Author: mcardle
Date: Fri Aug 4 08:39:58 2006
New Revision: 14841
URL: https://svndev.jahia.net/websvn/listing.php?sc=1&rev=14841&repname=jahia
Log:
* fixes for concurrent exceptions
* fixes for orphan absolute frags
Modified:
trunk/core/src/java/org/jahia/services/esi/EsiService.java
trunk/core/src/java/org/jahia/services/esi/tagstack/JesiObject.java
trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java
Modified: trunk/core/src/java/org/jahia/services/esi/EsiService.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/services/esi/EsiService.java&rev=14841&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/services/esi/EsiService.java (original)
+++ trunk/core/src/java/org/jahia/services/esi/EsiService.java Fri Aug 4
08:39:58 2006
@@ -730,8 +730,9 @@
Set absoluteFragNodeKeys = fragNode.getDataKeys();
if (absoluteFragNodeKeys!=null) {
+ absoluteFragNodeKeys = new
HashSet(absoluteFragNodeKeys);
for (Iterator iterator =
absoluteFragNodeKeys.iterator(); iterator.hasNext();) {
- String absoluteFragNodeKey = (String)
iterator.next();
+ String absoluteFragNodeKey = (String)
iterator.next();
frg = (Fragment) cache.get(absoluteFragNodeKey,
JesiObject.FRAGMENT_OBJ_MAPKEY);
addFrag(frg, result, fragNode);
}
@@ -1093,6 +1094,7 @@
if (node!=null) {
Set absoluteFragNodeKeys = node.getDataKeys();
if (absoluteFragNodeKeys!=null) {
+ absoluteFragNodeKeys = new HashSet(absoluteFragNodeKeys);
for (Iterator iterator = absoluteFragNodeKeys.iterator();
iterator.hasNext();) {
String absoluteFragNodeKey = (String)
iterator.next();
Fragment frg = (Fragment)
cache.get(absoluteFragNodeKey, JesiObject.FRAGMENT_OBJ_MAPKEY);
@@ -1684,19 +1686,40 @@
return cache.exists(trackbackKey);
}
+ public void removeFragment(int pageID, Fragment tempFrg) {
+ String frgTempNodeKey = tempFrg.getNodeKey();
+
+ tempFrg.removeTrackbackNodeInContentIds();
+
+ Template tpl = getTemplate(pageID);
+ String templateNodeKey = tpl.getNodeKey(); //TODO : not very efficient
+ //remove the reference to the old absolute fragment in parent template
+ try {
+ Object deletedRef =
cache.remove(templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY,
+ frgTempNodeKey);
+ //sanity check
+ if(deletedRef==null)
+ logger.warn("[esi]: could find MapKey entry ["
+frgTempNodeKey+ "] in Template Node
["+templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY+"] which was due for
removal.");
+ //now we can remove the old node
+ cache.remove(frgTempNodeKey);
+ } catch (CacheException ex) {
+ printTreeCacheError(ex);
+ }
+ }
+
/**
* renames the temporary node, used in the JesiFragmentTag, to its final
name.
*
- * @param frg
+ * @param tempFrg
* @param aclGroupTemporaryKey
* @param aclGroupFinalKey
*/
public void renameTemporaryAbsoluteFragment(int pageID,
- Fragment frg,
+ Fragment tempFrg,
String aclGroupTemporaryKey,
String aclGroupFinalKey) {
try {
- String frgTempNodeKey = frg.getNodeKey();
+ String frgTempNodeKey = tempFrg.getNodeKey();
//generate the new final node key
String newFrgNodeKey = frgTempNodeKey.replaceFirst(
EsiInvalidationWriterService.quote(aclGroupTemporaryKey),
//make sure it's un-regexed
@@ -1710,22 +1733,20 @@
//TODO: currently no nodal move operation in TreeCache
//copy the data entries from the previous node to the new node
(and create it)
- DataNode frgNode = (DataNode) cache.get(frgTempNodeKey);
- cache.put(newFrgNodeKey, frgNode.getData()); //won't copy children
node, so make sure there are none
+ DataNode tempFrgNode = (DataNode) cache.get(frgTempNodeKey);
+ cache.put(newFrgNodeKey, tempFrgNode.getData()); //won't copy
children node, so make sure there are none
+ //copy over the children
+ DataNode newFrgNode = (DataNode) cache.get(newFrgNodeKey);
+ newFrgNode.setChildren(tempFrgNode.getChildren());
+ //cache.put(newFrgNodeKey, tempFrgNode.getChildren());
Fragment newFrg = (Fragment) cache.get(newFrgNodeKey,
JesiObject.FRAGMENT_OBJ_MAPKEY);
- //reset some of the values in the copied node
- newFrg.setNodeKey(newFrgNodeKey);
- String absoluteHeader = newFrg.getAbsoluteKeyHeader();
- absoluteHeader = absoluteHeader.replaceFirst(
- EsiInvalidationWriterService.quote(aclGroupTemporaryKey),
//make sure it's un-regexed
- aclGroupFinalKey);
- newFrg.setAbsoluteKeyHeader(absoluteHeader);
Template tpl = getTemplate(pageID);
String templateNodeKey = tpl.getNodeKey(); //TODO : not very
efficient
//remove the reference to the old absolute fragment in parent
template
- Object deletedRef =
cache.remove(templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY,frgTempNodeKey);
+ Object deletedRef =
cache.remove(templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY,
+ frgTempNodeKey);
//sanity check
if(deletedRef==null)
logger.warn("[esi]: could find MapKey entry ["
+frgTempNodeKey+ "] in Template Node
["+templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY+"] which was due for
removal.");
@@ -1735,21 +1756,23 @@
"added by Template "+ templateNodeKey //TODO: change to a
dummy value
);
+ //first, make sure we rename the references to current Fragment in
the contentId Trackback node tree to the new one
+ tempFrg.renameTrackbackNodeInContentIds( newFrgNodeKey);
- //now we can remove the old node
- cache.remove(templateNodeKey+JesiObject.ABSOLUTE_FRAGS_NODEKEY,
- frgTempNodeKey //using it as a mapkey
- );
-
- //first, make sure we empty references to current Fragment in the
contentId Trackback node tree
- frg.removeTrackbackNodeInContentIds();
+ //reset some of the values in the copied node
+ newFrg.setNodeKey(newFrgNodeKey);
+ String absoluteHeader = newFrg.getAbsoluteKeyHeader();
+ absoluteHeader = absoluteHeader.replaceFirst(
+ EsiInvalidationWriterService.quote(aclGroupTemporaryKey),
//make sure it's un-regexed
+ aclGroupFinalKey);
+ newFrg.setAbsoluteKeyHeader(absoluteHeader);
+ //now we can remove the old node
cache.remove(frgTempNodeKey);
if (logger.isDebugEnabled())
logger.debug("[esi]: renamed temporary absolute node ["
+frgTempNodeKey+ "] to final ["+newFrgNodeKey+"].");
-
} catch (CacheException ex) {
printTreeCacheError(ex);
}
Modified: trunk/core/src/java/org/jahia/services/esi/tagstack/JesiObject.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/services/esi/tagstack/JesiObject.java&rev=14841&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/services/esi/tagstack/JesiObject.java
(original)
+++ trunk/core/src/java/org/jahia/services/esi/tagstack/JesiObject.java Fri Aug
4 08:39:58 2006
@@ -833,19 +833,61 @@
if (node!=null) {
Set contentIdKeys = node.getDataKeys();
if (contentIdKeys !=null) {
- contentIdKeys = new HashSet(node.getDataKeys());
+ contentIdKeys = new HashSet(contentIdKeys);
for (Iterator iterator = contentIdKeys.iterator();
iterator.hasNext();) {
String contentIdKey = (String) iterator.next();
//remove entry for the current node
String trackbackNodeKey = TRACKBACK_OVERALL_NODEKEY +
typeNodeKey + "/" + contentIdKey;
DataNode trackbackNode = cache.get(trackbackNodeKey);
if(trackbackNode!=null) {
-
//cache.remove(TRACKBACK_OVERALL_NODEKEY+typeNodeKey+"/"+contentIdKey, nodeKey);
+
//cache.remove(TRACKBACK_OVERALL_NODEKEY+typeNodeKey+"/"+contentIdKey, nodeKey);
+ trackbackNode.remove(nodeKey);
+ //safely remove this trackback node if it is empty
+ if (trackbackNode.getDataKeys().isEmpty()) {
+ cache.remove(trackbackNodeKey);
+ }
+ }
+ }
+ }
+ }
+ } catch (CacheException ex) {
+ logger.error("TreeCache error",ex);
+ }
+ }
+
+ public void renameTrackbackNodeInContentIds(String newNodeKey) {
+ TreeCache cache = getCache();
+
+ //for all contentIDs referenced by this template/fragment,
+ // rename the nodevalue (and maybe also nodekey)
+ // entry in trackback nodes
+ renameCurrentTrackbackNodeInContentIdsOfType(newNodeKey,
FIELDS_NODEKEY,cache);
+ renameCurrentTrackbackNodeInContentIdsOfType(newNodeKey,
CTNLISTS_NODEKEY,cache);
+ renameCurrentTrackbackNodeInContentIdsOfType(newNodeKey,
CTNS_NODEKEY,cache);
+ renameCurrentTrackbackNodeInContentIdsOfType(newNodeKey,
PAGES_NODEKEY,cache);
+ renameCurrentTrackbackNodeInContentIdsOfType(newNodeKey,
CTNLISTID0_NODEKEY,cache);
+ }
+
+
+ public void renameCurrentTrackbackNodeInContentIdsOfType(String
newNodeKey, String typeNodeKey ,TreeCache cache) {
+
+ try {
+ DataNode node = cache.get(nodeKey+typeNodeKey);
+
+ if (node!=null) {
+ Set contentIdKeys = node.getDataKeys();
+ if (contentIdKeys !=null) {
+ contentIdKeys = new HashSet(contentIdKeys);
+ for (Iterator iterator = contentIdKeys.iterator();
iterator.hasNext();) {
+ String contentIdKey = (String) iterator.next();
+ //rename entry for the current node
+ String trackbackNodeKey = TRACKBACK_OVERALL_NODEKEY +
typeNodeKey + "/" + contentIdKey;
+ DataNode trackbackNode = cache.get(trackbackNodeKey);
+ if(trackbackNode!=null) {
+ Object obj = trackbackNode.get(nodeKey);
+ trackbackNode.put(newNodeKey, obj);
trackbackNode.remove(nodeKey);
//safely remove this trackback node if it is empty
- if (trackbackNode.getDataKeys().isEmpty()) {
- cache.remove(trackbackNodeKey);
- }
}
}
}
Modified: trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java&rev=14841&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java (original)
+++ trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java Fri Aug 4
08:39:58 2006
@@ -764,6 +764,10 @@
ServicesRegistry.getInstance().getEsiService().renameTemporaryAbsoluteFragment(
jParams.getPageID(), frg, this.aclGroupTemporaryKey,
this.aclGroupFinalKey);
}
+ //delete temporary fragments for !requestFromEsiServer requests (such
as POSTs)
+ else if (aclGroupTemporaryKey!=null) {
+
ServicesRegistry.getInstance().getEsiService().removeFragment(jParams.getPageID(),
frg);
+ }
pageContext.removeAttribute( JesiConst.FRAGMENT_IN_USE,
PageContext.REQUEST_SCOPE );
release();