Commits

Sebastian Sdorra  committed 8064f31

resolve issue #11

  • Participants
  • Parent commits 5808edc

Comments (0)

Files changed (3)

File scm-webapp/src/main/java/sonia/scm/ScmServletModule.java

 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;
 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;
 import java.util.Map;
 import java.util.Set;
 
-import javax.xml.bind.JAXB;
 
 /**
  *
    */
   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 ---------------------------------------------------------------

File scm-webapp/src/main/java/sonia/scm/api/rest/resources/ConfigurationResource.java

 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;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
-import javax.xml.bind.JAXB;
-
 /**
  *
  * @author Sebastian Sdorra
 public class ConfigurationResource
 {
 
-  /** the logger for ConfigurationResource */
-  private static final Logger logger =
-    LoggerFactory.getLogger(ConfigurationResource.class);
-
-  //~--- constructors ---------------------------------------------------------
-
   /**
    * Constructs ...
    *
 
     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();

File scm-webapp/src/main/java/sonia/scm/util/ScmConfigurationUtil.java

+/**
+ * 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;
+}