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();

Reply via email to