Author: tdraier
Date: Thu Aug  2 16:34:28 2007
New Revision: 18113

URL: https://svndev.jahia.net/websvn/listing.php?sc=3D1&rev=3D18113&repname=
=3Djahia
Log:
ContainerCache updates
-integrate caching into <content:container> tag (deactivated by default)
-updated <content:cache-container> tag with optional cacheKey for different=
 rendering
-improved keys (acl group sharing, cacheKey)
-invalidation listener

(port 18058)

Added:
    trunk/core/src/java/org/jahia/services/cache/CacheEventListener.java
      - copied unchanged from r18058, branches/JAHIA-5-0-SP-BRANCH/core/src=
/java/org/jahia/services/cache/CacheEventListener.java
Modified:
    trunk/core/src/java/org/jahia/hibernate/dao/JahiaAclDAO.java
    trunk/core/src/java/org/jahia/hibernate/manager/JahiaAclManager.java
    trunk/core/src/java/org/jahia/services/acl/JahiaACLManagerService.java
    trunk/core/src/java/org/jahia/services/cache/ContainerHTMLCache.java
    trunk/core/src/java/org/jahia/taglibs/container/ContainerCacheTag.java
    trunk/core/src/java/org/jahia/taglibs/container/ContainerTag.java
    trunk/core/src/webapp/WEB-INF/etc/config/listeners.registry
    trunk/core/src/webapp/WEB-INF/etc/taglibs/content.tld

Modified: trunk/core/src/java/org/jahia/hibernate/dao/JahiaAclDAO.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/hibernate/dao/JahiaAclDAO.java&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/hibernate/dao/JahiaAclDAO.java (original)
+++ trunk/core/src/java/org/jahia/hibernate/dao/JahiaAclDAO.java Thu Aug  2=
 16:34:28 2007
@@ -166,6 +166,14 @@
         return ret;
     }
 =

