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 776bd99548..a3e8a1da73 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java @@ -74,8 +74,8 @@ public abstract class AbstractRepositoryHandler */ protected AbstractRepositoryHandler(ConfigurationStoreFactory storeFactory) { this.store = storeFactory - .withName(getType().getName()) .withType(getConfigClass()) + .withName(getType().getName()) .build(); } 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 7d0462d371..0ed0c07869 100644 --- a/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/BlobStoreFactory.java @@ -32,6 +32,8 @@ package sonia.scm.store; +import sonia.scm.repository.Repository; + /** * The BlobStoreFactory can be used to create new or get existing * {@link BlobStore}s. @@ -42,6 +44,51 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.BlobStore */ -public interface BlobStoreFactory extends StoreFactory { +public interface BlobStoreFactory { + BlobStore getStore(final StoreParameters storeParameters); + + default FloatingStoreParameters.Builder withName(String name) { + return new FloatingStoreParameters(this).new Builder(name); + } +} + +final class FloatingStoreParameters implements StoreParameters { + + private String name; + private Repository repository; + + private final BlobStoreFactory factory; + + FloatingStoreParameters(BlobStoreFactory factory) { + this.factory = factory; + } + + public Class getType() { + return null; + } + + public String getName() { + return name; + } + + public Repository getRepository() { + return repository; + } + + public class Builder { + + Builder(String name) { + FloatingStoreParameters.this.name = name; + } + + public FloatingStoreParameters.Builder forRepository(Repository repository) { + FloatingStoreParameters.this.repository = repository; + return this; + } + + public BlobStore build(){ + return factory.getStore(FloatingStoreParameters.this); + } + } } diff --git a/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStoreFactory.java b/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStoreFactory.java index 4a1202e28c..945d3b9742 100644 --- a/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/ConfigurationEntryStoreFactory.java @@ -32,6 +32,8 @@ package sonia.scm.store; +import sonia.scm.repository.Repository; + /** * The ConfigurationEntryStoreFactory can be used to create new or get existing * {@link ConfigurationEntryStore}s. @@ -45,5 +47,59 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.ConfigurationEntryStore */ -public interface ConfigurationEntryStoreFactory extends StoreFactory { +public interface ConfigurationEntryStoreFactory { + ConfigurationEntryStore getStore(final StoreParameters storeParameters); + + default TypedFloatingConfigurationEntryStoreParameters.Builder withType(Class type) { + return new TypedFloatingConfigurationEntryStoreParameters(this).new Builder(type); + } +} + +final class TypedFloatingConfigurationEntryStoreParameters implements StoreParameters { + + private Class type; + private String name; + private Repository repository; + + private final ConfigurationEntryStoreFactory factory; + + TypedFloatingConfigurationEntryStoreParameters(ConfigurationEntryStoreFactory factory) { + this.factory = factory; + } + + public Class getType() { + return type; + } + + public String getName() { + return name; + } + + public Repository getRepository() { + return repository; + } + + public class Builder { + + Builder(Class type) { + TypedFloatingConfigurationEntryStoreParameters.this.type = type; + } + + public OptionalRepositoryBuilder withName(String name) { + TypedFloatingConfigurationEntryStoreParameters.this.name = name; + return new OptionalRepositoryBuilder(); + } + } + + public class OptionalRepositoryBuilder { + + public OptionalRepositoryBuilder forRepository(Repository repository) { + TypedFloatingConfigurationEntryStoreParameters.this.repository = repository; + return this; + } + + public ConfigurationEntryStore build(){ + return factory.getStore(TypedFloatingConfigurationEntryStoreParameters.this); + } + } } diff --git a/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java b/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java index 6cf9541139..030be50f9e 100644 --- a/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/ConfigurationStoreFactory.java @@ -33,6 +33,8 @@ package sonia.scm.store; +import sonia.scm.repository.Repository; + /** * The ConfigurationStoreFactory can be used to create new or get existing * {@link ConfigurationStore} objects. @@ -45,4 +47,59 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.ConfigurationStore */ -public interface ConfigurationStoreFactory extends StoreFactory{} +public interface ConfigurationStoreFactory { + ConfigurationStore getStore(final StoreParameters storeParameters); + + default TypedFloatingConfigurationStoreParameters.Builder withType(Class type) { + return new TypedFloatingConfigurationStoreParameters(this).new Builder(type); + } +} + +final class TypedFloatingConfigurationStoreParameters implements StoreParameters { + + private Class type; + private String name; + private Repository repository; + + private final ConfigurationStoreFactory factory; + + TypedFloatingConfigurationStoreParameters(ConfigurationStoreFactory factory) { + this.factory = factory; + } + + public Class getType() { + return type; + } + + public String getName() { + return name; + } + + public Repository getRepository() { + return repository; + } + + public class Builder { + + Builder(Class type) { + TypedFloatingConfigurationStoreParameters.this.type = type; + } + + public OptionalRepositoryBuilder withName(String name) { + TypedFloatingConfigurationStoreParameters.this.name = name; + return new OptionalRepositoryBuilder(); + } + } + + public class OptionalRepositoryBuilder { + + public OptionalRepositoryBuilder forRepository(Repository repository) { + TypedFloatingConfigurationStoreParameters.this.repository = repository; + return this; + } + + public ConfigurationStore build(){ + return factory.getStore(TypedFloatingConfigurationStoreParameters.this); + } + } +} 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 c1e171a74b..ff324a9af4 100644 --- a/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java +++ b/scm-core/src/main/java/sonia/scm/store/DataStoreFactory.java @@ -32,6 +32,8 @@ package sonia.scm.store; +import sonia.scm.repository.Repository; + /** * The DataStoreFactory can be used to create new or get existing * {@link DataStore}s. @@ -42,4 +44,59 @@ package sonia.scm.store; * @apiviz.landmark * @apiviz.uses sonia.scm.store.DataStore */ -public interface DataStoreFactory extends StoreFactory{} +public interface DataStoreFactory { + DataStore getStore(final StoreParameters storeParameters); + + default TypedFloatingDataStoreParameters.Builder withType(Class type) { + return new TypedFloatingDataStoreParameters(this).new Builder(type); + } +} + +final class TypedFloatingDataStoreParameters implements StoreParameters { + + private Class type; + private String name; + private Repository repository; + + private final DataStoreFactory factory; + + TypedFloatingDataStoreParameters(DataStoreFactory factory) { + this.factory = factory; + } + + public Class getType() { + return type; + } + + public String getName() { + return name; + } + + public Repository getRepository() { + return repository; + } + + public class Builder { + + Builder(Class type) { + TypedFloatingDataStoreParameters.this.type = type; + } + + public OptionalRepositoryBuilder withName(String name) { + TypedFloatingDataStoreParameters.this.name = name; + return new OptionalRepositoryBuilder(); + } + } + + public class OptionalRepositoryBuilder { + + public OptionalRepositoryBuilder forRepository(Repository repository) { + TypedFloatingDataStoreParameters.this.repository = repository; + return this; + } + + public DataStore build(){ + return factory.getStore(TypedFloatingDataStoreParameters.this); + } + } +} diff --git a/scm-core/src/main/java/sonia/scm/store/StoreFactory.java b/scm-core/src/main/java/sonia/scm/store/StoreFactory.java deleted file mode 100644 index 012c334983..0000000000 --- a/scm-core/src/main/java/sonia/scm/store/StoreFactory.java +++ /dev/null @@ -1,58 +0,0 @@ -package sonia.scm.store; - -import sonia.scm.repository.Repository; - -public interface StoreFactory { - - STORE getStore(final StoreParameters storeParameters); - - default FloatingStoreParameters.Builder withName(String name) { - return new FloatingStoreParameters<>(this).new Builder(name); - } -} - -final class FloatingStoreParameters implements StoreParameters { - - private Class type; - private String name; - private Repository repository; - - private final StoreFactory factory; - - FloatingStoreParameters(StoreFactory factory) { - this.factory = factory; - } - - public Class getType() { - return type; - } - - public String getName() { - return name; - } - - public Repository getRepository() { - return repository; - } - - public class Builder { - - Builder(String name) { - FloatingStoreParameters.this.name = name; - } - - public FloatingStoreParameters.Builder withType(Class type) { - FloatingStoreParameters.this.type = type; - return this; - } - - public FloatingStoreParameters.Builder forRepository(Repository repository) { - FloatingStoreParameters.this.repository = repository; - return this; - } - - public STORE build(){ - return factory.getStore(FloatingStoreParameters.this); - } - } -} diff --git a/scm-core/src/main/java/sonia/scm/store/StoreParameters.java b/scm-core/src/main/java/sonia/scm/store/StoreParameters.java index c1bb2473ea..c46611ac40 100644 --- a/scm-core/src/main/java/sonia/scm/store/StoreParameters.java +++ b/scm-core/src/main/java/sonia/scm/store/StoreParameters.java @@ -8,9 +8,9 @@ import sonia.scm.repository.Repository; * @author Mohamed Karray * @since 2.0.0 */ -public interface StoreParameters{ +public interface StoreParameters { - Class getType(); + Class getType(); String getName(); 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 02ea2bd248..d6b65b41bd 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 @@ -66,8 +66,8 @@ public class XmlGroupDAO extends AbstractXmlDAO @Inject public XmlGroupDAO(ConfigurationStoreFactory storeFactory) { super(storeFactory - .withName(STORE_NAME) .withType(XmlGroupDatabase.class) + .withName(STORE_NAME) .build()); } 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 ca6d393a28..ea7f18fbba 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 @@ -65,8 +65,8 @@ public class XmlUserDAO extends AbstractXmlDAO public XmlUserDAO(ConfigurationStoreFactory storeFactory) { super(storeFactory - .withName(STORE_NAME) .withType(XmlUserDatabase.class) + .withName(STORE_NAME) .build()); } diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/FileBlobStoreTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/FileBlobStoreTest.java index e58afe5e86..3ec16baa57 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/FileBlobStoreTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/FileBlobStoreTest.java @@ -67,7 +67,6 @@ public class FileBlobStoreTest extends BlobStoreTestBase public void shouldStoreAndLoadInRepository() { BlobStore store = createBlobStoreFactory() .withName("test") - .withType(StoreObject.class) .forRepository(new Repository("id", "git", "ns", "n")) .build(); diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationEntryStoreTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationEntryStoreTest.java index e130b0d205..ae84f9d768 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationEntryStoreTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationEntryStoreTest.java @@ -133,8 +133,8 @@ public class JAXBConfigurationEntryStoreTest store.put("a45", new AssignedPermission("tuser4", "repository:create")); store = createConfigurationStoreFactory() - .withName(name) .withType(AssignedPermission.class) + .withName(name) .build(); AssignedPermission ap = store.get("a45"); @@ -232,8 +232,8 @@ public class JAXBConfigurationEntryStoreTest copy(resource, name); return createConfigurationStoreFactory() - .withName(name) .withType(AssignedPermission.class) + .withName(name) .build(); } } diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java index 4e3dc29faa..802f193340 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBConfigurationStoreTest.java @@ -57,8 +57,8 @@ public class JAXBConfigurationStoreTest extends StoreTestBase { public void shouldStoreAndLoadInRepository() { ConfigurationStore store = createStoreFactory() - .withName("test") .withType(StoreObject.class) + .withName("test") .forRepository(new Repository("id", "git", "ns", "n")) .build(); diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBDataStoreTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBDataStoreTest.java index b06f06fb9c..04d86aa625 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBDataStoreTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBDataStoreTest.java @@ -62,8 +62,8 @@ public class JAXBDataStoreTest extends DataStoreTestBase { @Override protected DataStore getDataStore(Class type, Repository repository) { return createDataStoreFactory() - .withName("test") .withType(type) + .withName("test") .forRepository(repository) .build(); } @@ -71,8 +71,8 @@ public class JAXBDataStoreTest extends DataStoreTestBase { @Override protected DataStore getDataStore(Class type) { return createDataStoreFactory() - .withName("test") .withType(type) + .withName("test") .build(); } 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 bc4c702320..dbd67a7f8e 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 @@ -86,7 +86,7 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Before public void initFactory() { - when(factory.withName(any())).thenCallRealMethod(); + when(factory.withType(any())).thenCallRealMethod(); } @Override 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 7e534e3453..c45d9ab358 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 @@ -72,7 +72,7 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Before public void initFactory() { - when(factory.withName(any())).thenCallRealMethod(); + when(factory.withType(any())).thenCallRealMethod(); } @Override 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 8f366b2ec3..7b22e15c94 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 @@ -107,7 +107,7 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Test public void getDirectory() { - when(factory.withName(any())).thenCallRealMethod(); + when(factory.withType(any())).thenCallRealMethod(); SvnRepositoryHandler repositoryHandler = new SvnRepositoryHandler(factory, facade, locationResolver); diff --git a/scm-test/src/main/java/sonia/scm/store/ConfigurationEntryStoreTestBase.java b/scm-test/src/main/java/sonia/scm/store/ConfigurationEntryStoreTestBase.java index 8ed7e33eb8..140bd54e65 100644 --- a/scm-test/src/main/java/sonia/scm/store/ConfigurationEntryStoreTestBase.java +++ b/scm-test/src/main/java/sonia/scm/store/ConfigurationEntryStoreTestBase.java @@ -52,16 +52,16 @@ public abstract class ConfigurationEntryStoreTestBase extends KeyValueStoreTestB @Override protected ConfigurationEntryStore getDataStore(Class type) { return this.createConfigurationStoreFactory() - .withName(storeName) .withType(type) + .withName(storeName) .build(); } @Override protected ConfigurationEntryStore getDataStore(Class type, Repository repository) { return this.createConfigurationStoreFactory() - .withName(repoStoreName) .withType(type) + .withName(repoStoreName) .forRepository(repository) .build(); } diff --git a/scm-test/src/main/java/sonia/scm/store/DataStoreTestBase.java b/scm-test/src/main/java/sonia/scm/store/DataStoreTestBase.java index ce00290ee5..f109e55119 100644 --- a/scm-test/src/main/java/sonia/scm/store/DataStoreTestBase.java +++ b/scm-test/src/main/java/sonia/scm/store/DataStoreTestBase.java @@ -65,13 +65,13 @@ public abstract class DataStoreTestBase extends KeyValueStoreTestBase // TODO public void shouldStoreRepositorySpecificData() { - StoreFactory dataStoreFactory = createDataStoreFactory(); + DataStoreFactory dataStoreFactory = createDataStoreFactory(); StoreObject obj = new StoreObject("test-1"); Repository repository = RepositoryTestData.createHeartOfGold(); DataStore store = dataStoreFactory - .withName("test") .withType(StoreObject.class) + .withName("test") .forRepository(repository) .build(); 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 41acb043a7..ef806c79f8 100644 --- a/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java +++ b/scm-test/src/main/java/sonia/scm/store/StoreTestBase.java @@ -66,7 +66,7 @@ public abstract class StoreTestBase extends AbstractTestBase @Test public void testGet() { - ConfigurationStore store = createStoreFactory().withName("test").withType(StoreObject.class).build(); + ConfigurationStore store = createStoreFactory().withType(StoreObject.class).withName("test").build(); assertNotNull(store); @@ -82,7 +82,7 @@ public abstract class StoreTestBase extends AbstractTestBase @Test public void testSet() { - ConfigurationStore store = createStoreFactory().withName("test").withType(StoreObject.class).build(); + ConfigurationStore store = createStoreFactory().withType(StoreObject.class).withName("test").build(); assertNotNull(store); diff --git a/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java b/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java index 1a1b1c2985..e93d4de597 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java +++ b/scm-webapp/src/main/java/sonia/scm/security/DefaultSecuritySystem.java @@ -112,8 +112,8 @@ public class DefaultSecuritySystem implements SecuritySystem public DefaultSecuritySystem(ConfigurationEntryStoreFactory storeFactory) { store = storeFactory - .withName(NAME) .withType(AssignedPermission.class) + .withName(NAME) .build(); readAvailablePermissions(); } diff --git a/scm-webapp/src/main/java/sonia/scm/security/SecureKeyResolver.java b/scm-webapp/src/main/java/sonia/scm/security/SecureKeyResolver.java index 700870db7c..a369db66bd 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/SecureKeyResolver.java +++ b/scm-webapp/src/main/java/sonia/scm/security/SecureKeyResolver.java @@ -91,8 +91,8 @@ public class SecureKeyResolver extends SigningKeyResolverAdapter public SecureKeyResolver(ConfigurationEntryStoreFactory storeFactory) { store = storeFactory - .withName(STORE_NAME) .withType(SecureKey.class) + .withName(STORE_NAME) .build(); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java index 435997633b..d392aefe4e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java @@ -67,7 +67,7 @@ public class AutoCompleteResourceTest { xmlDB = mock(XmlDatabase.class); when(storeConfig.get()).thenReturn(xmlDB); when(storeFactory.getStore(any())).thenReturn(storeConfig); - when(storeFactory.withName(any())).thenCallRealMethod(); + when(storeFactory.withType(any())).thenCallRealMethod(); XmlUserDAO userDao = new XmlUserDAO(storeFactory); this.userDao = spy(userDao); XmlGroupDAO groupDAO = new XmlGroupDAO(storeFactory); diff --git a/scm-webapp/src/test/java/sonia/scm/security/SecureKeyResolverTest.java b/scm-webapp/src/test/java/sonia/scm/security/SecureKeyResolverTest.java index 7609fd69a9..c4f281537e 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/SecureKeyResolverTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/SecureKeyResolverTest.java @@ -126,8 +126,8 @@ public class SecureKeyResolverTest { ConfigurationEntryStoreFactory factory = mock(ConfigurationEntryStoreFactory.class); - when(factory.withName(any())).thenCallRealMethod(); - when(factory.getStore(argThat(storeParameters -> { + when(factory.withType(any())).thenCallRealMethod(); + when(factory.getStore(argThat(storeParameters -> { assertThat(storeParameters.getName()).isEqualTo(SecureKeyResolver.STORE_NAME); assertThat(storeParameters.getType()).isEqualTo(SecureKey.class); return true;