diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java index c9cd1a75dd..a327b50dae 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java @@ -41,13 +41,13 @@ import org.slf4j.LoggerFactory; import sonia.scm.NotSupportedFeatuerException; import sonia.scm.SCMContextProvider; import sonia.scm.event.ScmEventBus; -import sonia.scm.store.Store; -import sonia.scm.store.StoreFactory; //~--- JDK imports ------------------------------------------------------------ import java.io.File; import java.io.IOException; +import sonia.scm.store.ConfigurationStore; +import sonia.scm.store.ConfigurationStoreFactory; /** @@ -72,7 +72,7 @@ public abstract class AbstractRepositoryHandler store; + protected ConfigurationStore store; } diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java index ebc9f9aa44..670cab93e1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -46,7 +46,6 @@ import sonia.scm.ConfigurationException; import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; import sonia.scm.io.FileSystem; -import sonia.scm.store.StoreFactory; import sonia.scm.util.IOUtil; //~--- JDK imports ------------------------------------------------------------ @@ -55,6 +54,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -89,7 +89,7 @@ public abstract class AbstractSimpleRepositoryHandler type of store objects */ -public abstract class AbstractStore implements Store -{ +public abstract class AbstractStore implements ConfigurationStore { + + /** + * stored object + */ + protected T storeObject; + + @Override + public T get() { + if (storeObject == null) { + storeObject = readObject(); + } + + return storeObject; + } + + @Override + public void set(T obejct) { + writeObject(obejct); + this.storeObject = obejct; + } /** * Read the stored object. @@ -61,43 +78,4 @@ public abstract class AbstractStore implements Store * @param object object to write */ protected abstract void writeObject(T object); - - //~--- get methods ---------------------------------------------------------- - - /** - * {@inheritDoc} - * - * - * @return - */ - @Override - public T get() - { - if (storeObject == null) - { - storeObject = readObject(); - } - - return storeObject; - } - - //~--- set methods ---------------------------------------------------------- - - /** - * {@inheritDoc} - * - * - * @param obejct - */ - @Override - public void set(T obejct) - { - writeObject(obejct); - this.storeObject = obejct; - } - - //~--- fields --------------------------------------------------------------- - - /** stored object */ - protected T storeObject; } diff --git a/scm-core/src/main/java/sonia/scm/store/BlobStore.java b/scm-core/src/main/java/sonia/scm/store/BlobStore.java index a78865c5ca..fb4f6daca6 100644 --- a/scm-core/src/main/java/sonia/scm/store/BlobStore.java +++ b/scm-core/src/main/java/sonia/scm/store/BlobStore.java @@ -44,7 +44,7 @@ import java.util.List; * * @apiviz.uses sonia.scm.store.Blob */ -public interface BlobStore extends StoreBase +public interface BlobStore extends MultiEntryStore { /** diff --git a/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java b/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java index de50a4510a..941b3923d1 100644 --- a/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java @@ -42,8 +42,7 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.BlobStore */ -public interface BlobStoreFactory -{ +public interface BlobStoreFactory { /** * Returns a {@link BlobStore} with the given name, if the {@link BlobStore} diff --git a/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStore.java b/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStore.java index fba0c3bce3..d564379cf1 100644 --- a/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStore.java +++ b/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStore.java @@ -50,8 +50,7 @@ import java.util.Collection; * @param store value type * @since 1.31 */ -public interface ConfigurationEntryStore extends DataStore -{ +public interface ConfigurationEntryStore extends DataStore { /** * Return all values matching the given {@link Predicate}. diff --git a/scm-core/src/main/java/sonia/scm/store/Store.java b/scm-core/src/main/java/sonia/scm/store/ConfigurationStore.java similarity index 93% rename from scm-core/src/main/java/sonia/scm/store/Store.java rename to scm-core/src/main/java/sonia/scm/store/ConfigurationStore.java index 064cec6f0c..a7f21dd304 100644 --- a/scm-core/src/main/java/sonia/scm/store/Store.java +++ b/scm-core/src/main/java/sonia/scm/store/ConfigurationStore.java @@ -34,16 +34,14 @@ package sonia.scm.store; /** - * Store for configuration objects. Note: the default + * ConfigurationStore for configuration objects. Note: the default * implementation use JAXB to marshall the configuration objects. - * - * TODO for 2.0 rename to ConfigurationStore * * @author Sebastian Sdorra * * @param type of the configuration objects */ -public interface Store +public interface ConfigurationStore { /** diff --git a/scm-core/src/main/java/sonia/scm/store/StoreFactory.java b/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java similarity index 76% rename from scm-core/src/main/java/sonia/scm/store/StoreFactory.java rename to scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java index 9f17e15a48..d9a97de98d 100644 --- a/scm-core/src/main/java/sonia/scm/store/StoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java @@ -30,38 +30,30 @@ */ - package sonia.scm.store; -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.Initable; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Closeable; /** - * The StoreFactory can be used to create new or get existing - * {@link Store}s. + * The ConfigurationStoreFactory can be used to create new or get existing + * {@link ConfigurationStore} objects. * * @author Sebastian Sdorra * * @apiviz.landmark - * @apiviz.uses sonia.scm.store.Store + * @apiviz.uses sonia.scm.store.ConfigurationStore */ -public interface StoreFactory extends Initable, Closeable +public interface ConfigurationStoreFactory { /** - * Get an existing {@link Store} or create a new one. + * Get an existing {@link ConfigurationStore} or create a new one. * * * @param type type of the store objects * @param name name of the store * @param type of the store objects * - * @return {@link Store} of the given type and name + * @return {@link ConfigurationStore} of the given type and name */ - public Store getStore(Class type, String name); + public ConfigurationStore getStore(Class type, String name); } diff --git a/scm-core/src/main/java/sonia/scm/store/DataStore.java b/scm-core/src/main/java/sonia/scm/store/DataStore.java index c31774ca9f..23f85d9df5 100644 --- a/scm-core/src/main/java/sonia/scm/store/DataStore.java +++ b/scm-core/src/main/java/sonia/scm/store/DataStore.java @@ -45,8 +45,7 @@ import java.util.Map; * * @param type of store items */ -public interface DataStore extends StoreBase -{ +public interface DataStore extends MultiEntryStore { /** * Put a item with automatically generated id to the store. diff --git a/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java b/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java index 424b650674..caed974ee4 100644 --- a/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java @@ -42,8 +42,7 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.DataStore */ -public interface DataStoreFactory -{ +public interface DataStoreFactory { /** * Get an existing {@link DataStore} or create a new one. diff --git a/scm-core/src/main/java/sonia/scm/store/EntryAlreadyExistsStoreException.java b/scm-core/src/main/java/sonia/scm/store/EntryAlreadyExistsStoreException.java index 3366987cc7..6e8d831c9f 100644 --- a/scm-core/src/main/java/sonia/scm/store/EntryAlreadyExistsStoreException.java +++ b/scm-core/src/main/java/sonia/scm/store/EntryAlreadyExistsStoreException.java @@ -39,10 +39,8 @@ package sonia.scm.store; * @author Sebastian Sdorra * @since 1.23 */ -public class EntryAlreadyExistsStoreException extends StoreException -{ +public class EntryAlreadyExistsStoreException extends StoreException { - /** Field description */ private static final long serialVersionUID = 7016781091599951287L; //~--- constructors --------------------------------------------------------- @@ -50,11 +48,9 @@ public class EntryAlreadyExistsStoreException extends StoreException /** * Constructs new EntryAllreadyExistsStoreException. * - * * @param message message for the exception */ - public EntryAlreadyExistsStoreException(String message) - { + public EntryAlreadyExistsStoreException(String message) { super(message); } } diff --git a/scm-core/src/main/java/sonia/scm/store/StoreBase.java b/scm-core/src/main/java/sonia/scm/store/MultiEntryStore.java similarity index 98% rename from scm-core/src/main/java/sonia/scm/store/StoreBase.java rename to scm-core/src/main/java/sonia/scm/store/MultiEntryStore.java index 5b577010f2..9a35cee0e0 100644 --- a/scm-core/src/main/java/sonia/scm/store/StoreBase.java +++ b/scm-core/src/main/java/sonia/scm/store/MultiEntryStore.java @@ -40,8 +40,7 @@ package sonia.scm.store; * * @param Type of the stored objects */ -public interface StoreBase -{ +public interface MultiEntryStore { /** * Remove all items from the store. diff --git a/scm-core/src/main/java/sonia/scm/store/StoreException.java b/scm-core/src/main/java/sonia/scm/store/StoreException.java index 2029302ab2..697df969b4 100644 --- a/scm-core/src/main/java/sonia/scm/store/StoreException.java +++ b/scm-core/src/main/java/sonia/scm/store/StoreException.java @@ -34,11 +34,11 @@ package sonia.scm.store; /** - * + * The store exception can be used by a store implementation. + * * @author Sebastian Sdorra */ -public class StoreException extends RuntimeException -{ +public class StoreException extends RuntimeException { /** Field description */ private static final long serialVersionUID = 6974469896007155294L; @@ -46,45 +46,21 @@ public class StoreException extends RuntimeException //~--- constructors --------------------------------------------------------- /** - * Constructs ... + * Constructs a new instance. * + * @param message exception message */ - public StoreException() - { - super(); - } - - /** - * Constructs ... - * - * - * @param message - */ - public StoreException(String message) - { + public StoreException(String message) { super(message); } /** - * Constructs ... + * Constructs a new instance. * - * - * @param cause + * @param message exception message + * @param cause exception cause */ - public StoreException(Throwable cause) - { - super(cause); - } - - /** - * Constructs ... - * - * - * @param message - * @param cause - */ - public StoreException(String message, Throwable cause) - { + public StoreException(String message, Throwable cause) { super(message, cause); } } diff --git a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java index e47033ad1b..577d732317 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java @@ -39,9 +39,10 @@ import com.google.inject.Singleton; import sonia.scm.group.Group; import sonia.scm.group.GroupDAO; -import sonia.scm.store.StoreFactory; import sonia.scm.xml.AbstractXmlDAO; +import sonia.scm.store.ConfigurationStoreFactory; + /** * * @author Sebastian Sdorra @@ -63,7 +64,7 @@ public class XmlGroupDAO extends AbstractXmlDAO * @param storeFactory */ @Inject - public XmlGroupDAO(StoreFactory storeFactory) + public XmlGroupDAO(ConfigurationStoreFactory storeFactory) { super(storeFactory.getStore(XmlGroupDatabase.class, STORE_NAME)); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java index d5aff6a906..7c17c365aa 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java @@ -39,8 +39,8 @@ import com.google.inject.Singleton; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryDAO; -import sonia.scm.store.StoreFactory; import sonia.scm.xml.AbstractXmlDAO; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -64,7 +64,7 @@ public class XmlRepositoryDAO * @param storeFactory */ @Inject - public XmlRepositoryDAO(StoreFactory storeFactory) + public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory) { super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStore.java index 07a841a777..18e758de8d 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStore.java @@ -50,7 +50,7 @@ import java.io.File; * * @param */ -public abstract class FileBasedStore implements StoreBase +public abstract class FileBasedStore implements MultiEntryStore { /** diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStoreFactory.java index 5fff61de3a..5bfc4f34b9 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/FileBasedStoreFactory.java @@ -28,12 +28,9 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - package sonia.scm.store; //~--- non-JDK imports -------------------------------------------------------- - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,75 +38,52 @@ import sonia.scm.SCMContextProvider; import sonia.scm.util.IOUtil; //~--- JDK imports ------------------------------------------------------------ - import java.io.File; /** - * + * Abstract store factory for file based stores. + * * @author Sebastian Sdorra */ -public class FileBasedStoreFactory -{ - - /** Field description */ - private static final String BASE_DIRECTORY = "var"; +public abstract class FileBasedStoreFactory { /** * the logger for FileBasedStoreFactory */ - private static final Logger logger = - LoggerFactory.getLogger(FileBasedStoreFactory.class); + private static final Logger LOG = LoggerFactory.getLogger(FileBasedStoreFactory.class); - //~--- constructors --------------------------------------------------------- + private static final String BASE_DIRECTORY = "var"; - /** - * Constructs ... - * - * - * @param context - * @param dataDirectoryName - */ - public FileBasedStoreFactory(SCMContextProvider context, - String dataDirectoryName) - { + private final SCMContextProvider context; + + private final String dataDirectoryName; + + private File dataDirectory; + + protected FileBasedStoreFactory(SCMContextProvider context, + String dataDirectoryName) { this.context = context; this.dataDirectoryName = dataDirectoryName; } //~--- get methods ---------------------------------------------------------- - /** - * Method description + * Returns data directory for given name. * + * @param name name of data directory * - * @param name - * - * @return + * @return data directory */ - protected File getDirectory(String name) - { - if (dataDirectory == null) - { + protected File getDirectory(String name) { + if (dataDirectory == null) { dataDirectory = new File(context.getBaseDirectory(), BASE_DIRECTORY.concat(File.separator).concat(dataDirectoryName)); - logger.debug("create data directory {}", dataDirectory); + LOG.debug("create data directory {}", dataDirectory); } File storeDirectory = new File(dataDirectory, name); - IOUtil.mkdirs(storeDirectory); - return storeDirectory; } - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private final SCMContextProvider context; - - /** Field description */ - private File dataDirectory; - - /** Field description */ - private final String dataDirectoryName; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlob.java b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlob.java index 9c4cba88d9..5352d0c4c9 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlob.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlob.java @@ -28,12 +28,9 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - package sonia.scm.store; //~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -43,87 +40,39 @@ import java.io.InputStream; import java.io.OutputStream; /** + * File base implementation of {@link Blob}. * * @author Sebastian Sdorra */ -public final class FileBlob implements Blob -{ +public final class FileBlob implements Blob { - /** - * Constructs ... - * - * - * @param id - * @param file - */ - public FileBlob(String id, File file) - { + private final String id; + private final File file; + + FileBlob(String id, File file) { this.id = id; this.file = file; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @throws IOException - */ @Override - public void commit() throws IOException - { + public void commit() throws IOException { // nothing todo } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override - public String getId() - { + public String getId() { return id; } - /** - * Method description - * - * - * @return - * - * @throws FileNotFoundException - */ @Override - public InputStream getInputStream() throws FileNotFoundException - { + public InputStream getInputStream() throws FileNotFoundException { return new FileInputStream(file); } - /** - * Method description - * - * - * @return - * - * @throws IOException - */ @Override - public OutputStream getOutputStream() throws IOException - { + public OutputStream getOutputStream() throws IOException { return new FileOutputStream(file); } - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private final File file; - - /** Field description */ - private final String id; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStore.java index 690c42fb33..45cb002611 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStore.java @@ -28,12 +28,9 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - package sonia.scm.store; //~--- non-JDK imports -------------------------------------------------------- - import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -45,147 +42,86 @@ import org.slf4j.LoggerFactory; import sonia.scm.security.KeyGenerator; //~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; import java.util.List; /** + * File based implementation of {@link BlobStore}. * * @author Sebastian Sdorra */ -public class FileBlobStore extends FileBasedStore implements BlobStore -{ - - /** Field description */ - private static final String SUFFIX = ".blob"; +public class FileBlobStore extends FileBasedStore implements BlobStore { /** * the logger for FileBlobStore */ - private static final Logger logger = - LoggerFactory.getLogger(FileBlobStore.class); + private static final Logger LOG + = LoggerFactory.getLogger(FileBlobStore.class); - //~--- constructors --------------------------------------------------------- + private static final String SUFFIX = ".blob"; - /** - * Constructs ... - * - * - * @param keyGenerator - * @param directory - */ - public FileBlobStore(KeyGenerator keyGenerator, File directory) - { + private final KeyGenerator keyGenerator; + + FileBlobStore(KeyGenerator keyGenerator, File directory) { super(directory, SUFFIX); this.keyGenerator = keyGenerator; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override - public Blob create() - { + public Blob create() { return create(keyGenerator.createKey()); } - /** - * Method description - * - * - * @param id - * - * @return - */ @Override - public Blob create(String id) - { + public Blob create(String id) { Preconditions.checkArgument(!Strings.isNullOrEmpty(id), "id argument is required"); - logger.debug("create new blob with id {}", id); + LOG.debug("create new blob with id {}", id); File file = getFile(id); - try - { - if (file.exists()) - { + try { + if (file.exists()) { throw new EntryAlreadyExistsStoreException( "blob with id ".concat(id).concat(" allready exists")); } - else if (!file.createNewFile()) - { + else if (!file.createNewFile()) { throw new StoreException("could not create blob for id ".concat(id)); } } - catch (IOException ex) - { + catch (IOException ex) { throw new StoreException("could not create blob for id ".concat(id), ex); } return new FileBlob(id, file); } - /** - * Method description - * - * - * @param blob - */ @Override - public void remove(Blob blob) - { + public void remove(Blob blob) { Preconditions.checkNotNull(blob, "blob argument is required"); remove(blob.getId()); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override - public List getAll() - { - logger.trace("get all items from data store"); + public List getAll() { + LOG.trace("get all items from data store"); Builder builder = ImmutableList.builder(); - for (File file : directory.listFiles()) - { + for (File file : directory.listFiles()) { builder.add(read(file)); } return builder.build(); } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param file - * - * @return - */ @Override - protected FileBlob read(File file) - { + protected FileBlob read(File file) { FileBlob blob = null; - if (file.exists()) - { + if (file.exists()) { String id = getId(file); blob = new FileBlob(id, file); @@ -194,8 +130,4 @@ public class FileBlobStore extends FileBasedStore implements BlobStore return blob; } - //~--- fields --------------------------------------------------------------- - - /** key generator */ - private final KeyGenerator keyGenerator; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStoreFactory.java index 93d525026c..8cc5b34ac2 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/FileBlobStoreFactory.java @@ -28,12 +28,9 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - package sonia.scm.store; //~--- non-JDK imports -------------------------------------------------------- - import com.google.inject.Inject; import com.google.inject.Singleton; @@ -44,60 +41,40 @@ import sonia.scm.SCMContextProvider; import sonia.scm.security.KeyGenerator; /** + * File based store factory. * * @author Sebastian Sdorra */ @Singleton -public class FileBlobStoreFactory extends FileBasedStoreFactory - implements BlobStoreFactory -{ +public class FileBlobStoreFactory extends FileBasedStoreFactory implements BlobStoreFactory { - /** Field description */ private static final String DIRECTORY_NAME = "blob"; /** * the logger for FileBlobStoreFactory */ - private static final Logger logger = - LoggerFactory.getLogger(FileBlobStoreFactory.class); + private static final Logger LOG = LoggerFactory.getLogger(FileBlobStoreFactory.class); - //~--- constructors --------------------------------------------------------- + private final KeyGenerator keyGenerator; /** - * Constructs ... + * Constructs a new instance. * - * - * @param context - * @param keyGenerator + * @param context scm context + * @param keyGenerator key generator */ @Inject public FileBlobStoreFactory(SCMContextProvider context, - KeyGenerator keyGenerator) - { + KeyGenerator keyGenerator) { super(context, DIRECTORY_NAME); this.keyGenerator = keyGenerator; } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param name - * - * @return - */ @Override - public BlobStore getBlobStore(String name) - { - logger.debug("create new blob with name {}", name); + public BlobStore getBlobStore(String name) { + LOG.debug("create new blob with name {}", name); return new FileBlobStore(keyGenerator, getDirectory(name)); } - //~--- fields --------------------------------------------------------------- - - /** key generator */ - private final KeyGenerator keyGenerator; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java index fea2c7220a..6a9098b545 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStore.java @@ -80,8 +80,7 @@ import javax.xml.stream.XMLStreamWriter; * * @param */ -public class JAXBConfigurationEntryStore - implements ConfigurationEntryStore +public class JAXBConfigurationEntryStore implements ConfigurationEntryStore { /** Field description */ diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStore.java similarity index 65% rename from scm-dao-xml/src/main/java/sonia/scm/store/JAXBStore.java rename to scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStore.java index a668a7ab86..4a87ea57f6 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStore.java @@ -28,18 +28,13 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - - package sonia.scm.store; //~--- non-JDK imports -------------------------------------------------------- - import org.slf4j.Logger; import org.slf4j.LoggerFactory; //~--- JDK imports ------------------------------------------------------------ - import java.io.File; import javax.xml.bind.JAXBContext; @@ -47,121 +42,81 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; /** + * JAXB implementation of {@link ConfigurationStore}. * * @author Sebastian Sdorra * * @param */ -public class JAXBStore extends AbstractStore -{ - - /** the logger for JAXBStore */ - private static final Logger logger = LoggerFactory.getLogger(JAXBStore.class); - - //~--- constructors --------------------------------------------------------- +public class JAXBConfigurationStore extends AbstractStore { /** - * Constructs ... - * - * - * @param type - * @param configFile + * the logger for JAXBConfigurationStore */ - public JAXBStore(Class type, File configFile) - { + private static final Logger LOG = LoggerFactory.getLogger(JAXBConfigurationStore.class); + + private Class type; + + private File configFile; + + private JAXBContext context; + + JAXBConfigurationStore(Class type, File configFile) { this.type = type; - try - { + try { context = JAXBContext.newInstance(type); this.configFile = configFile; } - catch (JAXBException ex) - { - throw new StoreException(ex); + catch (JAXBException ex) { + throw new StoreException("failed to create jaxb context", ex); } } - //~--- get methods ---------------------------------------------------------- - /** - * Method description + * Returns type of stored object. * * - * @return + * @return type */ - public Class getType() - { + public Class getType() { return type; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override @SuppressWarnings("unchecked") - protected T readObject() - { - logger.debug("load {} from store {}", type, configFile); + protected T readObject() { + LOG.debug("load {} from store {}", type, configFile); T result = null; - if (configFile.exists()) - { - try - { + if (configFile.exists()) { + try { result = (T) context.createUnmarshaller().unmarshal(configFile); } - catch (JAXBException ex) - { - throw new StoreException(ex); + catch (JAXBException ex) { + throw new StoreException("failed to unmarshall object", ex); } } return result; } - /** - * Method description - * - * - * @param object - */ @Override - protected void writeObject(T object) - { - if (logger.isDebugEnabled()) - { - logger.debug("store {} to {}", object.getClass().getName(), + protected void writeObject(T object) { + if (LOG.isDebugEnabled()) { + LOG.debug("store {} to {}", object.getClass().getName(), configFile.getPath()); } - try - { + try { Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(object, configFile); } - catch (JAXBException ex) - { - throw new StoreException(ex); + catch (JAXBException ex) { + throw new StoreException("failed to marshall object", ex); } } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private File configFile; - - /** Field description */ - private JAXBContext context; - - /** Field description */ - private Class type; } diff --git a/scm-test/src/main/java/sonia/scm/store/MemoryStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java similarity index 58% rename from scm-test/src/main/java/sonia/scm/store/MemoryStoreFactory.java rename to scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java index 3a00b70375..70fd962254 100644 --- a/scm-test/src/main/java/sonia/scm/store/MemoryStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java @@ -28,67 +28,59 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - - package sonia.scm.store; -//~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import sonia.scm.SCMContextProvider; +import sonia.scm.util.IOUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; +import java.io.File; /** + * JAXB implementation of {@link JAXBConfigurationStoreFactory}. * * @author Sebastian Sdorra */ -public class MemoryStoreFactory implements StoreFactory -{ +@Singleton +public class JAXBConfigurationStoreFactory implements ConfigurationStoreFactory { /** - * Method description - * - * - * @throws IOException + * the logger for JAXBConfigurationStoreFactory */ - @Override - public void close() throws IOException - { + private static final Logger LOG = LoggerFactory.getLogger(JAXBConfigurationStoreFactory.class); - // do nothing - } + private final File configDirectory; /** - * Method description + * Constructs a new instance. * - * - * @param context + * @param context scm context */ - @Override - public void init(SCMContextProvider context) - { - - // do nothing + @Inject + public JAXBConfigurationStoreFactory(SCMContextProvider context) { + configDirectory = new File(context.getBaseDirectory(), StoreConstants.CONFIGDIRECTORY_NAME); + IOUtil.mkdirs(configDirectory); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param type - * @param name - * @param - * - * @return - */ @Override - public Store getStore(Class type, String name) - { - return new MemoryStore(); + public JAXBConfigurationStore getStore(Class type, String name) { + if (configDirectory == null) { + throw new IllegalStateException("store factory is not initialized"); + } + + File configFile = new File(configDirectory, name.concat(StoreConstants.FILE_EXTENSION)); + + if (LOG.isDebugEnabled()) { + LOG.debug("create store for {} at {}", type.getName(), + configFile.getPath()); + } + + return new JAXBConfigurationStore<>(type, configFile); } + } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStore.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStore.java index c772016ee3..40a9a4a590 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStore.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStore.java @@ -28,12 +28,9 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - package sonia.scm.store; //~--- non-JDK imports -------------------------------------------------------- - import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; @@ -43,7 +40,6 @@ import org.slf4j.LoggerFactory; import sonia.scm.security.KeyGenerator; //~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.util.Map; @@ -53,87 +49,57 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; /** + * Jaxb implementation of {@link DataStore}. * * @author Sebastian Sdorra * - * @param + * @param type of stored data. */ -public class JAXBDataStore extends FileBasedStore implements DataStore -{ +public class JAXBDataStore extends FileBasedStore implements DataStore { /** * the logger for JAXBDataStore */ - private static final Logger logger = - LoggerFactory.getLogger(JAXBDataStore.class); + private static final Logger LOG + = LoggerFactory.getLogger(JAXBDataStore.class); - //~--- constructors --------------------------------------------------------- + private final JAXBContext context; - /** - * Constructs ... - * - * - * @param type - * @param keyGenerator - * @param directory - */ - public JAXBDataStore(KeyGenerator keyGenerator, Class type, File directory) - { + private final KeyGenerator keyGenerator; + + JAXBDataStore(KeyGenerator keyGenerator, Class type, File directory) { super(directory, StoreConstants.FILE_EXTENSION); this.keyGenerator = keyGenerator; - try - { + try { context = JAXBContext.newInstance(type); this.directory = directory; } - catch (JAXBException ex) - { - throw new StoreException(ex); + catch (JAXBException ex) { + throw new StoreException("failed to create jaxb context", ex); } } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param id - * @param item - */ @Override - public void put(String id, T item) - { - logger.debug("put item {} to store", id); + public void put(String id, T item) { + LOG.debug("put item {} to store", id); File file = getFile(id); - try - { + try { Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(item, file); } - catch (JAXBException ex) - { + catch (JAXBException ex) { throw new StoreException("could not write object with id ".concat(id), ex); } } - /** - * Method description - * - * - * @param item - * - * @return - */ @Override - public String put(T item) - { + public String put(T item) { String key = keyGenerator.createKey(); put(key, item); @@ -141,55 +107,31 @@ public class JAXBDataStore extends FileBasedStore implements DataStore return key; } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override - public Map getAll() - { - logger.trace("get all items from data store"); + public Map getAll() { + LOG.trace("get all items from data store"); Builder builder = ImmutableMap.builder(); - for (File file : directory.listFiles()) - { + for (File file : directory.listFiles()) { builder.put(getId(file), read(file)); } return builder.build(); } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param file - * - * @return - */ @Override @SuppressWarnings("unchecked") - protected T read(File file) - { + protected T read(File file) { T item = null; - if (file.exists()) - { - logger.trace("try to read {}", file); + if (file.exists()) { + LOG.trace("try to read {}", file); - try - { + try { item = (T) context.createUnmarshaller().unmarshal(file); } - catch (JAXBException ex) - { + catch (JAXBException ex) { throw new StoreException( "could not read object ".concat(file.getPath()), ex); } @@ -197,12 +139,4 @@ public class JAXBDataStore extends FileBasedStore implements DataStore return item; } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private JAXBContext context; - - /** Field description */ - private final KeyGenerator keyGenerator; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStoreFactory.java index 1a948a9de6..732b8c675b 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBDataStoreFactory.java @@ -95,7 +95,7 @@ public class JAXBDataStoreFactory extends FileBasedStoreFactory { logger.debug("create new store for type {} with name {}", type, name); - return new JAXBDataStore(keyGenerator, type, getDirectory(name)); + return new JAXBDataStore<>(keyGenerator, type, getDirectory(name)); } //~--- fields --------------------------------------------------------------- diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java deleted file mode 100644 index 5dcaa48113..0000000000 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * 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.store; - -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.SCMContextProvider; -import sonia.scm.util.IOUtil; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.File; -import java.io.IOException; - -/** - * - * @author Sebastian Sdorra - */ -@Singleton -public class JAXBStoreFactory implements StoreFactory -{ - - /** the logger for JAXBStoreFactory */ - private static final Logger logger = - LoggerFactory.getLogger(JAXBStoreFactory.class); - - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @throws IOException - */ - @Override - public void close() throws IOException - { - - // do nothing - } - - /** - * Method description - * - * - * @param context - */ - @Override - public void init(SCMContextProvider context) - { - configDirectory = new File(context.getBaseDirectory(), - StoreConstants.CONFIGDIRECTORY_NAME); - IOUtil.mkdirs(configDirectory); - } - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param type - * @param name - * @param - * - * @return - */ - @Override - public JAXBStore getStore(Class type, String name) - { - if (configDirectory == null) - { - throw new IllegalStateException("store factory is not initialized"); - } - - File configFile = new File(configDirectory, - name.concat(StoreConstants.FILE_EXTENSION)); - - if (logger.isDebugEnabled()) - { - logger.debug("create store for {} at {}", type.getName(), - configFile.getPath()); - } - - return new JAXBStore(type, configFile); - } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private File configDirectory; -} diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/StoreConstants.java b/scm-dao-xml/src/main/java/sonia/scm/store/StoreConstants.java index cc33f682d9..0bd9864cd7 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/StoreConstants.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/StoreConstants.java @@ -33,7 +33,8 @@ package sonia.scm.store; /** - * + * Store constants for xml implementations. + * * @author Sebastian Sdorra */ public interface StoreConstants diff --git a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java index 3f19c048bb..1bfd877f44 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java @@ -37,10 +37,10 @@ package sonia.scm.user.xml; import com.google.inject.Inject; import com.google.inject.Singleton; -import sonia.scm.store.StoreFactory; import sonia.scm.user.User; import sonia.scm.user.UserDAO; import sonia.scm.xml.AbstractXmlDAO; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -63,7 +63,7 @@ public class XmlUserDAO extends AbstractXmlDAO * @param storeFactory */ @Inject - public XmlUserDAO(StoreFactory storeFactory) + public XmlUserDAO(ConfigurationStoreFactory storeFactory) { super(storeFactory.getStore(XmlUserDatabase.class, STORE_NAME)); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java b/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java index a0baa41034..6b74fce7ca 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java +++ b/scm-dao-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java @@ -41,11 +41,11 @@ import org.slf4j.LoggerFactory; import sonia.scm.GenericDAO; import sonia.scm.ModelObject; import sonia.scm.group.xml.XmlGroupDAO; -import sonia.scm.store.Store; //~--- JDK imports ------------------------------------------------------------ import java.util.Collection; +import sonia.scm.store.ConfigurationStore; /** * @@ -76,7 +76,7 @@ public abstract class AbstractXmlDAO store) + public AbstractXmlDAO(ConfigurationStore store) { this.store = store; db = store.get(); @@ -290,7 +290,7 @@ public abstract class AbstractXmlDAO store; + private final ConfigurationStore store; /** Field description */ protected T db; diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBStoreTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java similarity index 86% rename from scm-dao-xml/src/test/java/sonia/scm/store/JAXBStoreTest.java rename to scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java index 6c4de42954..4151a6ca20 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBStoreTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java @@ -33,25 +33,15 @@ package sonia.scm.store; /** - * + * Unit tests for {@link JAXBConfigurationStore}. + * * @author Sebastian Sdorra */ -public class JAXBStoreTest extends StoreTestBase -{ +public class JAXBConfigurationStoreTest extends StoreTestBase { - /** - * Method description - * - * - * @return - */ @Override - protected StoreFactory createStoreFactory() + protected ConfigurationStoreFactory createStoreFactory() { - JAXBStoreFactory factory = new JAXBStoreFactory(); - - factory.init(contextProvider); - - return factory; + return new JAXBConfigurationStoreFactory(contextProvider); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java index 9cf2bc638b..2264859e57 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java @@ -44,12 +44,12 @@ import sonia.scm.Type; import sonia.scm.io.FileSystem; import sonia.scm.plugin.Extension; import sonia.scm.repository.spi.GitRepositoryServiceProvider; -import sonia.scm.store.StoreFactory; //~--- JDK imports ------------------------------------------------------------ import java.io.File; import java.io.IOException; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -89,7 +89,7 @@ public class GitRepositoryHandler * @param fileSystem */ @Inject - public GitRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem) + public GitRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem) { super(storeFactory, fileSystem); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java index 52acb18da6..5b146bc9c5 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java @@ -36,13 +36,13 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.io.DefaultFileSystem; -import sonia.scm.store.StoreFactory; import static org.junit.Assert.*; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -86,7 +86,7 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase * @return */ @Override - protected RepositoryHandler createRepositoryHandler(StoreFactory factory, + protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, File directory) { GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory, diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index e3ae8afb78..7711554d85 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -56,7 +56,6 @@ import sonia.scm.io.INIConfigurationWriter; import sonia.scm.io.INISection; import sonia.scm.plugin.Extension; import sonia.scm.repository.spi.HgRepositoryServiceProvider; -import sonia.scm.store.StoreFactory; import sonia.scm.util.IOUtil; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; @@ -73,6 +72,7 @@ import java.text.MessageFormat; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -122,7 +122,7 @@ public class HgRepositoryHandler * @param hgContextProvider */ @Inject - public HgRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem, + public HgRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, Provider hgContextProvider) { super(storeFactory, fileSystem); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java index f734d1673b..c14e5f1b61 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java @@ -37,13 +37,13 @@ package sonia.scm.repository; import sonia.scm.io.DefaultFileSystem; -import sonia.scm.store.StoreFactory; import static org.junit.Assert.*; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -83,7 +83,7 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase * @return */ @Override - protected RepositoryHandler createRepositoryHandler(StoreFactory factory, + protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, File directory) { HgRepositoryHandler handler = new HgRepositoryHandler(factory, @@ -98,3 +98,4 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase return handler; } } +//~--- non-JDK imports -------------------------------------------------------- diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java index a029007298..532038ff2d 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgTestUtil.java @@ -39,7 +39,7 @@ import org.junit.Assume; import sonia.scm.SCMContext; import sonia.scm.io.FileSystem; -import sonia.scm.store.MemoryStoreFactory; +import sonia.scm.store.InMemoryConfigurationStoreFactory; import static org.mockito.Mockito.*; @@ -105,7 +105,7 @@ public final class HgTestUtil FileSystem fileSystem = mock(FileSystem.class); HgRepositoryHandler handler = - new HgRepositoryHandler(new MemoryStoreFactory(), fileSystem, + new HgRepositoryHandler(new InMemoryConfigurationStoreFactory(), fileSystem, new HgContextProvider()); handler.init(context); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index c950e1b32d..b3bb8a2721 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -54,7 +54,6 @@ import sonia.scm.io.FileSystem; import sonia.scm.logging.SVNKitLogger; import sonia.scm.plugin.Extension; import sonia.scm.repository.spi.SvnRepositoryServiceProvider; -import sonia.scm.store.StoreFactory; import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ @@ -62,6 +61,7 @@ import sonia.scm.util.Util; import java.io.File; import java.io.IOException; import sonia.scm.repository.spi.HookEventFacade; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -106,7 +106,7 @@ public class SvnRepositoryHandler * @param repositoryManager */ @Inject - public SvnRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem, + public SvnRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, HookEventFacade eventFacade) { super(storeFactory, fileSystem); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java index 0bf69a04f2..af80e27bcf 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java @@ -36,13 +36,13 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.io.DefaultFileSystem; -import sonia.scm.store.StoreFactory; import static org.junit.Assert.*; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -81,7 +81,7 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase * @return */ @Override - protected RepositoryHandler createRepositoryHandler(StoreFactory factory, + protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, File directory) { SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, diff --git a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java index 34632e370f..0a85231da0 100644 --- a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java +++ b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java @@ -37,12 +37,12 @@ package sonia.scm.repository; import sonia.scm.Type; import sonia.scm.io.DefaultFileSystem; -import sonia.scm.store.StoreFactory; //~--- JDK imports ------------------------------------------------------------ import java.io.File; import java.io.IOException; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -69,7 +69,7 @@ public class DummyRepositoryHandler * * @param storeFactory */ - public DummyRepositoryHandler(StoreFactory storeFactory) + public DummyRepositoryHandler(ConfigurationStoreFactory storeFactory) { super(storeFactory, new DefaultFileSystem()); } diff --git a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java index f3a42a11c1..19af367a1d 100644 --- a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java @@ -38,8 +38,7 @@ package sonia.scm.repository; import org.junit.Test; import sonia.scm.AbstractTestBase; -import sonia.scm.store.MemoryStoreFactory; -import sonia.scm.store.StoreFactory; +import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.util.IOUtil; import static org.junit.Assert.*; @@ -48,6 +47,7 @@ import static org.junit.Assert.*; import java.io.File; import java.io.IOException; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -74,7 +74,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase * @return */ protected abstract RepositoryHandler createRepositoryHandler( - StoreFactory factory, File directory); + ConfigurationStoreFactory factory, File directory); /** * Method description @@ -150,11 +150,8 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase @Override protected void postSetUp() throws Exception { - MemoryStoreFactory storeFactory = new MemoryStoreFactory(); - - storeFactory.init(contextProvider); - baseDirectory = new File(contextProvider.getBaseDirectory(), - "repositories"); + InMemoryConfigurationStoreFactory storeFactory = new InMemoryConfigurationStoreFactory(); + baseDirectory = new File(contextProvider.getBaseDirectory(), "repositories"); IOUtil.mkdirs(baseDirectory); handler = createRepositoryHandler(storeFactory, baseDirectory); } diff --git a/scm-test/src/main/java/sonia/scm/store/MemoryStore.java b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStore.java similarity index 80% rename from scm-test/src/main/java/sonia/scm/store/MemoryStore.java rename to scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStore.java index c93ab0748d..c2a65bc2e5 100644 --- a/scm-test/src/main/java/sonia/scm/store/MemoryStore.java +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStore.java @@ -28,48 +28,27 @@ * http://bitbucket.org/sdorra/scm-manager * */ - - - package sonia.scm.store; /** - * + * In memory store implementation of {@link ConfigurationStore}. + * * @author Sebastian Sdorra * - * @param + * @param type of stored object */ -public class MemoryStore implements Store -{ +public class InMemoryConfigurationStore implements ConfigurationStore { + + private T object; - /** - * Method description - * - * - * @return - */ @Override - public T get() - { + public T get() { return object; } - //~--- set methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param obejct - */ @Override - public void set(T obejct) - { + public void set(T obejct) { this.object = obejct; } - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private T object; } diff --git a/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStoreFactory.java b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStoreFactory.java new file mode 100644 index 0000000000..d5e9474ff5 --- /dev/null +++ b/scm-test/src/main/java/sonia/scm/store/InMemoryConfigurationStoreFactory.java @@ -0,0 +1,50 @@ +/** + * 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.store; + +//~--- non-JDK imports -------------------------------------------------------- + +/** + * In memory configuration store factory for testing purposes. + * + * @author Sebastian Sdorra + */ +public class InMemoryConfigurationStoreFactory implements ConfigurationStoreFactory { + + @Override + public ConfigurationStore getStore(Class type, String name) + { + return new InMemoryConfigurationStore<>(); + } +} diff --git a/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java b/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java index b7c5fef192..c39efa3ffe 100644 --- a/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java +++ b/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java @@ -56,7 +56,7 @@ public abstract class StoreTestBase extends AbstractTestBase * * @return */ - protected abstract StoreFactory createStoreFactory(); + protected abstract ConfigurationStoreFactory createStoreFactory(); /** * Method description @@ -65,7 +65,7 @@ public abstract class StoreTestBase extends AbstractTestBase @Test public void testGet() { - Store store = createStoreFactory().getStore(StoreObject.class, + ConfigurationStore store = createStoreFactory().getStore(StoreObject.class, "test"); assertNotNull(store); @@ -82,7 +82,7 @@ public abstract class StoreTestBase extends AbstractTestBase @Test public void testSet() { - Store store = createStoreFactory().getStore(StoreObject.class, + ConfigurationStore store = createStoreFactory().getStore(StoreObject.class, "test"); assertNotNull(store); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 26f5283677..f8bc248199 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -54,7 +54,6 @@ import sonia.scm.plugin.DefaultPluginLoader; import sonia.scm.plugin.ExtensionProcessor; import sonia.scm.plugin.PluginWrapper; import sonia.scm.repository.RepositoryManager; -import sonia.scm.store.StoreFactory; import sonia.scm.upgrade.UpgradeManager; import sonia.scm.user.UserManager; import sonia.scm.util.IOUtil; @@ -119,9 +118,6 @@ public class ScmContextListener extends GuiceServletContextListener // close UserManager IOUtil.close(globalInjector.getInstance(UserManager.class)); - // close StoreFactory - IOUtil.close(globalInjector.getInstance(StoreFactory.class)); - // close CacheManager IOUtil.close(globalInjector.getInstance(CacheManager.class)); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index ba4dadfa85..edf2eabdd6 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -91,8 +91,7 @@ import sonia.scm.store.DataStoreFactory; import sonia.scm.store.FileBlobStoreFactory; import sonia.scm.store.JAXBConfigurationEntryStoreFactory; import sonia.scm.store.JAXBDataStoreFactory; -import sonia.scm.store.JAXBStoreFactory; -import sonia.scm.store.StoreFactory; +import sonia.scm.store.JAXBConfigurationStoreFactory; import sonia.scm.template.MustacheTemplateEngine; import sonia.scm.template.TemplateEngine; import sonia.scm.template.TemplateEngineFactory; @@ -127,6 +126,7 @@ import com.sun.jersey.spi.container.servlet.ServletContainer; import java.util.Map; import javax.servlet.ServletContext; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -227,7 +227,7 @@ public class ScmServletModule extends JerseyServletModule ScmConfiguration config = getScmConfiguration(); CipherUtil cu = CipherUtil.getInstance(); - + // bind repository provider ThrowingProviderBinder.create(binder()).bind( RepositoryProvider.class, Repository.class).to( @@ -241,9 +241,8 @@ public class ScmServletModule extends JerseyServletModule bind(ScmEventBus.class).toInstance(ScmEventBus.getInstance()); // bind core - bind(StoreFactory.class, JAXBStoreFactory.class); - bind(ConfigurationEntryStoreFactory.class, - JAXBConfigurationEntryStoreFactory.class); + bind(ConfigurationStoreFactory.class, JAXBConfigurationStoreFactory.class); + bind(ConfigurationEntryStoreFactory.class, JAXBConfigurationEntryStoreFactory.class); bind(DataStoreFactory.class, JAXBDataStoreFactory.class); bind(BlobStoreFactory.class, FileBlobStoreFactory.class); bind(ScmConfiguration.class).toInstance(config); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SupportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SupportResource.java index ac3cf73f86..752491f86b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SupportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/SupportResource.java @@ -53,7 +53,6 @@ import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.security.Role; import sonia.scm.security.ScmSecurityException; -import sonia.scm.store.StoreFactory; import sonia.scm.util.SystemUtil; //~--- JDK imports ------------------------------------------------------------ @@ -73,6 +72,7 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -105,7 +105,7 @@ public class SupportResource @Inject public SupportResource(SCMContextProvider context, ScmConfiguration configuration, PluginManager pluginManager, - StoreFactory storeFactory, RepositoryManager repositoryManager, + ConfigurationStoreFactory storeFactory, RepositoryManager repositoryManager, HttpServletRequest request) { this.context = context; diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 7dc982470e..3f50e8b638 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -46,8 +46,7 @@ import sonia.scm.repository.api.HookFeature; import sonia.scm.repository.spi.HookContextProvider; import sonia.scm.repository.xml.XmlRepositoryDAO; import sonia.scm.security.DefaultKeyGenerator; -import sonia.scm.store.JAXBStoreFactory; -import sonia.scm.store.StoreFactory; +import sonia.scm.store.JAXBConfigurationStoreFactory; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -61,6 +60,7 @@ import java.util.HashSet; import java.util.Set; import java.util.Stack; import org.apache.shiro.authz.UnauthorizedException; +import org.hamcrest.Matchers; import org.junit.Rule; import org.junit.rules.ExpectedException; import org.mockito.invocation.InvocationOnMock; @@ -69,6 +69,7 @@ import sonia.scm.Manager; import sonia.scm.ManagerTestBase; import sonia.scm.event.ScmEventBus; import sonia.scm.security.KeyGenerator; +import sonia.scm.store.ConfigurationStoreFactory; /** * Unit tests for {@link DefaultRepositoryManager}. @@ -282,6 +283,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase repositories = repositoryManager.getAll(); assertEquals(2, repositories.size()); - assertThat(repositories, - containsInAnyOrder( + assertThat(repositories, containsInAnyOrder( hasProperty("id", is("p42")), hasProperty("id", is("hof")) ) @@ -520,9 +521,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase handlerSet = new HashSet<>(); - StoreFactory factory = new JAXBStoreFactory(); - - factory.init(contextProvider); + ConfigurationStoreFactory factory = new JAXBConfigurationStoreFactory(contextProvider); handlerSet.add(new DummyRepositoryHandler(factory)); handlerSet.add(new DummyRepositoryHandler(factory) { @Override diff --git a/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java b/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java index 8a4894fa11..eb892c7e89 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/user/DefaultUserManagerTest.java @@ -42,8 +42,7 @@ import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; -import sonia.scm.store.JAXBStoreFactory; -import sonia.scm.store.StoreFactory; +import sonia.scm.store.JAXBConfigurationStoreFactory; import sonia.scm.user.xml.XmlUserDAO; import sonia.scm.util.MockUtil; @@ -54,6 +53,7 @@ import static org.mockito.Mockito.*; import java.util.Collections; import java.util.List; import org.junit.Rule; +import sonia.scm.store.ConfigurationStoreFactory; /** * @@ -120,18 +120,7 @@ public class DefaultUserManagerTest extends UserManagerTestBase //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - private XmlUserDAO createXmlUserDAO() - { - StoreFactory factory = new JAXBStoreFactory(); - - factory.init(contextProvider); - - return new XmlUserDAO(factory); + private XmlUserDAO createXmlUserDAO() { + return new XmlUserDAO(new JAXBConfigurationStoreFactory(contextProvider)); } }