Author: mcardle
Date: Mon Aug 14 08:28:36 2006
New Revision: 307

URL: https://svndev.jahia.net/websvn/listing.php?sc=1&rev=307&repname=esi_server
Log:
* (Continued) support for aclGroup template sharing and other things

Modified:
    trunk/WEB-INF/config/data.xml
    trunk/src/net/sf/j2ep/ProxyFilter.java
    trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
    trunk/src/org/jahia/esi/EsiConst.java
    trunk/src/org/jahia/esi/GetThread.java
    trunk/src/org/jahia/esi/Utils.java
    trunk/src/org/jahia/esi/cache/FragmentCache.java
    trunk/src/org/jahia/esi/cache/RequestInfo.java
    trunk/src/org/jahia/esi/cache/UrlCacheObject.java
    trunk/src/org/jahia/esi/settings/SettingsBean.java

Modified: trunk/WEB-INF/config/data.xml
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/WEB-INF/config/data.xml&rev=307&repname=esi_server
==============================================================================
--- trunk/WEB-INF/config/data.xml (original)
+++ trunk/WEB-INF/config/data.xml Mon Aug 14 08:28:36 2006
@@ -233,14 +233,21 @@
         <!-- *************** BEGIN : For Advanced Users only **************  
-->
         <!-- **************************************************************  
-->
         <!-- enable template caching -->
-        <enableTemplateCaching>false</enableTemplateCaching>
+        <enableTemplateCaching>true</enableTemplateCaching>
+
+        <!-- During heavy loads, the ESI server will return a default page 
with a Meta Refresh Tag
+          in it so that the browser will try again the request at a later time 
- hopefully when there is less load.
+          This frees up resources on the ESI server to de
+          This is the amount of time, in seconds, until the browser should 
reload the current page
+          -->
+        <metaRefreshWaitTimeInSecs>15</metaRefreshWaitTimeInSecs>
 
         <!-- name of esi cookie (should be identical to esiCookieCookieName in 
jahia.properties) -->
         <userCookieName>jesid</userCookieName>
         <!-- defines the maximum number of simultaenous HTTP connections to 
any given host -->
-        <maxHttpConnectionsPerHost>30</maxHttpConnectionsPerHost>
+        <maxHttpConnectionsPerHost>60</maxHttpConnectionsPerHost>
         <!-- defines the total maximum number of simultaenous HTTP connections 
across all hosts -->
-        <maxTotalHttpConnections>50</maxTotalHttpConnections>
+        <maxTotalHttpConnections>120</maxTotalHttpConnections>
         <!-- force processing of invalidation request before responding to 
remote server -->
         
<processInvalidationRequestBeforeResponse>true</processInvalidationRequestBeforeResponse>
 

Modified: trunk/src/net/sf/j2ep/ProxyFilter.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/net/sf/j2ep/ProxyFilter.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/ProxyFilter.java (original)
+++ trunk/src/net/sf/j2ep/ProxyFilter.java Mon Aug 14 08:28:36 2006
@@ -114,6 +114,16 @@
 
     private static Date oldestAllowedUserSession = new Date();
 
+    private static byte[] metaRefreshPage = null;
+
+    public static byte[] getMetaRefreshPage() {
+        return metaRefreshPage;
+    }
+
+    public static void setMetaRefreshPage(byte[] metaRefreshPage) {
+        ProxyFilter.metaRefreshPage = metaRefreshPage;
+    }
+
     public static Date getOldestAllowedUserSession() {
         return oldestAllowedUserSession;
     }
@@ -461,12 +471,8 @@
         multiThreadedHttpConnectionManager = new 
MultiThreadedHttpConnectionManager();
         
multiThreadedHttpConnectionManager.getParams().setDefaultMaxConnectionsPerHost(settings.getMaxHttpConnectionsPerHost());
         
