From eaea1ac61c47931b4e3b27466ccb2a6d234a12c4 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 18 Apr 2011 21:51:54 +0200 Subject: [PATCH] added ChangesetPreProcessor api --- .../scm/repository/ChangesetPreProcessor.java | 55 +++++++++++++++++++ .../sonia/scm/BindingExtensionProcessor.java | 13 +++++ .../rest/resources/RepositoryResource.java | 41 ++++++++++++-- 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/ChangesetPreProcessor.java diff --git a/scm-core/src/main/java/sonia/scm/repository/ChangesetPreProcessor.java b/scm-core/src/main/java/sonia/scm/repository/ChangesetPreProcessor.java new file mode 100644 index 0000000000..3e6db77967 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/ChangesetPreProcessor.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.plugin.ExtensionPoint; + +/** + * + * @author Sebastian Sdorra + */ +@ExtensionPoint +public interface ChangesetPreProcessor +{ + + /** + * Method description + * + * + * @param changeset + */ + public void process(Changeset changeset); +} diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index e702940776..e1d8786890 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -46,6 +46,7 @@ import sonia.scm.group.GroupListener; import sonia.scm.io.FileSystem; import sonia.scm.plugin.ext.Extension; import sonia.scm.plugin.ext.ExtensionProcessor; +import sonia.scm.repository.ChangesetPreProcessor; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryListener; import sonia.scm.resources.ResourceHandler; @@ -101,6 +102,8 @@ public class BindingExtensionProcessor implements ExtensionProcessor Multibinder.newSetBinder(binder, AuthenticationHandler.class); Multibinder resourceHandler = Multibinder.newSetBinder(binder, ResourceHandler.class); + Multibinder changesetPreProcessorBinder = + Multibinder.newSetBinder(binder, ChangesetPreProcessor.class); authenticators.addBinding().to(XmlAuthenticationHandler.class); @@ -198,6 +201,16 @@ public class BindingExtensionProcessor implements ExtensionProcessor fileSystemClass = extensionClass; } + else if (ChangesetPreProcessor.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind ChangesetPreProcessor {}", + extensionClass.getName()); + } + + changesetPreProcessorBinder.addBinding().to(extensionClass); + } else { if (logger.isInfoEnabled()) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java index 0e59abd061..36a5add717 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java @@ -40,7 +40,9 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import sonia.scm.config.ScmConfiguration; +import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.ChangesetPreProcessor; import sonia.scm.repository.ChangesetViewer; import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; @@ -50,12 +52,14 @@ import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; import sonia.scm.util.HttpUtil; +import sonia.scm.util.Util; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.util.ArrayList; import java.util.Collection; +import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -92,18 +96,21 @@ public class RepositoryResource * @param repositoryManager * @param securityContextProvider * @param requestProvider + * @param changesetPreProcessorSet */ @Inject public RepositoryResource( ScmConfiguration configuration, RepositoryManager repositoryManager, Provider securityContextProvider, - Provider requestProvider) + Provider requestProvider, + Set changesetPreProcessorSet) { super(repositoryManager); this.configuration = configuration; this.repositoryManager = repositoryManager; this.securityContextProvider = securityContextProvider; this.requestProvider = requestProvider; + this.changesetPreProcessorSet = changesetPreProcessorSet; setDisableCache(false); } @@ -124,10 +131,9 @@ public class RepositoryResource @GET @Path("{id}/changesets") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public Response getChangesets(@PathParam("id") String id, - @DefaultValue("0") @QueryParam("start") int start, - @DefaultValue("20") @QueryParam("limit") int limit) - throws RepositoryException + public Response getChangesets(@PathParam("id") String id, @DefaultValue("0") + @QueryParam("start") int start, @DefaultValue("20") + @QueryParam("limit") int limit) throws RepositoryException { Response response = null; Repository repository = repositoryManager.get(id); @@ -142,6 +148,7 @@ public class RepositoryResource ChangesetPagingResult changesets = changesetViewer.getChangesets(start, limit); + callPreProcessors(changesets); response = Response.ok(changesets).build(); } else @@ -275,6 +282,27 @@ public class RepositoryResource } } + /** + * Method description + * + * + * @param changesets + */ + private void callPreProcessors(ChangesetPagingResult changesets) + { + if (Util.isNotEmpty(changesetPreProcessorSet) + && Util.isNotEmpty(changesets.getChangesets())) + { + for (Changeset c : changesets.getChangesets()) + { + for (ChangesetPreProcessor cpp : changesetPreProcessorSet) + { + cpp.process(c); + } + } + } + } + /** * Method description * @@ -314,6 +342,9 @@ public class RepositoryResource //~--- fields --------------------------------------------------------------- + /** Field description */ + private Set changesetPreProcessorSet; + /** Field description */ private ScmConfiguration configuration;