Author: mcardle
Date: Wed Aug 16 09:34:34 2006
New Revision: 14903
URL: https://svndev.jahia.net/websvn/listing.php?sc=1&rev=14903&repname=jahia
Log:
* (Continued 2) support for aclGroup template sharing and other things
Modified:
trunk/core/src/java/org/jahia/services/esi/EsiService.java
trunk/core/src/java/org/jahia/services/esi/EsiTemplateCachingServlet.java
trunk/core/src/java/org/jahia/services/esi/tagstack/Template.java
trunk/core/src/java/org/jahia/taglibs/esi/JesiConst.java
trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java
trunk/core/src/java/org/jahia/taglibs/esi/JesiTemplateTag.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=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/services/esi/EsiService.java (original)
+++ trunk/core/src/java/org/jahia/services/esi/EsiService.java Wed Aug 16
09:34:34 2006
@@ -635,6 +635,7 @@
if (tpl !=null) {
tpl.setFirstExecute(true);
tpl.clearAclUserNames();
+ tpl.setFragmentUserACLs(new HashMap());
}
}
}
Modified:
trunk/core/src/java/org/jahia/services/esi/EsiTemplateCachingServlet.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/services/esi/EsiTemplateCachingServlet.java&rev=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/services/esi/EsiTemplateCachingServlet.java
(original)
+++ trunk/core/src/java/org/jahia/services/esi/EsiTemplateCachingServlet.java
Wed Aug 16 09:34:34 2006
@@ -5,13 +5,10 @@
package org.jahia.services.esi;
import org.jahia.bin.Jahia;
-import org.jahia.services.esi.tagstack.Fragment;
-import org.jahia.services.esi.tagstack.Template;
import org.jahia.services.usermanager.JahiaUser;
import org.jahia.registries.ServicesRegistry;
import org.jahia.taglibs.esi.JesiConst;
import org.jahia.taglibs.esi.JesiFragmentTag;
-import org.jahia.exceptions.JahiaSessionExpirationException;
import org.jahia.params.ParamBean;
import javax.servlet.http.HttpServlet;
@@ -22,9 +19,6 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
-import java.util.Iterator;
-import java.net.URLDecoder;
-import java.net.URL;
import java.net.URLEncoder;
/**
@@ -93,7 +87,7 @@
response.addHeader("Pragma" , "no-cache" );
PrintWriter out = response.getWriter();
- String responseStr =
userName+JesiConst.ACLGROUP_TEMPLATE_REPONSE_SEPARATOR+aclGroupKeyForUser;
+ String responseStr =
userName+JesiConst.ACLGROUP_TEMPLATE_RESPONSE_SEPARATOR +aclGroupKeyForUser;
out.println(responseStr);
if (logger.isDebugEnabled())
Modified: trunk/core/src/java/org/jahia/services/esi/tagstack/Template.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/services/esi/tagstack/Template.java&rev=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/services/esi/tagstack/Template.java (original)
+++ trunk/core/src/java/org/jahia/services/esi/tagstack/Template.java Wed Aug
16 09:34:34 2006
@@ -20,7 +20,9 @@
import org.jahia.registries.ServicesRegistry;
import org.jboss.cache.CacheException;
import org.jboss.cache.TreeCache;
-import org.jboss.cache.DataNode;
+
+import java.util.HashSet;
+import java.util.HashMap;
/**
* <p>Title: </p>
@@ -42,6 +44,8 @@
org.apache.log4j.Logger.getLogger(JesiObject.class);
+ public final static String FRAGMENT_USERACLS_MAPKEY = "Frag_UserACLs";
+
public Template (int siteID, int pageID, String URL) throws CacheException{
this.nodeKey =
ServicesRegistry.getInstance().getEsiService().getTemplateNodeKey(siteID,
pageID);
@@ -53,8 +57,48 @@
this.URL = URL;
//parseUrl(URL);
setObjType("Template");
+
+ setFragmentUserACLs(new HashMap());
+ }
+
+
+ public HashMap getFragmentUserACLs() {
+ TreeCache cache = getCache();
+ try {
+ return (HashMap) cache.get(nodeKey,FRAGMENT_USERACLS_MAPKEY);
+ } catch (CacheException ex) {
+ logger.error("TreeCache error",ex);
+ return null;
+ }
+ }
+
+ public void setFragmentUserACLs(HashMap hm) {
+ TreeCache cache = getCache();
+ try {
+ cache.put(nodeKey,FRAGMENT_USERACLS_MAPKEY,hm);
+ } catch (CacheException ex) {
+ logger.error("TreeCache error",ex);
+ }
}
+ public void addFragmentUserACLs(String headerName,String fragUserACLs) {
+ TreeCache cache = getCache();
+ try {
+ HashMap hm = (HashMap) cache.get(nodeKey,FRAGMENT_USERACLS_MAPKEY);
+ if (hm ==null) {
+ logger.info("FragmentUserACLs HashMap is null
"+this.toString());
+ hm = new HashMap();
+ }
+ hm.put(headerName, fragUserACLs);
+
+ cache.put(nodeKey,FRAGMENT_USERACLS_MAPKEY,hm);
+
+ } catch (CacheException ex) {
+ logger.error("TreeCache error",ex);
+ }
+ }
+
+
public String getObjDetails() {
try {
return "Template on pageID["+getPageID()+"]";
@@ -65,6 +109,7 @@
}
+
public String toString () {
TreeCache cache = getCache();
Modified: trunk/core/src/java/org/jahia/taglibs/esi/JesiConst.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/taglibs/esi/JesiConst.java&rev=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/taglibs/esi/JesiConst.java (original)
+++ trunk/core/src/java/org/jahia/taglibs/esi/JesiConst.java Wed Aug 16
09:34:34 2006
@@ -83,11 +83,14 @@
//aclGroup template and related Servlet constants
public static String PID_QUERY_PARAM = "pid";
- public static String ACLGROUP_TEMPLATE_USERACLS_HEADER =
"JahiaEsi_UserAcls";
- public static String ACLGROUP_TEMPLATE_USER_MARKER =
"esiAclGroupedUserMarker";
- public static String ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED = "NONE";
- public static String ACLGROUP_TEMPLATE_USERACLS_SEPARATOR = "_._";
- public static String ACLGROUP_TEMPLATE_REPONSE_SEPARATOR = "______";
+ public static String ACLGROUP_TEMPLATE_USERACLS_HEADER =
"JahiaEsi_TplUserAcls";
+ public static String ACLGROUP_FRAGMENT_USERACLS_HEADER =
"JahiaEsi_FragUserAcls";
+ public static String ACLGROUP_TEMPLATE_NOTIFIER_HEADER =
"JahiaEsi_AclGroupTemplate";
+ public static String USER_FRAGMENT_MARKER = "esiUserFragmentMarker";
+ public static String ACLGROUP_FRAGMENT_MARKER =
"esiAclGroupFragmentMarker";
+ public static String NO_USERACLS_DETECTED = "NONE";
+ public static String USERACLS_SEPARATOR = "_._";
+ public static String ACLGROUP_TEMPLATE_RESPONSE_SEPARATOR = "______";
public static HashMap RESERVED_PARAM_NAMES;
static
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=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java (original)
+++ trunk/core/src/java/org/jahia/taglibs/esi/JesiFragmentTag.java Wed Aug 16
09:34:34 2006
@@ -27,9 +27,7 @@
import org.jahia.registries.ServicesRegistry;
import org.jahia.bin.Jahia;
import java.text.DateFormat;
-import java.util.Date;
-import java.util.Vector;
-import java.util.Enumeration;
+import java.util.*;
import java.net.URL;
import java.net.MalformedURLException;
@@ -68,6 +66,8 @@
private boolean firstExecuteOfNonAclGroupFrag = false;
+ private boolean guestUser = false;
+
public int doStartTag()
throws JspTagException
{
@@ -88,6 +88,8 @@
}
else
{
+ guestUser = "guest".equals(jParams.getUser().getUsername());
+
EsiService esiService =
ServicesRegistry.getInstance().getEsiService();
int curSiteID = jParams.getSiteID();
int curPid = jParams.getPageID();
@@ -401,9 +403,8 @@
//if the parent template is aclGrouped, then we must use put a
special marker in the fragment link,
// and not the unique user=JahiaUsername identifier so that we can
share the same identical template with
//users with same acl group memberships
- if (Jahia.getSettings().isEsiEnableTemplateCaching()
- &&!JesiConst.UNSET.equals(parentTemplate.aclGroup)) {
- userPart =
"&"+JesiConst.USER+"="+JesiConst.ACLGROUP_TEMPLATE_USER_MARKER;
+ if (parentTemplate.aclGroupedTemplate && !guestUser) {//only do
this for logged-in user
+ userPart =
"&"+JesiConst.USER+"="+JesiConst.USER_FRAGMENT_MARKER;
}
//otherwise, just revert back to default behaviour for
non-aclGrouped Templates, which
//is to put the user name in the link
@@ -538,6 +539,7 @@
}
public static StringBuffer createUserGroupMembershipKey(JahiaUser
jahiaUser) {
+ //TODO: could do some of this once then store it in the session. This
would save us the hassle of looking up groups. Needs to make sure these session
vars are invalidated during ACL change
StringBuffer detectedGroups = new StringBuffer();
JahiaGroupManagerService groupService = ServicesRegistry.getInstance ()
@@ -576,6 +578,8 @@
return javax.servlet.jsp.tagext.Tag.EVAL_PAGE;//6;
}
+ boolean fragmentSessionStored = false; //toggle to indicate if the
current fragment was stored in the session or returned directly into the
response
+
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
ParamBean jParams = (ParamBean)Jahia.getThreadParamBean();
@@ -644,8 +648,13 @@
//update the real Key now
this.aclGroupFinalKey = aclGroupParam;
//append the aclGroup query parameter (obtained from
the detected content) to the fragment's URL
+
+ String inURLAclGroupParam=(!guestUser &&
parentTemplate.aclGroupedTemplate)?
+
JesiConst.ACLGROUP_FRAGMENT_MARKER
+ :aclGroupParam;
+
pageContext.getOut().write("<esi:include src=\""
- + this.currentURL +
"&"+JesiConst.ACL_GROUP+"=" + aclGroupParam + "\"> esi:include group tag here
</esi:include>");
+ + this.currentURL +
"&"+JesiConst.ACL_GROUP+"=" +inURLAclGroupParam+ "\"> esi:include group tag
here </esi:include>");
if (logger.isDebugEnabled())
logger.debug("[esi]: Generating Template. Added
<esi:include src=\""+ this.currentURL + "&"+JesiConst.ACL_GROUP+"=" +
aclGroupParam + "> esi:include group tag here </esi:include>");
@@ -676,7 +685,7 @@
//up (once only!!) when it is really requested
String sharingInfo = "aclGroup:"+aclGroupParam +
((!JesiConst.UNSET.equals(absolute))?"(Abs)":""); //to signla this is an
absolute Fragment
storeFragmentInSession(jParams,
fragmentBodyContent, UpdateTime, ctIDs, sharingInfo);
-
+ fragmentSessionStored=true;
//set firstExecute status of this Fragment to
false now since we'd detected all user acls on it
esiService.resetCurrentFragmentFirstExecute (
jParams.getSiteID(),
@@ -729,6 +738,7 @@
//are we generating a prefetch frag?
if (requestedFragment != JesiConst.NO_FRAGMENTS &&
this.prefetchURL !=null) {
storeFragmentInSession(jParams, fragmentBodyContent,
UpdateTime, ctIDs, sharingInfo);
+ fragmentSessionStored=true;
}
//This is not a prefetch frag or an aclgroup frag:
else {
@@ -766,6 +776,34 @@
Fragment frg = (Fragment)
ServicesRegistry.getInstance().getEsiService().getTackStack()
.pop("Fragment", fragCount);
+
+ //update the special headers for this fragment in the parent template
+ if (parentTemplate.aclGroupedTemplate //no need to do this inside
non-aclGrouped shared templates
+ && !JesiConst.UNSET.equals(aclGroup) //no need to do this
for non-aclGrouped fragments
+ //&& !frg.isFirstExecute(jParams.getOperationMode()) //if this is
the first time we execute this fragment, we don't know the user ACLs yet, so
just don't set the header just yet
+ ) {
+ String headerName= Integer.toString(getCurrentFragCount());
+ String headerVal=null;
+ //are there any User ACLs specifically assigned to this fragment?
+ Map aclUsernames = frg.getAclUserNames();
+ if (aclUsernames!=null && !aclUsernames.isEmpty()) {
+ StringBuffer sb = new StringBuffer();
+ Iterator usersIt = aclUsernames.keySet().iterator();
+ while (usersIt.hasNext()) {
+ String userName = (String) usersIt.next();
+ sb.append(userName).append(JesiConst.USERACLS_SEPARATOR);
+ }
+ headerVal = sb.toString();
+ }
+ else
+ headerVal = JesiConst.NO_USERACLS_DETECTED;
+
+ if (logger.isDebugEnabled())
+ logger.debug("Saved header [" +headerName+"="+headerVal+"]
in parent Template.");
+
+ parentTemplate.tpl.addFragmentUserACLs(headerName, headerVal);
+ }
+
//if we used a temporary aclGroup key to instanciate the current
absolute Fragment (where we stored the
//detected contentIDs and used the detected ACLs to generate the final
aclGroup key), then
//we need to rename this Fragment in the cache to the real aclGroup
key we have just detected:
@@ -846,6 +884,7 @@
public void release()
{
+ guestUser = false;
firstExecuteOfNonAclGroupFrag = false;
fragmentKey = null;
Modified: trunk/core/src/java/org/jahia/taglibs/esi/JesiTemplateTag.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/core/src/java/org/jahia/taglibs/esi/JesiTemplateTag.java&rev=14903&repname=jahia
==============================================================================
--- trunk/core/src/java/org/jahia/taglibs/esi/JesiTemplateTag.java (original)
+++ trunk/core/src/java/org/jahia/taglibs/esi/JesiTemplateTag.java Wed Aug 16
09:34:34 2006
@@ -29,6 +29,7 @@
import java.util.Date;
import java.util.Map;
import java.util.Iterator;
+import java.util.HashMap;
import java.text.DateFormat;
import org.jahia.resourcebundle.JahiaResourceBundle;
import org.jahia.services.esi.tagstack.Template;
@@ -123,6 +124,16 @@
HttpServletResponse httpResponse = ((HttpServletResponse)
pageContext.getResponse());
ProcessingContext pc = Jahia.getThreadParamBean();
+ if (Jahia.getSettings().isEsiEnableTemplateCaching()
+ && !JesiConst.UNSET.equals(this.aclGroup)) {
+ this.aclGroupedTemplate= true;
+ if (logger.isDebugEnabled())
+ logger.debug("aclGrouped Template detected");
+
+ if (!"true".equals(this.aclGroup))
+ logger.warn("aclGroup='true' is only supported argument, not
current aclGroup="+this.aclGroup);
+ }
+
//Is request asking for a Fragment?
try
{
@@ -141,17 +152,6 @@
//tag this response with the appropriate Template header
httpResponse.setHeader(JesiConst.ESI_TEMPLATE_HEADER, "yes");
- if (Jahia.getSettings().isEsiEnableTemplateCaching()
- && !JesiConst.UNSET.equals(this.aclGroup)) {
- if (logger.isDebugEnabled()) {
- logger.debug("aclGrouped Template detected");
- }
- aclGroupedTemplate= true;
- if (!"true".equals(this.aclGroup)) {
- logger.warn("aclGroup='true' is only supported argument,
not current aclGroup="+this.aclGroup);
- }
- }
-
ServicesRegistry.getInstance().getEsiService().emptyCurrentTemplateIfInEditMode
(
Jahia.getThreadParamBean().getSiteID(),
Jahia.getThreadParamBean().getPageID());
@@ -159,7 +159,7 @@
//this should really be in doEndTag() but response is committed by
then, so have to do it here.
//(the disavantage is that we cannot cache first run of this
template)
- if(this.requestFromSurrogate_10 && aclGroupedTemplate) {
+ if(this.requestFromSurrogate_10 && this.aclGroupedTemplate) {
//if this is an aclGroup-shared template, then set the
appropriate userACL header
//which shows if there are any specific user acls on this page.
try {
@@ -179,23 +179,47 @@
Iterator usersIt = aclUsernames.keySet().iterator();
while (usersIt.hasNext()) {
String userName = (String) usersIt.next();
-
sb.append(userName).append(JesiConst.ACLGROUP_TEMPLATE_USERACLS_SEPARATOR);
+
sb.append(userName).append(JesiConst.USERACLS_SEPARATOR);
}
headerVal = sb.toString();
}
else
- headerVal =
JesiConst.ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED;
+ headerVal = JesiConst.NO_USERACLS_DETECTED;
httpResponse.setHeader(JesiConst.ACLGROUP_TEMPLATE_USERACLS_HEADER,headerVal);
if (httpResponse.isCommitted())
logger.warn("Could not add
"+JesiConst.ACLGROUP_TEMPLATE_USERACLS_HEADER+" because request was committed
already.");
- if (logger.isDebugEnabled()) {
+ if (logger.isDebugEnabled())
logger.debug("Set " +
JesiConst.ACLGROUP_TEMPLATE_USERACLS_HEADER+" header : "+headerVal);
+
+ StringBuffer aclGroupFragmentUserACLsHeaderVal = new
StringBuffer();
+ HashMap hm = tpl.getFragmentUserACLs();
+ Iterator hmIter = hm.keySet().iterator();
+ while (hmIter.hasNext()) {
+ String fragHeaderName = (String) hmIter.next();
+ String fragHeaderVal = (String)
hm.get(fragHeaderName);
+
+
aclGroupFragmentUserACLsHeaderVal.append(fragHeaderName)
+ .append(":")
+ .append(fragHeaderVal)
+ .append(";");
}
+ //TODO: if (aclGroupFragmentUserACLsHeaderVal.length()==0)
{
+
+
httpResponse.setHeader(JesiConst.ACLGROUP_FRAGMENT_USERACLS_HEADER,
+
aclGroupFragmentUserACLsHeaderVal.toString());
+
+ if (logger.isDebugEnabled())
+ logger.debug("Set header ["
+JesiConst.ACLGROUP_FRAGMENT_USERACLS_HEADER
+"="+aclGroupFragmentUserACLsHeaderVal.toString() +"]");
+
}
+ //still notify ESI server that this is an aclGrouped-shared
template
+ else
+
httpResponse.setHeader(JesiConst.ACLGROUP_TEMPLATE_NOTIFIER_HEADER,"yes");
}
+
}
//If it's not requesting a fragment and Control tag isn't present,
then set HTTP ESI headers
if(requestedFragment == JesiConst.NO_FRAGMENTS