diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index 9b32167682..017582dc4c 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -70,6 +70,7 @@ import sonia.scm.template.TemplateServlet; import sonia.scm.user.UserManager; import sonia.scm.user.xml.XmlUserManager; import sonia.scm.util.DebugServlet; +import sonia.scm.util.ScmConfigurationUtil; import sonia.scm.web.cgi.CGIExecutorFactory; import sonia.scm.web.cgi.DefaultCGIExecutorFactory; import sonia.scm.web.security.AuthenticationManager; @@ -85,7 +86,6 @@ import com.sun.jersey.api.json.JSONConfiguration; import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; import com.sun.jersey.spi.container.servlet.ServletContainer; -import java.io.File; import java.util.Collection; import java.util.HashMap; @@ -94,7 +94,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; -import javax.xml.bind.JAXB; /** * @@ -362,41 +361,11 @@ public class ScmServletModule extends ServletModule */ private ScmConfiguration getScmConfiguration(SCMContextProvider context) { - ScmConfiguration config = null; - File file = new File(context.getBaseDirectory(), ScmConfiguration.PATH); + ScmConfiguration configuration = new ScmConfiguration(); - if (file.exists()) - { - if (logger.isInfoEnabled()) - { - logger.info("load ScmConfiguration: {}", file); - } + ScmConfigurationUtil.getInstance().load(configuration); - try - { - config = JAXB.unmarshal(file, ScmConfiguration.class); - - if (ScmConfiguration.OLD_PLUGINURL.equals(config.getPluginUrl())) - { - config.setPluginUrl(ScmConfiguration.DEFAULT_PLUGINURL); - } - } - catch (Exception ex) - { - logger.error(ex.getMessage(), ex); - } - } - else if (logger.isWarnEnabled()) - { - logger.warn("could not find ScmConfiguration at {}", file); - } - - if (config == null) - { - config = new ScmConfiguration(); - } - - return config; + return configuration; } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ConfigurationResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ConfigurationResource.java index 4ee9d5f582..934fe8dbcf 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ConfigurationResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ConfigurationResource.java @@ -39,20 +39,14 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.SCMContext; import sonia.scm.config.ScmConfiguration; import sonia.scm.plugin.PluginManager; -import sonia.scm.util.IOUtil; +import sonia.scm.util.ScmConfigurationUtil; import sonia.scm.util.SecurityUtil; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ -import java.io.File; - import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -63,8 +57,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import javax.xml.bind.JAXB; - /** * * @author Sebastian Sdorra @@ -74,12 +66,6 @@ import javax.xml.bind.JAXB; public class ConfigurationResource { - /** the logger for ConfigurationResource */ - private static final Logger logger = - LoggerFactory.getLogger(ConfigurationResource.class); - - //~--- constructors --------------------------------------------------------- - /** * Constructs ... * @@ -151,20 +137,7 @@ public class ConfigurationResource synchronized (ScmConfiguration.class) { - File file = new File(SCMContext.getContext().getBaseDirectory(), - ScmConfiguration.PATH); - - if (!file.exists()) - { - IOUtil.mkdirs(file.getParentFile()); - } - - if (logger.isInfoEnabled()) - { - logger.info("write ScmConfiguration to {}", file); - } - - JAXB.marshal(configuration, file); + ScmConfigurationUtil.getInstance().store(configuration); } return Response.created(uriInfo.getRequestUri()).build(); diff --git a/scm-webapp/src/main/java/sonia/scm/util/ScmConfigurationUtil.java b/scm-webapp/src/main/java/sonia/scm/util/ScmConfigurationUtil.java new file mode 100644 index 0000000000..9a9a2fced2 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/util/ScmConfigurationUtil.java @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.util; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.ConfigurationException; +import sonia.scm.SCMContext; +import sonia.scm.config.ScmConfiguration; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +/** + * + * @author Sebastian Sdorra + */ +public class ScmConfigurationUtil +{ + + /** Field description */ + private static volatile ScmConfigurationUtil instance; + + /** the logger for ScmConfigurationUtil */ + private static final Logger logger = + LoggerFactory.getLogger(ScmConfigurationUtil.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public ScmConfigurationUtil() + { + try + { + context = JAXBContext.newInstance(ScmConfiguration.class); + file = new File(SCMContext.getContext().getBaseDirectory(), + ScmConfiguration.PATH); + } + catch (JAXBException ex) + { + throw new ConfigurationException(ex); + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public static ScmConfigurationUtil getInstance() + { + if (instance == null) + { + synchronized (ScmConfigurationUtil.class) + { + if (instance == null) + { + instance = new ScmConfigurationUtil(); + } + } + } + + return instance; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param configuration + */ + public void load(ScmConfiguration configuration) + { + if (file.exists()) + { + if (logger.isInfoEnabled()) + { + logger.info("load ScmConfiguration from file {}", file); + } + + try + { + Unmarshaller unmarshaller = context.createUnmarshaller(); + ScmConfiguration loadedConfig = + (ScmConfiguration) unmarshaller.unmarshal(file); + + if (loadedConfig != null) + { + configuration.load(loadedConfig); + } + } + catch (Exception ex) + { + throw new ConfigurationException("could not load config", ex); + } + } + else if (logger.isWarnEnabled()) + { + logger.warn("could not find ScmConfiuration file at {}", file); + } + } + + /** + * Method description + * + * + * @param configuration + */ + public void store(ScmConfiguration configuration) + { + try + { + if (logger.isInfoEnabled()) + { + logger.info("store ScmConfiguration at {}", file); + } + + if (!file.exists()) + { + IOUtil.mkdirs(file.getParentFile()); + } + + Marshaller marshaller = context.createMarshaller(); + + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(configuration, file); + } + catch (Exception ex) + { + throw new ConfigurationException("could not store config", ex); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private JAXBContext context; + + /** Field description */ + private File file; +}