initial import of new repository api and spi

This commit is contained in:
Sebastian Sdorra
2012-06-11 12:59:17 +02:00
parent ac0c0fb44c
commit 8961e652ba
26 changed files with 3312 additions and 0 deletions

View File

@@ -0,0 +1,270 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.BlameResult;
import sonia.scm.repository.Repository;
import sonia.scm.repository.spi.BlameCommand;
import sonia.scm.repository.spi.BlameCommandRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
* Shows changeset information by line for a given file.
* Blame is also known as annotate in some SCM systems.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class BlameCommandBuilder
{
/** name of the cache */
private static final String CACHE_NAME = "sonia.scm.cache.blame";
//~--- constructors ---------------------------------------------------------
/**
* Constructs a new {@link BlameCommandBuilder}, this constructor should
* only be called from the {@link RepositoryService}.
*
* @param cacheManager cache manager
* @param blameCommand implementation of the {@link BlameCommand}
* @param repository repository to query
*/
BlameCommandBuilder(CacheManager cacheManager, BlameCommand blameCommand,
Repository repository)
{
this.cache = cacheManager.getCache(CacheKey.class, BlameResult.class,
CACHE_NAME);
this.blameCommand = blameCommand;
this.repository = repository;
}
//~--- methods --------------------------------------------------------------
/**
* Reset each parameter to its default value.
*
* @return {@code this}
*/
public BlameCommandBuilder reset()
{
request.reset();
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Returns changeset informations by line for the given file.
*
* @param path path of the file
* @return changeset informations by line for the given file
*
* @throws IllegalArgumentException if the path is null or empty
*/
public BlameResult getBlameResult(String path)
{
Preconditions.checkArgument(!Strings.isNullOrEmpty(path),
"path is required");
BlameCommandRequest requestClone = request.clone();
requestClone.setPath(path);
BlameResult result = null;
if (disableCache)
{
result = blameCommand.getBlameResult(requestClone);
}
else
{
CacheKey key = new CacheKey(repository, request);
result = cache.get(key);
if (result == null)
{
result = blameCommand.getBlameResult(requestClone);
if (result != null)
{
cache.put(key, result);
}
}
}
return result;
}
//~--- set methods ----------------------------------------------------------
/**
* Disables the cache. This means that every {@link BlameResult}
* is directly retrieved from the {@link Repository}. <b>Note: </b> Disabling
* the cache cost a lot of performance and could be much more slower.
*
*
* @param disableCache true to disable the cache
*
* @return {@code this}
*/
public BlameCommandBuilder setDisableCache(boolean disableCache)
{
this.disableCache = disableCache;
return this;
}
/**
* Sets the start revision for the blame.
*
*
* @param revision revision to start from
*
* @return {@code this}
*/
public BlameCommandBuilder setRevision(String revision)
{
request.setRevision(revision);
return this;
}
//~--- inner classes --------------------------------------------------------
/**
* Key for cache.
*
*
* @version Enter version here..., 12/06/05
* @author Enter your name here...
*/
private static class CacheKey implements Serializable
{
/**
* Constructs ...
*
*
* @param repository
* @param request
*/
public CacheKey(Repository repository, BlameCommandRequest request)
{
this.repositoryId = repository.getId();
this.request = request;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final CacheKey other = (CacheKey) obj;
return Objects.equal(repositoryId, other.repositoryId)
&& Objects.equal(request, other.request);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(repositoryId, request);
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String repositoryId;
/** Field description */
private BlameCommandRequest request;
}
//~--- fields ---------------------------------------------------------------
/** implementation of the blame command */
private BlameCommand blameCommand;
/** the cache */
private Cache<CacheKey, BlameResult> cache;
/** disable change */
private boolean disableCache;
/** the repository */
private Repository repository;
/** request for the blame command implementation */
private BlameCommandRequest request = new BlameCommandRequest();
}

View File

@@ -0,0 +1,270 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.Repository;
import sonia.scm.repository.spi.BrowseCommand;
import sonia.scm.repository.spi.BrowseCommandRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
* BrowseCommandBuilder is able to browse the files of a {@link Repository}.
*
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class BrowseCommandBuilder
{
/** Name of the cache */
private static final String CACHE_NAME = "sonia.scm.cache.browse";
//~--- constructors ---------------------------------------------------------
/**
* Constructs a new {@link LogCommandBuilder}, this constructor should
* only be called from the {@link RepositoryService}.
*
* @param cacheManager cache manager
* @param logCommand implementation of the {@link LogCommand}
* @param browseCommand
* @param repository repository to query
*/
BrowseCommandBuilder(CacheManager cacheManager, BrowseCommand browseCommand,
Repository repository)
{
this.cache = cacheManager.getCache(CacheKey.class, BrowserResult.class,
CACHE_NAME);
this.browseCommand = browseCommand;
this.repository = repository;
}
//~--- methods --------------------------------------------------------------
/**
* Reset each parameter to its default value.
*
*
* @return {@code this}
*/
public BrowseCommandBuilder reset()
{
request.reset();
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Return the files for the given parameters.
*
*
* @return files for the given parameters
*/
public BrowserResult getBrowserResult()
{
BrowserResult result = null;
if (disableCache)
{
result = browseCommand.getBrowserResult(request);
}
else
{
CacheKey key = new CacheKey(repository, request);
result = cache.get(key);
if (result != null)
{
cache.put(key, result);
}
}
return result;
}
//~--- set methods ----------------------------------------------------------
/**
* Disables the cache. This means that every {@link BrowserResult}
* is directly retrieved from the {@link Repository}. <b>Note: </b> Disabling
* the cache cost a lot of performance and could be much more slower.
*
*
* @param disableCache true to disable the cache
*
* @return {@code this}
*/
public BrowseCommandBuilder setDisableCache(boolean disableCache)
{
this.disableCache = disableCache;
return this;
}
/**
* Retrieve only files which are children of the given path.
* This path have to be a directory.
*
* @param path path of the folder
*
* @return {@code this}
*/
public BrowseCommandBuilder setPath(String path)
{
request.setPath(path);
return this;
}
/**
* Retrieve only files of the given revision.
*
* @param revision revision for the files
*
* @return {@code this}
*/
public BrowseCommandBuilder setRevision(String revision)
{
request.setRevision(revision);
return this;
}
//~--- inner classes --------------------------------------------------------
/**
* Key for cache.
*
*
* @version Enter version here..., 12/06/05
* @author Enter your name here...
*/
private static class CacheKey implements Serializable
{
/**
* Constructs ...
*
*
* @param repository
* @param request
*/
public CacheKey(Repository repository, BrowseCommandRequest request)
{
this.repositoryId = repository.getId();
this.request = request;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final CacheKey other = (CacheKey) obj;
return Objects.equal(repositoryId, other.repositoryId)
&& Objects.equal(request, other.request);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(repositoryId, request);
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String repositoryId;
/** Field description */
private BrowseCommandRequest request;
}
//~--- fields ---------------------------------------------------------------
/** implementation of the browse command */
private BrowseCommand browseCommand;
/** cache */
private Cache<CacheKey, BrowserResult> cache;
/** disables the cache */
private boolean disableCache;
/** the repsitory */
private Repository repository;
/** request for the command */
private BrowseCommandRequest request = new BrowseCommandRequest();
}

View File

@@ -0,0 +1,173 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.io.Closeables;
import sonia.scm.repository.Repository;
import sonia.scm.repository.spi.CatCommand;
import sonia.scm.repository.spi.CatCommandRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
/**
* Shows the content of a file in the {@link Repository}.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class CatCommandBuilder
{
/**
* Constructs a new {@link CatCommandBuilder}, this constructor should
* only be called from the {@link RepositoryService}.
*
* @param catCommand implementation of the {@link CatCommand}
*/
CatCommandBuilder(CatCommand catCommand)
{
this.catCommand = catCommand;
}
//~--- methods --------------------------------------------------------------
/**
* Reset each parameter to its default value.
*
* @return {@code this}
*/
public CatCommandBuilder reset()
{
request.reset();
return this;
}
/**
* Passes the content of the given file to the outputstream.
*
* @param outputStream outputstream for the content
* @param path file path
*
* @return {@code this}
*/
public CatCommandBuilder retriveContent(OutputStream outputStream,
String path)
{
getCatResult(outputStream, path);
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the content of the given file.
*
* @param path file path
* @return content of the file
*/
public String getContent(String path)
{
String content = null;
ByteArrayOutputStream baos = null;
try
{
baos = new ByteArrayOutputStream();
getCatResult(baos, path);
content = baos.toString();
}
finally
{
Closeables.closeQuietly(baos);
}
return content;
}
//~--- set methods ----------------------------------------------------------
/**
* Sets the revision of the file.
*
*
* @param revision revision of the file
*
* @return {@code this}
*/
public CatCommandBuilder setRevision(String revision)
{
request.setRevision(revision);
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Executes the cat command.
*
*
* @param outputStream the outputstream for the content
* @param path path of the file
*/
private void getCatResult(OutputStream outputStream, String path)
{
Preconditions.checkNotNull(outputStream, "OutputStream is required");
Preconditions.checkArgument(!Strings.isNullOrEmpty(path),
"path is required");
CatCommandRequest requestClone = request.clone();
requestClone.setPath(path);
catCommand.getCatResult(requestClone, outputStream);
}
//~--- fields ---------------------------------------------------------------
/** implementation of the cat command */
private CatCommand catCommand;
/** request for the cat command */
private CatCommandRequest request = new CatCommandRequest();
}

View File

@@ -0,0 +1,45 @@
/**
* 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.api;
/**
* Enumeration of available commands.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public enum Command
{
LOG, BROWSE, CAT, DIFF, BLAME
}

View File

@@ -0,0 +1,93 @@
/**
* 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.api;
/**
* This exception is thrown if the {@link RepositoryService} does not support
* the requested command.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class CommandNotSupportedException extends RuntimeException
{
/**
* Constructs a new {@link CommandNotSupportedException}.
*
*
* @param command not supported command
*/
public CommandNotSupportedException(Command command)
{
//J-
this(
command,
"The requested feature "
.concat(command.toString())
.concat(" is not supported")
);
//J+
}
/**
* Constructs a new {@link CommandNotSupportedException}.
*
*
* @param command not supported command
* @param message message to be shown
*/
public CommandNotSupportedException(Command command, String message)
{
super(message);
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the command which is not supported.
*
*
* @return not supported command
*/
public Command getCommand()
{
return command;
}
//~--- fields ---------------------------------------------------------------
/** not supported command */
private Command command;
}

View File

@@ -0,0 +1,173 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Preconditions;
import com.google.common.io.Closeables;
import sonia.scm.repository.spi.DiffCommand;
import sonia.scm.repository.spi.DiffCommandRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
/**
* Shows differences between revisions for a specified file or
* the entire revision.<br />
* <b>Note:</b> One of the parameter path or revision have to be set.
* TODO check current behavior.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class DiffCommandBuilder
{
/**
* Constructs a new {@link DiffCommandBuilder}, this constructor should
* only be called from the {@link RepositoryService}.
*
* @param implementation of {@link DiffCommand}
*
* @param diffCommand
*/
DiffCommandBuilder(DiffCommand diffCommand)
{
this.diffCommand = diffCommand;
}
//~--- methods --------------------------------------------------------------
/**
* Passes the difference of the given parameter to the outputstream.
*
*
* @param outputStream outputstream for the difference
*
* @return {@code this}
*/
public DiffCommandBuilder retriveContent(OutputStream outputStream)
{
getDiffResult(outputStream);
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the content of the difference as string.
*
* @return content of the difference
*/
public String getContent()
{
String content = null;
ByteArrayOutputStream baos = null;
try
{
baos = new ByteArrayOutputStream();
getDiffResult(baos);
content = baos.toString();
}
finally
{
Closeables.closeQuietly(baos);
}
return content;
}
//~--- set methods ----------------------------------------------------------
/**
* Show the difference only for the given path.
*
*
* @param path path for difference
*
* @return {@code this}
*/
public DiffCommandBuilder setPath(String path)
{
request.setPath(path);
return this;
}
/**
* Show the difference only for the given revision.
*
*
* @param revision revision for difference
*
* @return {@code this}
*/
public DiffCommandBuilder setRevision(String revision)
{
request.setRevision(revision);
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param outputStream
* @param path
*/
private void getDiffResult(OutputStream outputStream)
{
Preconditions.checkNotNull(outputStream, "OutputStream is required");
Preconditions.checkArgument(request.isValid(),
"path and/or revision is required");
diffCommand.getDiffResult(request, outputStream);
}
//~--- fields ---------------------------------------------------------------
/** implementation of the diff command */
private DiffCommand diffCommand;
/** request for the diff command implementation */
private DiffCommandRequest request = new DiffCommandRequest();
}

View File

@@ -0,0 +1,451 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.Repository;
import sonia.scm.repository.spi.LogCommand;
import sonia.scm.repository.spi.LogCommandRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
* LogCommandBuilder is able to show the history of a file in a
* {@link Repository} or the entire history of a {@link Repository}.
* This class could be used to retrieve a single {@link Changeset} by its id
* or to get a list of changesets in a {@link ChangesetPagingResult}
* which can be used for paging.<br />
* <br />
* <b>Samples</b>:
* <br />
* <br />
* <b>Get a instance of LogCommandBuilder:</b>
* <pre><code>
* public class Sample {
*
* {@literal @}Inject
* public Sample(RepositoryServiceFactory factory){
* LogCommandBuilder log = factory.create("repository-id").getLogCommand();
* }
*
* }
* </code></pre>
*
* <b>Retrieve a single {@link Changeset}:</b>
* <pre><code>
* LogCommand log = repositoryService.getLogCommand();
* Changeset changeset = log.getChangeset("id-of-the-commit");
* </code></pre>
*
* <b>Retrieve changesets of a {@link Repository} with paging:</b>
* <pre><code>
* LogCommand log = repositoryService.getLogCommand();
* ChangesetPagingResult changesetPagingResult =
* log.setPagingStart(25).setPagingLimit(25).getChangesets();
* </code></pre>
*
* <b>Retrieve all changesets of a file in a {@link Repository}:</b>
* <pre><code>
* LogCommand log = repositoryService.getLogCommand();
* ChangesetPagingResult changesetPagingResult =
* log.setPath("pom.xml").disablePagingLimit().getChangesets();
* </code></pre>
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class LogCommandBuilder
{
/** name of the cache */
private static final String CACHE_NAME = "sonia.scm.cache.log";
//~--- constructors ---------------------------------------------------------
/**
* Constructs a new {@link LogCommandBuilder}, this constructor should
* only be called from the {@link RepositoryService}.
*
* @param cacheManager cache manager
* @param logCommand implementation of the {@link LogCommand}
* @param repository repository to query
*/
LogCommandBuilder(CacheManager cacheManager, LogCommand logCommand,
Repository repository)
{
this.cache = cacheManager.getCache(CacheKey.class,
ChangesetPagingResult.class, CACHE_NAME);
this.logCommand = logCommand;
this.repository = repository;
}
//~--- methods --------------------------------------------------------------
/**
* Disable paging limit all available changesets will be retrieved.
* This method does the same as {@link #setPagingLimit(int)}
* with a value of -1.
*
*
* @return {@code this}
*/
public LogCommandBuilder disablePagingLimit()
{
request.setPagingLimit(-1);
return this;
}
/**
* Reset each parameter to its default value.
*
*
* @return {@code this}
*/
public LogCommandBuilder reset()
{
request.reset();
return this;
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the {@link Changeset} with the given id or null if the
* {@link Changeset} could not be found in the {@link Repository}.
*
*
* @param id id of the {@link Changeset}
*
* @return the {@link Changeset} with the given id or null
*/
public Changeset getChangeset(String id)
{
Changeset changeset = null;
if (disableCache)
{
changeset = logCommand.getChangeset(id);
}
else
{
CacheKey key = new CacheKey(repository, id);
ChangesetPagingResult cpr = cache.get(key);
if (cpr == null)
{
changeset = logCommand.getChangeset(id);
if (changeset != null)
{
cpr = new ChangesetPagingResult(1, ImmutableList.of(changeset));
cache.put(key, cpr);
}
}
else
{
changeset = cpr.iterator().next();
}
}
return changeset;
}
/**
* Return all changesets with the given parameters.
*
*
* @return all changesets with the given parameters
*/
public ChangesetPagingResult getChangesets()
{
ChangesetPagingResult cpr = null;
if (disableCache)
{
cpr = logCommand.getChangesets(request);
}
else
{
CacheKey key = new CacheKey(repository, request);
cpr = cache.get(key);
if (cpr == null)
{
cpr = logCommand.getChangesets(request);
if (cpr != null)
{
cache.put(key, cpr);
}
}
}
return cpr;
}
//~--- set methods ----------------------------------------------------------
/**
* Retrieve only changesets of the given branch.
*
*
* @param branch branch name to query
*
* @return {@code this}
*/
public LogCommandBuilder setBranch(String branch)
{
request.setBranch(branch);
return this;
}
/**
* Disables the cache for changesets. This means that every {@link Changeset}
* is directly retrieved from the {@link Repository}. <b>Note: </b> Disabling
* the cache cost a lot of performance and could be much more slower.
*
*
* @param disableCache true to disable the cache
*
* @return {@code this}
*/
public LogCommandBuilder setDisableCache(boolean disableCache)
{
this.disableCache = disableCache;
return this;
}
/**
* Retrieve changesets until the given the {@link Changeset}
* with the given id.
*
*
* @param endChangeset id of the end {@link Changeset}
*
* @return {@code this}
*/
public LogCommandBuilder setEndChangeset(String endChangeset)
{
request.setEndChangeset(endChangeset);
return this;
}
/**
* Set the limit for the returned changesets. The default value is 20.
* Setting the value to -1 means to disable the limit.
*
*
* @param pagingLimit limit for returned changesets
*
* @return {@code this}
*/
public LogCommandBuilder setPagingLimit(int pagingLimit)
{
request.setPagingLimit(pagingLimit);
return this;
}
/**
* Sets the start value for paging. The value is 0.
*
*
* @param pagingStart start value for paging
*
* @return {@code this}
*/
public LogCommandBuilder setPagingStart(int pagingStart)
{
request.setPagingStart(pagingStart);
return this;
}
/**
* Retrieve only changesets which are affect the given path.
*
*
* @param path file path in the {@link Repository}.
*
* @return {@code this}
*/
public LogCommandBuilder setPath(String path)
{
request.setPath(path);
return this;
}
/**
* Start at the given {@link Changeset}.
*
*
* @param startChangeset changeset id to start with
*
* @return {@code this}
*/
public LogCommandBuilder setStartChangeset(String startChangeset)
{
request.setStartChangeset(startChangeset);
return this;
}
//~--- inner classes --------------------------------------------------------
/**
* Class description
*
*
* @version Enter version here..., 12/06/05
* @author Enter your name here...
*/
private static class CacheKey implements Serializable
{
/**
* Constructs ...
*
*
* @param repository
* @param request
*/
public CacheKey(Repository repository, LogCommandRequest request)
{
this.repositoryId = repository.getId();
this.request = request;
}
/**
* Constructs ...
*
*
*
* @param repository
* @param changesetId
*/
public CacheKey(Repository repository, String changesetId)
{
this.repositoryId = repository.getId();
this.changesetId = changesetId;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final CacheKey other = (CacheKey) obj;
return Objects.equal(repositoryId, other.repositoryId)
&& Objects.equal(changesetId, other.changesetId)
&& Objects.equal(request, other.request);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(repositoryId, changesetId, request);
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String changesetId;
/** Field description */
private String repositoryId;
/** Field description */
private LogCommandRequest request;
}
//~--- fields ---------------------------------------------------------------
/** cache for changesets */
private Cache<CacheKey, ChangesetPagingResult> cache;
/** disable cache */
private boolean disableCache;
/** Implementation of the log command */
private LogCommand logCommand;
/** repository to query */
private Repository repository;
/** request for the log command */
private LogCommandRequest request = new LogCommandRequest();
}

View File

@@ -0,0 +1,165 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.Repository;
import sonia.scm.repository.spi.RepositoryServiceProvider;
/**
* From the {@link RepositoryService} it is possible to access all commands for
* a single {@link Repository}. The {@link RepositoryService} is only access
* able from the {@link RepositoryServiceFactory}.<br />
* <br />
*
* <b>Note:</b> Not every {@link RepositoryService} supports every command. If
* the command is not supported the method will trow a
* {@link CommandNotSupportedException}. It is possible to check if the command
* is supported by the {@link RepositoryService} with the
* {@link RepositoryService#isSupported(Command)} method.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class RepositoryService
{
/**
* Constructs a new {@link RepositoryService}. This constructor should only
* be called from the {@link RepositoryServiceFactory}.
*
* @param cacheManager cache manager
* @param provider implementation for {@link RepositoryServiceProvider}
* @param repository the repository
*/
RepositoryService(CacheManager cacheManager,
RepositoryServiceProvider provider, Repository repository)
{
this.cacheManager = cacheManager;
this.provider = provider;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* The blame command shows changeset information by line for a given file.
*
* @return instance of {@link BlameCommandBuilder}
* @throws CommandNotSupportedException if the command is not supported
* by the implementation of the repository service provider.
*/
public BlameCommandBuilder getBlameCommand()
{
return new BlameCommandBuilder(cacheManager, provider.getBlameCommand(),
repository);
}
/**
* The browse command allows browsing of a repository.
*
* @return instance of {@link BrowseCommandBuilder}
* @throws CommandNotSupportedException if the command is not supported
* by the implementation of the repository service provider.
*/
public BrowseCommandBuilder getBrowseCommand()
{
return new BrowseCommandBuilder(cacheManager, provider.getBrowseCommand(),
repository);
}
/**
* The cat command show the content of a given file.
*
* @return instance of {@link CatCommandBuilder}
* @throws CommandNotSupportedException if the command is not supported
* by the implementation of the repository service provider.
*/
public CatCommandBuilder getCatCommand()
{
return new CatCommandBuilder(provider.getCatCommand());
}
/**
* The diff command shows differences between revisions for a specified file
* or the entire revision.
*
* @return instance of {@link DiffCommandBuilder}
* @throws CommandNotSupportedException if the command is not supported
* by the implementation of the repository service provider.
*/
public DiffCommandBuilder getDiffCommand()
{
return new DiffCommandBuilder(provider.getDiffCommand());
}
/**
* The log command shows revision history of entire repository or files.
*
* @return instance of {@link LogCommandBuilder}
* @throws CommandNotSupportedException if the command is not supported
* by the implementation of the repository service provider.
*/
public LogCommandBuilder getLogCommand()
{
return new LogCommandBuilder(cacheManager, provider.getLogCommand(),
repository);
}
/**
* Returns true if the command is supported by the repository service.
*
*
* @param command command
*
* @return true if the command is supported
*/
public boolean isSupported(Command command)
{
return provider.getSupportedCommands().contains(command);
}
//~--- fields ---------------------------------------------------------------
/** cache manager */
private CacheManager cacheManager;
/** implementation of the repository service provider */
private RepositoryServiceProvider provider;
/** the repository */
private Repository repository;
}

View File

@@ -0,0 +1,228 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager;
import sonia.scm.repository.RepositoryNotFoundException;
import sonia.scm.repository.spi.RepositoryServiceProvider;
import sonia.scm.repository.spi.RepositoryServiceResolver;
//~--- JDK imports ------------------------------------------------------------
import java.util.Set;
/**
* The {@link RepositoryServiceFactory} is the entrypoint of the repository api.
* You could create {@link RepositoryService} from a {@link Repository} and
* with the {@link RepositoryService} you could browse and control the entire
* {@link Repository}.
* <p>&nbsp;</p>
* <b>Simple usage example:</b>
*
* <pre><code>
* public class Sample {
*
* private final RepositoryServiceFactory factory;
*
* {@literal @}Inject
* public Sample(RepositoryServiceFactory factory){
* this.factory = factory;
* }
*
* public Changeset getChangeset(String repositoryId, String commitId){
* RepositoryService service = factory.create(repositoryId);
* return service.getLogCommand().getChangeset(commitId);
* }
*
* }
* </code></pre>
*
* @author Sebastian Sdorra
* @since 1.17
*/
@Singleton
public final class RepositoryServiceFactory
{
/**
* Constructs a new {@link RepositoryServiceFactory}. This constructor
* should not be called manually, it should only be used by the injection
* container.
*
* @param cacheManager cache manager
* @param repositoryManager manager for repositories
* @param resolvers a set of {@link RepositoryServiceResolver}
*/
@Inject
public RepositoryServiceFactory(CacheManager cacheManager,
RepositoryManager repositoryManager,
Set<RepositoryServiceResolver> resolvers)
{
this.cacheManager = cacheManager;
this.repositoryManager = repositoryManager;
this.resolvers = resolvers;
}
//~--- methods --------------------------------------------------------------
/**
* Creates a new RepositoryService for the given repository.
*
*
* @param repositoryId id of the repository
*
* @return a implementation of RepositoryService
* for the given type of repository
*
* @throws RepositoryNotFoundException if no repository
* with the given id is available
* @throws RepositoryServiceNotFoundException if no repository service
* implementation for this kind of repository is available
* @throws IllegalArgumentException if the repository id is null or empty
*/
public RepositoryService create(String repositoryId)
throws RepositoryNotFoundException
{
Preconditions.checkArgument(!Strings.isNullOrEmpty(repositoryId),
"a non empty repositoryId is required");
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find a repository with id ".concat(repositoryId));
}
return create(repository);
}
/**
* Creates a new RepositoryService for the given repository.
*
*
* @param type type of the repository
* @param name name of the repository
*
* @return a implementation of RepositoryService
* for the given type of repository
*
* @throws RepositoryNotFoundException if no repository
* with the given id is available
* @throws RepositoryServiceNotFoundException if no repository service
* implementation for this kind of repository is available
* @throws IllegalArgumentException if one of the parameters is null or empty
*/
public RepositoryService create(String type, String name)
throws RepositoryNotFoundException
{
Preconditions.checkArgument(!Strings.isNullOrEmpty(type),
"a non empty type is required");
Preconditions.checkArgument(!Strings.isNullOrEmpty(name),
"a non empty name is required");
Repository repository = repositoryManager.get(type, name);
if (repository == null)
{
StringBuilder msg =
new StringBuilder("could not find a repository with type ");
msg.append(type).append(" and name ").append(name);
throw new RepositoryNotFoundException(msg.toString());
}
return create(repository);
}
/**
* Creates a new RepositoryService for the given repository.
*
*
* @param repository the repository
*
* @return a implementation of RepositoryService
* for the given type of repository
*
* @throws RepositoryServiceNotFoundException if no repository service
* implementation for this kind of repository is available
* @throws NullPointerException if the repository is null
*/
public RepositoryService create(Repository repository)
{
Preconditions.checkNotNull(repository, "repository is required");
RepositoryService service = null;
for (RepositoryServiceResolver resolver : resolvers)
{
RepositoryServiceProvider provider = resolver.reslove(repository);
if (provider != null)
{
service = new RepositoryService(cacheManager, provider, repository);
break;
}
}
if (service == null)
{
throw new RepositoryServiceNotFoundException(repository);
}
return service;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private CacheManager cacheManager;
/** Field description */
private RepositoryManager repositoryManager;
/** Field description */
private Set<RepositoryServiceResolver> resolvers;
}

View File

@@ -0,0 +1,80 @@
/**
* 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.api;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.Repository;
/**
* This exception is throw if no {@link RepositoryService}
* is available for the given {@link Repository}.
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class RepositoryServiceNotFoundException extends RuntimeException
{
/**
* Constructs a new {@link RepositoryServiceNotFoundException}.
*
*
* @param repository unsupported repository
*/
public RepositoryServiceNotFoundException(Repository repository)
{
super("could not find a repository service provider implementation for repository "
.concat(repository.getName()));
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the unsupported repository.
*
*
* @return unsupported repository
*/
public Repository getRepository()
{
return repository;
}
//~--- fields ---------------------------------------------------------------
/** unsupported repository */
private Repository repository;
}

View File

@@ -0,0 +1,37 @@
/**
* 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
*
*/
/**
* API for repository access.
*/
package sonia.scm.repository.api;

View File

@@ -0,0 +1,57 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.BlameResult;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface BlameCommand
{
/**
* Method description
*
*
* @param request
*
* @return
*/
public BlameResult getBlameResult(BlameCommandRequest request);
}

View File

@@ -0,0 +1,68 @@
/**
* 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.spi;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class BlameCommandRequest extends FileBaseCommandRequest
{
/**
* Method description
*
*
* @return
*/
@Override
public BlameCommandRequest clone()
{
BlameCommandRequest clone = null;
try
{
clone = (BlameCommandRequest) super.clone();
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
throw new InternalError("BlameCommandRequest seems not to be cloneable");
}
return clone;
}
}

View File

@@ -0,0 +1,57 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.BrowserResult;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface BrowseCommand
{
/**
* Method description
*
*
* @param request
*
* @return
*/
public BrowserResult getBrowserResult(BrowseCommandRequest request);
}

View File

@@ -0,0 +1,46 @@
/**
* 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.spi;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class BrowseCommandRequest extends FileBaseCommandRequest
implements Resetable, Serializable {}

View File

@@ -0,0 +1,56 @@
/**
* 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.spi;
//~--- JDK imports ------------------------------------------------------------
import java.io.OutputStream;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface CatCommand
{
/**
* Method description
*
*
* @param request
* @param output
*/
public void getCatResult(CatCommandRequest request, OutputStream output);
}

View File

@@ -0,0 +1,69 @@
/**
* 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.spi;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class CatCommandRequest extends FileBaseCommandRequest
implements Cloneable
{
/**
* Method description
*
*
* @return
*/
@Override
public CatCommandRequest clone()
{
CatCommandRequest clone = null;
try
{
clone = (CatCommandRequest) super.clone();
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
throw new InternalError("CatCommandRequest seems not to be cloneable");
}
return clone;
}
}

View File

@@ -0,0 +1,56 @@
/**
* 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.spi;
//~--- JDK imports ------------------------------------------------------------
import java.io.OutputStream;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface DiffCommand
{
/**
* Method description
*
*
* @param request
* @param output
*/
public void getDiffResult(DiffCommandRequest request, OutputStream output);
}

View File

@@ -0,0 +1,90 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Strings;
import sonia.scm.Validateable;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class DiffCommandRequest extends FileBaseCommandRequest
implements Cloneable, Validateable
{
/**
* Method description
*
*
* @return
*/
@Override
public DiffCommandRequest clone()
{
DiffCommandRequest clone = null;
try
{
clone = (DiffCommandRequest) super.clone();
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
throw new InternalError("DiffCommandRequest seems not to be cloneable");
}
return clone;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public boolean isValid()
{
return !Strings.isNullOrEmpty(getPath())
||!Strings.isNullOrEmpty(getRevision());
}
}

View File

@@ -0,0 +1,174 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public abstract class FileBaseCommandRequest implements Resetable, Serializable
{
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final FileBaseCommandRequest other = (FileBaseCommandRequest) obj;
return Objects.equal(path, other.path)
&& Objects.equal(revision, other.revision);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(path, revision);
}
/**
* Method description
*
*/
@Override
public void reset()
{
path = null;
revision = null;
}
/**
* Method description
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("path", path)
.add("revision", revision)
.toString();
//J+
}
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param path
*/
public void setPath(String path)
{
this.path = path;
}
/**
* Method description
*
*
* @param revision
*/
public void setRevision(String revision)
{
this.revision = revision;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
String getPath()
{
return path;
}
/**
* Method description
*
*
* @return
*/
String getRevision()
{
return revision;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private String path;
/** Field description */
private String revision;
}

View File

@@ -0,0 +1,68 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface LogCommand
{
/**
* Method description
*
*
* @param id
*
* @return
*/
public Changeset getChangeset(String id);
/**
* Method description
*
*
* @param request
*
* @return
*/
public ChangesetPagingResult getChangesets(LogCommandRequest request);
}

View File

@@ -0,0 +1,326 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public final class LogCommandRequest implements Serializable, Resetable
{
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final LogCommandRequest other = (LogCommandRequest) obj;
return Objects.equal(startChangeset, other.startChangeset)
&& Objects.equal(endChangeset, other.endChangeset)
&& Objects.equal(pagingStart, other.pagingStart)
&& Objects.equal(pagingLimit, other.pagingLimit)
&& Objects.equal(branch, other.branch)
&& Objects.equal(path, other.path)
&& Objects.equal(pending, other.pending);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(startChangeset, endChangeset, pagingStart,
pagingLimit, branch, path, pending);
}
/**
* Method description
*
*/
@Override
public void reset()
{
startChangeset = null;
endChangeset = null;
pagingStart = 0;
pagingLimit = 20;
path = null;
branch = null;
pending = false;
}
/**
* Method description
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("startChangeset", startChangeset)
.add("endChangeset", endChangeset)
.add("pagingStart", pagingStart)
.add("pagingLimit", pagingLimit)
.add("branch", branch)
.add("path", path)
.add("pending", pending)
.toString();
//J+
}
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param branch
*/
public void setBranch(String branch)
{
this.branch = branch;
}
/**
* Method description
*
*
* @param endChangeset
*/
public void setEndChangeset(String endChangeset)
{
this.endChangeset = endChangeset;
}
/**
* Method description
*
*
* @param pagingLimit
*/
public void setPagingLimit(int pagingLimit)
{
this.pagingLimit = pagingLimit;
}
/**
* Method description
*
*
* @param pagingStart
*/
public void setPagingStart(int pagingStart)
{
this.pagingStart = pagingStart;
}
/**
* Method description
*
*
* @param path
*/
public void setPath(String path)
{
this.path = path;
}
/**
* Method description
*
*
* @param pending
*/
public void setPending(boolean pending)
{
this.pending = pending;
}
/**
* Method description
*
*
* @param startChangeset
*/
public void setStartChangeset(String startChangeset)
{
this.startChangeset = startChangeset;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
String getBranch()
{
return branch;
}
/**
* Method description
*
*
* @return
*/
String getEndChangeset()
{
return endChangeset;
}
/**
* Method description
*
*
* @return
*/
int getPagingLimit()
{
return pagingLimit;
}
/**
* Method description
*
*
* @return
*/
int getPagingStart()
{
return pagingStart;
}
/**
* Method description
*
*
* @return
*/
String getPath()
{
return path;
}
/**
* Method description
*
*
* @return
*/
String getStartChangeset()
{
return startChangeset;
}
/**
* Method description
*
*
* @return
*/
boolean isPagingUnlimited()
{
return pagingLimit < 0;
}
/**
* Method description
*
*
* @return
*/
boolean isPending()
{
return pending;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private String branch;
/** Field description */
private String endChangeset;
/** Field description */
private int pagingLimit = 20;
/** Field description */
private int pagingStart = 0;
/** Field description */
private String path;
/** Field description */
private boolean pending = false;
/** Field description */
private String startChangeset;
}

View File

@@ -0,0 +1,115 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.Command;
import sonia.scm.repository.api.CommandNotSupportedException;
//~--- JDK imports ------------------------------------------------------------
import java.util.Set;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public abstract class RepositoryServiceProvider
{
/**
* Method description
*
*
* @return
*/
public abstract Set<Command> getSupportedCommands();
/**
* Method description
*
*
* @return
*/
public BlameCommand getBlameCommand()
{
throw new CommandNotSupportedException(Command.BLAME);
}
/**
* Method description
*
*
* @return
*/
public BrowseCommand getBrowseCommand()
{
throw new CommandNotSupportedException(Command.BROWSE);
}
/**
* Method description
*
*
* @return
*/
public CatCommand getCatCommand()
{
throw new CommandNotSupportedException(Command.CAT);
}
/**
* Method description
*
*
* @return
*/
public DiffCommand getDiffCommand()
{
throw new CommandNotSupportedException(Command.DIFF);
}
/**
* Method description
*
*
* @return
*/
public LogCommand getLogCommand()
{
throw new CommandNotSupportedException(Command.LOG);
}
}

View File

@@ -0,0 +1,59 @@
/**
* 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.spi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.plugin.ExtensionPoint;
import sonia.scm.repository.Repository;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
@ExtensionPoint
public interface RepositoryServiceResolver
{
/**
* Method description
*
*
* @param repository
*
* @return
*/
public RepositoryServiceProvider reslove(Repository repository);
}

View File

@@ -0,0 +1,49 @@
/**
* 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.spi;
/**
*
* @author Sebastian Sdorra
* @since 1.17
*/
public interface Resetable
{
/**
* Method description
*
*/
public void reset();
}

View File

@@ -0,0 +1,37 @@
/**
* 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
*
*/
/**
* SPI for repository access. This package is only for service provider.
*/
package sonia.scm.repository.spi;