diff --git a/scm-core/src/main/java/sonia/scm/repository/api/Command.java b/scm-core/src/main/java/sonia/scm/repository/api/Command.java index c5bd6bdb70..e78d19a1af 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/Command.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/Command.java @@ -56,5 +56,5 @@ public enum Command /** * @since 1.31 */ - INCOMING; + INCOMING, OUTGOING; } diff --git a/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java new file mode 100644 index 0000000000..9f4664543b --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java @@ -0,0 +1,163 @@ +/** + * 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; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import sonia.scm.cache.CacheManager; +import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.PermissionType; +import sonia.scm.repository.PreProcessorUtil; +import sonia.scm.repository.Repository; +import sonia.scm.repository.spi.OutgoingCommand; +import sonia.scm.repository.spi.OutgoingCommandRequest; +import sonia.scm.security.RepositoryPermission; + +/** + * Show changesets not found in a remote repository. + * + * @author Sebastian Sdorra + * @since 1.31 + */ +public final class OutgoingCommandBuilder +{ + + + /** + * Constructs a new {@link OutgoingCommandBuilder}, this constructor should + * only be called from the {@link RepositoryService}. + * + * @param cacheManager cache manager + * @param command implementation of the {@link OutgoingCommand} + * @param repository repository to query + * @param preProcessorUtil pre processor util + */ + OutgoingCommandBuilder(CacheManager cacheManger, OutgoingCommand command, + Repository repository, PreProcessorUtil preProcessorUtil) + { + this.command = command; + this.preProcessorUtil = preProcessorUtil; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Returns the outgoing changesets for the remote repository. + * + * + * @param remoteRepository remote repository + * + * @return outgoing changesets + */ + public ChangesetPagingResult getOutgoingChangesets( + Repository remoteRepository) + { + Subject subject = SecurityUtils.getSubject(); + + subject.checkPermission(new RepositoryPermission(remoteRepository, + PermissionType.READ)); + + request.setRemoteRepository(remoteRepository); + + // TODO caching + ChangesetPagingResult cpr = command.getOutgoingChangesets(request); + + if (!disablePreProcessors) + { + preProcessorUtil.prepareForReturn(remoteRepository, cpr); + } + + return cpr; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Disable the execution of pre processors. + * + * + * @param disablePreProcessors true to disable the pre processors execution + * + * @return {@code this} + */ + public OutgoingCommandBuilder setDisablePreProcessors( + boolean disablePreProcessors) + { + this.disablePreProcessors = disablePreProcessors; + + return this; + } + + /** + * Set the limit for the returned outgoing 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 OutgoingCommandBuilder 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 OutgoingCommandBuilder setPagingStart(int pagingStart) + { + request.setPagingStart(pagingStart); + + return this; + } + + //~--- fields --------------------------------------------------------------- + + /** outgoing command implementation */ + private OutgoingCommand command; + + /** disable the execution of pre processors */ + private boolean disablePreProcessors = false; + + /** disable the execution of pre processors */ + private PreProcessorUtil preProcessorUtil; + + /** request object */ + private OutgoingCommandRequest request = new OutgoingCommandRequest(); + +} diff --git a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java index 18da43bb21..11ec2a6e17 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java @@ -79,6 +79,7 @@ import java.io.IOException; * @apiviz.uses sonia.scm.repository.api.TagsCommandBuilder * @apiviz.uses sonia.scm.repository.api.BranchesCommandBuilder * @apiviz.uses sonia.scm.repository.api.IncomingCommandBuilder + * @apiviz.uses sonia.scm.repository.api.OutgoingCommandBuilder */ public final class RepositoryService implements Closeable { @@ -278,6 +279,27 @@ public final class RepositoryService implements Closeable repository, preProcessorUtil); } + /** + * The outgoing command show changesets not found in a remote repository. + * + * + * @return instance of {@link OutgoingCommandBuilder} + * @throws CommandNotSupportedException if the command is not supported + * by the implementation of the repository service provider. + * @since 1.31 + */ + public OutgoingCommandBuilder getOutgoingCommand() + { + if (logger.isDebugEnabled()) + { + logger.debug("create outgoing command for repository {}", + repository.getName()); + } + + return new OutgoingCommandBuilder(cacheManager, + provider.getOutgoingCommand(), repository, preProcessorUtil); + } + /** * Returns the repository of this service. * diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java new file mode 100644 index 0000000000..97d155021b --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java @@ -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; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.repository.ChangesetPagingResult; + +/** + * + * @author Sebastian Sdorra + * @since 1.31 + */ +public interface OutgoingCommand +{ + + /** + * Method description + * + * + * @param request + * + * @return + */ + public ChangesetPagingResult getOutgoingChangesets( + OutgoingCommandRequest request); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommandRequest.java new file mode 100644 index 0000000000..f280186ca2 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommandRequest.java @@ -0,0 +1,39 @@ +/** + * 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.31 + */ +public final class OutgoingCommandRequest extends PagedRemoteCommandRequest {} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/RepositoryServiceProvider.java b/scm-core/src/main/java/sonia/scm/repository/spi/RepositoryServiceProvider.java index 6ea9e2ad23..f5e72ff23b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/RepositoryServiceProvider.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/RepositoryServiceProvider.java @@ -142,6 +142,7 @@ public abstract class RepositoryServiceProvider implements Closeable * * * @return + * @since 1.31 */ public IncomingCommand getIncomingCommand() { @@ -159,6 +160,18 @@ public abstract class RepositoryServiceProvider implements Closeable throw new CommandNotSupportedException(Command.LOG); } + /** + * Method description + * + * + * @return + * @since 1.31 + */ + public OutgoingCommand getOutgoingCommand() + { + throw new CommandNotSupportedException(Command.OUTGOING); + } + /** * Method description *