multiThreadedHttpConnectionManager.getParams().setMaxTotalConnections(settings.getMaxTotalHttpConnections());
-        //TODO: remove this!
-        threadAvailable = new 
Semaphore(settings.getMaxHttpConnectionsPerHost()-10, true); //leaves 10 
connections as a safety margin
-        executor = new ThreadPoolExecutor(7, 
settings.getMaxHttpConnectionsPerHost()+10,
-                                      3L, TimeUnit.MINUTES,
-                                      new LinkedBlockingQueue());
-                   
//Executors.newFixedThreadPool(settings.getMaxHttpConnectionsPerHost()-10);
+        threadAvailable = new 
Semaphore(settings.getMaxHttpConnectionsPerHost()/2, true);
+        executor = Executors.newCachedThreadPool(); //unlimited number of 
threads with 60 second time-to-live
         httpClient = new HttpClient(multiThreadedHttpConnectionManager);
 
         
httpClient.getParams().setBooleanParameter(HttpClientParams.USE_EXPECT_CONTINUE,
 false);
@@ -567,6 +573,9 @@
                 e.printStackTrace();  //To change body of catch statement use 
File | Settings | File Templates.
             }
         }
+
+        //initialize Meta Refresh Page
+        setMetaRefreshPage(Utils.generateMetaRefreshPage().getBytes());
     }
 
     /**
@@ -616,6 +625,6 @@
             }
         }
 
-        log = null;
+        //log = null;
     }
 }
\ No newline at end of file

Modified: trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java (original)
+++ trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java Mon Aug 14 
08:28:36 2006
@@ -250,7 +250,7 @@
             //fragmentCache.add(cacheKey, this.method, cacheByteContent);
             fragmentCache.add(cacheKey, this.methodToServer, cacheByteContent,
                     this.getClientRequestURL().toString(),
-                    null, null, null ,null, false, null);  
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+                    null, null, null ,null, false, null, null);  
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         }
     }
 
@@ -519,8 +519,15 @@
         String backupCacheKeyForThrottling = null;
 
         try {
+            //deal with the case when we are overloaded with request, just 
return a refresh-later page back to client browser
+            if (ProxyFilter.getThreadAvailable().availablePermits() == 0) {
+                log.info("Meta Refresh Page returned for 
"+clientRequest.getMethod()+" - "+clientRequestUrl);
+                clientResponse.setStatus(HttpStatus.SC_SERVICE_UNAVAILABLE);
+                if (!methodToServer.getName().equals("HEAD")) //since there is 
no content for HEAD requests
+                    sendStreamToClientFromCache (clientResponse , 
ProxyFilter.getMetaRefreshPage());
+            }
             //Deal with POSTs and such like
-            if (checkforMatchingPassThroughRules(server, clientRequestUrl)) {
+            else if (checkforMatchingPassThroughRules(server, 
clientRequestUrl)) {
 
                 if (SettingsBean.getInstance().isRequestThrottle()
                     && SettingsBean.getInstance().isRequestThrottlePOSTs()) {
@@ -569,7 +576,7 @@
                     userAclGroupKey = userInfo[1];
                     requestInfoKey = 
CacheAdministrator.getInstance().generateRequestInfoKey(server, clientRequest, 
this.getClientRequestURL()) ;
                     requestInfo = fragmentCache.getRequestInfo(requestInfoKey);
-                    if (requestInfo!=null)
+                    if (requestInfo!=null && userName!=null)
                          userAclDeclaredForCurrentRequest = 
requestInfo.containsUsername(userName);
                 }
 
@@ -1014,7 +1021,7 @@
                                    HttpSession userSession = 
clientRequest.getSession(false);
                                    if (userSession!=null)
                                             userSession.invalidate();
-                                    if (log.isDebugEnabled()) 
log.debug("invalidated user session due to cookie set ["+setCookieVal+"]. 
Session username was : "+userSession.getAttribute("userName"));
+                                    if (log.isDebugEnabled()) 
log.debug("invalidated user session due to cookie set ["+setCookieVal+"]. 
Session username was : "+userSession.getAttribute(EsiConst.USERNAME));
                                 }
                             }
                         }
@@ -1376,11 +1383,11 @@
             HttpSession userSession = clientRequest.getSession(true);
 
             boolean invalidatedSession = false;
-            Date userTimeAdded = (Date)userSession.getAttribute("timeAdded");
+            Date userTimeAdded = 
(Date)userSession.getAttribute(EsiConst.TIME_ADDED);
             if (userTimeAdded!=null && 
userTimeAdded.before(ProxyFilter.getOldestAllowedUserSession()))
                 invalidatedSession = true;
 
-            if (userSession.isNew() || 
userSession.getAttribute("userName")==null || invalidatedSession) {
+            if (userSession.isNew() || 
userSession.getAttribute(EsiConst.USERNAME)==null || invalidatedSession) {
 
                 org.apache.commons.httpclient.URI requestURI = 
methodToServer.getURI();
                 //TODO: add authentication
@@ -1393,11 +1400,26 @@
                 String servletPath = path.substring(0,slashIndex);
 
                 
requestURI.setPath(servletPath+"/servlet/EsiTemplateCachingServlet");
+                log.info("EsiTemplateCachingServlet :"+requestURI);
+
                 GetMethod userGroupMembershipFetcherMethod = new 
GetMethod(requestURI.toString());
+
+                //copy client's request headers to this method (need it for 
Jahia session)
+                Header[] hds = methodToServer.getRequestHeaders();
+                for (int i = 0; i < hds.length; i++) {
+                    Header hd = hds[i];
+                    userGroupMembershipFetcherMethod.setRequestHeader(hd);
+                }
+
                 try {
                     int statusCode = 
ProxyFilter.getHttpClient().executeMethod(userGroupMembershipFetcherMethod);
-                    if (statusCode != HttpStatus.SC_OK) {
+                    if (statusCode == HttpStatus.SC_NOT_FOUND) {
+                        if (log.isDebugEnabled()) log.debug(" User does not 
yet have a session on Jahia");
+                        return new String[] {null, null};
+                    }
+                    else if (statusCode != HttpStatus.SC_OK) {
                         log.error("userGroupMembershipFetcherMethod failed : " 
+ userGroupMembershipFetcherMethod.getStatusLine());
+                        return new String[] {null, null};
                     }
                     else {
                         // Read the response body.
@@ -1405,28 +1427,28 @@
 
                         if (responseBody!=null) {
                             String responseStr = new String(responseBody, 
"UTF-8");
-                            String[] tokens = responseStr.split("______");
+                            String[] tokens = 
responseStr.split(EsiConst.ACLGROUP_TEMPLATE_REPONSE_SEPARATOR);
                             userName = tokens[0];
-                            userSession.setAttribute("userName",userName);
+                            
userSession.setAttribute(EsiConst.USERNAME,userName);
                             userAclGroupKey = tokens[1];
-                            
userSession.setAttribute("userAclGroupKey",userAclGroupKey);
-                            userSession.setAttribute("timeAdded",new Date());
+                            
userSession.setAttribute(EsiConst.USER_ACL_GROUP_KEY,userAclGroupKey);
+                            userSession.setAttribute(EsiConst.TIME_ADDED,new 
Date());
                             if (log.isDebugEnabled()) log.debug("Set session 
username["+userName+"] and userAclGroupKey["+userAclGroupKey+"]"  );
                         }
                     }
                     //TODO: MORE error handling
                 } catch (HttpException e) {
-                    log.error("Fatal protocol violation: " + e.getMessage());
+                    log.error("EsiTemplateCachingServlet : Fatal protocol 
violation: " + e.getMessage());
                 } catch (IOException e) {
-                    log.error("Fatal transport error: " + e.getMessage());
+                    log.error("EsiTemplateCachingServlet : Fatal transport 
error: " + e.getMessage());
                 } finally {
                     // Release the connection.
                     userGroupMembershipFetcherMethod.releaseConnection();
                 }
             }
             else {
-                userName = (String)userSession.getAttribute("userName");
-                userAclGroupKey = 
(String)userSession.getAttribute("userAclGroupKey");
+                userName = (String)userSession.getAttribute(EsiConst.USERNAME);
+                userAclGroupKey = 
(String)userSession.getAttribute(EsiConst.USER_ACL_GROUP_KEY);
                 if (userName==null || userAclGroupKey==null) {
                     log.error("Null values for userName["+userName+"] and/or 
userAclGroupKey["+userAclGroupKey+"] for request 
"+methodToServer.getURI().toString());
                 }

Modified: trunk/src/org/jahia/esi/EsiConst.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/EsiConst.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/EsiConst.java (original)
+++ trunk/src/org/jahia/esi/EsiConst.java Mon Aug 14 08:28:36 2006
@@ -106,6 +106,14 @@
     public static String ACLGROUP_TEMPLATE_USER_MARKER = 
"esiAclGroupedUserMarker";
     public static String ACLGROUP_TEMPLATE_USERACLS_HEADER = 
"JahiaEsi_UserAcls";
 
+    public static String ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED = "NONE";
+    public static String ACLGROUP_TEMPLATE_USERACLS_UNSET = "UNSET";
+    public static String ACLGROUP_TEMPLATE_REPONSE_SEPARATOR = "______";
+
+    public static String USERNAME = "UserName";
+    public static String USER_ACL_GROUP_KEY = "userAclGroupKey";
+    public static String TIME_ADDED = "timeAdded";
+
     public static HashMap RESERVED_PARAM_NAMES;
     static
     {

Modified: trunk/src/org/jahia/esi/GetThread.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/GetThread.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/GetThread.java (original)
+++ trunk/src/org/jahia/esi/GetThread.java Mon Aug 14 08:28:36 2006
@@ -366,6 +366,9 @@
 
                     if (log.isDebugEnabled()) log.debug(id + "- expiration 
time extracted from expiry Headers. Expires in ["+(expiryDate - 
now)/1000+"secs]");
 
+                    requestInfo = new RequestInfo(false, 
EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET);
+                    fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
+
                     fragmentCache.add(urlKey, this.methodToServer, bytes,
                             this.clientRequestUrl,
                             null, null, null ,null,
@@ -375,7 +378,8 @@
                             true,
                             false,   //can put inUse=false since we've sent it 
already and won't use it again until another request
                             !fetchingSkeleton,
-                            null);
+                            null,
+                            requestInfoKey);
                 }
                 //no expiry info in response, so set cache entry to default 
expirations for the moment
                 else {
@@ -387,7 +391,8 @@
                             true,
                             false, //can put inUse=false since we've sent it 
already and won't use it again until another request
                            !fetchingSkeleton,
-                            null);
+                            null,
+                            requestInfoKey);
 
                 }
             }
@@ -448,30 +453,40 @@
 
             if (fetchingSkeleton && 
SettingsBean.getInstance().isEnableTemplateCaching()) {
                 Header headerAclUserAcls = 
methodToServer.getResponseHeader(EsiConst.ACLGROUP_TEMPLATE_USERACLS_HEADER);
-                if (requestInfo==null) {
-                    if (headerAclUserAcls !=null) {
-                        requestInfo = new RequestInfo(true, 
headerAclUserAcls.getValue() );
-                        fragmentCache.addRequestInfo(requestInfoKey, 
requestInfo);
-                    }
-                    else {
-                        requestInfo = new RequestInfo(false, null );
-                        fragmentCache.addRequestInfo(requestInfoKey, 
requestInfo);
-                    }
-                    if (log.isDebugEnabled()) log.debug(id + " added 
RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request urlKey 
["+urlToServer+"] ");
+
+                //Compares previous to new RequestInfo //TODO: eventually 
remove
+                if (log.isDebugEnabled() && requestInfo!=null) {
+                    String hvalue = (headerAclUserAcls 
!=null)?headerAclUserAcls.getValue():null;
+                    if (hvalue==null) {
+                        if (requestInfo.isTemplate())
+                            log.debug("Stored as template when return value 
isn't template. Stored requestInfo["+requestInfo+"] " +
+                                    " does not match 
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
+                    }
+                    else if ( hvalue!=null && 
!requestInfo.getAclUsernames().equals(hvalue)) {
+                        
log.debug("requestInfo.getAclUsernames()["+requestInfo.getAclUsernames()+"] " +
+                                " does not match 
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
+                    }
+                }
+                //(re)generate the RequestInfo it from the response
+                //this is a Jahia page
+                if (headerAclUserAcls !=null) {
+                    requestInfo = new RequestInfo(true, 
headerAclUserAcls.getValue() );
+                    fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
                 }
-                //sanity check
+                //this is not a Jahia page
                 else {
-                        String hvalue = (headerAclUserAcls 
!=null)?headerAclUserAcls.getValue():null;
-                        if ( (headerAclUserAcls==null && hvalue!=null)
-                             ||   
!requestInfo.getAclUsernames().equals(hvalue)) {
-                            
log.warn("requestInfo.getAclUsernames()["+requestInfo.getAclUsernames()+"] " +
-                                     " does not match 
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
-                        }
+                    requestInfo = new RequestInfo(false, 
EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET);
+                    fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
                 }
+                if (log.isDebugEnabled()) log.debug(id + " added 
RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request urlKey 
["+urlToServer+"] ");
+                //sanity check : if RequestObject exists for this object, it 
should be the same as the one returned in response
 
-                userAclDeclaredForCurrentRequest = 
requestInfo.containsUsername(userName);
-                if (log.isDebugEnabled()) log.debug(id + "  "+userName+" has 
specific permission on RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] 
during request urlKey ["+urlToServer+"] ");
 
+                if (requestInfo.isTemplate()) {
+                    userAclDeclaredForCurrentRequest = 
requestInfo.containsUsername(userName);
+                    if (log.isDebugEnabled() && 
userAclDeclaredForCurrentRequest)
+                        log.debug(id + "  "+userName+" has specific permission 
on RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request 
urlKey ["+urlToServer+"] ");
+                }
                 //is this an aclGroup-shared templates?
                 if (!userAclDeclaredForCurrentRequest //user-based caching 
cannot user userGroups
                         && requestInfo.isTemplate() //must be a template
@@ -755,6 +770,7 @@
                          ||      //AggregatePageOnTheFly=true but entry is for 
user 'guest' (i.e. no cookie marker in UrlKey) -since we want to keep these 
whole in cache-
                                 
(SettingsBean.getInstance().isAggregateLoggedUserPagesOnTheFly()
                                  && 
Utils.getUserCookieValue(clientRequest)==null)
+                         ||      aclGroupSharedTemplate  //no need to do this 
if it's an aclGrouped shared template //TODO: review this is we give precedence 
to OnTheFly instead
                         )                        ) {
                     //TODO: sanity check, this should not be necessary
                     if (tagCacheObject==null) {
@@ -869,7 +885,10 @@
                             valid,
                             true, //currently inUse
                             !fetchingSkeleton,
-                            userName);
+                            userName,
+                            Utils.replaceUserNameWithMarker(
+                                    
Utils.removeCacheParamInUrl(requestInfoKey, isCacheOffOnce)
+                                    , userName, !aclGroupSharedTemplate ));
                 }
                 //for "/cache/bypass" we just don't store it (by setting 
expiration to 0)
                 if (log.isDebugEnabled()) log.debug("Setting expiration to 0 
for "+urlKey);
@@ -896,7 +915,8 @@
                     valid,
                     true,
                     !fetchingSkeleton,
-                    userName);
+                    userName,
+                    requestInfoKey);
 
         } catch (Exception e) {
 

Modified: trunk/src/org/jahia/esi/Utils.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/Utils.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/Utils.java (original)
+++ trunk/src/org/jahia/esi/Utils.java Mon Aug 14 08:28:36 2006
@@ -75,7 +75,7 @@
 
     private static final transient Log log = LogFactory.getLog(Utils.class);
 
-    public static String jahiaEsiServerBuildNumber = "0.2";
+    public static String jahiaEsiServerBuildNumber = "0.3";
 
     public static String stackTraceToString(Exception ex) {
         // Append stack trace if not null
@@ -606,6 +606,35 @@
         return page.toString();
     }
 
+    public static String generateMetaRefreshPage()
+    {
+        StringBuffer page         = new StringBuffer();
+        page.append("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n");
+        page.append("<html> <head>\n");
+        page.append("<title>Server Busy - Please Wait</title>\n");
+        page.append("<META http-equiv=\"refresh\" 
content=\""+SettingsBean.getInstance().getMetaRefreshWaitTimeInSecs()+"\">\n");
+        page.append("</head>\n" );
+        page.append("\n" );
+        page.append("<body bgcolor=\"white\">\n" );
+        //page.append("<img 
src='"+localAddress+"/esierror/img/esi_logo_mini.png' /><br>");
+        //page.append ("<pre> \n" );
+        //page.append (getJahiaWebCacheLogo());
+        //page.append ("</pre>\n");
+        page.append("<fieldset style='border-width: 7px; border-color: red; 
border: inset'> <font color=\"red\">\n" );
+        page.append("<h2>The server is busy.</h2>\n" );
+        page.append("</font>\n" );
+        page.append( "Please Wait. Maximum 
").append(SettingsBean.getInstance().getMaxHttpConnectionsPerHost()/2).append(" 
simultaneous connections reached.")
+            .append(" Automatic refresh in 
").append(SettingsBean.getInstance().getMetaRefreshWaitTimeInSecs()).append(" 
seconds.\n");
+        page.append("<p><center> <form><input type=button value=\"Force Retry 
Now\" onClick=\"window.location.reload( true )\"></form></center><p>");
+        page.append("\n" );
+        page.append("<hr>\n" );
+        page.append("<p><h3>Jahia ESI Cache Server - version 
"+jahiaEsiServerBuildNumber+"</h3></p>\n" );
+        page.append("</fieldset>\n" );
+        page.append("</body> </html>");
+        return page.toString();
+    }
+
+
     public static String getJahiaWebCacheLogo() {
         StringBuffer logo         = new StringBuffer();
         logo.append ("\n");

Modified: trunk/src/org/jahia/esi/cache/FragmentCache.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/FragmentCache.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/FragmentCache.java (original)
+++ trunk/src/org/jahia/esi/cache/FragmentCache.java Mon Aug 14 08:28:36 2006
@@ -243,7 +243,7 @@
     private static long defaultUnfetchedExpirationDelayInSecs = 86400; //24 
hours
 
     public void addUnfectched(String urlKey, HttpMethod method, String 
errorMsg,
-                              String Url, boolean inUse, boolean isFragment    
) {
+                              String Url, boolean inUse, boolean isFragment ) {
 
         if (SettingsBean.getInstance().isCacheJanitorEnable()) {
             synchronized (urlKeyStore) { urlKeyStore.put(urlKey, urlKey); }
@@ -278,7 +278,8 @@
                 defaultUnfetchedExpirationDelayInSecs,
                 false,
                 inUse,
-                isFragment
+                isFragment,
+                null
         );
 
         //all valid objects in cache have an expiration delay, expect for 
unfetched error fragments.
@@ -431,7 +432,8 @@
                     boolean valid,
                     boolean inUse,
                     boolean isFragment,
-                    String userIdentifier
+                    String userIdentifier,
+                    String requestInfoKey
                                  ) {
           add(urlKey, method, byteContent,
                 Url,
@@ -445,7 +447,8 @@
                 valid,
                 inUse,
                 isFragment,
-                userIdentifier );
+                userIdentifier,
+                requestInfoKey);
     }
 
     public void add(String urlKey, HttpMethod method, byte[] byteContent,
@@ -455,7 +458,8 @@
                     int[] referencedObjsStartIndex,
                     int[] referencedObjsEndIndex,
                     boolean isFragment,
-                    String userIdentifier
+                    String userIdentifier,
+                    String requestInfoKey
                                  ) {
         add(urlKey, method, byteContent,
                 Url,
@@ -469,7 +473,8 @@
                 true,
                 false,
                 isFragment,
-                userIdentifier );
+                userIdentifier,
+                requestInfoKey );
     }
 
     public void add(String urlKey, HttpMethod method, byte[] byteContent,
@@ -484,7 +489,8 @@
                     boolean valid,
                     boolean inUse,
                     boolean isFragment,
-                    String userIdentifier //this is non-null only when we are 
dealing with a aclGrouped shared template
+                    String userIdentifier, //this is non-null only when we are 
dealing with a aclGrouped shared template
+                    String requestInfoKey
     ) {
 
         if (log.isDebugEnabled()) log.debug("Adding ["+urlKey+"] with 
expirationDateInSecs:"+new Date(expirationDateInSecs*1000));
@@ -515,6 +521,7 @@
             previousUrlObj.setInUse(inUse);
             previousUrlObj.setFragment(isFragment);
             previousUrlObj.generatePidFidRefKey(); //update its key
+            previousUrlObj.setRequestInfoKey(requestInfoKey);
             updateReferenceCount(refObjs,userIdentifier);
             previousUrlObj.incUpdateCount();
             urlEntry = updateExpirationDelay(urlEntry, expirationInSecs);
@@ -537,7 +544,8 @@
                     maxRemovalDelayInSecs,
                     valid,
                     inUse,
-                    isFragment);
+                    isFragment,
+                    requestInfoKey);
 
             if (!isFragment) {
                 //only need to add templates to keyStore (since associated 
fragments will be deleted if template deleted)
@@ -786,6 +794,8 @@
             String contentHashToRemove = urlObj.getContentHash();
 
             removeContentCacheObject(contentObj, contentHashToRemove, urlKey);
+            //in any case, remove its requestInfo object
+            removeRequestInfo(urlObj.getRequestInfoKey());
         }
         else
             log.info("---- could not remove already deleted content 
["+urlObj.getContentHash()+"] for urlKey:"+urlKey );
@@ -922,24 +932,35 @@
     }
 
     public RequestInfo getRequestInfo(String requestUrl) { //TODO: make sure 
requestUrl string is cluster-compatible encoded
-        CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
-        if (urlEntry!=null) {
-            if (! (urlEntry.getObject() instanceof RequestInfo) ) {
-                log.error("ERROR " + requestUrl);
+        if (requestUrl!=null) {
+            CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
+            if (urlEntry!=null) {
+                RequestInfo requestInfo = (RequestInfo) urlEntry.getObject();
+                return requestInfo;
+            }
+            else {
+                if (log.isDebugEnabled()) log.debug("Couldn't get since wasn't 
found in the cache:  RequestInfo with key ["+requestUrl +"] ");
             }
-            RequestInfo requestInfo = (RequestInfo) urlEntry.getObject();
-            return requestInfo;
-        }
-        else {
-            if (log.isDebugEnabled()) log.debug("wasn't found in the cache:  
UrlCacheObject with urlKey ["+requestUrl +"] ");
-            return null;
         }
+        return null;
     }
 
     public void addRequestInfo(String requestInfoKey, RequestInfo requestInfo) 
{
         CacheEntry newEntry = new CacheEntry();
         newEntry.setObject(requestInfo);
-        requestInfoStore.put(requestInfoKey, newEntry);
+        requestInfoStore.putCacheEntry(requestInfoKey, newEntry, true);
+    }
+
+    public void removeRequestInfo(String requestUrl) {
+        if (requestUrl!=null) {
+        //CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
+        //if (urlEntry!=null) {
+            requestInfoStore.remove(requestUrl);
+        //}
+        //else {
+        //    if (log.isDebugEnabled()) log.debug("Couldn't remove since 
wasn't found in the cache:  RequestInfo with key ["+requestUrl +"] ");
+        //}
+        }
     }
 
     public PidFidRefCacheHelper getPidFidRefCacheHelper() {

Modified: trunk/src/org/jahia/esi/cache/RequestInfo.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/RequestInfo.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/RequestInfo.java (original)
+++ trunk/src/org/jahia/esi/cache/RequestInfo.java Mon Aug 14 08:28:36 2006
@@ -75,8 +75,12 @@
      * @return
      */
     public boolean containsUsername (String username)  {
-        if (username==null)
-            return false;
+        if (!template
+                || username==null
+                || 
aclUsernames.equals(EsiConst.ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED)
+                || 
aclUsernames.equals(EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET)  )
+           return false;
+
         return this.aclUsernames.indexOf(username+ 
EsiConst.ACLGROUP_TEMPLATE_USERACLS_SEPARATOR)!=-1;
     }
 

