From 0c7dca54632751e045c5ba00e31e1af0cbb63fe7 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 24 Apr 2013 11:46:57 +0000 Subject: [PATCH] Republizierte Items werden jetzt aus dem Cache entfernt git-svn-id: https://svn.libreccm.org/ccm/trunk@2141 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/dispatcher/SimpleXMLGenerator.java | 86 ++++++++++++------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/ccm-cms/src/com/arsdigita/cms/dispatcher/SimpleXMLGenerator.java b/ccm-cms/src/com/arsdigita/cms/dispatcher/SimpleXMLGenerator.java index 07e66690d..2c163fdc7 100755 --- a/ccm-cms/src/com/arsdigita/cms/dispatcher/SimpleXMLGenerator.java +++ b/ccm-cms/src/com/arsdigita/cms/dispatcher/SimpleXMLGenerator.java @@ -42,6 +42,7 @@ import com.arsdigita.persistence.OID; import com.arsdigita.persistence.metadata.Property; import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.xml.Element; +import java.util.HashMap; import org.apache.log4j.Logger; import java.util.Iterator; import java.util.LinkedHashMap; @@ -55,7 +56,7 @@ import java.util.Map; * @version $Id: SimpleXMLGenerator.java 2167 2011-06-19 21:12:12Z pboy $ */ public class SimpleXMLGenerator implements XMLGenerator { - + private static final Logger s_log = Logger.getLogger(SimpleXMLGenerator.class); public static final String ADAPTER_CONTEXT = SimpleXMLGenerator.class.getName(); /** @@ -83,11 +84,15 @@ public class SimpleXMLGenerator implements XMLGenerator { */ private String itemElemName = "cms:item"; private String itemElemNs = CMS.CMS_XML_NS; + //Cache for generated XML private static final CacheTable CACHE = new CacheTable( SimpleXMLGenerator.class.getName() + "Cache", CMSConfig.getInstance().getXmlCacheSize(), CMSConfig.getInstance().getXmlCacheAge(), true); + //Stores the master ID of the cached items and the ID of cached version. Used to delete obsolete entries in the + //cash after republishing + private static final Map CACHED_ITEMS = new HashMap(); //private static final Map cache = new HashMap(); //private static final boolean USE_CACHE = false; @@ -202,21 +207,21 @@ public class SimpleXMLGenerator implements XMLGenerator { final Element cached = (Element) CACHE.get(item.getOID().toString()); //parent.importElement(content); cached.syncDocs(); - + content = startElement(useContext); final Iterator entries = cached.getAttributes().entrySet().iterator(); Map.Entry entry; - while(entries.hasNext()) { + while (entries.hasNext()) { entry = (Map.Entry) entries.next(); - content.addAttribute((String) entry.getKey(), (String) entry.getValue()); + content.addAttribute((String) entry.getKey(), (String) entry.getValue()); } final Iterator childs = cached.getChildren().iterator(); - while(childs.hasNext()) { - copyElement(content, (Element) childs.next()); + while (childs.hasNext()) { + copyElement(content, (Element) childs.next()); } } else { s_log.debug("Item is not in cache, generating item."); - + content = startElement(useContext); final ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(content); @@ -236,11 +241,15 @@ public class SimpleXMLGenerator implements XMLGenerator { //parent.addContent(content); + if (CMSConfig.getInstance().getEnableXmlCache()) { + validateCache(item); + } + //Only published items //Only the XML of the item itself, no extra XML - if (item.isLiveVersion()) { + if (CMSConfig.getInstance().getEnableXmlCache() && item.isLiveVersion()) { s_log.debug("Putting item item into the cache."); - final Element cachedElem = startCachedElement(useContext); + final Element cachedElem = startCachedElement(useContext); final Iterator entries = content.getAttributes().entrySet().iterator(); Map.Entry entry; while (entries.hasNext()) { @@ -252,16 +261,16 @@ public class SimpleXMLGenerator implements XMLGenerator { //cachedElem.newChildElement((Element) childs.next()); copyElement(cachedElem, (Element) childs.next()); } - CACHE.put(item.getOID().toString(), cachedElem); + CACHE.put(item.getOID().toString(), cachedElem); } } //Only item XML Cache End - + // s_log.debug("Content elem content: "); // logElementTree(content); // s_log.debug("Content elem content end -- "); - - + + /* * 2011-08-27 jensp: Introduced to remove the annoying special templates * for MultiPartArticle, SiteProxy and others. The method called @@ -307,7 +316,7 @@ public class SimpleXMLGenerator implements XMLGenerator { draftItem, item.getContentSection(), draftItem.getVersion())); - } + } parent.addContent(content); @@ -399,7 +408,7 @@ public class SimpleXMLGenerator implements XMLGenerator { return element; } - + private Element startCachedElement(final String useContext) { final Element element = new Element(itemElemName, itemElemNs) { @Override @@ -407,33 +416,34 @@ public class SimpleXMLGenerator implements XMLGenerator { s_log.debug("Copy of element added to cached elem."); return super.newChildElement(copyFrom); } - + @Override public Element newChildElement(String name, Element copyFrom) { s_log.debug("Copy of element added to cached elem."); return super.newChildElement(name, copyFrom); } - + @Override public Element addContent(final Element newContent) { s_log.debug("Content added to cached element"); return super.addContent(newContent); } + }; - - if (useContext != null) { + + if (useContext != null) { element.addAttribute("useContext", useContext); } for (Map.Entry attr : itemAttributes.entrySet()) { element.addAttribute(attr.getKey(), attr.getValue()); } - + return element; } - + private void copyElement(final Element parent, final Element element) { - final Element copy = parent.newChildElement(element.getName()); + final Element copy = parent.newChildElement(element.getName()); final Iterator attrs = element.getAttributes().entrySet().iterator(); Map.Entry attr; while (attrs.hasNext()) { @@ -472,28 +482,44 @@ public class SimpleXMLGenerator implements XMLGenerator { element.addAttribute("UDItemAttrValue", value); return element; } - + private void logElementTree(final Element element) { s_log.debug("Tree of element" + element.getName() + ":\n"); s_log.debug("\n" + logElementTree(element, new StringBuilder(), 0)); } - + private String logElementTree(final Element element, final StringBuilder builder, final int depth) { - for(int i = 0; i < depth; i++) { + for (int i = 0; i < depth; i++) { builder.append('\t'); } - builder.append('<').append(element.getName()).append(">\n"); - - for(Object childObj : element.getChildren()) { + builder.append('<').append(element.getName()).append(">\n"); + + for (Object childObj : element.getChildren()) { final Element child = (Element) childObj; logElementTree(child, builder, depth + 1); } - - for(int i = 0; i < depth; i++) { + + for (int i = 0; i < depth; i++) { builder.append('\t'); } builder.append("\n"); return builder.toString(); } + private void validateCache(final ContentItem item) { + if (item.isDraftVersion()) { + //Draft version are not cached + return; + } + final String itemId = item.getOID().toString(); + final String masterId = item.getDraftVersion().getOID().toString(); + + final String cachedId = CACHED_ITEMS.get(masterId); + if ((cachedId != null) + && !cachedId.equals(itemId)) { + CACHE.remove(cachedId); + } + + } + }