Noch ein BugFix für den XMLDeliveryCache

git-svn-id: https://svn.libreccm.org/ccm/trunk@2170 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-06-03 17:47:52 +00:00
parent 4d8148da83
commit 2fdc8c3bae
1 changed files with 62 additions and 116 deletions

View File

@ -25,7 +25,7 @@ public final class XMLDeliveryCache {
*/ */
private CacheTable cache = new CacheTable(XMLDeliveryCache.class.getName(), private CacheTable cache = new CacheTable(XMLDeliveryCache.class.getName(),
CMSConfig.getInstance().getXmlCacheSize(), CMSConfig.getInstance().getXmlCacheSize(),
CMSConfig.getInstance().getXmlCacheAge(), CMSConfig.getInstance().getXmlCacheSize(),
true); true);
/** /**
* Maps from the OID of the master version of an item in the cache to the OID of the item in the cache. * Maps from the OID of the master version of an item in the cache to the OID of the item in the cache.
@ -56,22 +56,22 @@ public final class XMLDeliveryCache {
* @param listMode Is the XML cached for list mode or normal mode. * @param listMode Is the XML cached for list mode or normal mode.
* @return * @return
*/ */
public boolean isCached(final OID oid, final String context, final boolean listMode) { public boolean isCached(final OID oid, final String context, final boolean listMode) {
final CachedItem cachedItem = (CachedItem) cache.get(oid.toString()); final CachedItem cachedItem = (CachedItem) cache.get(oid.toString());
if (cachedItem == null) { if (cachedItem == null) {
return false; return false;
} }
final CachedXml cachedXml = cachedItem.get(context); final CachedXml cachedXml = cachedItem.get(context);
if (cachedXml == null) { if (cachedXml == null) {
return false; return false;
} }
if (listMode) { if (listMode) {
return (cachedXml.getCachedXml(Mode.LIST_MODE) != null); return (cachedXml.getCachedXml(Mode.LIST_MODE) != null);
} else { } else {
return (cachedXml.getCachedXml(Mode.DEFAULT) != null); return (cachedXml.getCachedXml(Mode.DEFAULT) != null);
} }
} }
/** /**
@ -127,18 +127,14 @@ public final class XMLDeliveryCache {
context)); context));
} }
//Element cacheElem; Element cacheElem;
String cached;
if (listMode) { if (listMode) {
//cacheElem = cachedXml.getCachedXml(Mode.LIST_MODE); cacheElem = cachedXml.getCachedXml(Mode.LIST_MODE);
cached = cachedXml.getCachedXml(Mode.LIST_MODE);
} else { } else {
//cacheElem = cachedXml.getCachedXml(Mode.DEFAULT); cacheElem = cachedXml.getCachedXml(Mode.DEFAULT);
cached = cachedXml.getCachedXml(Mode.LIST_MODE);
} }
//if (cacheElem == null) { if (cacheElem == null) {
if (cached == null) {
if (listMode) { if (listMode) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"The item with the OID '%s' is not cached for context '%s' in list mode", "The item with the OID '%s' is not cached for context '%s' in list mode",
@ -154,33 +150,18 @@ public final class XMLDeliveryCache {
} }
} }
//cacheElem.syncDocs(); cacheElem.syncDocs();
Map<String, String> cachedAttributes; final Iterator<Map.Entry<String, String>> attrs = cacheElem.getAttributes().entrySet().iterator();
if (listMode) { Map.Entry<String, String> attr;
cachedAttributes = cachedXml.getCachedAttributes(Mode.LIST_MODE); while (attrs.hasNext()) {
} else { attr = attrs.next();
cachedAttributes = cachedXml.getCachedAttributes(Mode.DEFAULT); parent.addAttribute(attr.getKey(), attr.getValue());
} }
final Iterator<Element> childs = cacheElem.getChildren().iterator();
if (cachedAttributes != null) { while (childs.hasNext()) {
for (Map.Entry<String, String> attribute : cachedAttributes.entrySet()) { copyElement(parent, childs.next());
parent.addAttribute(attribute.getKey(), attribute.getValue());
}
} }
parent.setText(cached);
// final Iterator<Map.Entry<String, String>> attrs = cacheElem.getAttributes().entrySet().iterator();
// Map.Entry<String, String> attr;
// while (attrs.hasNext()) {
// attr = attrs.next();
// parent.addAttribute(attr.getKey(), attr.getValue());
// }
// final Iterator<Element> childs = cacheElem.getChildren().iterator();
// while (childs.hasNext()) {
// copyElement(parent, childs.next());
// }
} }
/** /**
@ -221,10 +202,10 @@ public final class XMLDeliveryCache {
* @param context The context of the XML output. * @param context The context of the XML output.
* @param listMode If the XML is for the list mode. * @param listMode If the XML is for the list mode.
*/ */
public void cache(final OID oid, public void cache(final OID oid,
final ContentItem item, final ContentItem item,
final Element parent, final Element parent,
final String context, final String context,
final boolean listMode) { final boolean listMode) {
CachedItem cachedItem = (CachedItem) cache.get(oid.toString()); CachedItem cachedItem = (CachedItem) cache.get(oid.toString());
if (cachedItem == null) { if (cachedItem == null) {
@ -238,40 +219,28 @@ public final class XMLDeliveryCache {
cachedItem.put(context, cachedXml); cachedItem.put(context, cachedXml);
} }
// final Element cacheElem = new Element("cachedItem"); final Element cacheElem = new Element("cachedItem");
// final Iterator<Map.Entry<String, String>> attrs = parent.getAttributes().entrySet().iterator();
// Map.Entry<String, String> attr;
// while (attrs.hasNext()) {
// attr = attrs.next();
// cacheElem.addAttribute(attr.getKey(), attr.getValue());
// }
// final Iterator<Element> childs = parent.getChildren().iterator();
// while (childs.hasNext()) {
// copyElement(cacheElem, childs.next());
// }
final Mode mode;
if (listMode) {
mode = Mode.LIST_MODE;
} else {
mode = Mode.DEFAULT;
}
final Iterator<Map.Entry<String, String>> attrs = parent.getAttributes().entrySet().iterator(); final Iterator<Map.Entry<String, String>> attrs = parent.getAttributes().entrySet().iterator();
Map.Entry<String, String> attr; Map.Entry<String, String> attr;
final Map<String, String> attributes = new HashMap<String, String>();
while (attrs.hasNext()) { while (attrs.hasNext()) {
attr = attrs.next(); attr = attrs.next();
attributes.put(attr.getKey(), attr.getValue()); cacheElem.addAttribute(attr.getKey(), attr.getValue());
}
final Iterator<Element> childs = parent.getChildren().iterator();
while (childs.hasNext()) {
copyElement(cacheElem, childs.next());
} }
cachedXml.putCachedXml(mode, parent.toString()); if (listMode) {
cachedXml.pubCachedAttributes(mode, attributes); cachedXml.putCachedXml(Mode.LIST_MODE, cacheElem);
} else {
cachedXml.putCachedXml(Mode.DEFAULT, cacheElem);
}
if (item.getDraftVersion() != null) { if (item.getDraftVersion() != null) {
cachedItems.put(item.getDraftVersion().getOID().toString(), oid.toString()); cachedItems.put(item.getDraftVersion().getOID().toString(), oid.toString());
} }
if ((item instanceof ContentPage) && (((ContentPage) item).getContentBundle() != null)) { if ((item instanceof ContentPage) && (((ContentPage) item).getContentBundle() != null)) {
cachedItems.put(((ContentPage) item).getContentBundle().getOID().toString(), oid.toString()); cachedItems.put(((ContentPage) item).getContentBundle().getOID().toString(), oid.toString());
} }
@ -292,33 +261,30 @@ public final class XMLDeliveryCache {
} }
} }
// 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()) {
// attr = (Map.Entry) attrs.next(); attr = (Map.Entry) attrs.next();
// copy.addAttribute((String) attr.getKey(), (String) attr.getValue()); copy.addAttribute((String) attr.getKey(), (String) attr.getValue());
// } }
//
// final Iterator childs = element.getChildren().iterator(); final Iterator childs = element.getChildren().iterator();
// while (childs.hasNext()) { while (childs.hasNext()) {
// copyElement(copy, (Element) childs.next()); copyElement(copy, (Element) childs.next());
// } }
//
// if (element.getText() != null) { if (element.getText() != null) {
// copy.setText(element.getText()); copy.setText(element.getText());
// } }
//
// if (element.getCDATASection() != null) { if (element.getCDATASection() != null) {
// copy.setCDATASection(element.getCDATASection()); copy.setCDATASection(element.getCDATASection());
// } }
//
// } }
/**
* Helper class, containing the XML for different contexts.
*/
private class CachedItem { private class CachedItem {
private final Map<String, CachedXml> cachedXml = new HashMap<String, CachedXml>(); private final Map<String, CachedXml> cachedXml = new HashMap<String, CachedXml>();
@ -334,47 +300,27 @@ public final class XMLDeliveryCache {
public void put(final String context, final CachedXml cachedXml) { public void put(final String context, final CachedXml cachedXml) {
this.cachedXml.put(context, cachedXml); this.cachedXml.put(context, cachedXml);
} }
} }
private class CachedXml { private class CachedXml {
//private final Map<Mode, Element> cachedXml = new EnumMap<Mode, Element>(Mode.class); private final Map<Mode, Element> cachedXml = new EnumMap<Mode, Element>(Mode.class);
private final Map<Mode, String> cachedXml = new EnumMap<Mode, String>(Mode.class);
private final Map<Mode, Map<String, String>> cachedAttributes = new EnumMap<Mode, Map<String, String>>(
Mode.class);
public CachedXml() { public CachedXml() {
//Nothing //Nothing
} }
// public Element getCachedXml(final Mode mode) { public Element getCachedXml(final Mode mode) {
// return cachedXml.get(mode);
// }
public String getCachedXml(final Mode mode) {
return cachedXml.get(mode); return cachedXml.get(mode);
} }
public Map<String, String> getCachedAttributes(final Mode mode) { public void putCachedXml(final Mode mode, final Element element) {
return cachedAttributes.get(mode);
}
// public void putCachedXml(final Mode mode, final Element element) {
// cachedXml.put(mode, element);
// }
public void pubCachedAttributes(final Mode mode, final Map<String, String> attributes) {
cachedAttributes.put(mode, attributes);
}
public void putCachedXml(final Mode mode, final String element) {
cachedXml.put(mode, element); cachedXml.put(mode, element);
} }
} }
private enum Mode { private enum Mode {
DEFAULT, DEFAULT,
LIST_MODE, LIST_MODE,}
}
} }