Modified: trunk/src/org/jahia/esi/cache/UrlCacheObject.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/UrlCacheObject.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/UrlCacheObject.java (original)
+++ trunk/src/org/jahia/esi/cache/UrlCacheObject.java Mon Aug 14 08:28:36 2006
@@ -93,6 +93,7 @@
     protected String urlKey; //a copy of the hashkey where this object is 
stored
     protected boolean fragment=false; //true if current object is a fragment 
of a template, false if it's a template, a binary object or something else
     protected String pidFidRefKey; //the key where this object will be 
referenced in PidFidRefCache cross-reference cache (used only for Jahia 
page/fragment objects only)
+    String requestInfoKey; //pointer to RequestInfo object related to this 
object
 
     public UrlCacheObject(String urlKey,
                           String contentHash,
@@ -106,7 +107,8 @@
                           long maxRemovalDelayInSecs,
                           boolean valid,
                           boolean inUse,
-                          boolean fragment
+                          boolean fragment,
+                          String requestInfoKey
     ) {
         this.urlKey = urlKey;
         this.referencedObjsUrls = referencedObjsUrls;
@@ -120,6 +122,7 @@
         this.expirationDateInSecs = expirationDateInSecs;
         this.maxRemovalDelayInSecs = maxRemovalDelayInSecs;
         this.valid = valid;
+        this.requestInfoKey = requestInfoKey;
         setInUse(inUse);
         initCookies();
         copyHeaders();
@@ -140,6 +143,14 @@
         this.fragment = fragment;
     }
 
