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 455ab16409..e46fe85f5c 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 @@ -33,8 +33,15 @@ package sonia.scm.plugin; +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; +import com.google.inject.name.Named; + //~--- JDK imports ------------------------------------------------------------ +import java.io.File; + import java.util.ArrayList; import java.util.List; @@ -48,8 +55,16 @@ public class DefaultPluginBackend implements PluginBackend /** * Constructs ... * + * + * + * @param baseDirectory */ - public DefaultPluginBackend() {} + @Inject + public DefaultPluginBackend( + @Named(ScmBackendModule.DIRECTORY_PROPERTY) File baseDirectory) + { + this.baseDirectory = baseDirectory; + } //~--- methods -------------------------------------------------------------- @@ -67,6 +82,18 @@ public class DefaultPluginBackend implements PluginBackend //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + @Override + public File getBaseDirectory() + { + return baseDirectory; + } + /** * Method description * @@ -119,6 +146,9 @@ public class DefaultPluginBackend implements PluginBackend //~--- fields --------------------------------------------------------------- + /** Field description */ + private File baseDirectory; + /** Field description */ private List plugins = new ArrayList(); } 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 e664b6c122..2d62328f3d 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 @@ -35,6 +35,8 @@ package sonia.scm.plugin; //~--- JDK imports ------------------------------------------------------------ +import java.io.File; + import java.util.List; /** @@ -54,6 +56,14 @@ public interface PluginBackend //~--- 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 ba5400e583..ff60d526f5 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 @@ -35,12 +35,21 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.name.Names; import com.google.inject.servlet.ServletModule; +import sonia.scm.ConfigurationException; import sonia.scm.plugin.scanner.DefaultPluginScannerFactory; import sonia.scm.plugin.scanner.PluginScannerFactory; import sonia.scm.plugin.scanner.PluginScannerScheduler; import sonia.scm.plugin.scanner.TimerPluginScannerScheduler; +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import javax.xml.bind.JAXB; /** * @@ -49,6 +58,20 @@ import sonia.scm.plugin.scanner.TimerPluginScannerScheduler; public class ScmBackendModule extends ServletModule { + /** 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"; + + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -56,8 +79,76 @@ 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); + + if (!configurationFile.exists()) + { + throw new ConfigurationException( + "could not find configuration at ".concat( + configurationFile.getPath())); + } + + BackendConfiguration configuration = JAXB.unmarshal(baseDirectory, + 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); bind(PluginScannerScheduler.class).to(TimerPluginScannerScheduler.class); } + + /** + * 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); + } }