Republizierte Items werden jetzt aus dem Cache entfernt

git-svn-id: https://svn.libreccm.org/ccm/trunk@2141 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-04-24 11:46:57 +00:00
parent 9a41854aa3
commit 0c7dca5463
1 changed files with 56 additions and 30 deletions

View File

@ -42,6 +42,7 @@ import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.metadata.Property; import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.util.HashMap;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -83,11 +84,15 @@ public class SimpleXMLGenerator implements XMLGenerator {
*/ */
private String itemElemName = "cms:item"; private String itemElemName = "cms:item";
private String itemElemNs = CMS.CMS_XML_NS; private String itemElemNs = CMS.CMS_XML_NS;
//Cache for generated XML
private static final CacheTable CACHE = new CacheTable( private static final CacheTable CACHE = new CacheTable(
SimpleXMLGenerator.class.getName() + "Cache", SimpleXMLGenerator.class.getName() + "Cache",
CMSConfig.getInstance().getXmlCacheSize(), CMSConfig.getInstance().getXmlCacheSize(),
CMSConfig.getInstance().getXmlCacheAge(), CMSConfig.getInstance().getXmlCacheAge(),
true); 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<String, String> CACHED_ITEMS = new HashMap<String, String>();
//private static final Map<OID, Element> cache = new HashMap<OID, Element>(); //private static final Map<OID, Element> cache = new HashMap<OID, Element>();
//private static final boolean USE_CACHE = false; //private static final boolean USE_CACHE = false;
@ -206,12 +211,12 @@ public class SimpleXMLGenerator implements XMLGenerator {
content = startElement(useContext); content = startElement(useContext);
final Iterator entries = cached.getAttributes().entrySet().iterator(); final Iterator entries = cached.getAttributes().entrySet().iterator();
Map.Entry entry; Map.Entry entry;
while(entries.hasNext()) { while (entries.hasNext()) {
entry = (Map.Entry) entries.next(); 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(); final Iterator childs = cached.getChildren().iterator();
while(childs.hasNext()) { while (childs.hasNext()) {
copyElement(content, (Element) childs.next()); copyElement(content, (Element) childs.next());
} }
} else { } else {
@ -236,9 +241,13 @@ public class SimpleXMLGenerator implements XMLGenerator {
//parent.addContent(content); //parent.addContent(content);
if (CMSConfig.getInstance().getEnableXmlCache()) {
validateCache(item);
}
//Only published items //Only published items
//Only the XML of the item itself, no extra XML //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."); 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(); final Iterator entries = content.getAttributes().entrySet().iterator();
@ -419,9 +428,10 @@ public class SimpleXMLGenerator implements XMLGenerator {
s_log.debug("Content added to cached element"); s_log.debug("Content added to cached element");
return super.addContent(newContent); return super.addContent(newContent);
} }
}; };
if (useContext != null) { if (useContext != null) {
element.addAttribute("useContext", useContext); element.addAttribute("useContext", useContext);
} }
@ -479,21 +489,37 @@ public class SimpleXMLGenerator implements XMLGenerator {
} }
private String logElementTree(final Element element, final StringBuilder builder, final int depth) { 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('\t');
} }
builder.append('<').append(element.getName()).append(">\n"); builder.append('<').append(element.getName()).append(">\n");
for(Object childObj : element.getChildren()) { for (Object childObj : element.getChildren()) {
final Element child = (Element) childObj; final Element child = (Element) childObj;
logElementTree(child, builder, depth + 1); logElementTree(child, builder, depth + 1);
} }
for(int i = 0; i < depth; i++) { for (int i = 0; i < depth; i++) {
builder.append('\t'); builder.append('\t');
} }
builder.append("</").append(element.getName()).append(">\n"); builder.append("</").append(element.getName()).append(">\n");
return builder.toString(); 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);
}
}
} }