Author: twilliams
Date: Tue Nov 10 01:40:54 2009
New Revision: 834295

URL: http://svn.apache.org/viewvc?rev=834295&view=rev
Log:
Add cache config to get rid of failsafe warning.  Finishing up FOR-1031

Added:
    forrest/trunk/main/webapp/WEB-INF/ehcache.xml
Modified:
    forrest/trunk/main/build.xml
    
forrest/trunk/main/java/org/apache/forrest/locationmap/LocationMapModule.java
    forrest/trunk/main/webapp/WEB-INF/   (props changed)
    forrest/trunk/main/webapp/WEB-INF/cocoon.xconf

Modified: forrest/trunk/main/build.xml
URL: 
http://svn.apache.org/viewvc/forrest/trunk/main/build.xml?rev=834295&r1=834294&r2=834295&view=diff
==============================================================================
--- forrest/trunk/main/build.xml (original)
+++ forrest/trunk/main/build.xml Tue Nov 10 01:40:54 2009
@@ -456,8 +456,10 @@
 <!-- Jar Cocoon classes                                                  -->
 <!-- =================================================================== -->
   <target name="jar" depends="init, compile">
-    <jar destfile="${build.dir}/xml-forrest.jar"
-      basedir="${build.classes}">
+    <jar destfile="${build.dir}/xml-forrest.jar">
+      <fileset dir="${build.classes}"/>
+      <fileset file="${forrest.core}/webapp/WEB-INF/ehcache.xml"/>
+ 
       <manifest>
         <section name="org/apache/forrest/">
           <attribute name="Comment" value="Support classes for Apache 
Forrest"/>

Modified: 
forrest/trunk/main/java/org/apache/forrest/locationmap/LocationMapModule.java
URL: 
http://svn.apache.org/viewvc/forrest/trunk/main/java/org/apache/forrest/locationmap/LocationMapModule.java?rev=834295&r1=834294&r2=834295&view=diff
==============================================================================
--- 
forrest/trunk/main/java/org/apache/forrest/locationmap/LocationMapModule.java 
(original)
+++ 
forrest/trunk/main/java/org/apache/forrest/locationmap/LocationMapModule.java 
Tue Nov 10 01:40:54 2009
@@ -18,11 +18,12 @@
 
 import java.io.IOException;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.HashMap;
 
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
 import org.apache.forrest.locationmap.lm.LocationMap;
 import org.apache.avalon.framework.activity.Disposable;
 import org.apache.avalon.framework.configuration.Configurable;
@@ -60,22 +61,19 @@
  *  &lt;/locationmap&gt;<br>
  *  <p>
  *  You can use the same actions and selectors like you can use 
- *  in any othe sitemap.
+ *  in any other sitemap.
  */
 public class LocationMapModule extends AbstractLogEnabled
     implements InputModule, Serviceable, Configurable, Disposable, ThreadSafe {
-
-    private static final Iterator ATTNAMES = Collections.EMPTY_LIST.iterator();
-
+    
     private ServiceManager m_manager;
     private SourceResolver m_resolver;
     private String m_src;
     private SourceValidity m_srcVal;
     private LocationMap m_lm;
-    private boolean m_cacheAll;
-    private int m_cacheTtl;
-    private Date m_cacheLastLoaded;
-    private Map m_locationsCache;
+    private boolean m_cacheAll; 
+    private Cache m_cache;
+    private CacheManager m_cacheManager;
 
     // ---------------------------------------------------- lifecycle
 
@@ -90,20 +88,23 @@
     public void configure(Configuration configuration) throws 
ConfigurationException {
         m_src = configuration.getChild("file").getAttribute("src");
         m_cacheAll = 
configuration.getChild("cacheable").getValueAsBoolean(true);
-        m_cacheTtl = 
configuration.getChild("cache-lifespan").getValueAsInteger();
+        Configuration oldCacheConf = configuration.getChild("cache-lifespan", 
false);
         
-        debug("LM Configured cache? " + m_cacheAll);
-        debug("LM Configured cache-lifespan: " + m_cacheTtl);
+        if(oldCacheConf != null) {
+          getLogger().warn("Locationmap cache configuration is deprecated 
through cocoon.xconf.  " 
+                        + "Please use ehcache.xml instead.");
+        }
         
-        if (m_cacheAll == true) {
-            m_locationsCache = new HashMap();
-            m_cacheLastLoaded = new Date();
+        if(m_cacheAll == true) {
+            m_cacheManager = new CacheManager();
+            m_cache = m_cacheManager.getCache("lm_Cache");
+            debug("LM caching enabled and configured.");
         }
     }
 
     public void dispose() {
         m_lm.dispose();
-        m_locationsCache = null;
+        m_cacheManager.shutdown();
     }
 
     private LocationMap getLocationMap() throws Exception {
@@ -146,7 +147,6 @@
                 m_resolver.release(source);
             }
         }
-        m_cacheLastLoaded = new Date();
         
         return m_lm;
     }
