diff --git a/scm-core/src/main/java/sonia/scm/ConfigChangedListener.java b/scm-core/src/main/java/sonia/scm/ConfigChangedListener.java new file mode 100644 index 0000000000..aa8b7c13d5 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/ConfigChangedListener.java @@ -0,0 +1,22 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm; + +/** + * + * @author Sebastian Sdorra + */ +public interface ConfigChangedListener +{ + + /** + * Method description + * + */ + public void configChanged(Object config); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java index 032d2cd268..09b0b5176a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractRepositoryHandler.java @@ -9,6 +9,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.ConfigChangedListener; import sonia.scm.SCMContextProvider; import sonia.scm.util.Util; @@ -18,6 +19,8 @@ import java.io.File; import java.io.IOException; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import javax.xml.bind.JAXB; @@ -42,6 +45,18 @@ public abstract class AbstractRepositoryHandler //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @param listener + */ + @Override + public void addListener(ConfigChangedListener listener) + { + listenerSet.add(listener); + } + /** * Method description * @@ -84,6 +99,18 @@ public abstract class AbstractRepositoryHandler } } + /** + * Method description + * + * + * @param listener + */ + @Override + public void removeListener(ConfigChangedListener listener) + { + listenerSet.remove(listener); + } + /** * Method description * @@ -132,6 +159,7 @@ public abstract class AbstractRepositoryHandler public void setConfig(C config) { this.config = config; + fireConfigChanged(); } //~--- methods -------------------------------------------------------------- @@ -174,6 +202,18 @@ public abstract class AbstractRepositoryHandler repository.setCreationDate(new Date()); } + /** + * Method description + * + */ + private void fireConfigChanged() + { + for (ConfigChangedListener listener : listenerSet) + { + listener.configChanged(config); + } + } + //~--- fields --------------------------------------------------------------- /** Field description */ @@ -181,4 +221,8 @@ public abstract class AbstractRepositoryHandler /** Field description */ protected File configFile; + + /** Field description */ + private Set listenerSet = + new HashSet(); } diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java index 6ad71d0fa5..60e5352af1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -36,8 +36,8 @@ import javax.xml.bind.JAXB; * * @param */ -public abstract class AbstractSimpleRepositoryHandler - extends AbstractRepositoryHandler +public abstract class AbstractSimpleRepositoryHandler + extends AbstractRepositoryHandler { /** Field description */ @@ -343,19 +343,12 @@ public abstract class AbstractSimpleRepositoryHandler */ public interface RepositoryHandler - extends Handler + extends Handler, + ListenerSupport { /** diff --git a/scm-webapp/src/main/java/sonia/scm/cache/CacheRepositoryManagerDecorator.java b/scm-webapp/src/main/java/sonia/scm/cache/CacheRepositoryManagerDecorator.java index d7b8592855..a796302217 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/CacheRepositoryManagerDecorator.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/CacheRepositoryManagerDecorator.java @@ -10,12 +10,16 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; -import com.google.inject.name.Named; +import sonia.scm.ConfigChangedListener; +import sonia.scm.SCMContextProvider; +import sonia.scm.Undecorated; import sonia.scm.repository.AbstractRepositoryManagerDecorator; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; +import sonia.scm.repository.RepositoryType; import sonia.scm.util.AssertUtil; import sonia.scm.util.Util; @@ -24,7 +28,6 @@ import sonia.scm.util.Util; import java.io.IOException; import java.util.Collection; -import sonia.scm.Undecorated; /** * @@ -32,6 +35,7 @@ import sonia.scm.Undecorated; */ public class CacheRepositoryManagerDecorator extends AbstractRepositoryManagerDecorator + implements ConfigChangedListener { /** Field description */ @@ -51,8 +55,7 @@ public class CacheRepositoryManagerDecorator */ @Inject public CacheRepositoryManagerDecorator( - @Undecorated RepositoryManager manager, - CacheManager cacheManager) + @Undecorated RepositoryManager manager, CacheManager cacheManager) { super(manager); cache = cacheManager.getExtendedCache(String.class, Repository.class, @@ -61,6 +64,31 @@ public class CacheRepositoryManagerDecorator //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @param handler + */ + @Override + public void addHandler(RepositoryHandler handler) + { + super.addHandler(handler); + handler.addListener(this); + } + + /** + * Method description + * + * + * @param config + */ + @Override + public void configChanged(Object config) + { + cache.clear(); + } + /** * Method description * @@ -95,6 +123,23 @@ public class CacheRepositoryManagerDecorator removeFromCache(repository); } + /** + * Method description + * + * + * @param context + */ + @Override + public void init(SCMContextProvider context) + { + super.init(context); + + for (RepositoryType type : getTypes()) + { + getHandler(type.getName()).addListener(this); + } + } + /** * Method description *