You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2011/07/07 21:09:10 UTC

svn commit: r1143981 - /wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java

Author: jdonnerstag
Date: Thu Jul  7 19:09:09 2011
New Revision: 1143981

URL: http://svn.apache.org/viewvc?rev=1143981&view=rev
Log:
fixed: When base markup file has been removed from the cache, the the derived markup should be removed as well
Issue: WICKET-3878

Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java?rev=1143981&r1=1143980&r2=1143981&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/MarkupCache.java Thu Jul  7 19:09:09 2011
@@ -124,67 +124,52 @@ public class MarkupCache implements IMar
 
 		if (log.isDebugEnabled())
 		{
-			log.debug("Remove from cache: cacheKey=" + cacheKey);
+			log.debug("Remove from cache: " + cacheKey);
 		}
 
 		// Remove the markup from the cache
 		String locationString = markupKeyCache.get(cacheKey);
 		IMarkupFragment markup = (locationString != null ? markupCache.get(locationString) : null);
-		if (markup != null)
+		if (markup == null)
 		{
-			// Found an entry: actual markup or Markup.NO_MARKUP. Null values are not possible
-			// because of ConcurrentHashMap.
-			markupCache.remove(locationString);
-
-			// If a base markup file has been removed from the cache, than
-			// the derived markup should be removed as well.
-
-			// Repeat until all dependent resources have been removed (count == 0)
-			int count = 1;
-			while (count > 0)
-			{
-				// Reset prior to next round
-				count = 0;
-
-				// Iterate though all entries of the cache
-				Iterator<String> iter = markupCache.getKeys().iterator();
-				while (iter.hasNext())
-				{
-					String key = iter.next();
+			return null;
+		}
 
-					// Check if the markup associated with key has a base markup. And if yes, test
-					// if that is cached.
-					if (isBaseMarkupCached(key))
-					{
-						if (log.isDebugEnabled())
-						{
-							log.debug("Remove from cache: cacheKey=" + key);
-						}
+		// Found an entry: actual markup or Markup.NO_MARKUP. Null values are not possible
+		// because of ConcurrentHashMap.
+		markupCache.remove(locationString);
 
-						iter.remove();
-						count++;
-					}
-				}
-			}
+		if (log.isDebugEnabled())
+		{
+			log.debug("Removed from cache: " + locationString);
+		}
 
-			// And now remove all watcher entries associated with markup
-			// resources no longer in the cache. Note that you can not use
-			// Application.get() since removeMarkup() will be called from a
-			// ModificationWatcher thread which has no associated Application.
+		// If a base markup file has been removed from the cache, than
+		// the derived markup should be removed as well.
+		removeMarkupWhereBaseMarkupIsNoLongerInTheCache();
 
-			IModificationWatcher watcher = application.getResourceSettings().getResourceWatcher(
-				false);
-			if (watcher != null)
+		// And now remove all watcher entries associated with markup
+		// resources no longer in the cache.
+
+		// Note that you can not use Application.get() since removeMarkup() will be called from a
+		// ModificationWatcher thread which has no associated Application.
+
+		IModificationWatcher watcher = application.getResourceSettings().getResourceWatcher(false);
+		if (watcher != null)
+		{
+			Iterator<IModifiable> iter = watcher.getEntries().iterator();
+			while (iter.hasNext())
 			{
-				Iterator<IModifiable> iter = watcher.getEntries().iterator();
-				while (iter.hasNext())
+				IModifiable modifiable = iter.next();
+				if (modifiable instanceof MarkupResourceStream)
 				{
-					IModifiable modifiable = iter.next();
-					if (modifiable instanceof MarkupResourceStream)
+					if (!isMarkupCached((MarkupResourceStream)modifiable))
 					{
-						if (isMarkupCached((MarkupResourceStream)modifiable))
+						iter.remove();
+
+						if (log.isDebugEnabled())
 						{
-							iter.remove();
+							log.debug("Removed from watcher: " + modifiable);
 						}
 					}
 				}
@@ -194,32 +179,42 @@ public class MarkupCache implements IMar
 		return markup;
 	}
 
-	/**
-	 * @param key
-	 * @return True, if base markup for entry with cache 'key' is available in the cache as well.
-	 */
-	private boolean isBaseMarkupCached(final String key)
+	private void removeMarkupWhereBaseMarkupIsNoLongerInTheCache()
 	{
-		// Get the markup associated with key. Null in case the key has no associated value. A null
-		// value is not possible because of ConcurrentHashMap.
-		Markup markup = markupCache.get(key);
-		if (markup == null)
+		// Repeat until all dependent resources have been removed (count == 0)
+		int count = 1;
+		while (count > 0)
 		{
-			return false;
-		}
+			// Reset prior to next round
+			count = 0;
 
-		// NO_MARKUP does not have an associated resource stream
-		if (markup == Markup.NO_MARKUP)
-		{
-			return false;
-		}
+			// Iterate though all entries of the cache
+			Iterator<Markup> iter = markupCache.getValues().iterator();
+			while (iter.hasNext())
+			{
+				Markup markup = iter.next();
+
+				// Check if the markup associated with key has a base markup. And if yes, test
+				// if that is cached. If the base markup has been removed, than remove the derived
+				// markup as well.
+
+				MarkupResourceStream resourceStream = markup.getMarkupResourceStream()
+					.getBaseMarkupResourceStream();
 
-		// Get the base markup resource stream from the markup
-		MarkupResourceStream resourceStream = markup.getMarkupResourceStream()
-			.getBaseMarkupResourceStream();
+				// Is the base markup available in the cache?
+				if ((resourceStream != null) && !isMarkupCached(resourceStream))
+				{
+					iter.remove();
+					count++;
 
-		// Is the base markup available in the cache?
-		return isMarkupCached(resourceStream);
+					if (log.isDebugEnabled())
+					{
+						log.debug("Removed derived markup from cache: " +
+							markup.getMarkupResourceStream());
+					}
+				}
+			}
+		}
 	}
 
 	/**
@@ -514,7 +509,7 @@ public class MarkupCache implements IMar
 					{
 						if (log.isDebugEnabled())
 						{
-							log.debug("Remove markup from cache: " + markupResourceStream);
+							log.debug("Remove markup from watcher: " + markupResourceStream);
 						}
 
 						// Remove the markup from the cache. It will be reloaded
@@ -607,6 +602,13 @@ public class MarkupCache implements IMar
 		Collection<K> getKeys();
 
 		/**
+		 * Get all the values referencing cache entries
+		 * 
+		 * @return collection of cached keys
+		 */
+		Collection<V> getValues();
+
+		/**
 		 * Check if key is in the cache
 		 * 
 		 * @param key
@@ -681,6 +683,11 @@ public class MarkupCache implements IMar
 			return cache.keySet();
 		}
 
+		public Collection<V> getValues()
+		{
+			return cache.values();
+		}
+
 		public void put(K key, V value)
 		{
 			// Note that neither key nor value are allowed to be null with ConcurrentHashMap