merge with branch issue-59

This commit is contained in:
Sebastian Sdorra
2012-01-16 16:53:37 +01:00
18 changed files with 1459 additions and 39 deletions

View File

@@ -38,11 +38,16 @@ package sonia.scm;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import javax.xml.bind.annotation.XmlRootElement;
/**
* Base class for all objects which supports different types.
*
* @author Sebastian Sdorra
*/
@XmlRootElement
public class Type
{

View File

@@ -0,0 +1,223 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Sebastian Sdorra
* @since 1.12
*/
public abstract class AbstactImportHandler implements ImportHandler
{
/**
* the logger for AbstactImportHandler
*/
private static final Logger logger =
LoggerFactory.getLogger(AbstactImportHandler.class);
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
protected abstract String[] getDirectoryNames();
/**
* Method description
*
*
* @return
*/
protected abstract AbstractRepositoryHandler<?> getRepositoryHandler();
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param manager
*
*
* @return
* @throws IOException
* @throws RepositoryException
*/
@Override
public List<String> importRepositories(RepositoryManager manager)
throws IOException, RepositoryException
{
List<String> imported = new ArrayList<String>();
if (logger.isTraceEnabled())
{
logger.trace("search for repositories to import");
}
List<String> repositoryNames =
RepositoryUtil.getRepositoryNames(getRepositoryHandler(),
getDirectoryNames());
for (String repositoryName : repositoryNames)
{
if (logger.isTraceEnabled())
{
logger.trace("check repository {} for import", repositoryName);
}
Repository repository = manager.get(getTypeName(), repositoryName);
if (repository == null)
{
if (importRepository(manager, repositoryName))
{
imported.add(repositoryName);
}
}
else if (logger.isDebugEnabled())
{
logger.debug("repository {} is allready managed", repositoryName);
}
}
return imported;
}
/**
* Method description
*
*
* @param repositoryDirectory
* @param repositoryName
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
protected Repository createRepository(File repositoryDirectory,
String repositoryName)
throws IOException, RepositoryException
{
Repository repository = new Repository();
repository.setName(repositoryName);
repository.setPublicReadable(false);
repository.setType(getTypeName());
return repository;
}
/**
* Method description
*
*
* @param manager
* @param repositoryName
*
*
* @return
* @throws IOException
* @throws RepositoryException
*/
private boolean importRepository(RepositoryManager manager,
String repositoryName)
throws IOException, RepositoryException
{
boolean result = false;
Repository repository =
createRepository(getRepositoryDirectory(repositoryName), repositoryName);
if (repository != null)
{
if (logger.isInfoEnabled())
{
logger.info("import repository {} of type {}", repositoryName,
getTypeName());
}
manager.importRepository(repository);
result = true;
}
else if (logger.isWarnEnabled())
{
logger.warn("could not create repository object for {}", repositoryName);
}
return result;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repositoryName
*
* @return
*/
private File getRepositoryDirectory(String repositoryName)
{
return new File(
getRepositoryHandler().getConfig().getRepositoryDirectory(),
repositoryName);
}
/**
* Method description
*
*
* @return
*/
private String getTypeName()
{
return getRepositoryHandler().getType().getName();
}
}

View File

@@ -39,6 +39,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.ConfigChangedListener;
import sonia.scm.NotSupportedFeatuerException;
import sonia.scm.SCMContextProvider;
import sonia.scm.store.Store;
import sonia.scm.store.StoreFactory;
@@ -243,6 +244,21 @@ public abstract class AbstractRepositoryHandler<C extends SimpleRepositoryConfig
return null;
}
/**
* Method description
*
*
* @return
*
* @throws NotSupportedFeatuerException
*/
@Override
public ImportHandler getImportHandler() throws NotSupportedFeatuerException
{
throw new NotSupportedFeatuerException(
"import handler is not supported by this repository handler");
}
/**
* Method description
*

View File

@@ -0,0 +1,62 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.List;
/**
* Searches and import existing repositories.
*
* @author Sebastian Sdorra
* @since 1.12
*/
public interface ImportHandler
{
/**
* Import existing and non managed repositories.
*
*
* @param manager The global {@link RepositoryManager}
*
*
* @return a {@link List} names of imported repositories
* @throws IOException
* @throws RepositoryException
*/
public List<String> importRepositories(RepositoryManager manager)
throws IOException, RepositoryException;
}

View File

@@ -38,6 +38,7 @@ package sonia.scm.repository;
import sonia.scm.ConfigChangedListener;
import sonia.scm.Handler;
import sonia.scm.ListenerSupport;
import sonia.scm.NotSupportedFeatuerException;
import sonia.scm.plugin.ExtensionPoint;
/**
@@ -64,4 +65,17 @@ public interface RepositoryHandler
* @return resource path of the {@link Repository}
*/
public String createResourcePath(Repository repository);
//~--- get methods ----------------------------------------------------------
/**
* Returns the {@link ImportHandler} for the repository type of this handler.
*
*
* @return {@link ImportHandler} for the repository type of this handler
* @since 1.12
*
* @throws NotSupportedFeatuerException
*/
public ImportHandler getImportHandler() throws NotSupportedFeatuerException;
}