@@ -195,26 +195,14 @@
        
         try {
                if (this.m_cacheAll == true) {
-                  Date now = new Date();
-                  long cacheAge = now.getTime() - m_cacheLastLoaded.getTime();
-                  debug("LM Cache current age is: " + cacheAge + "ms");
-                 
-                  if (cacheAge > m_cacheTtl) {
-                    debug("LM Cache has expiring - contains " + 
m_locationsCache.size() + " objects.");
-                    synchronized (this) {
-                      m_locationsCache.clear(); 
-                      debug("LM Cache has expired - now contains " + 
m_locationsCache.size() + " objects.");
-                  }
-                }
-                  
-                       hasBeenCached = m_locationsCache.containsKey(name);
-                       if (hasBeenCached == true && 
m_locationsCache.get(name)!=null) {
-                               result =  m_locationsCache.get(name);
+                       hasBeenCached = m_cache.isKeyInCache(name);
+                       if (hasBeenCached == true && m_cache.get(name)!=null) {
+                               result =  m_cache.get(name).getObjectValue();
                                if (getLogger().isDebugEnabled()) {
                                        getLogger().debug("Locationmap cached 
location returned for hint: " + name + " value: " + result);
                                }
-                       }else{
-                    result = getFreshResult(name, objectModel);
+                       } else{
+                            result = getFreshResult(name, objectModel);
                   }
                }
                
@@ -254,10 +242,12 @@
       result = getLocationMap().locate(name,objectModel);
       
       if (m_cacheAll == true) {
-       m_locationsCache.put(name,result);
-       if (getLogger().isDebugEnabled()) {
+          Element elem = new Element(name, result);
+          m_cache.put(elem);
+          
+          if (getLogger().isDebugEnabled()) {
                getLogger().debug("Locationmap caching hint: " + name + " 
value: " + result);
-       }
+          }
       }
       return result;
     }

Propchange: forrest/trunk/main/webapp/WEB-INF/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Nov 10 01:40:54 2009
@@ -0,0 +1 @@
+.cocoon.xconf.swp

Modified: forrest/trunk/main/webapp/WEB-INF/cocoon.xconf
URL: 
http://svn.apache.org/viewvc/forrest/trunk/main/webapp/WEB-INF/cocoon.xconf?rev=834295&r1=834294&r2=834295&view=diff
==============================================================================
--- forrest/trunk/main/webapp/WEB-INF/cocoon.xconf (original)
+++ forrest/trunk/main/webapp/WEB-INF/cocoon.xconf Tue Nov 10 01:40:54 2009
@@ -264,7 +264,6 @@
       logger="core.modules.mapper.lm" name="lm">
       <file src="cocoon://locationmap.xml"/>
       <cacheable>true</cacheable>
-      <cache-lifespan>100000</cache-lifespan>
     </component-instance>
 
 </input-modules>

Added: forrest/trunk/main/webapp/WEB-INF/ehcache.xml
URL: 
http://svn.apache.org/viewvc/forrest/trunk/main/webapp/WEB-INF/ehcache.xml?rev=834295&view=auto
==============================================================================
--- forrest/trunk/main/webapp/WEB-INF/ehcache.xml (added)
+++ forrest/trunk/main/webapp/WEB-INF/ehcache.xml Tue Nov 10 01:40:54 2009
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<ehcache>
+
+    <!-- Sets the path to the directory where cache .data files are created.
+
+         If the path is a Java System Property it is replaced by
+         its value in the running VM.
+
+         The following properties are translated:
+         user.home - User's home directory
+         user.dir - User's current working directory
+         java.io.tmpdir - Default temp file path -->
+    <diskStore path="${diskstorepath}"/>
+
+    <!--Default Cache configuration. These will be applied to caches 
programmatically created through
+        the CacheManager.
+
+        The following attributes are required:
+
+        maxElementsInMemory            - Sets the maximum number of objects 
that will be created in memory
+        eternal                        - Sets whether elements are eternal. If 
eternal,  timeouts are ignored and the
+                                         element is never expired.
+        overflowToDisk                 - Sets whether elements can overflow to 
disk when the in-memory cache
+                                         has reached the maxInMemory limit.
+
+        The following attributes are optional:
+        timeToIdleSeconds              - Sets the time to idle for an element 
before it expires.
+                                         i.e. The maximum amount of time 
between accesses before an element expires
+                                         Is only used if the element is not 
eternal.
+                                         Optional attribute. A value of 0 
means that an Element can idle for infinity.
+                                         The default value is 0.
+        timeToLiveSeconds              - Sets the time to live for an element 
before it expires.
+                                         i.e. The maximum time between 
creation time and when an element expires.
+                                         Is only used if the element is not 
eternal.
+                                         Optional attribute. A value of 0 
means that and Element can live for infinity.
+                                         The default value is 0.
+        diskPersistent                 - Whether the disk store persists 
between restarts of the Virtual Machine.
+                                         The default value is false.
+        diskExpiryThreadIntervalSeconds- The number of seconds between runs of 
the disk expiry thread. The default value
+                                         is 120 seconds.
+        -->
+
+    <defaultCache
+        maxElementsInMemory="10000"
+        eternal="true"
+        timeToIdleSeconds="0"
+        timeToLiveSeconds="0"
+        overflowToDisk="true"
+        diskPersistent="true"
+        diskExpiryThreadIntervalSeconds="120"
+        />
+   
+   <cache name="lm_Cache"
+       maxElementsInMemory="10000"
+       eternal="false"
+       overflowToDisk="false"
+       timeToIdleSeconds="0"
+       timeToLiveSeconds="0"
+       diskPersistent="false"
+       diskExpiryThreadIntervalSeconds="120"
+       memoryStoreEvictionPolicy="LFU"
+       />
+</ehcache>