From f8ae7cedf7a458397a7f0f69bf29a12e76226185 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Thu, 15 Nov 2018 10:04:16 +0100 Subject: [PATCH] Refactor the repository store implementation in order to store repositories in specific paths. --- .../scm/repository/AbstactImportHandler.java | 40 ------ .../AbstractSimpleRepositoryHandler.java | 94 ++++---------- .../InitialRepositoryLocationResolver.java | 58 +++++++++ .../repository/PathBasedRepositoryDAO.java | 20 +++ .../scm/repository/RepositoryConfig.java | 65 +++------- .../RepositoryDirectoryHandler.java | 16 ++- .../RepositoryLocationResolver.java | 73 +++++++++++ .../RepositoryPathNotFoundException.java | 12 ++ .../sonia/scm/repository/RepositoryUtil.java | 14 +-- .../scm/repository/RepositoryUtilTest.java | 26 +--- .../scm/repository/xml/RepositoryPath.java | 90 ++++++++++++++ .../scm/repository/xml/XmlRepositoryDAO.java | 84 ++++++++++--- .../repository/xml/XmlRepositoryDatabase.java | 117 ++++++++---------- .../scm/repository/xml/XmlRepositoryList.java | 16 +-- .../xml/XmlRepositoryMapAdapter.java | 83 +++++++++---- .../JAXBConfigurationEntryStoreFactory.java | 2 +- .../store/JAXBConfigurationStoreFactory.java | 4 +- .../java/sonia/scm/store/StoreConstants.java | 10 +- .../java/sonia/scm/xml/AbstractXmlDAO.java | 31 +++-- .../scm/api/v2/resources/GitConfigDto.java | 3 - .../scm/repository/GitRepositoryHandler.java | 10 +- .../sonia/scm/web/GitRepositoryResolver.java | 28 +---- .../GitConfigDtoToGitConfigMapperTest.java | 4 - .../v2/resources/GitConfigResourceTest.java | 2 - .../GitConfigToGitConfigDtoMapperTest.java | 2 - .../repository/GitRepositoryHandlerTest.java | 35 ++++-- .../scm/web/GitRepositoryResolverTest.java | 110 ---------------- .../scm/api/v2/resources/HgConfigDto.java | 3 - .../scm/installer/AbstractHgInstaller.java | 26 ---- .../sonia/scm/installer/UnixHgInstaller.java | 2 - .../scm/installer/WindowsHgInstaller.java | 2 - .../scm/repository/HgRepositoryHandler.java | 11 +- .../spi/HgHookChangesetProvider.java | 5 +- .../HgConfigDtoToHgConfigMapperTest.java | 2 - .../v2/resources/HgConfigResourceTest.java | 2 - .../scm/api/v2/resources/HgConfigTests.java | 2 - .../repository/HgRepositoryHandlerTest.java | 24 ++-- .../java/sonia/scm/repository/HgTestUtil.java | 11 +- .../spi/AbstractHgCommandTestBase.java | 4 +- .../spi/IncomingOutgoingTestBase.java | 4 +- .../scm/web/HgHookCallbackServletTest.java | 9 +- .../scm/api/v2/resources/SvnConfigDto.java | 3 - .../scm/repository/SvnRepositoryHandler.java | 4 +- .../SvnConfigDtoToSvnConfigMapperTest.java | 4 - .../v2/resources/SvnConfigResourceTest.java | 2 - .../SvnConfigToSvnConfigDtoMapperTest.java | 2 - .../repository/SvnRepositoryHandlerTest.java | 25 ++-- .../repository/DummyRepositoryHandler.java | 5 +- .../SimpleRepositoryHandlerTestBase.java | 7 +- .../repository/DefaultRepositoryManager.java | 2 +- .../DefaultRepositoryManagerTest.java | 12 +- 51 files changed, 628 insertions(+), 594 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/InitialRepositoryLocationResolver.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/PathBasedRepositoryDAO.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/RepositoryPathNotFoundException.java create mode 100644 scm-dao-xml/src/main/java/sonia/scm/repository/xml/RepositoryPath.java delete mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitRepositoryResolverTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java index 2195e87730..1f1e7cfefb 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java @@ -37,7 +37,6 @@ package sonia.scm.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.AlreadyExistsException; import sonia.scm.repository.ImportResult.Builder; import java.io.File; @@ -230,49 +229,10 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler // } } - /** - * Method description - * - * - * @param manager - * @param repositoryName - * - * - * @return - * @throws IOException - */ - private void importRepository(RepositoryManager manager, - String repositoryName) - throws IOException, AlreadyExistsException { - Repository repository = - createRepository(getRepositoryDirectory(repositoryName), repositoryName); - if (logger.isInfoEnabled()) - { - logger.info("import repository {} of type {}", repositoryName, - getTypeName()); - } - - manager.importRepository(repository); - } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param repositoryName - * - * @return - */ - private File getRepositoryDirectory(String repositoryName) - { - return new File( - getRepositoryHandler().getConfig().getRepositoryDirectory(), - repositoryName); - } - /** * Method description * 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 a717cdf05b..ac6879a2b9 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -44,7 +44,6 @@ import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; import sonia.scm.io.FileSystem; import sonia.scm.store.ConfigurationStoreFactory; -import sonia.scm.util.IOUtil; import java.io.File; import java.io.IOException; @@ -61,8 +60,6 @@ public abstract class AbstractSimpleRepositoryHandler * 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. + * 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. + * 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. - * + * 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 @@ -24,13 +24,11 @@ * 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.repository; import sonia.scm.Validateable; @@ -38,7 +36,6 @@ import sonia.scm.config.Configuration; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; -import java.io.File; /** * Basic {@link Repository} configuration class. @@ -46,20 +43,10 @@ import java.io.File; * @author Sebastian Sdorra */ @XmlRootElement -public abstract class RepositoryConfig implements Validateable, Configuration -{ - - /** - * Returns the directory for the repositories. - * - * - * @return directory for the repositories - */ - public File getRepositoryDirectory() - { - return repositoryDirectory; - } +public abstract class RepositoryConfig implements Validateable, Configuration { + /** true if the plugin is disabled */ + private boolean disabled = false; /** * Returns true if the plugin is disabled. * @@ -67,8 +54,7 @@ public abstract class RepositoryConfig implements Validateable, Configuration * @return true if the plugin is disabled * @since 1.13 */ - public boolean isDisabled() - { + public boolean isDisabled() { return disabled; } @@ -79,9 +65,8 @@ public abstract class RepositoryConfig implements Validateable, Configuration * @return true if the configuration object is valid */ @Override - public boolean isValid() - { - return repositoryDirectory != null; + public boolean isValid() { + return true; } //~--- set methods ---------------------------------------------------------- @@ -93,29 +78,11 @@ public abstract class RepositoryConfig implements Validateable, Configuration * @param disabled * @since 1.13 */ - public void setDisabled(boolean disabled) - { + public void setDisabled(boolean disabled) { this.disabled = disabled; } - /** - * Sets the directory for the repositories - * - * - * @param repositoryDirectory directory for repositories - */ - public void setRepositoryDirectory(File repositoryDirectory) - { - this.repositoryDirectory = repositoryDirectory; - } - //~--- fields --------------------------------------------------------------- - - /** true if the plugin is disabled */ - private boolean disabled = false; - - /** directory for repositories */ - private File repositoryDirectory; /** * Specifies the identifier of the concrete {@link RepositoryConfig} when checking permissions of an object. diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryDirectoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryDirectoryHandler.java index 2f766fb1f6..9891c307bf 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryDirectoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryDirectoryHandler.java @@ -40,8 +40,18 @@ import java.io.File; * @author Sebastian Sdorra * @since 1.36 */ -public interface RepositoryDirectoryHandler extends RepositoryHandler -{ +public interface RepositoryDirectoryHandler extends RepositoryHandler { - public File getDirectory(Repository repository); + /** + * Get the current directory of the given repository + * @param repository + * @return the current directory of the given repository + */ + File getDirectory(Repository repository); + + /** + * get the initial directory of all repositories + * @return the initial directory of all repositories + */ + File getInitialBaseDirectory(); } diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java new file mode 100644 index 0000000000..5515c3eb88 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryLocationResolver.java @@ -0,0 +1,73 @@ +package sonia.scm.repository; + +import groovy.lang.Singleton; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; + +import static sonia.scm.repository.InitialRepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY; + +/** + * + * A Location Resolver for File based Repository Storage. + * + * WARNING: The Locations provided with this class may not be used from the plugins to store any plugin specific files. + * + * Please use the {@link sonia.scm.store.DataStoreFactory } and the {@link sonia.scm.store.DataStore} classes to store data + * Please use the {@link sonia.scm.store.BlobStoreFactory } and the {@link sonia.scm.store.BlobStore} classes to store binary files + * Please use the {@link sonia.scm.store.ConfigurationStoreFactory} and the {@link sonia.scm.store.ConfigurationStore} classes to store configurations + * + * @author Mohamed Karray + * @since 2.0.0 + */ +@Singleton +public class RepositoryLocationResolver { + + private RepositoryDAO repositoryDAO; + private InitialRepositoryLocationResolver initialRepositoryLocationResolver; + + @Inject + public RepositoryLocationResolver(RepositoryDAO repositoryDAO, InitialRepositoryLocationResolver initialRepositoryLocationResolver) { + this.repositoryDAO = repositoryDAO; + this.initialRepositoryLocationResolver = initialRepositoryLocationResolver; + } + + /** + * Get the current repository directory from the dao or create the initial directory if the repository does not exists + * @param repository + * @return the current repository directory from the dao or the initial directory if the repository does not exists + * @throws IOException + */ + public File getRepositoryDirectory(Repository repository) throws IOException { + if (repositoryDAO instanceof PathBasedRepositoryDAO) { + PathBasedRepositoryDAO pathBasedRepositoryDAO = (PathBasedRepositoryDAO) repositoryDAO; + try { + return pathBasedRepositoryDAO.getPath(repository).toFile(); + } catch (RepositoryPathNotFoundException e) { + return createInitialDirectory(repository); + } + } + return createInitialDirectory(repository); + } + + public File getInitialBaseDirectory() { + return initialRepositoryLocationResolver.getBaseDirectory(); + } + + public File createInitialDirectory(Repository repository) throws IOException { + return initialRepositoryLocationResolver.createDirectory(repository); + } + + public File getInitialDirectory(Repository repository) { + return initialRepositoryLocationResolver.getDirectory(repository); + } + + public File getNativeDirectory(Repository repository) throws IOException { + return new File (getRepositoryDirectory(repository), REPOSITORIES_NATIVE_DIRECTORY); + } + + public File getInitialNativeDirectory(Repository repository) { + return new File (getInitialDirectory(repository), REPOSITORIES_NATIVE_DIRECTORY); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryPathNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryPathNotFoundException.java new file mode 100644 index 0000000000..96f76346b3 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryPathNotFoundException.java @@ -0,0 +1,12 @@ + +package sonia.scm.repository; + +public class RepositoryPathNotFoundException extends Exception { + + public static final String REPOSITORY_PATH_NOT_FOUND = "Repository path not found"; + + public RepositoryPathNotFoundException() { + super(REPOSITORY_PATH_NOT_FOUND); + } + +} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java index a90eb4cc34..f65e71db9f 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryUtil.java @@ -66,16 +66,12 @@ public final class RepositoryUtil { } @SuppressWarnings("squid:S2083") // ignore, because the path is validated at {@link #getRepositoryId(File, File)} - public static String getRepositoryId(AbstractRepositoryHandler handler, String directoryPath) throws IOException { - return getRepositoryId(handler.getConfig().getRepositoryDirectory(), new File(directoryPath)); + public static String getRepositoryId(RepositoryDirectoryHandler handler, String directoryPath) throws IOException { + return getRepositoryId(handler.getInitialBaseDirectory(), new File(directoryPath)); } - public static String getRepositoryId(AbstractRepositoryHandler handler, File directory) throws IOException { - return getRepositoryId(handler.getConfig(), directory); - } - - public static String getRepositoryId(RepositoryConfig config, File directory) throws IOException { - return getRepositoryId(config.getRepositoryDirectory(), directory); + public static String getRepositoryId(RepositoryDirectoryHandler handler, File directory) throws IOException { + return getRepositoryId(handler.getInitialBaseDirectory(), directory); } public static String getRepositoryId(File baseDirectory, File directory) throws IOException { @@ -87,7 +83,7 @@ public final class RepositoryUtil { "repository path %s is not in the main repository path %s", path, basePath ); - String id = IOUtil.trimSeperatorChars(path.substring(basePath.length())); + String id = IOUtil.trimSeperatorChars(path.substring(basePath.length()).replace(InitialRepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY, "")); Preconditions.checkArgument( !id.contains("\\") && !id.contains("/"), diff --git a/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java b/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java index fabc55b9c9..deaeb1ced5 100644 --- a/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/RepositoryUtilTest.java @@ -21,25 +21,18 @@ public class RepositoryUtilTest { public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Mock - private AbstractRepositoryHandler repositoryHandler; + private RepositoryDirectoryHandler repositoryHandler; - private RepositoryConfig repositoryConfig = new RepositoryConfig() { - @Override - public String getId() { - return "repository"; - } - }; + private File repositoryTypeRoot; @Before - public void setUpMocks() { - when(repositoryHandler.getConfig()).thenReturn(repositoryConfig); + public void setUpMocks() throws IOException { + repositoryTypeRoot = temporaryFolder.newFolder(); + when(repositoryHandler.getInitialBaseDirectory()).thenReturn(repositoryTypeRoot); } @Test public void testGetRepositoryId() throws IOException { - File repositoryTypeRoot = temporaryFolder.newFolder(); - repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); - File repository = new File(repositoryTypeRoot, "abc"); String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath()); assertEquals("abc", id); @@ -47,9 +40,6 @@ public class RepositoryUtilTest { @Test(expected = IllegalArgumentException.class) public void testGetRepositoryIdWithInvalidPath() throws IOException { - File repositoryTypeRoot = temporaryFolder.newFolder(); - repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); - File repository = new File("/etc/abc"); String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath()); assertEquals("abc", id); @@ -57,9 +47,6 @@ public class RepositoryUtilTest { @Test(expected = IllegalArgumentException.class) public void testGetRepositoryIdWithInvalidPathButSameLength() throws IOException { - File repositoryTypeRoot = temporaryFolder.newFolder(); - repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); - File repository = new File(temporaryFolder.newFolder(), "abc"); String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath()); @@ -68,9 +55,6 @@ public class RepositoryUtilTest { @Test(expected = IllegalArgumentException.class) public void testGetRepositoryIdWithInvalidId() throws IOException { - File repositoryTypeRoot = temporaryFolder.newFolder(); - repositoryConfig.setRepositoryDirectory(repositoryTypeRoot); - File repository = new File(repositoryTypeRoot, "abc/123"); RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath()); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/RepositoryPath.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/RepositoryPath.java new file mode 100644 index 0000000000..bf2d812e40 --- /dev/null +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/RepositoryPath.java @@ -0,0 +1,90 @@ +package sonia.scm.repository.xml; + +import org.apache.commons.lang.StringUtils; +import sonia.scm.ModelObject; +import sonia.scm.repository.Repository; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +@XmlRootElement(name = "repository-link") +@XmlAccessorType(XmlAccessType.FIELD) +public class RepositoryPath implements ModelObject { + + private String path; + private String id; + private Long lastModified; + private Long creationDate; + + @XmlTransient + private Repository repository; + + /** + * Needed from JAXB + */ + public RepositoryPath() { + } + + public RepositoryPath(String path, String id, Repository repository) { + this.path = path; + this.id = id; + this.repository = repository; + } + + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + @Override + public String getId() { + return id; + } + + @Override + public void setLastModified(Long lastModified) { + this.lastModified = lastModified; + } + + @Override + public Long getCreationDate() { + return creationDate; + } + + @Override + public void setCreationDate(Long creationDate) { + this.creationDate = creationDate; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public Long getLastModified() { + return lastModified; + } + + @Override + public String getType() { + return getRepository()!= null? getRepository().getType():""; + } + + @Override + public boolean isValid() { + return StringUtils.isNotEmpty(path); + } +} 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 4510706721..eadf277dd3 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 @@ -36,80 +36,124 @@ package sonia.scm.repository.xml; import com.google.inject.Inject; import com.google.inject.Singleton; +import sonia.scm.repository.InitialRepositoryLocationResolver; import sonia.scm.repository.NamespaceAndName; +import sonia.scm.repository.PathBasedRepositoryDAO; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryDAO; +import sonia.scm.repository.RepositoryPathNotFoundException; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.xml.AbstractXmlDAO; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.Optional; + /** - * * @author Sebastian Sdorra */ @Singleton public class XmlRepositoryDAO - extends AbstractXmlDAO - implements RepositoryDAO -{ + extends AbstractXmlDAO + implements PathBasedRepositoryDAO { - /** Field description */ + /** + * Field description + */ public static final String STORE_NAME = "repositories"; + private InitialRepositoryLocationResolver initialRepositoryLocationResolver; //~--- constructors --------------------------------------------------------- /** * Constructs ... * - * * @param storeFactory */ @Inject - public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory) - { + public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory, InitialRepositoryLocationResolver initialRepositoryLocationResolver) { super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)); + this.initialRepositoryLocationResolver = initialRepositoryLocationResolver; } //~--- methods -------------------------------------------------------------- @Override - public boolean contains(NamespaceAndName namespaceAndName) - { + public boolean contains(NamespaceAndName namespaceAndName) { return db.contains(namespaceAndName); } //~--- get methods ---------------------------------------------------------- @Override - public Repository get(NamespaceAndName namespaceAndName) - { + public Repository get(NamespaceAndName namespaceAndName) { return db.get(namespaceAndName); } //~--- methods -------------------------------------------------------------- + + @Override + public void modify(Repository repository) { + db.remove(repository.getId()); + add(repository); + } + + @Override + public void add(Repository repository) { + String path = initialRepositoryLocationResolver.getDirectory(repository).getAbsolutePath(); + RepositoryPath repositoryPath = new RepositoryPath(path, repository.getId(), repository.clone()); + synchronized (store) { + db.add(repositoryPath); + storeDB(); + } + } + + @Override + public Repository get(String id) { + RepositoryPath repositoryPath = db.get(id); + if (repositoryPath != null) { + return repositoryPath.getRepository(); + } + return null; + } + + @Override + public Collection getAll() { + return db.getRepositories(); + } + /** * Method description * - * * @param repository - * * @return */ @Override - protected Repository clone(Repository repository) - { + protected Repository clone(Repository repository) { return repository.clone(); } /** * Method description * - * * @return */ @Override - protected XmlRepositoryDatabase createNewDatabase() - { + protected XmlRepositoryDatabase createNewDatabase() { return new XmlRepositoryDatabase(); } + + @Override + public Path getPath(Repository repository) throws RepositoryPathNotFoundException { + Optional repositoryPath = db.getPaths().stream() + .filter(repoPath -> repoPath.getId().equals(repository.getId())) + .findFirst(); + if (!repositoryPath.isPresent()) { + throw new RepositoryPathNotFoundException(); + } else { + + return Paths.get(repositoryPath.get().getPath()); + } + } } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java index 93be611213..bf08909378 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java @@ -44,21 +44,29 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; //~--- JDK imports ------------------------------------------------------------ @XmlRootElement(name = "repository-db") @XmlAccessorType(XmlAccessType.FIELD) -public class XmlRepositoryDatabase implements XmlDatabase -{ +public class XmlRepositoryDatabase implements XmlDatabase { - public XmlRepositoryDatabase() - { + private Long creationTime; + + private Long lastModified; + + @XmlJavaTypeAdapter(XmlRepositoryMapAdapter.class) + @XmlElement(name = "repositories") + private Map repositoryPathMap = new LinkedHashMap<>(); + + + public XmlRepositoryDatabase() { long c = System.currentTimeMillis(); - creationTime = c; lastModified = c; } @@ -74,14 +82,14 @@ public class XmlRepositoryDatabase implements XmlDatabase } @Override - public void add(Repository repository) + public void add(RepositoryPath repositoryPath) { - repositoryMap.put(createKey(repository), repository); + repositoryPathMap.put(createKey(repositoryPath.getRepository()), repositoryPath); } public boolean contains(NamespaceAndName namespaceAndName) { - return repositoryMap.containsKey(createKey(namespaceAndName)); + return repositoryPathMap.containsKey(createKey(namespaceAndName)); } @Override @@ -92,61 +100,55 @@ public class XmlRepositoryDatabase implements XmlDatabase public boolean contains(Repository repository) { - return repositoryMap.containsKey(createKey(repository)); + return repositoryPathMap.containsKey(createKey(repository)); } public void remove(Repository repository) { - repositoryMap.remove(createKey(repository)); + repositoryPathMap.remove(createKey(repository)); } @Override - public Repository remove(String id) + public RepositoryPath remove(String id) { - Repository r = get(id); - - remove(r); - - return r; + return repositoryPathMap.remove(createKey(get(id).getRepository())); } - @Override - public Collection values() - { - return repositoryMap.values(); - } - - //~--- get methods ---------------------------------------------------------- - - public Repository get(NamespaceAndName namespaceAndName) - { - return repositoryMap.get(createKey(namespaceAndName)); - } - - /** - * Method description - * - * - * @param id - * - * @return - */ - @Override - public Repository get(String id) - { - Repository repository = null; - - for (Repository r : values()) - { - if (r.getId().equals(id)) - { - repository = r; - - break; - } + public Collection getRepositories() { + List repositories = new ArrayList<>(); + for (RepositoryPath repositoryPath : repositoryPathMap.values()) { + Repository repository = repositoryPath.getRepository(); + repositories.add(repository); } + return repositories; + } - return repository; + @Override + public Collection values() + { + return repositoryPathMap.values(); + } + + public Collection getPaths() { + return repositoryPathMap.values(); + } + + + public Repository get(NamespaceAndName namespaceAndName) { + RepositoryPath repositoryPath = repositoryPathMap.get(createKey(namespaceAndName)); + if (repositoryPath != null) { + return repositoryPath.getRepository(); + } + return null; + } + + + @Override + public RepositoryPath get(String id) { + return values().stream() + .filter(repoPath -> repoPath.getId().equals(id)) + .findFirst() + .orElse(null); } /** @@ -198,17 +200,4 @@ public class XmlRepositoryDatabase implements XmlDatabase { this.lastModified = lastModified; } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private Long creationTime; - - /** Field description */ - private Long lastModified; - - /** Field description */ - @XmlJavaTypeAdapter(XmlRepositoryMapAdapter.class) - @XmlElement(name = "repositories") - private Map repositoryMap = new LinkedHashMap<>(); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java index d9807e9188..b31f870a8e 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryList.java @@ -54,7 +54,7 @@ import javax.xml.bind.annotation.XmlRootElement; */ @XmlRootElement(name = "repositories") @XmlAccessorType(XmlAccessType.FIELD) -public class XmlRepositoryList implements Iterable +public class XmlRepositoryList implements Iterable { /** @@ -70,9 +70,9 @@ public class XmlRepositoryList implements Iterable * * @param repositoryMap */ - public XmlRepositoryList(Map repositoryMap) + public XmlRepositoryList(Map repositoryMap) { - this.repositories = new LinkedList(repositoryMap.values()); + this.repositories = new LinkedList<>(repositoryMap.values()); } //~--- methods -------------------------------------------------------------- @@ -84,7 +84,7 @@ public class XmlRepositoryList implements Iterable * @return */ @Override - public Iterator iterator() + public Iterator iterator() { return repositories.iterator(); } @@ -97,7 +97,7 @@ public class XmlRepositoryList implements Iterable * * @return */ - public LinkedList getRepositories() + public LinkedList getRepositoryPaths() { return repositories; } @@ -110,7 +110,7 @@ public class XmlRepositoryList implements Iterable * * @param repositories */ - public void setRepositories(LinkedList repositories) + public void setRepositories(LinkedList repositories) { this.repositories = repositories; } @@ -118,6 +118,6 @@ public class XmlRepositoryList implements Iterable //~--- fields --------------------------------------------------------------- /** Field description */ - @XmlElement(name = "repository") - private LinkedList repositories; + @XmlElement(name = "repository-path") + private LinkedList repositories; } diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java index 4d6686dfb2..02d7dcff4d 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryMapAdapter.java @@ -1,19 +1,19 @@ /** * 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. + * 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. + * 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. - * + * 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 @@ -24,45 +24,76 @@ * 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.repository.xml; -//~--- non-JDK imports -------------------------------------------------------- - import sonia.scm.repository.Repository; +import sonia.scm.store.StoreConstants; +import sonia.scm.store.StoreException; +import sonia.scm.util.IOUtil; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.io.File; import java.util.LinkedHashMap; import java.util.Map; -//~--- JDK imports ------------------------------------------------------------ /** - * * @author Sebastian Sdorra */ -public class XmlRepositoryMapAdapter extends XmlAdapter> { +public class XmlRepositoryMapAdapter extends XmlAdapter> { @Override - public XmlRepositoryList marshal(Map repositoryMap) { - return new XmlRepositoryList(repositoryMap); - } + public XmlRepositoryList marshal(Map repositoryMap) { + XmlRepositoryList repositoryPaths = new XmlRepositoryList(repositoryMap); + try { + JAXBContext context = JAXBContext.newInstance(Repository.class); + Marshaller marshaller = context.createMarshaller(); - @Override - public Map unmarshal(XmlRepositoryList repositories) { - Map repositoryMap = new LinkedHashMap<>(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - for (Repository repository : repositories) { - repositoryMap.put(XmlRepositoryDatabase.createKey(repository), - repository); + // marshall the repo_path/metadata.xml files + for (RepositoryPath repositoryPath : repositoryPaths.getRepositoryPaths()) { + File dir = new File(repositoryPath.getPath()); + if (!dir.exists()){ + IOUtil.mkdirs(dir); + } + marshaller.marshal(repositoryPath.getRepository(), getRepositoryMetadataFile(dir)); + } + } catch (JAXBException ex) { + throw new StoreException("failed to marshall repository database", ex); } - return repositoryMap; + return repositoryPaths; + + } + + private File getRepositoryMetadataFile(File dir) { + return new File(dir, StoreConstants.REPOSITORY_METADATA.concat(StoreConstants.FILE_EXTENSION)); + } + + @Override + public Map unmarshal(XmlRepositoryList repositories) { + Map repositoryPathMap = new LinkedHashMap<>(); + try { + JAXBContext context = JAXBContext.newInstance(Repository.class); + Unmarshaller unmarshaller = context.createUnmarshaller(); + for (RepositoryPath repositoryPath : repositories) { + Repository repository = (Repository) unmarshaller.unmarshal(getRepositoryMetadataFile(new File(repositoryPath.getPath()))); + repositoryPath.setRepository(repository); + repositoryPathMap.put(XmlRepositoryDatabase.createKey(repository), repositoryPath); + } + } catch (JAXBException ex) { + throw new StoreException("failed to unmarshall object", ex); + } + return repositoryPathMap; } } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java index bf5dae720f..261c36f8e4 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationEntryStoreFactory.java @@ -79,7 +79,7 @@ public class JAXBConfigurationEntryStoreFactory { this.keyGenerator = keyGenerator; directory = new File(context.getBaseDirectory(), - StoreConstants.CONFIGDIRECTORY_NAME); + StoreConstants.CONFIG_DIRECTORY_NAME); IOUtil.mkdirs(directory); } diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java index 70fd962254..705b0c1177 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBConfigurationStoreFactory.java @@ -42,7 +42,7 @@ import sonia.scm.util.IOUtil; import java.io.File; /** - * JAXB implementation of {@link JAXBConfigurationStoreFactory}. + * JAXB implementation of {@link ConfigurationStoreFactory}. * * @author Sebastian Sdorra */ @@ -63,7 +63,7 @@ public class JAXBConfigurationStoreFactory implements ConfigurationStoreFactory */ @Inject public JAXBConfigurationStoreFactory(SCMContextProvider context) { - configDirectory = new File(context.getBaseDirectory(), StoreConstants.CONFIGDIRECTORY_NAME); + configDirectory = new File(context.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME); IOUtil.mkdirs(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 0bd9864cd7..cf24d125c2 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 @@ -37,12 +37,14 @@ package sonia.scm.store; * * @author Sebastian Sdorra */ -public interface StoreConstants +public class StoreConstants { - /** Field description */ - public static final String CONFIGDIRECTORY_NAME = "config"; + private StoreConstants() { } + + public static final String CONFIG_DIRECTORY_NAME = "config"; + + public static final String REPOSITORY_METADATA = "metadata"; - /** Field description */ public static final String FILE_EXTENSION = ".xml"; } 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 b8d1e6f42e..31203a1746 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 @@ -1,19 +1,19 @@ /** * 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. + * 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. + * 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. - * + * 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 @@ -24,9 +24,8 @@ * 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 - * */ @@ -35,18 +34,14 @@ package sonia.scm.xml; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.ImmutableList; -import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.GenericDAO; import sonia.scm.ModelObject; import sonia.scm.group.xml.XmlGroupDAO; import sonia.scm.store.ConfigurationStore; -import sonia.scm.util.AssertUtil; import java.util.Collection; -import java.util.stream.Collectors; //~--- JDK imports ------------------------------------------------------------ @@ -58,7 +53,7 @@ import java.util.stream.Collectors; * @param */ public abstract class AbstractXmlDAO> implements GenericDAO + T extends XmlDatabase> implements GenericDAO { /** Field description */ @@ -192,6 +187,7 @@ public abstract class AbstractXmlDAO store; + protected final ConfigurationStore store; /** Field description */ protected T db; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigDto.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigDto.java index 19a014dcdf..3d07a91741 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigDto.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/api/v2/resources/GitConfigDto.java @@ -6,14 +6,11 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.io.File; - @NoArgsConstructor @Getter @Setter public class GitConfigDto extends HalRepresentation { - private File repositoryDirectory; private boolean disabled = false; private String gcExpression; 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 c3436c2395..f5c1857a89 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 @@ -88,7 +88,7 @@ public class GitRepositoryHandler GitRepositoryServiceProvider.COMMANDS); private static final Object LOCK = new Object(); - + private final Scheduler scheduler; private Task task; @@ -98,15 +98,15 @@ public class GitRepositoryHandler /** * Constructs ... * - * - * @param storeFactory + * @param storeFactory * @param fileSystem * @param scheduler + * @param repositoryLocationResolver */ @Inject - public GitRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, Scheduler scheduler) + public GitRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, Scheduler scheduler, RepositoryLocationResolver repositoryLocationResolver) { - super(storeFactory, fileSystem); + super(storeFactory, fileSystem, repositoryLocationResolver); this.scheduler = scheduler; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java index 7f04bb3a54..eb57ac8ff8 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java @@ -106,7 +106,7 @@ public class GitRepositoryResolver implements RepositoryResolver hgContextProvider) + Provider hgContextProvider, RepositoryLocationResolver repositoryLocationResolver) { - super(storeFactory, fileSystem); + super(storeFactory, fileSystem, repositoryLocationResolver); this.hgContextProvider = hgContextProvider; try @@ -566,8 +566,7 @@ public class HgRepositoryHandler if (c != null) { - File repositoryDirectroy = c.getRepositoryDirectory(); - + File repositoryDirectroy = getInitialBaseDirectory(); if (repositoryDirectroy.exists()) { File lockFile = new File(repositoryDirectroy, PATH_HOOK); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookChangesetProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookChangesetProvider.java index 59ad0c3345..21f35587ed 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookChangesetProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookChangesetProvider.java @@ -123,8 +123,9 @@ public class HgHookChangesetProvider implements HookChangesetProvider */ private Repository open() { - File directory = handler.getConfig().getRepositoryDirectory(); - File repositoryDirectory = new File(directory, id); + sonia.scm.repository.Repository repo = new sonia.scm.repository.Repository(); + repo.setId(id); + File repositoryDirectory = handler.getDirectory(repo); // use HG_PENDING only for pre receive hooks boolean pending = type == RepositoryHookType.PRE_RECEIVE; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigDtoToHgConfigMapperTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigDtoToHgConfigMapperTest.java index b95056892e..f8aaedb32f 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigDtoToHgConfigMapperTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigDtoToHgConfigMapperTest.java @@ -23,7 +23,6 @@ public class HgConfigDtoToHgConfigMapperTest { HgConfig config = mapper.map(dto); assertTrue(config.isDisabled()); - assertEquals("repository/directory", config.getRepositoryDirectory().getPath()); assertEquals("ABC", config.getEncoding()); assertEquals("/etc/hg", config.getHgBinary()); @@ -36,7 +35,6 @@ public class HgConfigDtoToHgConfigMapperTest { private HgConfigDto createDefaultDto() { HgConfigDto configDto = new HgConfigDto(); configDto.setDisabled(true); - configDto.setRepositoryDirectory(new File("repository/directory")); configDto.setEncoding("ABC"); configDto.setHgBinary("/etc/hg"); configDto.setPythonBinary("/py"); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java index 9cd04a0789..df59954971 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigResourceTest.java @@ -93,7 +93,6 @@ public class HgConfigResourceTest { ObjectNode responseJson = new ObjectMapper().readValue(responseString, ObjectNode.class); assertTrue(responseString.contains("\"disabled\":false")); - assertTrue(responseJson.get("repositoryDirectory").asText().endsWith("repository/directory")); assertTrue(responseString.contains("\"self\":{\"href\":\"/v2/config/hg")); assertTrue(responseString.contains("\"update\":{\"href\":\"/v2/config/hg")); } @@ -162,7 +161,6 @@ public class HgConfigResourceTest { private HgConfig createConfiguration() { HgConfig config = new HgConfig(); config.setDisabled(false); - config.setRepositoryDirectory(new File("repository/directory")); return config; } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigTests.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigTests.java index 4167321344..84343cdf72 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigTests.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/api/v2/resources/HgConfigTests.java @@ -16,7 +16,6 @@ class HgConfigTests { static HgConfig createConfiguration() { HgConfig config = new HgConfig(); config.setDisabled(true); - config.setRepositoryDirectory(new File("repository/directory")); config.setEncoding("ABC"); config.setHgBinary("/etc/hg"); @@ -30,7 +29,6 @@ class HgConfigTests { static void assertEqualsConfiguration(HgConfigDto dto) { assertTrue(dto.isDisabled()); - assertEquals("repository/directory", dto.getRepositoryDirectory().getPath()); assertEquals("ABC", dto.getEncoding()); assertEquals("/etc/hg", dto.getHgBinary()); 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 10df3f5009..408f7de24d 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 @@ -42,9 +42,13 @@ import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.ConfigurationStoreFactory; import java.io.File; +import java.nio.file.Path; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; //~--- JDK imports ------------------------------------------------------------ @@ -61,6 +65,9 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Mock private com.google.inject.Provider provider; + RepositoryLocationResolver repositoryLocationResolver ; + private Path repoDir; + @Override protected void checkDirectory(File directory) { File hgDirectory = new File(directory, ".hg"); @@ -77,14 +84,17 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Override protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, - File directory) { + File directory) throws RepositoryPathNotFoundException { + DefaultFileSystem fileSystem = new DefaultFileSystem(); + PathBasedRepositoryDAO repoDao = mock(PathBasedRepositoryDAO.class); + repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(contextProvider,fileSystem)); HgRepositoryHandler handler = new HgRepositoryHandler(factory, new DefaultFileSystem(), - new HgContextProvider()); + new HgContextProvider(), repositoryLocationResolver); handler.init(contextProvider); - handler.getConfig().setRepositoryDirectory(directory); - + repoDir = directory.toPath(); + when(repoDao.getPath(any())).thenReturn(repoDir); HgTestUtil.checkForSkip(handler); return handler; @@ -93,17 +103,15 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Test public void getDirectory() { HgRepositoryHandler repositoryHandler = new HgRepositoryHandler(factory, - new DefaultFileSystem(), provider); + new DefaultFileSystem(), provider, repositoryLocationResolver); HgConfig hgConfig = new HgConfig(); - hgConfig.setRepositoryDirectory(new File("/path")); hgConfig.setHgBinary("hg"); hgConfig.setPythonBinary("python"); repositoryHandler.setConfig(hgConfig); Repository repository = new Repository("id", "git", "Space", "Name"); - File path = repositoryHandler.getDirectory(repository); - assertEquals("/path/id", path.getAbsolutePath()); + assertEquals(repoDir.toString()+File.separator+InitialRepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY, path.getAbsolutePath()); } } 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 532038ff2d..9c8f9747cf 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 @@ -46,6 +46,7 @@ import static org.mockito.Mockito.*; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import java.nio.file.Path; import javax.servlet.http.HttpServletRequest; @@ -95,19 +96,21 @@ public final class HgTestUtil * * @return */ - public static HgRepositoryHandler createHandler(File directory) - { + public static HgRepositoryHandler createHandler(File directory) throws RepositoryPathNotFoundException { TempSCMContextProvider context = (TempSCMContextProvider) SCMContext.getContext(); context.setBaseDirectory(directory); FileSystem fileSystem = mock(FileSystem.class); + PathBasedRepositoryDAO repoDao = mock(PathBasedRepositoryDAO.class); + RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(context,fileSystem)); HgRepositoryHandler handler = new HgRepositoryHandler(new InMemoryConfigurationStoreFactory(), fileSystem, - new HgContextProvider()); - + new HgContextProvider(), repositoryLocationResolver); + Path repoDir = directory.toPath(); + when(repoDao.getPath(any())).thenReturn(repoDir); handler.init(context); return handler; diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java index b5284c737c..2e06d4c6ea 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/AbstractHgCommandTestBase.java @@ -40,6 +40,7 @@ import org.junit.Before; import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.HgTestUtil; +import sonia.scm.repository.RepositoryPathNotFoundException; import sonia.scm.repository.RepositoryTestData; import sonia.scm.util.MockUtil; @@ -76,8 +77,7 @@ public class AbstractHgCommandTestBase extends ZippedRepositoryTestBase * @throws IOException */ @Before - public void initHgHandler() throws IOException - { + public void initHgHandler() throws IOException, RepositoryPathNotFoundException { this.handler = HgTestUtil.createHandler(tempFolder.newFolder()); HgTestUtil.checkForSkip(handler); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java index 8dca8fdfe6..163a236d77 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/IncomingOutgoingTestBase.java @@ -51,6 +51,7 @@ import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgContext; import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.HgTestUtil; +import sonia.scm.repository.RepositoryPathNotFoundException; import sonia.scm.user.User; import sonia.scm.user.UserTestData; import sonia.scm.util.MockUtil; @@ -78,8 +79,7 @@ public abstract class IncomingOutgoingTestBase extends AbstractTestBase * @throws IOException */ @Before - public void initHgHandler() throws IOException - { + public void initHgHandler() throws IOException, RepositoryPathNotFoundException { HgRepositoryHandler temp = HgTestUtil.createHandler(tempFolder.newFolder()); HgTestUtil.checkForSkip(temp); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgHookCallbackServletTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgHookCallbackServletTest.java index a586962bb8..0a0e859f60 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgHookCallbackServletTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgHookCallbackServletTest.java @@ -25,14 +25,15 @@ public class HgHookCallbackServletTest { HgHookCallbackServlet servlet = new HgHookCallbackServlet(null, handler, null, null); HttpServletRequest request = mock(HttpServletRequest.class); HttpServletResponse response = mock(HttpServletResponse.class); - HgConfig config = mock(HgConfig.class); when(request.getContextPath()).thenReturn("http://example.com/scm"); when(request.getRequestURI()).thenReturn("http://example.com/scm/hook/hg/pretxnchangegroup"); - when(request.getParameter(PARAM_REPOSITORYPATH)).thenReturn("/tmp/hg/12345"); + String path = "/tmp/hg/12345"; + when(request.getParameter(PARAM_REPOSITORYPATH)).thenReturn(path); - when(handler.getConfig()).thenReturn(config); - when(config.getRepositoryDirectory()).thenReturn(new File("/tmp/hg")); + + File file = new File(path); + when(handler.getInitialBaseDirectory()).thenReturn(file); servlet.doPost(request, response); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigDto.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigDto.java index 548944a49c..879e92a186 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigDto.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/api/v2/resources/SvnConfigDto.java @@ -7,15 +7,12 @@ import lombok.NoArgsConstructor; import lombok.Setter; import sonia.scm.repository.Compatibility; -import java.io.File; - @NoArgsConstructor @Getter @Setter public class SvnConfigDto extends HalRepresentation { private boolean disabled; - private File repositoryDirectory; private boolean enabledGZip; private Compatibility compatibility; 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 7d5c9695c9..64a11034b6 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 @@ -85,9 +85,9 @@ public class SvnRepositoryHandler @Inject public SvnRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, - HookEventFacade eventFacade) + HookEventFacade eventFacade, RepositoryLocationResolver repositoryLocationResolver) { - super(storeFactory, fileSystem); + super(storeFactory, fileSystem, repositoryLocationResolver); // register logger SVNDebugLog.setDefaultLog(new SVNKitLogger()); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigDtoToSvnConfigMapperTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigDtoToSvnConfigMapperTest.java index b111d0229f..8ab947fbaf 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigDtoToSvnConfigMapperTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigDtoToSvnConfigMapperTest.java @@ -7,8 +7,6 @@ import org.mockito.runners.MockitoJUnitRunner; import sonia.scm.repository.Compatibility; import sonia.scm.repository.SvnConfig; -import java.io.File; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -24,7 +22,6 @@ public class SvnConfigDtoToSvnConfigMapperTest { SvnConfig config = mapper.map(dto); assertTrue(config.isDisabled()); - assertEquals("repository/directory", config.getRepositoryDirectory().getPath()); assertEquals(Compatibility.PRE15, config.getCompatibility()); assertTrue(config.isEnabledGZip()); @@ -33,7 +30,6 @@ public class SvnConfigDtoToSvnConfigMapperTest { private SvnConfigDto createDefaultDto() { SvnConfigDto configDto = new SvnConfigDto(); configDto.setDisabled(true); - configDto.setRepositoryDirectory(new File("repository/directory")); configDto.setCompatibility(Compatibility.PRE15); configDto.setEnabledGZip(true); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java index 28dbe09e92..3077bb34f3 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigResourceTest.java @@ -81,7 +81,6 @@ public class SvnConfigResourceTest { ObjectNode responseJson = new ObjectMapper().readValue(responseString, ObjectNode.class); assertTrue(responseString.contains("\"disabled\":false")); - assertTrue(responseJson.get("repositoryDirectory").asText().endsWith("repository/directory")); assertTrue(responseString.contains("\"self\":{\"href\":\"/v2/config/svn")); assertTrue(responseString.contains("\"update\":{\"href\":\"/v2/config/svn")); } @@ -150,7 +149,6 @@ public class SvnConfigResourceTest { private SvnConfig createConfiguration() { SvnConfig config = new SvnConfig(); config.setDisabled(false); - config.setRepositoryDirectory(new File("repository/directory")); return config; } diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigToSvnConfigDtoMapperTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigToSvnConfigDtoMapperTest.java index 5184aa3d41..6bbff499e1 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigToSvnConfigDtoMapperTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/api/v2/resources/SvnConfigToSvnConfigDtoMapperTest.java @@ -61,7 +61,6 @@ public class SvnConfigToSvnConfigDtoMapperTest { SvnConfigDto dto = mapper.map(config); assertTrue(dto.isDisabled()); - assertEquals("repository/directory", dto.getRepositoryDirectory().getPath()); assertEquals(Compatibility.PRE15, dto.getCompatibility()); assertTrue(dto.isEnabledGZip()); @@ -84,7 +83,6 @@ public class SvnConfigToSvnConfigDtoMapperTest { private SvnConfig createConfiguration() { SvnConfig config = new SvnConfig(); config.setDisabled(true); - config.setRepositoryDirectory(new File("repository/directory")); config.setCompatibility(Compatibility.PRE15); config.setEnabledGZip(true); 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 e5e9511872..3c644056ca 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 @@ -43,6 +43,7 @@ import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStoreFactory; import java.io.File; +import java.nio.file.Path; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -72,6 +73,9 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { private HookEventFacade facade = new HookEventFacade(repositoryManagerProvider, hookContextFactory); + RepositoryLocationResolver repositoryLocationResolver ; + private Path repoDir; + @Override protected void checkDirectory(File directory) { File format = new File(directory, "format"); @@ -87,16 +91,22 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { @Override protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, - File directory) { - SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, - new DefaultFileSystem(), null); + File directory) throws RepositoryPathNotFoundException { + + DefaultFileSystem fileSystem = new DefaultFileSystem(); + PathBasedRepositoryDAO repoDao = mock(PathBasedRepositoryDAO.class); + + repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(contextProvider,fileSystem)); + SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, + new DefaultFileSystem(), null, repositoryLocationResolver); + + repoDir = directory.toPath(); + when(repoDao.getPath(any())).thenReturn(repoDir); handler.init(contextProvider); SvnConfig config = new SvnConfig(); - config.setRepositoryDirectory(directory); - // TODO fix event bus exception handler.setConfig(config); @@ -107,15 +117,14 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase { public void getDirectory() { when(factory.getStore(any(), any())).thenReturn(store); SvnRepositoryHandler repositoryHandler = new SvnRepositoryHandler(factory, - new DefaultFileSystem(), facade); + new DefaultFileSystem(), facade, repositoryLocationResolver); SvnConfig svnConfig = new SvnConfig(); - svnConfig.setRepositoryDirectory(new File("/path")); repositoryHandler.setConfig(svnConfig); Repository repository = new Repository("id", "svn", "Space", "Name"); File path = repositoryHandler.getDirectory(repository); - assertEquals("/path/id", path.getAbsolutePath()); + assertEquals(repoDir.toString()+File.separator+InitialRepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY, path.getAbsolutePath()); } } 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 5a1dc605bb..40b13243f7 100644 --- a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java +++ b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java @@ -46,7 +46,6 @@ import java.util.Set; //~--- JDK imports ------------------------------------------------------------ /** - * * @author Sebastian Sdorra */ public class DummyRepositoryHandler @@ -60,8 +59,8 @@ public class DummyRepositoryHandler private final Set existingRepoNames = new HashSet<>(); - public DummyRepositoryHandler(ConfigurationStoreFactory storeFactory) { - super(storeFactory, new DefaultFileSystem()); + public DummyRepositoryHandler(ConfigurationStoreFactory storeFactory, RepositoryLocationResolver repositoryLocationResolver) { + super(storeFactory, new DefaultFileSystem(), repositoryLocationResolver); } @Override 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 999ef1dc45..23f0e33987 100644 --- a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java @@ -41,6 +41,7 @@ import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.util.IOUtil; import java.io.File; +import java.io.IOException; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -58,7 +59,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { protected abstract void checkDirectory(File directory); protected abstract RepositoryHandler createRepositoryHandler( - ConfigurationStoreFactory factory, File directory); + ConfigurationStoreFactory factory, File directory) throws IOException, RepositoryPathNotFoundException; @Test public void testCreate() throws AlreadyExistsException { @@ -87,7 +88,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { } @Override - protected void postSetUp() { + protected void postSetUp() throws IOException, RepositoryPathNotFoundException { InMemoryConfigurationStoreFactory storeFactory = new InMemoryConfigurationStoreFactory(); baseDirectory = new File(contextProvider.getBaseDirectory(), "repositories"); IOUtil.mkdirs(baseDirectory); @@ -106,7 +107,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { handler.create(repository); - File directory = new File(baseDirectory, repository.getId()); + File directory = new File(new File(baseDirectory, repository.getId()), InitialRepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY); assertTrue(directory.exists()); assertTrue(directory.isDirectory()); diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index c2e8bc3ad8..565d8854c7 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -166,7 +166,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { throw new RepositoryIsNotArchivedException(); } fireEvent(HandlerEventType.BEFORE_DELETE, toDelete); -// getHandler(toDelete).delete(toDelete); + getHandler(toDelete).delete(toDelete); } @Override 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 4a28c3bc83..dd467752d9 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -51,6 +51,7 @@ import sonia.scm.ManagerTestBase; import sonia.scm.NotFoundException; import sonia.scm.config.ScmConfiguration; import sonia.scm.event.ScmEventBus; +import sonia.scm.io.DefaultFileSystem; import sonia.scm.repository.api.HookContext; import sonia.scm.repository.api.HookContextFactory; import sonia.scm.repository.api.HookFeature; @@ -419,23 +420,26 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase { } private DefaultRepositoryManager createRepositoryManager(boolean archiveEnabled, KeyGenerator keyGenerator) { + DefaultFileSystem fileSystem = new DefaultFileSystem(); Set handlerSet = new HashSet<>(); ConfigurationStoreFactory factory = new JAXBConfigurationStoreFactory(contextProvider); - handlerSet.add(new DummyRepositoryHandler(factory)); - handlerSet.add(new DummyRepositoryHandler(factory) { + InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider, fileSystem); + XmlRepositoryDAO repositoryDAO = new XmlRepositoryDAO(factory, initialRepositoryLocationResolver); + RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repositoryDAO, initialRepositoryLocationResolver); + handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver)); + handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver) { @Override public RepositoryType getType() { return new RepositoryType("hg", "Mercurial", Sets.newHashSet()); } }); - handlerSet.add(new DummyRepositoryHandler(factory) { + handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver) { @Override public RepositoryType getType() { return new RepositoryType("git", "Git", Sets.newHashSet()); } }); - XmlRepositoryDAO repositoryDAO = new XmlRepositoryDAO(factory); this.configuration = new ScmConfiguration();