+    public Collection findAllTarget(int type) {
+        String hql =3D "select distinct a.comp_id.target from JahiaAclEntr=
y a where a.comp_id.type=3D?";
+        final HibernateTemplate template =3D getHibernateTemplate();
+        template.setCacheQueries(true);
+        template.setFlushMode(HibernateTemplate.FLUSH_NEVER);
+        return template.find(hql, new Integer(type));
+    }
+
     private void saveOrUpdateEntry(final Map userEntries, String key, Hibe=
rnateTemplate hibernateTemplate)
             throws HibernateException {
         JahiaAclEntry jahiaAclEntry =3D (JahiaAclEntry) userEntries.get(ke=
y);

Modified: trunk/core/src/java/org/jahia/hibernate/manager/JahiaAclManager.j=
ava
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/hibernate/manager/JahiaAclManager.java&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/hibernate/manager/JahiaAclManager.java (o=
riginal)
+++ trunk/core/src/java/org/jahia/hibernate/manager/JahiaAclManager.java Th=
u Aug  2 16:34:28 2007
@@ -32,6 +32,7 @@
 import org.springframework.orm.ObjectRetrievalFailureException;
 =

 import java.util.List;
+import java.util.Collection;
 =

 /**
  * Created by IntelliJ IDEA.
@@ -132,6 +133,10 @@
         return dao.isGroupUsedInAclEntries(groupName);
     }
 =

+    public Collection findAllTarget(int type) {
+        return dao.findAllTarget(type);
+    }
+
     public void saveAcl(JahiaAcl acl) {
         if(acl.getId()!=3Dnull)  {
             flushCache();

Modified: trunk/core/src/java/org/jahia/services/acl/JahiaACLManagerService=
.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/services/acl/JahiaACLManagerService.java&rev=3D18113&repname=3Djah=
ia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/services/acl/JahiaACLManagerService.java =
(original)
+++ trunk/core/src/java/org/jahia/services/acl/JahiaACLManagerService.java =
Thu Aug  2 16:34:28 2007
@@ -687,4 +687,13 @@
         }
         return result;
     }
+
+    public Collection getAllUsersInAcl() {
+        return manager.findAllTarget(1);
+    }
+    public Collection getAllGroupsInAcl() {
+        return manager.findAllTarget(2);
+    }
+
+
 }

Modified: trunk/core/src/java/org/jahia/services/cache/ContainerHTMLCache.j=
ava
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/services/cache/ContainerHTMLCache.java&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/services/cache/ContainerHTMLCache.java (o=
riginal)
+++ trunk/core/src/java/org/jahia/services/cache/ContainerHTMLCache.java Th=
u Aug  2 16:34:28 2007
@@ -1,10 +1,11 @@
 package org.jahia.services.cache;
 =

-import org.jahia.bin.Jahia;
-import org.jahia.settings.SettingsBean;
+import org.jahia.services.usermanager.JahiaUser;
+import org.jahia.services.usermanager.JahiaGroup;
+import org.jahia.data.containers.JahiaContainer;
+import org.jahia.registries.ServicesRegistry;
 =

-import java.util.Set;
-import java.util.HashSet;
+import java.util.*;
 =

 /**
  * Created by IntelliJ IDEA.
@@ -23,6 +24,7 @@
 =

     private static final String CONTAINER_PREFIX =3D "CONTAINER-";
     private static final String PARENTCONTAINER_PREFIX =3D "PARENTCONTAINE=
R-";
+    private static final String KEY_PREFIX =3D "KEY-";
     private static final String USERNAME_PREFIX =3D "USERNAME-";
     private static final String LANGUAGECODE_PREFIX =3D "LANGUAGECODE-";
     private static final String WORKFLOWSTATE_PREFIX =3D "WORKFLOWSTATE-";
@@ -40,55 +42,56 @@
      * <p>Builds the cache key that is used to reference the cache entries=
 in the
      * lookup table.</p>
      *
-     * @param parentContainerID the identifier for the parent container ID
-     * @param containerID   the container identification number
-     * @param userName      the user name
+     * @param container   the container identification number
+     * @param group
+     [EMAIL PROTECTED] user          the user name
      * @param languageCode  the language code
      * @param workflowState the workflow state
      * @param scheme        the request scheme (http/https)
-     *
      * @return  the generated cache key
      */
-    public GroupCacheKey computeEntryKey (int parentContainerID,
-                                          int containerID,
-                                          String userName,
-                                          String languageCode,
-                                          int workflowState,
-                                          String scheme)
+    public GroupCacheKey computeEntryKey(
+            JahiaContainer container,
+            String group, JahiaUser user,
+            String languageCode,
+            int workflowState,
+            String scheme)
     {
-        Set compositeKeyElements =3D new HashSet();
-        String containerid =3D CONTAINER_PREFIX + containerID;
-        compositeKeyElements.add(containerid);
-        // compositeKeyElements.add(USERNAME_PREFIX + userName);
-        compositeKeyElements.add(LANGUAGECODE_PREFIX + languageCode);
-        String workflowStateString =3D WORKFLOWSTATE_PREFIX + workflowStat=
e;
-        compositeKeyElements.add(workflowStateString);
-        if (!"http".equals(scheme)) {
-            compositeKeyElements.add(SCHEME_PREFIX + scheme);
-        }
-        compositeKeyElements.add(containerid +workflowStateString);
-        return new GroupCacheKey(compositeKeyElements);
+        int id =3D container.getID();
+        String usercachekey =3D getUserCacheKey(user, container.getSiteID(=
));
+
+        String key =3D getKey(id, workflowState, languageCode, usercacheke=
y, group, scheme);
+
+        return new GroupCacheKey(key, new HashSet());
     }
 =

-    /**
-     * <p>Invalidates all the cache entries related to the specified conta=
iner <code>containerID</code>,
-     * by removing the cache entries.</p>
-     *
-     * @param containerID  the container identification number
-     */
-    public synchronized void invalidateContainerEntries (String containerI=
D) {
-        if (!Jahia.getSettings().lookupBoolean(SettingsBean.OUTPUT_CACHE_A=
CTIVATED))
-            return;
+    public GroupCacheKey computeEntryKeyWithGroups(
+            JahiaContainer container,
+            String group, JahiaUser user,
+            String languageCode,
+            int workflowState,
+            String scheme)
+    {
+        int id =3D container.getID();
+        String usercachekey =3D getUserCacheKey(user, container.getSiteID(=
));
 =

-        if (containerID =3D=3D null) {
-            logger.debug ("Cannot remove a null container ID from the cach=
e!");
-            return;
-        }
-        logger.debug ("Removing cache entries for container ["+ containerI=
D +"]");
+        String key =3D getKey(id, workflowState, languageCode, usercacheke=
y, group, scheme);
 =

-        String pageKey =3D CONTAINER_PREFIX + containerID;
+        Set groups =3D new HashSet();
+        groups.add(CONTAINER_PREFIX + id + WORKFLOWSTATE_PREFIX + workflow=
State + LANGUAGECODE_PREFIX + languageCode);
+        groups.add(USERNAME_PREFIX + usercachekey);
+        return new GroupCacheKey(key, groups);
+    }
 =

-        flushGroup(pageKey);
+    private String getKey(int id, int workflowState, String languageCode, =
String usercachekey, String group, String scheme) {
+        String key =3D id + "-" + workflowState + "-" + languageCode + "-"=
 +usercachekey ;
+        if (group !=3D null) {
+            key +=3D "-" + group;
+        }
+        if (!"http".equals(scheme)) {
+            key +=3D "-" +  scheme;
+        }
+        return key;
     }
 =

     /**
@@ -97,46 +100,61 @@
      *
      * @param containerID  the container identification number
      * @param workflowState the workflow state for which to invalidate the=
 containers.
+     * @param languageCode the language code for which to invalidate the c=
ontainers.
      */
-    public synchronized void invalidatePageEntries (String containerID, in=
t workflowState) {
-        if (!Jahia.getSettings().lookupBoolean(SettingsBean.OUTPUT_CACHE_A=
CTIVATED))
-            return;
+
+    public synchronized void invalidateContainerEntries(String containerID=
, int workflowState, String languageCode) {
 =

         if (containerID =3D=3D null) {
             logger.debug ("Cannot remove a null container ID from the cach=
e!");
             return;
         }
 =

-        logger.debug ("Removing cache entries for page ["+ containerID +"]=
");
+        logger.debug ("Removing cache entries for page ["+ containerID + "=
], workflow ["+workflowState+"], lang ["+languageCode+"]");
 =

-        String pageKey =3D CONTAINER_PREFIX + containerID + WORKFLOWSTATE_=
PREFIX + workflowState;
+        String pageKey =3D CONTAINER_PREFIX + containerID + WORKFLOWSTATE_=
PREFIX + workflowState + LANGUAGECODE_PREFIX + languageCode;
 =

         flushGroup(pageKey);
     }
 =

+    public void rightsUpdated() {
+        SortedSet newgroups =3D new TreeSet(ServicesRegistry.getInstance()=
.getJahiaACLManagerService().getAllGroupsInAcl());
+        if (!newgroups.equals(groups)) {
+            groups =3D newgroups;
+            flush();
+        }
+    }
 =

-    /** <p>Invalidates all the cache entries related to the specified user
-     *  <code>username</code>, by removing the cache entries.</p>
-     *
-     * <p><b>Caution</b>: depending of the HTML cache size, this operation=
 can be
-     * time consumming!</p>
-     *
-     * @param username    the page identification
-     */
-    public synchronized void invalidateUserEntries (String username) {
-        if (!Jahia.getSettings().lookupBoolean(SettingsBean.OUTPUT_CACHE_A=
CTIVATED))
-            return;
+    private String getUserCacheKey(JahiaUser user, int siteID) {
+        String usercachekey;
 =

-        if (username =3D=3D null) {
-            logger.debug ("Cannot remove a null username fromt the cache!"=
);
-            return;
-        }
+        Set users =3D new HashSet(ServicesRegistry.getInstance().getJahiaA=
CLManagerService().getAllUsersInAcl());
+        SortedSet groups =3D getAllGroups();
 =

-        logger.debug ("Removing cache entries for user ["+ username +"]");
+        if (users.contains(user.getUserKey())) {
+            usercachekey =3D user.getUserKey();
+        } else {
+            StringBuffer b =3D new StringBuffer();
+            for (Iterator iterator =3D groups.iterator(); iterator.hasNext=
();) {
+                String groupName =3D (String) iterator.next();
+                JahiaGroup g =3D ServicesRegistry.getInstance().getJahiaGr=
oupManagerService().lookupGroup(groupName);
+                if (g.getSiteID() =3D=3D siteID && g.isMember(user)) {
+                    b.append(groupName);
+                    b.append("|");
+                }
+            }
+            usercachekey =3D b.toString();
+        }
+        return usercachekey;
+    }
 =

-        String userKey =3D USERNAME_PREFIX + username;
+    private SortedSet groups;
 =

-        flushGroup(userKey);
+    private synchronized SortedSet getAllGroups() {
+        if (groups =3D=3D null) {
+            groups =3D new TreeSet(ServicesRegistry.getInstance().getJahia=
ACLManagerService().getAllGroupsInAcl());
+        }
+        return groups;
     }
 =

 }

Modified: trunk/core/src/java/org/jahia/taglibs/container/ContainerCacheTag=
.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/taglibs/container/ContainerCacheTag.java&rev=3D18113&repname=3Djah=
ia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/taglibs/container/ContainerCacheTag.java =
(original)
+++ trunk/core/src/java/org/jahia/taglibs/container/ContainerCacheTag.java =
Thu Aug  2 16:34:28 2007
@@ -34,10 +34,18 @@
     private String containerContent =3D null;
     private int counter =3D 1;
     private JahiaData jData =3D null;
-
+    private String cacheKey =3D null;
 =

     private boolean display =3D true;
 =

+    public String getCacheKey() {
+        return cacheKey;
+    }
+
+    public void setCacheKey(String cacheKey) {
+        this.cacheKey =3D cacheKey;
+    }
+
     /**
          * @jsp:attribute name=3D"id" required=3D"false" rtexprvalue=3D"tr=
ue"
          * description=3D"id attribute for this tag.
@@ -68,6 +76,7 @@
 =

         ContainerListTag cListTag =3D (ContainerListTag) findAncestorWithC=
lass(this, ContainerListTag.class);
         ContainerTag containerTag =3D (ContainerTag) findAncestorWithClass=
(this, ContainerTag.class);
+        containerTag.setCache("false");
         container =3D containerTag.getContainer();
         containerList =3D cListTag.getContainerList();
         if ((containerList =3D=3D null) || (container =3D=3D null)) {
@@ -77,7 +86,7 @@
         ServletRequest request =3D pageContext.getRequest();
         jData =3D (JahiaData) request.getAttribute("org.jahia.data.JahiaDa=
ta");
         try {
-            containerContent =3D getFromContainerCache(containerList, cont=
ainer, jData);
+            containerContent =3D getFromContainerCache(container, jData);
             if (containerContent !=3D null) {
                 return SKIP_BODY;
             }
@@ -94,7 +103,7 @@
         if (this.display) {
             try {
                 String bodyContent =3D getBodyContent().getString();
-                writeToContainerCache(containerList, container, jData, bod=
yContent);
+                writeToContainerCache(container, jData, bodyContent);
                 getBodyContent().writeOut(getPreviousOut());
                 getBodyContent().clear();
                 this.counter++;
@@ -126,17 +135,15 @@
         firstContainer =3D null;
         containerContent =3D null;
         counter =3D 1;
-
+        cacheKey =3D null;
         jData =3D null;
 =

         display =3D true;
         return EVAL_PAGE;
     }
 =

-    private void writeToContainerCache(JahiaContainerList jahiaContainerLi=
st,
-                                       JahiaContainer jahiaContainer,
-                                       JahiaData jahiaData,
-                                       String bodyContent) throws JahiaIni=
tializationException {
+    private void writeToContainerCache(JahiaContainer jahiaContainer,Jahia=
Data jahiaData,
+            String bodyContent) throws JahiaInitializationException {
         ContainerHTMLCache containerHTMLCache =3D ServicesRegistry.getInst=
ance().getCacheService().getContainerHTMLCacheInstance();
         ProcessingContext processingContext =3D jahiaData.getProcessingCon=
text();
         int workflowState =3D processingContext.getEntryLoadRequest().
@@ -144,17 +151,15 @@
         // Get the language code
         String curLanguageCode =3D LanguageCodeConverters.localeToLanguage=
Tag(
             processingContext.getLocale());
-        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKey(=
jahiaContainerList.getParentEntryID(),
-                jahiaContainer.getID(), processingContext.getUser().getUse=
rKey(),
+        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKeyW=
ithGroups(
+                jahiaContainer, cacheKey, processingContext.getUser(),
                 curLanguageCode,
                 workflowState,
                 processingContext.getScheme());
         containerHTMLCache.put(containerKey, bodyContent);
     }
 =

-    private String getFromContainerCache(JahiaContainerList jahiaContainer=
List,
-                                       JahiaContainer jahiaContainer,
-                                       JahiaData jahiaData) throws JahiaIn=
itializationException {
+    private String getFromContainerCache(JahiaContainer jahiaContainer,Jah=
iaData jahiaData) throws JahiaInitializationException {
         ContainerHTMLCache containerHTMLCache =3D ServicesRegistry.getInst=
ance().getCacheService().getContainerHTMLCacheInstance();
         ProcessingContext processingContext =3D jahiaData.getProcessingCon=
text();
         int workflowState =3D processingContext.getEntryLoadRequest().
@@ -162,8 +167,8 @@
         // Get the language code
         String curLanguageCode =3D LanguageCodeConverters.localeToLanguage=
Tag(
             processingContext.getLocale());
-        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKey(=
jahiaContainerList.getParentEntryID(),
-                jahiaContainer.getID(), processingContext.getUser().getUse=
rKey(),
+        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKey(
+                jahiaContainer, cacheKey, processingContext.getUser(),
                 curLanguageCode,
                 workflowState,
                 processingContext.getScheme());

Modified: trunk/core/src/java/org/jahia/taglibs/container/ContainerTag.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/java/o=
rg/jahia/taglibs/container/ContainerTag.java&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/java/org/jahia/taglibs/container/ContainerTag.java (orig=
inal)
+++ trunk/core/src/java/org/jahia/taglibs/container/ContainerTag.java Thu A=
ug  2 16:34:28 2007
@@ -20,7 +20,6 @@
 import org.jahia.data.beans.ContainerBean;
 import org.jahia.data.containers.JahiaContainer;
 import org.jahia.data.containers.JahiaContainerList;
-import org.jahia.data.containers.JahiaContainerDefinition;
 import org.jahia.params.ProcessingContext;
 import org.jahia.registries.ServicesRegistry;
 import org.jahia.services.cache.ContainerHTMLCache;
@@ -31,6 +30,7 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspTagException;
+import javax.servlet.jsp.JspWriter;
 import javax.servlet.jsp.tagext.BodyTagSupport;
 import java.io.IOException;
 import java.util.Enumeration;
@@ -57,6 +57,9 @@
 =

     private Enumeration containers;
 =

+    // default value for container caching
+    private static final String CACHING_DEFAULT_VALUE =3D "false";
+
     private boolean first =3D true;
     private boolean last =3D true;
     private JahiaContainer container =3D null;
@@ -65,6 +68,9 @@
     private int counter =3D 1;
     private JahiaData jData =3D null;
 =

+    private String cache =3D CACHING_DEFAULT_VALUE;
+    private String cacheKey =3D "";
+
     private boolean initLoop =3D true;
 =

     private boolean display =3D true;
@@ -88,6 +94,22 @@
         return this.last;
     }
 =

+    public String getCache() {
+        return cache;
+    }
+
+    public void setCache(String cache) {
+        this.cache =3D cache;
+    }
+
+    public String getCacheKey() {
+        return cacheKey;
+    }
+
+    public void setCacheKey(String cacheKey) {
+        this.cacheKey =3D cacheKey;
+    }
+
     public JahiaContainer getContainer() {
         return this.container;
     }
@@ -117,15 +139,12 @@
                 // here is stuff we need to do only once...
                 // reads the containers of this list
                 containers =3D containerList.getContainers();
-                int ct =3D 0;
                 if (containers.hasMoreElements()) {
                     this.container =3D (JahiaContainer)containers.nextElem=
ent();
                     if (getId() !=3D null) {
                         pageContext.setAttribute(getId(), getContainerBean=
());
                     }
-                    if (ct =3D=3D 0) {
-                        this.firstContainer =3D this.container;
-                    }
+                    this.firstContainer =3D this.container;
                     if (containers.hasMoreElements()) {
                         this.last =3D false;
                     }
@@ -134,43 +153,72 @@
                     this.display =3D false;
                 }
                 containers =3D containerList.getContainers();
-                if (containers.hasMoreElements()) {
-                    this.container =3D (JahiaContainer) containers.nextEle=
ment();
-                    if (getId() !=3D null) {
-                        pageContext.setAttribute(getId(), getContainerBean=
());
-                    }
-                } else {
-                    return SKIP_BODY;
-                }
                 initLoop =3D false;
+
+                return processNextContainer(pageContext.getOut());
             }
         return EVAL_BODY_BUFFERED;
     }
 =

+    private int processNextContainer(JspWriter out) throws JspTagException=
 {
+        while (containers.hasMoreElements()) {
+            this.container =3D (JahiaContainer) containers.nextElement();
+            if (getId() !=3D null) {
+                pageContext.setAttribute(getId(), getContainerBean());
+            }
+            // maybe not the first one anymore
+            this.first =3D firstContainer =3D=3D container;
+            // checks if it's the last one
+            if (!containers.hasMoreElements()) {
+                this.last =3D true;
+            }
+
+            ServletRequest request =3D pageContext.getRequest();
+            jData =3D (JahiaData) request.getAttribute("org.jahia.data.Jah=
iaData");
+            if ("true".equals(cache)) {
+                try {
+                    String containerContent =3D getFromContainerCache(cont=
ainer, jData);
+                    if (containerContent !=3D null) {
+                        if ((this.display)) {
+                            try {
+                                out.print(containerContent);
+                            } catch (IOException ioe) {
+                                logger.error("Error displaying container o=
utput", ioe);
+                                throw new JspTagException();
+                            }
+                        }
+                        continue;
+                    }
+                } catch (JahiaInitializationException jie) {
+                    logger.error("Error initializing container rendering",=
 jie);
+                    throw new JspTagException();
+                }
+            }
+            return EVAL_BODY_BUFFERED;
+        }
+        return SKIP_BODY;
+    }
+
 =

     // loops through the next elements
     public int doAfterBody() throws JspException {
         if (this.display) {
             try {
+                if ("true".equals(cache)) {
+                    writeToContainerCache(container, jData, getBodyContent=
().getString());
+                }
                 getBodyContent().writeOut(getPreviousOut());
                 getBodyContent().clear();
                 this.counter++;
             } catch (IOException ioe) {
                 logger.error("Error displaying container output", ioe);
                 throw new JspTagException();
+            } catch (JahiaInitializationException jie) {
+                logger.error("Error displaying container output", jie);
+                throw new JspTagException();
             }
             if (containers.hasMoreElements()) {
-                this.container =3D (JahiaContainer)containers.nextElement(=
);
-                if (getId() !=3D null) {
-                    pageContext.setAttribute(getId(), getContainerBean());
-                }
-                // not the first one anymore
-                this.first =3D false;
-                // checks if it's the last one
-                if (!containers.hasMoreElements()) {
-                    this.last =3D true;
-                }
-                return EVAL_BODY_BUFFERED;
+                return processNextContainer(getPreviousOut());
             } else {
                 this.display =3D false;
             }
@@ -191,6 +239,10 @@
         firstContainer =3D null;
         counter =3D 1;
 =

+        cache =3D CACHING_DEFAULT_VALUE;
+
+        cacheKey =3D "";
+
         initLoop =3D true;
         jData =3D null;
 =

@@ -199,6 +251,39 @@
             pageContext.removeAttribute(getId());
         }
         return EVAL_PAGE;
+    }                          =

+
+    private void writeToContainerCache(JahiaContainer jahiaContainer, Jahi=
aData jahiaData,
+            String bodyContent) throws JahiaInitializationException {
+        ContainerHTMLCache containerHTMLCache =3D ServicesRegistry.getInst=
ance().getCacheService().getContainerHTMLCacheInstance();
+        ProcessingContext processingContext =3D jahiaData.getProcessingCon=
text();
+        int workflowState =3D processingContext.getEntryLoadRequest().
+                            getWorkflowState();
+        // Get the language code
+        String curLanguageCode =3D LanguageCodeConverters.localeToLanguage=
Tag(
+            processingContext.getLocale());
+        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKeyW=
ithGroups(
+                jahiaContainer, cacheKey, processingContext.getUser(),
+                curLanguageCode,
+                workflowState,
+                processingContext.getScheme());
+        containerHTMLCache.put(containerKey, bodyContent);
+    }
+
+    private String getFromContainerCache(JahiaContainer jahiaContainer, Ja=
hiaData jahiaData) throws JahiaInitializationException {
+        ContainerHTMLCache containerHTMLCache =3D ServicesRegistry.getInst=
ance().getCacheService().getContainerHTMLCacheInstance();
+        ProcessingContext processingContext =3D jahiaData.getProcessingCon=
text();
+        int workflowState =3D processingContext.getEntryLoadRequest().
+                            getWorkflowState();
+        // Get the language code
+        String curLanguageCode =3D LanguageCodeConverters.localeToLanguage=
Tag(
+            processingContext.getLocale());
+        GroupCacheKey containerKey =3D containerHTMLCache.computeEntryKey(
+                jahiaContainer, cacheKey, processingContext.getUser(),
+                curLanguageCode,
+                workflowState,
+                processingContext.getScheme());
+        return (String) containerHTMLCache.get(containerKey);
     }
 =

 }

Modified: trunk/core/src/webapp/WEB-INF/etc/config/listeners.registry
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/webapp=
/WEB-INF/etc/config/listeners.registry&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/webapp/WEB-INF/etc/config/listeners.registry (original)
+++ trunk/core/src/webapp/WEB-INF/etc/config/listeners.registry Thu Aug  2 =
16:34:28 2007
@@ -20,6 +20,7 @@
 EsiInvalidationEventListener=3Dorg.jahia.services.esi.EsiInvalidationEvent=
Listener
 SlideSiteListener=3Dorg.jahia.services.webdav.SlideSiteListener
 JCRSiteListener=3Dorg.jahia.services.content.JCRSiteListener
+CacheEventListener=3Dorg.jahia.services.cache.CacheEventListener
 =

 #
 # Activate the JSP Event listener if you want to be able to implement JSP

Modified: trunk/core/src/webapp/WEB-INF/etc/taglibs/content.tld
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/trunk/core/src/webapp=
/WEB-INF/etc/taglibs/content.tld&rev=3D18113&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/core/src/webapp/WEB-INF/etc/taglibs/content.tld (original)
+++ trunk/core/src/webapp/WEB-INF/etc/taglibs/content.tld Thu Aug  2 16:34:=
28 2007
@@ -269,6 +269,16 @@
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
+    <attribute>
+        <name>cache</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>cacheKey</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
   </tag>
 =

     <tag>
@@ -280,6 +290,11 @@
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
       </attribute>
+        <attribute>
+            <name>cacheKey</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
     </tag>
 =

   <tag>

_______________________________________________
cvs_list mailing list
[email protected]
http://lists.jahia.org/cgi-bin/mailman/listinfo/cvs_list

Reply via email to