You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2014/11/27 12:02:42 UTC

svn commit: r1642086 - in /sling/trunk/bundles/engine/src: main/java/org/apache/sling/engine/impl/ main/java/org/apache/sling/engine/impl/filter/ test/java/org/apache/sling/engine/impl/filter/

Author: fmeschbe
Date: Thu Nov 27 11:02:42 2014
New Revision: 1642086

URL: http://svn.apache.org/r1642086
Log:
SLING-4204 Improve Filter handling and add usage tracking

Added:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java   (with props)
Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/WebConsoleConfigPrinter.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/RequestSlingFilterChain.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingComponentFilterChain.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java
    sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java Thu Nov 27 11:02:42 2014
@@ -27,7 +27,6 @@ import java.io.PrintWriter;
 import java.io.Writer;
 import java.security.AccessControlException;
 
-import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
@@ -49,6 +48,7 @@ import org.apache.sling.api.servlets.Ser
 import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
 import org.apache.sling.engine.SlingRequestProcessor;
 import org.apache.sling.engine.impl.filter.AbstractSlingFilterChain;
+import org.apache.sling.engine.impl.filter.FilterHandle;
 import org.apache.sling.engine.impl.filter.RequestSlingFilterChain;
 import org.apache.sling.engine.impl.filter.ServletFilterManager;
 import org.apache.sling.engine.impl.filter.ServletFilterManager.FilterChainType;
@@ -140,7 +140,7 @@ public class SlingRequestProcessorImpl i
             Resource resource = requestData.initResource(resourceResolver);
             requestData.initServlet(resource, sr);
 