+    public String getRequestInfoKey() {
+        return requestInfoKey;
+    }
+
+    public void setRequestInfoKey(String requestInfoKey) {
+        this.requestInfoKey = requestInfoKey;
+    }
+
     public String getPidFidRefKey() {
         return pidFidRefKey;
     }
@@ -511,6 +522,7 @@
                 ", referenceCount=" + referenceCount +
                 ", urlKey=" + urlKey +
                 ", pidFidRefKey=" + pidFidRefKey+
+                ", requestInfoKey='" + requestInfoKey+ "'" +
                 "}";
     }
 }

Modified: trunk/src/org/jahia/esi/settings/SettingsBean.java
URL: 
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/settings/SettingsBean.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/settings/SettingsBean.java (original)
+++ trunk/src/org/jahia/esi/settings/SettingsBean.java Mon Aug 14 08:28:36 2006
@@ -133,6 +133,9 @@
     private int requestThrottleMaxWait = 4000; //in ms
 
     private boolean enableTemplateCaching = false;
+
+    private int metaRefreshWaitTimeInSecs = 15; //in secs
+
     /**
      * The default non-caching rules, which will be traversed to find a 
matching non-caching rule.
      */
@@ -222,6 +225,14 @@
     //TODO: add these to data.xml -----------------------------------------
     //TODO:  *****************************  END - Dummy Functions 
*********************************
 
+    public int getMetaRefreshWaitTimeInSecs() {
+        return metaRefreshWaitTimeInSecs;
+    }
+
+    public void setMetaRefreshWaitTimeInSecs(int metaRefreshWaitTimeInSecs) {
+        this.metaRefreshWaitTimeInSecs = metaRefreshWaitTimeInSecs;
+    }
+
     public boolean isEnableTemplateCaching() {
         return enableTemplateCaching;
     }
@@ -695,6 +706,7 @@
                 ", connectionTimeout=" + connectionTimeout +  "\n" +
                 ", maxHttpConnectionsPerHost='" + maxHttpConnectionsPerHost + 
"'" +  "\n" +
                 ", maxTotalHttpConnections='" + maxTotalHttpConnections + "'" 
+  "\n" +
+                ", metaRefreshWaitTimeInSecs ='" + metaRefreshWaitTimeInSecs+ 
"'" + "\n" +
                 ", maxFetchThreadWait='" + maxFetchThreadWait + "' ms" +  "\n" 
+
                 ", processInvalidationRequestBeforeResponse=" + 
processInvalidationRequestBeforeResponse +  "\n" +
                 "\n" +

Reply via email to