svn commit: r1610061 - in /portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE: components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/ components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/ compone...

[email protected]
Newsgroups gmane.comp.jakarta.jetspeed.devel
Message-ID <[email protected]>
Author: taylor
Date: Sat Jul 12 21:37:17 2014
New Revision: 1610061

URL: http://svn.apache.org/r1610061
Log:
JS2-1287: backporting trunk to 2.2.3 release

Added:
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingInfo.java
Modified:
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletTrackingManagerImpl.java
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/test/assembly/cache-test.xml
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingManager.java
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/aggregation.xml
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/cache.xml
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml
    portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java Sat Jul 12 21:37:17 2014
@@ -16,12 +16,11 @@
  */
 package org.apache.jetspeed.cache.impl;
 
-import java.io.Serializable;
-
 import net.sf.ehcache.Element;
-
 import org.apache.jetspeed.cache.CacheElement;
 
+import java.io.Serializable;
+
 public class EhCacheElementImpl implements CacheElement
 {
 	Element element;

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletTrackingManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletTrackingManagerImpl.java?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletTrackingManagerImpl.java (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletTrackingManagerImpl.java Sat Jul 12 21:37:17 2014
@@ -16,21 +16,23 @@
  */
 package org.apache.jetspeed.aggregator.impl;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.jetspeed.PortalReservedParameters;
+import org.apache.jetspeed.aggregator.PortletTrackingInfo;
 import org.apache.jetspeed.aggregator.PortletTrackingManager;
 import org.apache.jetspeed.aggregator.RenderTrackable;
+import org.apache.jetspeed.cache.CacheElement;
+import org.apache.jetspeed.cache.JetspeedCache;
 import org.apache.jetspeed.container.PortletWindow;
 import org.apache.jetspeed.om.portlet.LocalizedField;
 import org.apache.jetspeed.om.portlet.PortletDefinition;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Tracks out of service status for portlets
  *  
@@ -39,7 +41,16 @@ import org.apache.jetspeed.om.portlet.Po
  */
 public class PortletTrackingManagerImpl implements PortletTrackingManager
 {
-    protected Map outOfService = Collections.synchronizedMap(new HashMap());
+    /**
+     * The out of service cache. This cache is keyed off of full portlet name <tt>portletApp::portletName</tt> which
+     * holds as its element a list of windows id strings
+     */
+    protected final JetspeedCache trackingCache;
+
+    /**
+     * Holds failed window ids and their failure counts
+     */
+    protected Map<String,Integer> trackingCounts = new HashMap<String,Integer>();
 
     /**
      * when rendering a portlet, the default timeout period in milliseconds
@@ -54,10 +65,11 @@ public class PortletTrackingManagerImpl 
      */
     protected int outOfServiceLimit;
     
-    public PortletTrackingManagerImpl(long defaultPortletTimeout, int outOfServiceLimit)
+    public PortletTrackingManagerImpl(long defaultPortletTimeout, int outOfServiceLimit, JetspeedCache trackingCache)
     {
         this.defaultPortletTimeout = defaultPortletTimeout;
         this.outOfServiceLimit = outOfServiceLimit;
+        this.trackingCache = trackingCache;
     }
     
     public long getDefaultPortletTimeout()
@@ -67,6 +79,10 @@ public class PortletTrackingManagerImpl 
 
     public boolean exceededTimeout(long renderTime, PortletWindow window)
     {
+        if (!isEnabled()) {
+            return false;
+        }
+
         RenderTrackable trackInfo = (RenderTrackable)window;
         long defaultTimeout = this.getDefaultPortletTimeout();
         if (trackInfo.getExpiration() > 0)
@@ -82,12 +98,29 @@ public class PortletTrackingManagerImpl 
     
     public boolean isOutOfService(PortletWindow window)
     {
+        if (!isEnabled()) {
+            return false;
+        }
+
         RenderTrackable trackable = (RenderTrackable)window;
-        if (trackable.getRenderTimeoutCount() > this.outOfServiceLimit)
+        if (trackable.getRenderTimeoutCount() >= this.outOfServiceLimit)
         {
             return true;
         }
-        
+
+        CacheElement element = trackingCache.get(window.getPortletDefinition().getUniqueName());
+        if (element != null) {
+            List<String> windows = (List<String>)element.getContent();
+            if (windows.contains(window.getWindowId()))
+                return true;
+        }
+
+        Integer count = trackingCounts.get(window.getWindowId());
+        if (count != null && count >= this.outOfServiceLimit) {
+            takeOutOfService(window);
+            return true;
+        }
+
         PortletDefinition def = window.getPortletDefinition();
         Collection<LocalizedField> fields = def.getMetadata().getFields(PortalReservedParameters.PORTLET_EXTENDED_DESCRIPTOR_OUT_OF_SERVICE);
         
@@ -95,6 +128,7 @@ public class PortletTrackingManagerImpl 
         {
             if (BooleanUtils.toBoolean(fields.iterator().next().getValue()))
             {
+                addToCache(window);
                 return true;
             }
         }
@@ -109,13 +143,29 @@ public class PortletTrackingManagerImpl 
     
     public void incrementRenderTimeoutCount(PortletWindow window)
     {
+        if (!isEnabled()) {
+            return;
+        }
         RenderTrackable trackable = (RenderTrackable)window;
-        trackable.incrementRenderTimeoutCount();       
+        trackable.incrementRenderTimeoutCount();
+        Integer count = trackingCounts.get(window.getWindowId());
+        if (count == null) {
+            trackingCounts.put(window.getWindowId(), 1);
+        }
+        else {
+            count = count + 1;
+            trackingCounts.put(window.getWindowId(), count);
+        }
     }
    
     public void success(PortletWindow window)
     {
+        if (!isEnabled()) {
+            return ;
+        }
         RenderTrackable trackable = (RenderTrackable)window;
+        removeFromCache(window);
+        trackingCounts.remove(window.getWindowId());
         trackable.success();
     }
     
@@ -128,31 +178,90 @@ public class PortletTrackingManagerImpl 
     public void takeOutOfService(PortletWindow window)
     {
         RenderTrackable trackable = (RenderTrackable)window;
+        addToCache(window);
+        trackingCounts.remove(window.getWindowId());
         trackable.setRenderTimeoutCount((int)this.defaultPortletTimeout + 1);
     }
     
     public void putIntoService(PortletWindow window)
     {
         RenderTrackable trackable = (RenderTrackable)window;
+        removeFromCache(window);
+        trackingCounts.remove(window.getWindowId());
         trackable.setRenderTimeoutCount(0);        
     }
     
-    public void putIntoService(List fullPortletNames)
+    public void putIntoService(List<String> fullPortletNames)
     {
-        // TODO
+        for (String fullName : fullPortletNames) {
+            trackingCache.remove(fullName);
+        }
     }
     
-    public List getOutOfServiceList(String fullPortletName)
+    public PortletTrackingInfo getOutOfServiceList(String fullPortletName)
     {
-        List outs = new ArrayList();
-        // TODO
-        return outs;
+        CacheElement element = trackingCache.get(fullPortletName);
+        if (element != null) {
+            List<String> windows = (List<String>)element.getContent();
+            return new PortletTrackingInfo(fullPortletName, windows);
+        }
+        else {
+            List<String> windows = new ArrayList<String>();
+            return new PortletTrackingInfo(fullPortletName, windows);
+        }
     }
     
-    public List getOutOfServiceList()
+    public List<PortletTrackingInfo> getOutOfServiceList()
     {
-        List outs = new ArrayList();
-        // TODO
-        return outs;
+        List<PortletTrackingInfo> result = new ArrayList<PortletTrackingInfo>();
+        List<String> keys = trackingCache.getKeys();
+        for (String fullName : keys) {
+            CacheElement element = trackingCache.get(fullName);
+            if (element != null) {
+                List<String> windows = (List<String>) element.getContent();
+                result.add(new PortletTrackingInfo(fullName, windows));
+            }
+        }
+        return result;
+    }
+
+    protected boolean addToCache(PortletWindow window) {
+        String fullName = window.getPortletDefinition().getUniqueName();
+        CacheElement cachedElement = trackingCache.get(fullName);
+        if (cachedElement == null) {
+            List<String> windowIds = new ArrayList<String>();
+            windowIds.add(window.getWindowId());
+            cachedElement = trackingCache.createElement(fullName, windowIds);
+            trackingCache.put(cachedElement);
+            return true;
+        }
+        else {
+            List<String> windowIds = (List<String>)cachedElement.getContent();
+            if (!windowIds.contains(window.getWindowId())) {
+                windowIds.add(window.getWindowId());
+                trackingCache.put(cachedElement);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected boolean removeFromCache(PortletWindow window) {
+        String fullName = window.getPortletDefinition().getUniqueName();
+        CacheElement cachedElement = trackingCache.get(fullName);
+        if (cachedElement == null) {
+            return false;
+        }
+        List<String> windowIds = (List<String>)cachedElement.getContent();
+        if (!windowIds.contains(window.getWindowId())) {
+            windowIds.remove(window.getWindowId());
+            trackingCache.put(cachedElement);
+            return true;
+        }
+        return false;
+    }
+
+    public  boolean isEnabled() {
+        return defaultPortletTimeout > 0;
     }
 }
\ No newline at end of file

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/test/assembly/cache-test.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/test/assembly/cache-test.xml?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/test/assembly/cache-test.xml (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/test/assembly/cache-test.xml Sat Jul 12 21:37:17 2014
@@ -162,6 +162,8 @@
         </property>
         <property name="cacheName" value="desktopContentCache" />
     </bean>
+
+
     
     <bean id="portletApplicationOidCache" class="org.apache.jetspeed.cache.impl.EhCacheImpl">
         <meta key="j2:cat" value="default or cache" />
@@ -329,5 +331,35 @@
         <meta key="j2:cat" value="default or cache"/>
         <constructor-arg><ref bean="ehPageManagerPrincipalPropertiesPathCache"/></constructor-arg>
     </bean>
-    
+
+    <!--
+      Abstract Factory bean used to make a reference to the existing EHCache with the specified name
+      or instantiate a new EHCache when the cache hasn't been defined in ehcache.xml.
+      All the properties except of cacheManager are applied only when a new EHCache is instantiated.
+    -->
+    <bean id="ehCacheParent" abstract="true" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+        <meta key="j2:cat" value="default or cache" />
+        <property name="cacheManager" ref="cacheManager" />
+        <property name="maxElementsInMemory" value="500" />
+        <property name="maxElementsOnDisk" value="1000" />
+        <property name="eternal" value="false" />
+        <property name="overflowToDisk" value="false" />
+        <property name="timeToLive" value="120" />
+        <property name="timeToIdle" value="120" />
+        <property name="diskPersistent" value="false" />
+        <property name="diskExpiryThreadIntervalSeconds" value="120" />
+    </bean>
+
+    <bean id="ehPortletTrackingCache" parent="ehCacheParent">
+        <meta key="j2:cat" value="default or cache" />
+        <property name="cacheName" value="portletTrackingCache" />
+    </bean>
+
+    <bean id="portletTrackingCache" class="org.apache.jetspeed.cache.impl.EhCacheImpl">
+        <meta key="j2:cat" value="default or cache" />
+        <constructor-arg>
+            <ref bean="ehPortletTrackingCache" />
+        </constructor-arg>
+    </bean>
+
 </beans>

Added: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingInfo.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingInfo.java?rev=1610061&view=auto
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingInfo.java (added)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingInfo.java Sat Jul 12 21:37:17 2014
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+package org.apache.jetspeed.aggregator;
+
+import java.util.List;
+
+/**
+ * Portlet Tracking information used in PortletTrackingManager to represent minimal data passed between the tracking
+ * manager and clients of the API
+ *
+ */
+public class PortletTrackingInfo {
+
+    private final List<String> windows;
+    private final String fullPortletName;
+
+    public PortletTrackingInfo(String fullPortletName, List<String> windows) {
+        this.windows = windows;
+        this.fullPortletName = fullPortletName;
+    }
+
+    public String getFullPortletName() {
+        return fullPortletName;
+    }
+
+    public List<String> getWindows() {
+        return windows;
+    }
+}

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingManager.java?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingManager.java (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/PortletTrackingManager.java Sat Jul 12 21:37:17 2014
@@ -16,16 +16,21 @@
  */
 package org.apache.jetspeed.aggregator;
 
-import java.util.List;
-
 import org.apache.jetspeed.container.PortletWindow;
 
+import java.util.List;
+
 
 /**
- * <h4>PortletRendererService<br />
- * Jetspeed-2 Rendering service.</h4>
- * <p>This service process all portlet rendering requests and interfaces with the portlet
- * container to generate the resulting markup</p>
+ * The Portlet Tracking Manager will track portlets rendering statistics, taking portlets out of
+ * service when their rendering time exceeds a configurable threshold. This threshold has two parameters:
+ * <tt>defaultPortletTimeout</tt> is a value in milliseconds representing the maximum render time to be considered
+ * as a timeout for a given portlet window. <tt>outOfServiceLimit</tt> represents the number of times the portlet window
+ * reaches the timeout threshold before it is taken out of service.
+ * <p>
+ * This service is used primarily by the rendering engine to determine whether to take a portlet window out of
+ * service to avoid long 'timeouts' when rendering a portlet. The service also provides functions to put the
+ * portlet windows back into service.
  *
  * @author <a href="mailto:[email protected]">David Sean Taylor</a>
  * @version $Id: $
@@ -33,39 +38,101 @@ import org.apache.jetspeed.container.Por
 public interface PortletTrackingManager
 {
     /**
-     *  Get the default timeout for rendering a portlet in milliseconds
+     * Returns the default timeout threshold for rendering a portlet in milliseconds. This threshold is used to
+     * determine if the portlet has timed out, and is used in combination with <code>getOutOfServiceLimit</code>
      *
+     * @return the default rendering timeout
      */
     long getDefaultPortletTimeout();
 
     /**
-     * Out of service limit, if a portlet entity times out past its limit (or default limit) n consecutive times,
-     *  it is taken out of service
-     *  
-     * @return
+     * The number of times a portlet window can timeout before it is taken out of service
+     *
+     * @return the number of times a portlet window can time out before it is considered out of service
      */
     int getOutOfServiceLimit();
-    
+
+    /**
+     * Ask if a given window is out of service or not
+     * @param window this window will be checked
+     * @return <tt>true</tt> when the portlet window is determined to be out of service
+     */
     boolean isOutOfService(PortletWindow window);
-    
+
+    /**
+     * Given a render time, ask if the given portlet window has exceeded the timeout threshold
+     *
+     * @param renderTime the time it took to render a portlet
+     * @param window this window will be checked
+     * @return <tt>true</tt> when the render time exceeded the timeout threshold
+     */
     boolean exceededTimeout(long renderTime, PortletWindow window);
-    
+
+    /**
+     * Increment the render timeout count for a given portlet window
+     * @param window the portlet window to be incremented
+     */
     void incrementRenderTimeoutCount(PortletWindow window);
 
+    /**
+     * Set a specific caching expiration timeout for a given portlet window
+     *
+     * @param window this window will have a new expiration timeout value
+     * @param expiration the value of the timeout expiration
+     */
     void setExpiration(PortletWindow window, long expiration);
-    
+
+    /**
+     * Reset this portlet window as successfully rendered, clearing all expiration counts
+     *
+     * @param window this window will have its expiration status reset
+     */
     void success(PortletWindow window);
-      
+
+    /**
+     * Take a given portlet window out of service. This portlet window will no longer be rendered.
+     *
+     * @param window this window will be taken out of service
+     */
     void takeOutOfService(PortletWindow window);
-    
+
+    /**
+     * Put a given portlet window that is out of service back into service and re-enable rendering of the window
+     *
+     * @param window this window will be put back into service
+     */
     void putIntoService(PortletWindow window);
+
+    /**
+     *  Given a list of full portlet names in format of <tt>portletApp::portletName</tt>, put all windows back
+     *  into service for each of the portlet names given. Note that a portlet can have many windows associated with it.
+     *  Each of the windows associated with a given portlet will be put back into service.
+     *
+     * @param fullPortletNames a list of strings of full portlet names in format <tt>portletApp::portletName</tt>
+     */
+    void putIntoService(List<String> fullPortletNames);
+
+    /**
+     * Retrieve the list of out of service portlet windows for a given portlet, or an empty <code>PortletTrackingInfo</code>
+     * if none are found
+     *
+     * @param fullPortletName a full portlet names in format <tt>portletApp::portletName</tt>
+     * @return a single <code>PortletTrackingInfo</code> which includes a list of window ids
+     */
+    PortletTrackingInfo getOutOfServiceList(String fullPortletName);
+
+    /**
+     * Retrieve the list of out of service portlet windows for the entire system
+     *
+     * @return a list of portlet windows represented by <code>PortletTrackingInfo</code>
+     */
+    List<PortletTrackingInfo> getOutOfServiceList();
+
     /**
-     * 
-     * @param fullPortletNames a list of Strings of full portlet names
+     * Returns <tt>true</tt> if this service is enabled, otherwise <tt>false</tt>. The service is enabled via the
+     * <tt>jetspeed.properties</tt> property named <tt>portal.core.aggregator.portlet.timeout</tt>. The value
+     * represents the timeout threshold in milliseconds. A value of zero disables portlet tracking.
+     * @return <tt>true</tt> if this service is enabled, otherwise <tt>false</tt>
      */
-    void putIntoService(List fullPortletNames);
-    
-    List getOutOfServiceList(String fullPortletName);
-    
-    List getOutOfServiceList();
+    boolean isEnabled();
 }
\ No newline at end of file

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/aggregation.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/aggregation.xml?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/aggregation.xml (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/aggregation.xml Sat Jul 12 21:37:17 2014
@@ -31,6 +31,7 @@
     <constructor-arg index="1">
       <value>${portal.core.aggregator.portlet.service.limit}</value>
     </constructor-arg>
+    <constructor-arg index="2"><ref bean="portletTrackingCache"/></constructor-arg>
   </bean>
 
 

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/cache.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/cache.xml?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/cache.xml (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/assembly/cache.xml Sat Jul 12 21:37:17 2014
@@ -317,5 +317,17 @@
         <constructor-arg><ref bean="decorationContentCache"/></constructor-arg>
         <constructor-arg><ref bean="ContentCacheKeyGenerator"/></constructor-arg>
     </bean>
-    
+
+    <bean id="ehPortletTrackingCache" parent="ehCacheParent">
+        <meta key="j2:cat" value="default or cache" />
+        <property name="cacheName" value="portletTrackingCache" />
+    </bean>
+
+    <bean id="portletTrackingCache" class="org.apache.jetspeed.cache.impl.EhCacheImpl">
+        <meta key="j2:cat" value="default or cache" />
+        <constructor-arg>
+            <ref bean="ehPortletTrackingCache" />
+        </constructor-arg>
+    </bean>
+
 </beans>

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml Sat Jul 12 21:37:17 2014
@@ -431,7 +431,21 @@
           timeToLiveSeconds="3600"
           memoryStoreEvictionPolicy="LRU">
    </cache>
-   
+
+    <cache name="portletTrackingCache"
+           maxElementsInMemory="1000"
+           eternal="true"
+           overflowToDisk="false"
+           timeToIdleSeconds="0"
+           timeToLiveSeconds="0"
+           memoryStoreEvictionPolicy="LRU">
+        <cacheEventListenerFactory
+            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
+            properties="replicateAsynchronously=true, replicatePuts=true,
+                            replicateUpdates=true, replicateUpdatesViaCopy=true,
+                            replicateRemovals=true"/>
+    </cache>
+
     <!--
     Sample distributed cache named sampleDistributedCache1.
     This cache replicates using defaults.

Modified: portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml?rev=1610061&r1=1610060&r2=1610061&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml (original)
+++ portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml Sat Jul 12 21:37:17 2014
@@ -408,7 +408,15 @@
           timeToLiveSeconds="3600"
           memoryStoreEvictionPolicy="LRU">
    </cache>
-   
+
+    <cache name="portletTrackingCache"
+           maxElementsInMemory="1000"
+           eternal="true"
+           overflowToDisk="false"
+           timeToIdleSeconds="0"
+           timeToLiveSeconds="0"
+           memoryStoreEvictionPolicy="LRU"/>
+
     <!--
     Sample distributed cache named sampleDistributedCache1.
     This cache replicates using defaults.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.