-            Filter[] filters = filterManager.getFilters(FilterChainType.REQUEST);
+            FilterHandle[] filters = filterManager.getFilters(FilterChainType.REQUEST);
             if (filters != null) {
                 FilterChain processor = new RequestSlingFilterChain(this,
                     filters);
@@ -273,7 +273,7 @@ public class SlingRequestProcessorImpl i
             final FilterChainType filterChainType) throws IOException,
             ServletException {
 
-        Filter filters[] = filterManager.getFilters(filterChainType);
+        FilterHandle filters[] = filterManager.getFilters(filterChainType);
         if (filters != null) {
 
             FilterChain processor = new SlingComponentFilterChain(filters);
@@ -335,7 +335,7 @@ public class SlingRequestProcessorImpl i
         // the response output stream if reset does not reset this
         response = new ErrorResponseWrapper(response);
 
-        Filter[] filters = filterManager.getFilters(FilterChainType.ERROR);
+        FilterHandle[] filters = filterManager.getFilters(FilterChainType.ERROR);
         if (filters != null && filters.length > 0) {
             FilterChain processor = new AbstractSlingFilterChain(filters) {
 
@@ -367,7 +367,7 @@ public class SlingRequestProcessorImpl i
         // the response output stream if reset does not reset this
         response = new ErrorResponseWrapper(response);
 
-        Filter[] filters = filterManager.getFilters(FilterChainType.ERROR);
+        FilterHandle[] filters = filterManager.getFilters(FilterChainType.ERROR);
         if (filters != null && filters.length > 0) {
             FilterChain processor = new AbstractSlingFilterChain(filters) {
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/WebConsoleConfigPrinter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/WebConsoleConfigPrinter.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/WebConsoleConfigPrinter.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/WebConsoleConfigPrinter.java Thu Nov 27 11:02:42 2014
@@ -22,9 +22,9 @@ import java.io.PrintWriter;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
+import org.apache.sling.engine.impl.filter.FilterHandle;
 import org.apache.sling.engine.impl.filter.ServletFilterManager;
 import org.apache.sling.engine.impl.filter.ServletFilterManager.FilterChainType;
-import org.apache.sling.engine.impl.filter.SlingFilterChainHelper;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
@@ -79,19 +79,14 @@ public class WebConsoleConfigPrinter {
     /**
      * Helper method for printing out a filter chain.
      */
-    private void printFilterChain(final PrintWriter pw, final SlingFilterChainHelper.FilterListEntry[] entries) {
+    private void printFilterChain(final PrintWriter pw, final FilterHandle[] entries) {
         if ( entries == null ) {
             pw.println("---");
         } else {
-            for(final SlingFilterChainHelper.FilterListEntry entry : entries) {
-                pw.print(entry.getOrder());
-                pw.print(" : ");
-                pw.print(entry.getFilter().getClass());
-                pw.print(" (id: ");
-                pw.print(entry.getFilterId());
-                pw.print(", property: ");
-                pw.print(entry.getOrderSource());
-                pw.println(")");
+            for(final FilterHandle entry : entries) {
+                pw.printf("%d : %s (id: %d, property: %s); called: %d; time: %dms; time/call: %dµs%n",
+                    entry.getOrder(), entry.getFilter().getClass(), entry.getFilterId(), entry.getOrderSource(),
+                    entry.getCalls(), entry.getTime(), entry.getTimePerCall());
             }
         }
     }
@@ -106,7 +101,7 @@ public class WebConsoleConfigPrinter {
             pw.println();
             pw.println(type + " Filters:");
             printFilterChain(pw,
-                filterManager.getFilterChain(type).getFilterListEntries());
+                filterManager.getFilterChain(type).getFilters());
         }
     }
 }

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java Thu Nov 27 11:02:42 2014
@@ -20,7 +20,6 @@ package org.apache.sling.engine.impl.fil
 
 import java.io.IOException;
 
-import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
@@ -33,18 +32,23 @@ import org.apache.sling.engine.impl.requ
 
 public abstract class AbstractSlingFilterChain implements FilterChain {
 
-    private Filter[] filters;
+    private FilterHandle[] filters;
 
     private int current;
 
-    protected AbstractSlingFilterChain(Filter[] filters) {
+    private long[] times;
+
+    protected AbstractSlingFilterChain(FilterHandle[] filters) {
         this.filters = filters;
         this.current = -1;
+        this.times = (filters != null) ? new long[filters.length + 1] : null;
     }
 
     public void doFilter(ServletRequest request, ServletResponse response)
             throws ServletException, IOException {
-        this.current++;
+
+        final int filterIdx = ++this.current;
+        final long start = System.currentTimeMillis();
 
         // the previous filter may have wrapped non-Sling request and response
         // wrappers (e.g. WebCastellum does this), so we have to make
@@ -52,17 +56,26 @@ public abstract class AbstractSlingFilte
         SlingHttpServletRequest slingRequest = toSlingRequest(request);
         SlingHttpServletResponse slingResponse = toSlingResponse(response);
 
-        if (this.current < this.filters.length) {
+        try {
+
+            if (this.current < this.filters.length) {
+
+                // continue filtering with the next filter
+                FilterHandle filter = this.filters[this.current];
+                trackFilter(slingRequest, filter);
+                filter.getFilter().doFilter(slingRequest, slingResponse, this);
 
-            // continue filtering with the next filter
-            Filter filter = this.filters[this.current];
-            trackFilter(slingRequest, filter);
-            filter.doFilter(slingRequest, slingResponse, this);
+            } else {
 
-        } else {
+                this.render(slingRequest, slingResponse);
 
-            this.render(slingRequest, slingResponse);
+            }
 
+        } finally {
+            times[filterIdx] = System.currentTimeMillis() - start;
+            if (filterIdx == 0) {
+                consolidateFilterTimings(slingRequest);
+            }
         }
     }
 
@@ -72,12 +85,28 @@ public abstract class AbstractSlingFilte
 
     // ---------- internal helper
 
-    private void trackFilter(ServletRequest request, Filter filter) {
+    private void trackFilter(ServletRequest request, FilterHandle filter) {
         RequestData data = RequestData.getRequestData(request);
         if (data != null) {
             RequestProgressTracker tracker = data.getRequestProgressTracker();
             tracker.log("Calling filter: {0}",
-                this.filters[this.current].getClass().getName());
+                filter.getFilter().getClass().getName());
+        }
+        filter.track();
+    }
+
+    private void consolidateFilterTimings(ServletRequest request) {
+        if (filters != null) {
+            RequestData data = RequestData.getRequestData(request);
+            RequestProgressTracker tracker = (data != null) ? data.getRequestProgressTracker() : null;
+
+            for (int i = filters.length - 1; i > 0; i--) {
+                filters[i].trackTime(times[i] - times[i + 1]);
+                if (tracker != null) {
+                    tracker.log("Filter timing: filter={0}, inner={1}, total={2}, outer={3}",
+                        filters[i].getFilter().getClass().getName(), times[i + 1], times[i], (times[i] - times[i + 1]));
+                }
+            }
         }
     }
 

Added: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java?rev=1642086&view=auto
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java (added)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java Thu Nov 27 11:02:42 2014
@@ -0,0 +1,130 @@
+/*************************************************************************
+*
+* ADOBE CONFIDENTIAL
+* ___________________
+*
+*  Copyright 2014 Adobe Systems Incorporated
+*  All Rights Reserved.
+*
+* NOTICE:  All information contained herein is, and remains
+* the property of Adobe Systems Incorporated and its suppliers,
+* if any.  The intellectual and technical concepts contained
+* herein are proprietary to Adobe Systems Incorporated and its
+* suppliers and are protected by trade secret or copyright law.
+* Dissemination of this information or reproduction of this material
+* is strictly forbidden unless prior written permission is obtained
+* from Adobe Systems Incorporated.
+**************************************************************************/
+package org.apache.sling.engine.impl.filter;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.servlet.Filter;
+
+public class FilterHandle implements Comparable<FilterHandle> {
+
+    private final Filter filter;
+
+    private final Long filterId;
+
+    private final int order;
+
+    private final String orderSource;
+
+    private AtomicLong calls;
+
+    private AtomicLong time;
+
+    FilterHandle(Filter filter, Long filterId, int order, final String orderSource) {
+        this.filter = filter;
+        this.filterId = filterId;
+        this.order = order;
+        this.orderSource = orderSource;
+        this.calls = new AtomicLong();
+        this.time = new AtomicLong();
+    }
+
+    public Filter getFilter() {
+        return filter;
+    }
+
+    public Long getFilterId() {
+        return filterId;
+    }
+
+    public int getOrder() {
+        return order;
+    }
+
+    public String getOrderSource() {
+        return orderSource;
+    }
+
+    public long getCalls() {
+        return calls.get();
+    }
+
+    public long getTime() {
+        return time.get();
+    }
+
+    public long getTimePerCall() {
+        return (getCalls() > 0) ? (1000L * getTime() / getCalls()) : -1;
+    }
+
+    void track() {
+        calls.incrementAndGet();
+    }
+
+    void trackTime(long time) {
+        this.time.addAndGet(time);
+    }
+
+    /**
+     * Note: this class has a natural ordering that is inconsistent with
+     * equals.
+     */
+    public int compareTo(FilterHandle other) {
+        if (this == other || equals(other)) {
+            return 0;
+        }
+
+        if (order > other.order) {
+            return -1;
+        } else if (order < other.order) {
+            return 1;
+        }
+
+        // if the filterId is comparable and the other is of the same class
+        if (filterId != null && other.filterId != null) {
+            int comp = filterId.compareTo(other.filterId);
+            if (comp != 0) {
+                return comp;
+            }
+        }
+
+        // consider equal ranking
+        return 0;
+    }
+
+    @Override
+    public int hashCode() {
+        if ( filter == null ) {
+            return 0;
+        }
+        return filter.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof FilterHandle) {
+            FilterHandle other = (FilterHandle) obj;
+            return getFilter().equals(other.getFilter());
+        }
+
+        return false;
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/RequestSlingFilterChain.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/RequestSlingFilterChain.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/RequestSlingFilterChain.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/RequestSlingFilterChain.java Thu Nov 27 11:02:42 2014
@@ -20,11 +20,11 @@ package org.apache.sling.engine.impl.fil
 
 import java.io.IOException;
 
-import javax.servlet.Filter;
 import javax.servlet.ServletException;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.engine.impl.SlingMainServlet;
 import org.apache.sling.engine.impl.SlingRequestProcessorImpl;
 import org.apache.sling.engine.impl.filter.ServletFilterManager.FilterChainType;
 
@@ -38,7 +38,7 @@ public class RequestSlingFilterChain ext
 
     private final SlingRequestProcessorImpl handler;
 
-    public RequestSlingFilterChain(SlingRequestProcessorImpl handler, Filter[] filters) {
+    public RequestSlingFilterChain(SlingRequestProcessorImpl handler, FilterHandle[] filters) {
         super(filters);
         this.handler = handler;
     }

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java Thu Nov 27 11:02:42 2014
@@ -119,7 +119,7 @@ public class ServletFilterManager extend
         return filterChains[chain.ordinal()];
     }
 
-    public Filter[] getFilters(final FilterChainType chain) {
+    public FilterHandle[] getFilters(final FilterChainType chain) {
         return getFilterChain(chain).getFilters();
     }
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingComponentFilterChain.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingComponentFilterChain.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingComponentFilterChain.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingComponentFilterChain.java Thu Nov 27 11:02:42 2014
@@ -20,7 +20,6 @@ package org.apache.sling.engine.impl.fil
 
 import java.io.IOException;
 
-import javax.servlet.Filter;
 import javax.servlet.ServletException;
 
 import org.apache.sling.api.SlingHttpServletRequest;
@@ -35,7 +34,7 @@ import org.apache.sling.engine.impl.requ
  */
 public class SlingComponentFilterChain extends AbstractSlingFilterChain {
 
-    public SlingComponentFilterChain(Filter[] filters) {
+    public SlingComponentFilterChain(FilterHandle[] filters) {
         super(filters);
     }
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java Thu Nov 27 11:02:42 2014
@@ -33,11 +33,11 @@ import javax.servlet.Filter;
  */
 public class SlingFilterChainHelper {
 
-    private static final Filter[] EMPTY_FILTER_ARRAY = new Filter[0];
+    private static final FilterHandle[] EMPTY_FILTER_ARRAY = new FilterHandle[0];
 
-    private SortedSet<FilterListEntry> filterList;
+    private SortedSet<FilterHandle> filterList;
 
-    private Filter[] filters = EMPTY_FILTER_ARRAY;
+    private FilterHandle[] filters = EMPTY_FILTER_ARRAY;
 
     SlingFilterChainHelper() {
     }
@@ -45,22 +45,22 @@ public class SlingFilterChainHelper {
     public synchronized Filter addFilter(final Filter filter,
             final Long filterId, final int order, final String orderSource) {
         if (filterList == null) {
-            filterList = new TreeSet<FilterListEntry>();
+            filterList = new TreeSet<FilterHandle>();
         }
-        filterList.add(new FilterListEntry(filter, filterId, order, orderSource));
-        filters = this.getFilterArray();
+        filterList.add(new FilterHandle(filter, filterId, order, orderSource));
+        filters = getFiltersInternal();
         return filter;
     }
 
     public synchronized boolean removeFilterById(final Object filterId) {
         if (filterList != null) {
-            for (Iterator<FilterListEntry> fi = filterList.iterator(); fi.hasNext();) {
-                FilterListEntry test = fi.next();
+            for (Iterator<FilterHandle> fi = filterList.iterator(); fi.hasNext();) {
+                FilterHandle test = fi.next();
                 if (test.getFilterId() == filterId
                     || (test.getFilterId() != null && test.getFilterId().equals(
                         filterId))) {
                     fi.remove();
-                    filters = this.getFilterArray();
+                    filters = getFiltersInternal();
                     return true;
                 }
             }
@@ -75,123 +75,14 @@ public class SlingFilterChainHelper {
      * or <code>null</code> if no filters have been added.
      * This method doesn't need to be synced as it is called from synced methods.
      */
-    private Filter[] getFilterArray() {
-        if (filterList != null && !filterList.isEmpty()) {
-            final Filter[] tmp = new Filter[filterList.size()];
-            int i = 0;
-            for (FilterListEntry entry : filterList) {
-                tmp[i] = entry.getFilter();
-                i++;
-            }
-            return tmp;
-        }
-        return EMPTY_FILTER_ARRAY;
-    }
-
-    /**
-     * Returns the list of <code>Filter</code>s added to this instance
-     * or <code>null</code> if no filters have been added.
-     * This method doesn't need to be synced as it is only
-     * returned the current cached filter array.
-     */
-    public Filter[] getFilters() {
-        return this.filters;
+    public FilterHandle[] getFilters() {
+        return filters;
     }
 
-    /**
-     * Returns the list of <code>FilterListEntry</code>s added to this instance
-     * or <code>null</code> if no filters have been added.
-     */
-    public synchronized FilterListEntry[] getFilterListEntries() {
-        FilterListEntry[] result = null;
-        if (filterList != null && !filterList.isEmpty()) {
-            result = new FilterListEntry[filterList.size()];
-            filterList.toArray(result);
-        }
-        return result;
-    }
-
-    public static class FilterListEntry implements Comparable<FilterListEntry> {
-
-        private final Filter filter;
-
-        private final Long filterId;
-
-        private final int order;
-
-        private final String orderSource;
-
-        FilterListEntry(final Filter filter, final Long filterId, final int order, final String orderSource) {
-            this.filter = filter;
-            this.filterId = filterId;
-            this.order = order;
-            this.orderSource = orderSource;
-        }
-
-        public Filter getFilter() {
-            return filter;
-        }
-
-        public Long getFilterId() {
-            return filterId;
-        }
-
-        public int getOrder() {
-            return order;
-        }
-
-        public String getOrderSource() {
-            return orderSource;
-        }
-
-        /**
-         * Note: this class has a natural ordering that is inconsistent with
-         * equals.
-         */
-        public int compareTo(final FilterListEntry other) {
-            if (this == other || equals(other)) {
-                return 0;
-            }
-
-            // new service.ranking order (correct)
-            if (order > other.order) {
-                return -1;
-            } else if (order < other.order) {
-                return 1;
-            }
-
-            // compare filter id (service id)
-            if (filterId != null && other.filterId != null) {
-                int comp = filterId.compareTo(other.filterId);
-                if (comp != 0) {
-                    return comp;
-                }
-            }
-
-            // consider equal ranking
-            return 0;
-        }
-
-        @Override
-        public int hashCode() {
-            if ( filter == null ) {
-                return 0;
-            }
-            return filter.hashCode();
-        }
-
-        @Override
-        public boolean equals(final Object obj) {
-            if (this == obj) {
-                return true;
-            }
-
-            if (obj instanceof FilterListEntry) {
-                final FilterListEntry other = (FilterListEntry) obj;
-                return getFilter().equals(other.getFilter());
-            }
-
-            return false;
+    private FilterHandle[] getFiltersInternal() {
+        if (filterList == null || filterList.isEmpty()) {
+            return EMPTY_FILTER_ARRAY;
         }
+        return filterList.toArray(new FilterHandle[filterList.size()]);
     }
-}
+}
\ No newline at end of file

Modified: sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java?rev=1642086&r1=1642085&r2=1642086&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java (original)
+++ sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java Thu Nov 27 11:02:42 2014
@@ -42,7 +42,7 @@ public class SlingFilterChainHelperTest 
         chain.addFilter(context.mock(Filter.class, "D"), 4L, -1000, "4:-1000");
         chain.addFilter(context.mock(Filter.class, "E"), 5L, 1000, "5:1000");
 
-        final SlingFilterChainHelper.FilterListEntry[] entries = chain.getFilterListEntries();
+        final FilterHandle[] entries = chain.getFilters();
         assertEquals(5, entries.length);
         assertEquals("5:1000", entries[0].getOrderSource());
         assertEquals("1:100", entries[1].getOrderSource());