diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/AbstractPluginBackend.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/AbstractPluginBackend.java index 3a7a5c6cec..2b0c473d8f 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/AbstractPluginBackend.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/AbstractPluginBackend.java @@ -42,6 +42,9 @@ import sonia.scm.util.Util; import java.io.File; import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; /** * @@ -50,6 +53,30 @@ import java.util.Arrays; public abstract class AbstractPluginBackend implements PluginBackend { + /** + * Method description + * + * + * @param listener + */ + @Override + public void addListener(PluginBackendListener listener) + { + listenerSet.add(listener); + } + + /** + * Method description + * + * + * @param listeners + */ + @Override + public void addListeners(Collection listeners) + { + listenerSet.addAll(listeners); + } + /** * Method description * @@ -79,4 +106,37 @@ public abstract class AbstractPluginBackend implements PluginBackend addScannedFiles(Arrays.asList(scannedFiles)); } } + + /** + * Method description + * + * + * @param listener + */ + @Override + public void removeListener(PluginBackendListener listener) + { + listenerSet.remove(listener); + } + + /** + * Method description + * + * + * + * @param plugins + */ + protected void fireEvent(Collection plugins) + { + for (PluginBackendListener listener : listenerSet) + { + listener.addedNewPlugins(plugins); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Set listenerSet = + new HashSet(); } diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java index 00e18fbc6d..076f6c6d88 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/DefaultPluginBackend.java @@ -158,6 +158,7 @@ public class DefaultPluginBackend extends AbstractPluginBackend if (changed) { + fireEvent(plugins); store(); } } diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java index efb60de413..e1c2b521f8 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackend.java @@ -33,6 +33,10 @@ package sonia.scm.plugin; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.ListenerSupport; + //~--- JDK imports ------------------------------------------------------------ import java.io.File; @@ -45,7 +49,7 @@ import java.util.Set; * * @author Sebastian Sdorra */ -public interface PluginBackend +public interface PluginBackend extends ListenerSupport { /** diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackendListener.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackendListener.java new file mode 100644 index 0000000000..d5c76cbeff --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginBackendListener.java @@ -0,0 +1,54 @@ +/** + * 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.plugin; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Collection; + +/** + * + * @author Sebastian Sdorra + */ +public interface PluginBackendListener +{ + + /** + * Method description + * + * + * @param plugins + */ + public void addedNewPlugins(Collection plugins); +} diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginResource.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginResource.java index 10a2fe7899..5aa9ce3e05 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginResource.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginResource.java @@ -36,6 +36,7 @@ package sonia.scm.plugin.rest; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; +import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,6 +67,7 @@ import javax.ws.rs.core.Response; * * @author Sebastian Sdorra */ +@Singleton @Path("{version}/plugins") public class PluginResource {