View File

@@ -41,6 +41,8 @@ import sonia.scm.TypeManager;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
@@ -60,6 +62,21 @@ public interface RepositoryManager
BlameViewerProvider, DiffViewerProvider
{
/**
* Imports an existing {@link Repository}.
* Note: This method should only be called from a {@link RepositoryHandler}.
*
*
* @param repository {@link Repository} to import
*
* @throws IOException
* @throws RepositoryException
*/
public void importRepository(Repository repository)
throws IOException, RepositoryException;
//~--- get methods ----------------------------------------------------------
/**
* Returns a {@link Repository} by its type and name or
* null if the {@link Repository} could not be found.

View File

@@ -38,6 +38,7 @@ package sonia.scm.repository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.io.DirectoryFileFilter;
import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
@@ -45,6 +46,10 @@ import sonia.scm.util.IOUtil;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author Sebastian Sdorra
@@ -57,6 +62,27 @@ public class RepositoryUtil
private static final Logger logger =
LoggerFactory.getLogger(RepositoryUtil.class);
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param directory
* @param names
*
* @return
*/
public static List<File> searchRepositoryDirectories(File directory,
String... names)
{
List<File> repositories = new ArrayList<File>();
searchRepositoryDirectories(repositories, directory, Arrays.asList(names));
return repositories;
}
//~--- get methods ----------------------------------------------------------
/**
@@ -166,4 +192,115 @@ public class RepositoryUtil
return name;
}
/**
* Method description
*
*
* @param handler
* @param directoryNames
*
* @return
*
* @throws IOException
*/
public static List<String> getRepositoryNames(
AbstractRepositoryHandler handler, String... directoryNames)
throws IOException
{
return getRepositoryNames(handler.getConfig(), directoryNames);
}
/**
* Method description
*
*
* @param config
* @param directoryNames
*
* @return
*
* @throws IOException
*/
public static List<String> getRepositoryNames(SimpleRepositoryConfig config,
String... directoryNames)
throws IOException
{
return getRepositoryNames(config.getRepositoryDirectory(), directoryNames);
}
/**
* Method description
*
*
* @param baseDirectory
* @param directoryNames
*
* @return
*
* @throws IOException
*/
public static List<String> getRepositoryNames(File baseDirectory,
String... directoryNames)
throws IOException
{
List<String> repositories = new ArrayList<String>();
List<File> repositoryFiles = searchRepositoryDirectories(baseDirectory,
directoryNames);
for (File file : repositoryFiles)
{
String name = getRepositoryName(baseDirectory, file);
if (name != null)
{
repositories.add(name);
}
}
return repositories;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param repositories
* @param directory
* @param names
*/
private static void searchRepositoryDirectories(List<File> repositories,
File directory, List<String> names)
{
boolean found = false;
for (String name : names)
{
if (new File(directory, name).exists())
{
found = true;
break;
}
}
if (found)
{
repositories.add(directory);
}
else
{
File[] directories = directory.listFiles(DirectoryFileFilter.instance);
if (directories != null)
{
for (File d : directories)
{
searchRepositoryDirectories(repositories, d, names);
}
}
}
}
}