Republizierte Items werden jetzt aus dem Cache entfernt
git-svn-id: https://svn.libreccm.org/ccm/trunk@2141 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
9a41854aa3
commit
0c7dca5463
|
|
@ -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;
|
||||||
|
|
@ -55,7 +56,7 @@ import java.util.Map;
|
||||||
* @version $Id: SimpleXMLGenerator.java 2167 2011-06-19 21:12:12Z pboy $
|
* @version $Id: SimpleXMLGenerator.java 2167 2011-06-19 21:12:12Z pboy $
|
||||||
*/
|
*/
|
||||||
public class SimpleXMLGenerator implements XMLGenerator {
|
public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
|
|
||||||
private static final Logger s_log = Logger.getLogger(SimpleXMLGenerator.class);
|
private static final Logger s_log = Logger.getLogger(SimpleXMLGenerator.class);
|
||||||
public static final String ADAPTER_CONTEXT = SimpleXMLGenerator.class.getName();
|
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 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;
|
||||||
|
|
||||||
|
|
@ -202,21 +207,21 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
final Element cached = (Element) CACHE.get(item.getOID().toString());
|
final Element cached = (Element) CACHE.get(item.getOID().toString());
|
||||||
//parent.importElement(content);
|
//parent.importElement(content);
|
||||||
cached.syncDocs();
|
cached.syncDocs();
|
||||||
|
|
||||||
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 {
|
||||||
s_log.debug("Item is not in cache, generating item.");
|
s_log.debug("Item is not in cache, generating item.");
|
||||||
|
|
||||||
content = startElement(useContext);
|
content = startElement(useContext);
|
||||||
|
|
||||||
final ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(content);
|
final ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(content);
|
||||||
|
|
@ -236,11 +241,15 @@ 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();
|
||||||
Map.Entry entry;
|
Map.Entry entry;
|
||||||
while (entries.hasNext()) {
|
while (entries.hasNext()) {
|
||||||
|
|
@ -252,16 +261,16 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
//cachedElem.newChildElement((Element) childs.next());
|
//cachedElem.newChildElement((Element) childs.next());
|
||||||
copyElement(cachedElem, (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
|
//Only item XML Cache End
|
||||||
|
|
||||||
// s_log.debug("Content elem content: ");
|
// s_log.debug("Content elem content: ");
|
||||||
// logElementTree(content);
|
// logElementTree(content);
|
||||||
// s_log.debug("Content elem content end -- ");
|
// s_log.debug("Content elem content end -- ");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2011-08-27 jensp: Introduced to remove the annoying special templates
|
* 2011-08-27 jensp: Introduced to remove the annoying special templates
|
||||||
* for MultiPartArticle, SiteProxy and others. The method called
|
* for MultiPartArticle, SiteProxy and others. The method called
|
||||||
|
|
@ -307,7 +316,7 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
draftItem,
|
draftItem,
|
||||||
item.getContentSection(),
|
item.getContentSection(),
|
||||||
draftItem.getVersion()));
|
draftItem.getVersion()));
|
||||||
}
|
}
|
||||||
|
|
||||||
parent.addContent(content);
|
parent.addContent(content);
|
||||||
|
|
||||||
|
|
@ -399,7 +408,7 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
|
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Element startCachedElement(final String useContext) {
|
private Element startCachedElement(final String useContext) {
|
||||||
final Element element = new Element(itemElemName, itemElemNs) {
|
final Element element = new Element(itemElemName, itemElemNs) {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -407,33 +416,34 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
s_log.debug("Copy of element added to cached elem.");
|
s_log.debug("Copy of element added to cached elem.");
|
||||||
return super.newChildElement(copyFrom);
|
return super.newChildElement(copyFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Element newChildElement(String name, Element copyFrom) {
|
public Element newChildElement(String name, Element copyFrom) {
|
||||||
s_log.debug("Copy of element added to cached elem.");
|
s_log.debug("Copy of element added to cached elem.");
|
||||||
return super.newChildElement(name, copyFrom);
|
return super.newChildElement(name, copyFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Element addContent(final Element newContent) {
|
public Element addContent(final Element newContent) {
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<String, String> attr : itemAttributes.entrySet()) {
|
for (Map.Entry<String, String> attr : itemAttributes.entrySet()) {
|
||||||
element.addAttribute(attr.getKey(), attr.getValue());
|
element.addAttribute(attr.getKey(), attr.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyElement(final Element parent, final Element 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();
|
final Iterator attrs = element.getAttributes().entrySet().iterator();
|
||||||
Map.Entry attr;
|
Map.Entry attr;
|
||||||
while (attrs.hasNext()) {
|
while (attrs.hasNext()) {
|
||||||
|
|
@ -472,28 +482,44 @@ public class SimpleXMLGenerator implements XMLGenerator {
|
||||||
element.addAttribute("UDItemAttrValue", value);
|
element.addAttribute("UDItemAttrValue", value);
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logElementTree(final Element element) {
|
private void logElementTree(final Element element) {
|
||||||
s_log.debug("Tree of element" + element.getName() + ":\n");
|
s_log.debug("Tree of element" + element.getName() + ":\n");
|
||||||
s_log.debug("\n" + logElementTree(element, new StringBuilder(), 0));
|
s_log.debug("\n" + logElementTree(element, new StringBuilder(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue