diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java new file mode 100644 index 0000000000..decf245284 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -0,0 +1,335 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.ConfigurationException; +import sonia.scm.SCMContextProvider; +import sonia.scm.io.CommandResult; +import sonia.scm.io.ExtendedCommand; +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.bind.JAXB; + +/** + * + * @author Sebastian Sdorra + * + * @param + */ +public abstract class AbstractSimpleRepositoryHandler + extends AbstractRepositoryHandler +{ + + /** Field description */ + private static final Logger logger = + Logger.getLogger(AbstractSimpleRepositoryHandler.class.getName()); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * @param directory + * + * @return + */ + protected abstract ExtendedCommand buildCreateCommand(Repository repository, + File directory); + + /** + * Method description + * + * + * @param repository + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public void create(Repository repository) + throws RepositoryException, IOException + { + initNewRepository(repository); + + File directory = getDirectory(repository); + + if (directory.exists()) + { + throw new RepositoryAllreadyExistExeption(); + } + + ExtendedCommand cmd = buildCreateCommand(repository, directory); + CommandResult result = cmd.execute(); + + if (!result.isSuccessfull()) + { + StringBuilder msg = new StringBuilder("command exit with error "); + + msg.append(result.getReturnCode()).append(" and message: '"); + msg.append(result.getOutput()).append("'"); + + throw new RepositoryException(msg.toString()); + } + + repository.setType(getType().getName()); + storeRepositoryConfig(repository); + } + + /** + * Method description + * + * + * @param repository + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public void delete(Repository repository) + throws RepositoryException, IOException + { + File directory = getDirectory(repository); + File repositoryFile = getRepositoryFile(repository); + + if (directory.exists() && repositoryFile.exists()) + { + Util.delete(directory); + Util.delete(repositoryFile); + } + else + { + throw new RepositoryException("repository does not exists"); + } + } + + /** + * Method description + * + * + * @param context + */ + @Override + public void init(SCMContextProvider context) + { + super.init(context); + createConfigDirectory(context); + } + + /** + * Method description + * + * + * @param repository + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public void modify(Repository repository) + throws RepositoryException, IOException + { + Repository old = get(repository.getId()); + + if (old.getName().equals(repository.getName())) + { + storeRepositoryConfig(repository); + } + else + { + throw new RepositoryException( + "the name of a repository could not changed"); + } + } + + /** + * Method description + * + * + * @param repository + * + * @throws IOException + * @throws RepositoryException + */ + @Override + public void refresh(Repository repository) + throws RepositoryException, IOException + { + Repository fresh = get(repository.getId()); + + fresh.copyProperties(repository); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param id + * + * @return + */ + @Override + public Repository get(String id) + { + Repository repository = null; + File repositoryFile = getRepositoryFile(id); + + if (repositoryFile.exists()) + { + repository = JAXB.unmarshal(repositoryFile, Repository.class); + } + + return repository; + } + + /** + * Method description + * + * + * @return + */ + @Override + public Collection getAll() + { + List repositories = new ArrayList(); + File[] repositoryFiles = configDirectory.listFiles(new FilenameFilter() + { + @Override + public boolean accept(File dir, String name) + { + return name.endsWith(".xml"); + } + }); + + for (File repositoryFile : repositoryFiles) + { + try + { + Repository repository = JAXB.unmarshal(repositoryFile, + Repository.class); + + repositories.add(repository); + } + catch (Exception ex) + { + logger.log(Level.SEVERE, null, ex); + } + } + + return repositories; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param context + */ + protected void createConfigDirectory(SCMContextProvider context) + { + File baseDirectory = context.getBaseDirectory(); + + configDirectory = + new File(baseDirectory, + "config".concat(File.separator).concat(getType().getName())); + + if (!configDirectory.exists() &&!configDirectory.mkdirs()) + { + throw new ConfigurationException("could not create config directory"); + } + } + + /** + * Method description + * + * + * @param repository + */ + protected void storeRepositoryConfig(Repository repository) + { + JAXB.marshal(repository, getRepositoryFile(repository)); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * + * @return + */ + protected File getDirectory(Repository repository) + { + File directory = null; + + if (isConfigured()) + { + directory = new File(config.getRepositoryDirectory(), + repository.getName()); + } + else + { + throw new ConfigurationException("RepositoryHandler is not configured"); + } + + return directory; + } + + /** + * Method description + * + * + * + * @param id + * + * @return + */ + private File getRepositoryFile(String id) + { + return new File(configDirectory, id.concat(".xml")); + } + + /** + * Method description + * + * + * @param repository + * + * @return + */ + private File getRepositoryFile(Repository repository) + { + return getRepositoryFile(repository.getId()); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private File configDirectory; +} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java index 863f1132f0..d5921f06f9 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java @@ -19,6 +19,13 @@ public interface RepositoryHandler extends Handler { + /** + * Method description + * + * + * @return + */ + public RepositoryType getType(); /** * Method description @@ -27,12 +34,4 @@ public interface RepositoryHandler * @return */ public boolean isConfigured(); - - /** - * Method description - * - * - * @return - */ - public RepositoryType getType(); } diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java index 58d96d0fb4..e5757150d9 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryListener.java @@ -14,8 +14,6 @@ package sonia.scm.repository; public interface RepositoryListener { - //~--- methods -------------------------------------------------------------- - /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/SimpleRepositoryConfig.java b/scm-core/src/main/java/sonia/scm/repository/SimpleRepositoryConfig.java new file mode 100644 index 0000000000..ed341a2e1e --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/SimpleRepositoryConfig.java @@ -0,0 +1,49 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.repository; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +/** + * + * @author Sebastian Sdorra + */ +public class SimpleRepositoryConfig extends BasicRepositoryConfig +{ + + /** + * Method description + * + * + * @return + */ + public File getRepositoryDirectory() + { + return repositoryDirectory; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param repositoryDirectory + */ + public void setRepositoryDirectory(File repositoryDirectory) + { + this.repositoryDirectory = repositoryDirectory; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private File repositoryDirectory; +}