Index: E:/magnolia/trunk/magnolia-core/src/main/java/info/magnolia/cms/beans/config/ObservedManager.java =================================================================== --- E:/magnolia/trunk/magnolia-core/src/main/java/info/magnolia/cms/beans/config/ObservedManager.java (revision 2664) +++ E:/magnolia/trunk/magnolia-core/src/main/java/info/magnolia/cms/beans/config/ObservedManager.java (working copy) @@ -41,11 +41,20 @@ protected Logger log = LoggerFactory.getLogger(getClass()); /** + * Count of reload request + */ + private int reloadRequestCount = 0; + + /** * True if this manager is realoading. used to avoid cycles. */ private boolean reloading = false; /** + * milli second the Reloader Thread sleeps + */ + private static final long SLEEP_MILLIS = 1000; + /** * UUIDs of the registered main nodes. They will get registered again after a change. */ protected Set registeredUUIDs = new HashSet(); @@ -82,26 +91,14 @@ public synchronized void reload() { // if recalled in the same thread only if (this.reloading == true) { - log.warn("this manager is already reloading: [{}]", this.getClass().getName()); + log.debug("this manager waiting for reloading: [{}]", this.getClass().getName()); + this.reloadRequestCount++; return; } - this.reloading = true; - onClear(); - - HierarchyManager hm = MgnlContext.getSystemContext().getHierarchyManager(ContentRepository.CONFIG); - - for (Iterator iter = registeredUUIDs.iterator(); iter.hasNext();) { - String uuid = (String) iter.next(); - try { - Content node = hm.getContentByUUID(uuid); - reload(node); - } - catch (Exception e) { - registeredUUIDs.remove(uuid); - log.warn("can't reload the the node [" + uuid + "]"); - } - } - this.reloading = false; + setReloading(true); + this.reloadRequestCount = 0; + Reloader reloader = new Reloader(this, this.reloadRequestCount); + new Thread(reloader).start(); } /** @@ -138,4 +135,92 @@ return reloading; } + /** + * Sets the reloading flag + * @param reloading boolean + */ + private void setReloading(boolean reloading) { + this.reloading = reloading; + } + + /** + * + * @return Returns the reloadRequestCount + */ + protected int getReloadRequestCount() { + return reloadRequestCount; + } + + /** + * Reloading is done in a separate thread. The thread sleeps for SLEEP_MILLIS milliseconds and + * checks if the reloadRequestCount of the observedManager has changed. If true it will remain + * sleeping. If false the real reloading starts. + * + * + * @author Ralf Hirning + * + */ + private class Reloader implements Runnable { + /** + * reloadRequestCount before sleeping + */ + private int lastReloadRequestCount = 0; + + /** + * the ObservedManager + */ + private ObservedManager observedManager; + + /** + * Constructor + * + * @param observedManager ObservedManager + * @param reloadRequestCount reloadRequestCount of the observedManager + */ + private Reloader(ObservedManager observedManager, int reloadRequestCount) { + this.observedManager = observedManager; + this.lastReloadRequestCount = reloadRequestCount; + } + + /** + * The Reloader thread's run method + */ + public void run() { + while (true) { + try { + Thread.sleep(SLEEP_MILLIS); + } catch (InterruptedException e) { + // ok, go on + ; + } + + // check if the reloadRequestCount of the observedManager has changed + int currentReloadRequestCount = this.observedManager.getReloadRequestCount(); + if (currentReloadRequestCount > lastReloadRequestCount) { + lastReloadRequestCount = currentReloadRequestCount; + } else { + // allow creation of a new Reloader + this.observedManager.setReloading(false); + + // Call onClear and reregister the nodes by calling onRegister + this.observedManager.onClear(); + + HierarchyManager hm = MgnlContext.getSystemContext().getHierarchyManager(ContentRepository.CONFIG); + + for (Iterator iter = this.observedManager.registeredUUIDs.iterator(); iter.hasNext();) { + String uuid = (String) iter.next(); + try { + Content node = hm.getContentByUUID(uuid); + reload(node); + } + catch (Exception e) { + this.observedManager.registeredUUIDs.remove(uuid); + log.warn("can't reload the the node [" + uuid + "]"); + } + } + return; + } + } + } + } }