Refactor directories in RepositoryPath and dao

This commit is contained in:
René Pfeuffer
2018-11-22 12:29:26 +01:00
parent 2694a165cc
commit 00e3cbec57
9 changed files with 218 additions and 74 deletions

View File

@@ -21,9 +21,6 @@ public class RepositoryPath implements ModelObject {
@XmlTransient
private Repository repository;
@XmlTransient
private String absolutePath;
@XmlTransient
private boolean toBeSynchronized;
@@ -33,9 +30,8 @@ public class RepositoryPath implements ModelObject {
public RepositoryPath() {
}
public RepositoryPath(String path, String absolutePath, String id, Repository repository) {
public RepositoryPath(String path, String id, Repository repository) {
this.path = path;
this.absolutePath = absolutePath;
this.id = id;
this.repository = repository;
}
@@ -102,12 +98,4 @@ public class RepositoryPath implements ModelObject {
public void setToBeSynchronized(boolean toBeSynchronized) {
this.toBeSynchronized = toBeSynchronized;
}
public String getAbsolutePath() {
return absolutePath;
}
public void setAbsolutePath(String absolutePath) {
this.absolutePath = absolutePath;
}
}

View File

@@ -35,19 +35,18 @@ package sonia.scm.repository.xml;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import sonia.scm.SCMContext;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.InitialRepositoryLocationResolver;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.NamespaceAndName;
import sonia.scm.repository.PathBasedRepositoryDAO;
import sonia.scm.repository.Repository;
import sonia.scm.store.ConfigurationStoreFactory;
import sonia.scm.xml.AbstractXmlDAO;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.function.Supplier;
import java.util.Optional;
/**
* @author Sebastian Sdorra
@@ -59,6 +58,7 @@ public class XmlRepositoryDAO
public static final String STORE_NAME = "repositories";
private InitialRepositoryLocationResolver initialRepositoryLocationResolver;
private final SCMContextProvider context;
//~--- constructors ---------------------------------------------------------
@@ -66,11 +66,13 @@ public class XmlRepositoryDAO
* Constructs ...
*
* @param storeFactory
* @param context
*/
@Inject
public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory, InitialRepositoryLocationResolver initialRepositoryLocationResolver) {
public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory, InitialRepositoryLocationResolver initialRepositoryLocationResolver, SCMContextProvider context) {
super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME));
this.initialRepositoryLocationResolver = initialRepositoryLocationResolver;
this.context = context;
}
//~--- methods --------------------------------------------------------------
@@ -92,22 +94,17 @@ public class XmlRepositoryDAO
@Override
public void modify(Repository repository) {
String path = getPath(repository).toAbsolutePath().toString();
db.remove(repository.getId());
RepositoryPath repositoryPath = new RepositoryPath(initialRepositoryLocationResolver.getRelativePath(path), path, repository.getId(), repository.clone());
RepositoryPath repositoryPath = findExistingRepositoryPath(repository).orElseThrow(() -> new InternalRepositoryException(repository, "path object for repository not found"));
repositoryPath.setRepository(repository);
repositoryPath.setToBeSynchronized(true);
add(repositoryPath);
storeDB();
}
@Override
public void add(Repository repository) {
String path = getPath(repository).toAbsolutePath().toString();
RepositoryPath repositoryPath = new RepositoryPath(initialRepositoryLocationResolver.getRelativePath(path),path, repository.getId(), repository.clone());
String relativeRepositoryPath = initialRepositoryLocationResolver.getRelativeRepositoryPath(repository);
RepositoryPath repositoryPath = new RepositoryPath(relativeRepositoryPath, repository.getId(), repository.clone());
repositoryPath.setToBeSynchronized(true);
add(repositoryPath);
}
public void add(RepositoryPath repositoryPath) {
synchronized (store) {
db.add(repositoryPath);
storeDB();
@@ -151,20 +148,15 @@ public class XmlRepositoryDAO
@Override
public Path getPath(Repository repository) {
return db.getPaths().stream()
.filter(repoPath -> repoPath.getId().equals(repository.getId()))
.findFirst()
.map(RepositoryPath::getPath)
.map(relativePath -> new File(SCMContext.getContext().getBaseDirectory(), relativePath).toPath())
.orElseGet(createRepositoryPath(repository));
return context
.getBaseDirectory()
.toPath()
.resolve(findExistingRepositoryPath(repository).map(RepositoryPath::getPath).orElse(initialRepositoryLocationResolver.getRelativeRepositoryPath(repository)));
}
private Supplier<? extends Path> createRepositoryPath(Repository repository) {
return () -> {
if (db.getDefaultDirectory() == null) {
db.setDefaultDirectory(initialRepositoryLocationResolver.getDefaultRepositoryPath());
}
return Paths.get(initialRepositoryLocationResolver.getDirectory(db.getDefaultDirectory(), repository).toURI());
};
private Optional<RepositoryPath> findExistingRepositoryPath(Repository repository) {
return db.getPaths().stream()
.filter(repoPath -> repoPath.getId().equals(repository.getId()))
.findFirst();
}
}

View File

@@ -60,8 +60,6 @@ public class XmlRepositoryDatabase implements XmlDatabase<RepositoryPath> {
private Long lastModified;
private String defaultDirectory;
@XmlJavaTypeAdapter(XmlRepositoryMapAdapter.class)
@XmlElement(name = "repositories")
private Map<String, RepositoryPath> repositoryPathMap = new LinkedHashMap<>();
@@ -202,12 +200,4 @@ public class XmlRepositoryDatabase implements XmlDatabase<RepositoryPath> {
{
this.lastModified = lastModified;
}
public String getDefaultDirectory() {
return defaultDirectory;
}
public void setDefaultDirectory(String defaultDirectory) {
this.defaultDirectory = defaultDirectory;
}
}

View File

@@ -33,10 +33,10 @@ package sonia.scm.repository.xml;
import sonia.scm.SCMContext;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.InternalRepositoryException;
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;
@@ -44,6 +44,8 @@ import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -66,11 +68,13 @@ public class XmlRepositoryMapAdapter extends XmlAdapter<XmlRepositoryList, Map<S
for (RepositoryPath repositoryPath : repositoryPaths.getRepositoryPaths()) {
if (repositoryPath.toBeSynchronized()) {
File dir = new File(repositoryPath.getAbsolutePath());
if (!dir.exists()) {
IOUtil.mkdirs(dir);
File baseDirectory = SCMContext.getContext().getBaseDirectory();
Path dir = baseDirectory.toPath().resolve(repositoryPath.getPath());
if (!Files.isDirectory(dir)) {
throw new InternalRepositoryException(repositoryPath.getRepository(), "repository path not found");
}
marshaller.marshal(repositoryPath.getRepository(), getRepositoryMetadataFile(dir));
marshaller.marshal(repositoryPath.getRepository(), getRepositoryMetadataFile(dir.toFile()));
repositoryPath.setToBeSynchronized(false);
}
}
@@ -95,7 +99,8 @@ public class XmlRepositoryMapAdapter extends XmlAdapter<XmlRepositoryList, Map<S
for (RepositoryPath repositoryPath : repositoryPaths) {
SCMContextProvider contextProvider = SCMContext.getContext();
File baseDirectory = contextProvider.getBaseDirectory();
Repository repository = (Repository) unmarshaller.unmarshal(getRepositoryMetadataFile(new File(baseDirectory, repositoryPath.getPath())));
Repository repository = (Repository) unmarshaller.unmarshal(getRepositoryMetadataFile(baseDirectory.toPath().resolve(repositoryPath.getPath()).toFile()));
repositoryPath.setRepository(repository);
repositoryPathMap.put(XmlRepositoryDatabase.createKey(repository), repositoryPath);
}