From 0ce48bb5d8c27b2ff5e2820c67747ee74209b7fb Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 5 Jan 2013 19:22:32 +0100 Subject: [PATCH] improve base directory handling --- .../java/sonia/scm/plugin/BaseDirectory.java | 158 ++++++++++++++++++ .../scm/plugin/DefaultPluginBackend.java | 26 +-- .../java/sonia/scm/plugin/PluginBackend.java | 8 - .../sonia/scm/plugin/ScmBackendModule.java | 69 +------- .../scm/plugin/rest/ScreenshotResource.java | 3 +- 5 files changed, 166 insertions(+), 98 deletions(-) create mode 100644 scm-plugin-backend/src/main/java/sonia/scm/plugin/BaseDirectory.java diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/BaseDirectory.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/BaseDirectory.java new file mode 100644 index 0000000000..d6e1c415d5 --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/BaseDirectory.java @@ -0,0 +1,158 @@ +/** + * 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.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.util.IOUtil; +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +/** + * + * @author Sebastian Sdorra + */ +public class BaseDirectory +{ + + /** Field description */ + private static final String DIRECTORY_DEFAULT = ".scm-backend"; + + /** Field description */ + private static final String DIRECTORY_ENVIRONMENT = "SCMBACKEND_HOME"; + + /** Field description */ + static final String DIRECTORY_PROPERTY = "scm-backend.home"; + + /** Field description */ + private static BaseDirectory instance; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public BaseDirectory() + { + baseDirectory = findBaseDirectory(); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param name + * + * @return + */ + public static File getDirectory(String name) + { + File directory = getFile(name); + + IOUtil.mkdirs(directory); + + return directory; + } + + /** + * Method description + * + * + * @param name + * + * @return + */ + public static File getFile(String name) + { + return new File(getInstance().baseDirectory, name); + } + + /** + * Method description + * + * + * @return + */ + private static BaseDirectory getInstance() + { + if (instance == null) + { + instance = new BaseDirectory(); + } + + return instance; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + private File findBaseDirectory() + { + String path = System.getProperty(DIRECTORY_PROPERTY); + + if (Util.isEmpty(path)) + { + path = System.getenv(DIRECTORY_ENVIRONMENT); + + if (Util.isEmpty(path)) + { + path = System.getProperty("user.home").concat(File.separator).concat( + DIRECTORY_DEFAULT); + } + } + + File directory = new File(path); + + if (!directory.exists() &&!directory.mkdirs()) + { + throw new IllegalStateException("could not create directory"); + } + + return directory; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private File baseDirectory; +} diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java index a9523272ce..eedc01aa85 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java @@ -98,13 +98,10 @@ public class DefaultPluginBackend extends AbstractPluginBackend * @param configuration */ @Inject - public DefaultPluginBackend( - @Named(ScmBackendModule.DIRECTORY_PROPERTY) File baseDirectory, - BackendConfiguration configuration) + public DefaultPluginBackend(BackendConfiguration configuration) { - this.baseDirectory = baseDirectory; this.configuration = configuration; - this.storeFile = new File(baseDirectory, FILE_STORE); + this.storeFile = BaseDirectory.getFile(FILE_STORE); try { @@ -197,18 +194,6 @@ public class DefaultPluginBackend extends AbstractPluginBackend //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - @Override - public File getBaseDirectory() - { - return baseDirectory; - } - /** * Method description * @@ -281,7 +266,7 @@ public class DefaultPluginBackend extends AbstractPluginBackend */ private void readScannedFiles() throws IOException { - File file = new File(baseDirectory, FILE_SCANNED); + File file = BaseDirectory.getFile(FILE_SCANNED); if (file.exists()) { @@ -347,7 +332,7 @@ public class DefaultPluginBackend extends AbstractPluginBackend logger.info("store scanned files"); } - File file = new File(baseDirectory, FILE_SCANNED); + File file = BaseDirectory.getFile(FILE_SCANNED); PrintWriter writer = null; try @@ -371,9 +356,6 @@ public class DefaultPluginBackend extends AbstractPluginBackend //~--- fields --------------------------------------------------------------- - /** Field description */ - private File baseDirectory; - /** Field description */ private BackendConfiguration configuration; diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java index e1c2b521f8..9609ec2b26 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java @@ -88,14 +88,6 @@ public interface PluginBackend extends ListenerSupport //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - public File getBaseDirectory(); - /** * Method description * diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/ScmBackendModule.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/ScmBackendModule.java index 3ce137f168..4f3139271b 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/ScmBackendModule.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/ScmBackendModule.java @@ -78,15 +78,6 @@ public class ScmBackendModule extends ServletModule /** Field description */ public static final String CACHE_CONFIG = "/config/ehcache.xml"; - /** Field description */ - public static final String DIRECTORY_DEFAULT = ".scm-backend"; - - /** Field description */ - public static final String DIRECTORY_ENVIRONMENT = "SCMBACKEND_HOME"; - - /** Field description */ - public static final String DIRECTORY_PROPERTY = "scm-backend.home"; - /** Field description */ public static final String FILE_CONFIG = "config.xml"; @@ -100,8 +91,7 @@ public class ScmBackendModule extends ServletModule public static final String PATTERN_REST_API = "/*"; /** Field description */ - public static final String PATTERN_REST_EXCLUDE = - "/(template/|news).*"; + public static final String PATTERN_REST_EXCLUDE = "/(template/|news).*"; //~--- methods -------------------------------------------------------------- @@ -112,14 +102,7 @@ public class ScmBackendModule extends ServletModule @Override protected void configureServlets() { - File baseDirectory = findBaseDirectory(); - - if (baseDirectory == null) - { - throw new ConfigurationException("could not find base directory"); - } - - File configurationFile = getConfigurationFile(baseDirectory); + File configurationFile = BaseDirectory.getFile(FILE_CONFIG); if (!configurationFile.exists()) { @@ -130,8 +113,6 @@ public class ScmBackendModule extends ServletModule BackendConfiguration configuration = JAXB.unmarshal(configurationFile, BackendConfiguration.class); - bind(File.class).annotatedWith(Names.named(DIRECTORY_PROPERTY)).toInstance( - baseDirectory); bind(BackendConfiguration.class).toInstance(configuration); bind(PluginBackend.class).to(DefaultPluginBackend.class); bind(PluginScannerFactory.class).to(DefaultPluginScannerFactory.class); @@ -168,50 +149,4 @@ public class ScmBackendModule extends ServletModule PATTERN_REST_EXCLUDE); filter(PATTERN_REST_API).through(GuiceContainer.class, params); } - - /** - * Method description - * - * - * @return - */ - private File findBaseDirectory() - { - String path = System.getProperty(DIRECTORY_PROPERTY); - - if (Util.isEmpty(path)) - { - path = System.getenv(DIRECTORY_ENVIRONMENT); - - if (Util.isEmpty(path)) - { - path = System.getProperty("user.home").concat(File.separator).concat( - DIRECTORY_DEFAULT); - } - } - - File directory = new File(path); - - if (!directory.exists() &&!directory.mkdirs()) - { - throw new IllegalStateException("could not create directory"); - } - - return directory; - } - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param baseDirectory - * - * @return - */ - private File getConfigurationFile(File baseDirectory) - { - return new File(baseDirectory, FILE_CONFIG); - } } diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/ScreenshotResource.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/ScreenshotResource.java index 30876caba9..896fe24728 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/ScreenshotResource.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/ScreenshotResource.java @@ -66,6 +66,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import sonia.scm.plugin.BaseDirectory; /** * @@ -225,7 +226,7 @@ public class ScreenshotResource path.append(size).append(File.separator).append(checksum); path.append(EXTENSION_IMAGE); - return new File(backend.getBaseDirectory(), path.toString()); + return BaseDirectory.getFile(path.toString()); } //~--- fields ---------------------------------------------------------------