added api for repository imports

This commit is contained in:
Sebastian Sdorra
2012-01-12 14:21:04 +01:00
parent 70a7ad1a5f
commit 909fe32574
6 changed files with 281 additions and 3 deletions

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,58 @@
/**
* 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;
/**
* 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}
*
* @throws IOException
* @throws RepositoryException
*/
public void 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);
}
}
}
}
}