Optimise OrderedComparator to use shared instance to reduce memory footprint


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/55af2c3f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/55af2c3f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/55af2c3f

Branch: refs/heads/master
Commit: 55af2c3f4ec3b8b710d80676ee04f0780032e916
Parents: faf98c8
Author: Claus Ibsen <davscl...@apache.org>
Authored: Sat May 27 10:56:12 2017 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Sat May 27 10:56:12 2017 +0200

----------------------------------------------------------------------
 .../apache/camel/impl/DefaultCamelContext.java  |  4 +--
 .../camel/processor/CamelInternalProcessor.java |  2 +-
 .../processor/interceptor/DefaultChannel.java   |  2 +-
 .../apache/camel/util/OrderedComparator.java    | 17 ++++++++++
 .../org/apache/camel/util/UnitOfWorkHelper.java |  6 ++--
 .../camel/util/OrderedComparatorTest.java       | 34 ++++++++++++++++++++
 6 files changed, 58 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 5869183..7ed1d10 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -3677,7 +3677,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         doWarmUpRoutes(inputs, startConsumer);
 
         // sort the startup listeners so they are started in the right order
-        startupListeners.sort(new OrderedComparator());
+        startupListeners.sort(OrderedComparator.get());
         // now call the startup listeners where the routes has been warmed up
         // (only the actual route consumer has not yet been started)
         for (StartupListener startup : startupListeners) {
@@ -3701,7 +3701,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         }
 
         // sort the startup listeners so they are started in the right order
-        startupListeners.sort(new OrderedComparator());
+        startupListeners.sort(OrderedComparator.get());
         // now the consumers that was just started may also add new 
StartupListeners (such as timer)
         // so we need to ensure they get started as well
         for (StartupListener startup : startupListeners) {

http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
 
b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
index c98b1b0..33bda1b 100644
--- 
a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
+++ 
b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
@@ -100,7 +100,7 @@ public class CamelInternalProcessor extends 
DelegateAsyncProcessor {
     public void addAdvice(CamelInternalProcessorAdvice advice) {
         advices.add(advice);
         // ensure advices are sorted so they are in the order we want
-        advices.sort(new OrderedComparator());
+        advices.sort(OrderedComparator.get());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
 
b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
index e4d317d..e789ab1 100644
--- 
a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
+++ 
b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
@@ -260,7 +260,7 @@ public class DefaultChannel extends CamelInternalProcessor 
implements ModelChann
         }
 
         // sort interceptors according to ordered
-        interceptors.sort(new OrderedComparator());
+        interceptors.sort(OrderedComparator.get());
         // then reverse list so the first will be wrapped last, as it would 
then be first being invoked
         Collections.reverse(interceptors);
         // wrap the output with the configured interceptors

http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/main/java/org/apache/camel/util/OrderedComparator.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/util/OrderedComparator.java 
b/camel-core/src/main/java/org/apache/camel/util/OrderedComparator.java
index caa918a..5462a99 100644
--- a/camel-core/src/main/java/org/apache/camel/util/OrderedComparator.java
+++ b/camel-core/src/main/java/org/apache/camel/util/OrderedComparator.java
@@ -27,12 +27,29 @@ import org.apache.camel.Ordered;
  */
 public final class OrderedComparator implements Comparator<Object> {
 
+    private static final OrderedComparator INSTANCE = new OrderedComparator();
+    private static final OrderedComparator INSTANCE_REVERSE = new 
OrderedComparator(true);
+
+    public static OrderedComparator get() {
+        return INSTANCE;
+    }
+
+    public static OrderedComparator getReverse() {
+        return INSTANCE_REVERSE;
+    }
+
     private final boolean reverse;
 
+    /**
+     * Favor using the static instance {@link #get()}
+     */
     public OrderedComparator() {
         this(false);
     }
 
+    /**
+     * Favor using the static instance {@link #getReverse()}
+     */
     public OrderedComparator(boolean reverse) {
         this.reverse = reverse;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/main/java/org/apache/camel/util/UnitOfWorkHelper.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/util/UnitOfWorkHelper.java 
b/camel-core/src/main/java/org/apache/camel/util/UnitOfWorkHelper.java
index 350d02e..6446a40 100644
--- a/camel-core/src/main/java/org/apache/camel/util/UnitOfWorkHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/UnitOfWorkHelper.java
@@ -91,7 +91,7 @@ public final class UnitOfWorkHelper {
             // reverse so we invoke it FILO style instead of FIFO
             Collections.reverse(copy);
             // and honor if any was ordered by sorting it accordingly
-            copy.sort(new OrderedComparator());
+            copy.sort(OrderedComparator.get());
 
             // invoke synchronization callbacks
             for (Synchronization synchronization : copy) {
@@ -119,7 +119,7 @@ public final class UnitOfWorkHelper {
             // reverse so we invoke it FILO style instead of FIFO
             Collections.reverse(copy);
             // and honor if any was ordered by sorting it accordingly
-            copy.sort(new OrderedComparator());
+            copy.sort(OrderedComparator.get());
 
             // invoke synchronization callbacks
             for (Synchronization synchronization : copy) {
@@ -144,7 +144,7 @@ public final class UnitOfWorkHelper {
             // reverse so we invoke it FILO style instead of FIFO
             Collections.reverse(copy);
             // and honor if any was ordered by sorting it accordingly
-            copy.sort(new OrderedComparator());
+            copy.sort(OrderedComparator.get());
 
             // invoke synchronization callbacks
             for (Synchronization synchronization : copy) {

http://git-wip-us.apache.org/repos/asf/camel/blob/55af2c3f/camel-core/src/test/java/org/apache/camel/util/OrderedComparatorTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/util/OrderedComparatorTest.java 
b/camel-core/src/test/java/org/apache/camel/util/OrderedComparatorTest.java
index 2c89e77..aa2abb9 100644
--- a/camel-core/src/test/java/org/apache/camel/util/OrderedComparatorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/OrderedComparatorTest.java
@@ -28,6 +28,23 @@ import org.apache.camel.Ordered;
  */
 public class OrderedComparatorTest extends TestCase {
 
+    public void testOrderedComparatorGet() throws Exception {
+        List<Ordered> answer = new ArrayList<Ordered>();
+        answer.add(new MyOrder(0));
+        answer.add(new MyOrder(2));
+        answer.add(new MyOrder(1));
+        answer.add(new MyOrder(5));
+        answer.add(new MyOrder(4));
+
+        answer.sort(OrderedComparator.get());
+
+        assertEquals(0, answer.get(0).getOrder());
+        assertEquals(1, answer.get(1).getOrder());
+        assertEquals(2, answer.get(2).getOrder());
+        assertEquals(4, answer.get(3).getOrder());
+        assertEquals(5, answer.get(4).getOrder());
+    }
+
     public void testOrderedComparator() throws Exception {
         List<Ordered> answer = new ArrayList<Ordered>();
         answer.add(new MyOrder(0));
@@ -45,6 +62,23 @@ public class OrderedComparatorTest extends TestCase {
         assertEquals(5, answer.get(4).getOrder());
     }
 
+    public void testOrderedComparatorGetReverse() throws Exception {
+        List<Ordered> answer = new ArrayList<Ordered>();
+        answer.add(new MyOrder(0));
+        answer.add(new MyOrder(2));
+        answer.add(new MyOrder(1));
+        answer.add(new MyOrder(5));
+        answer.add(new MyOrder(4));
+
+        answer.sort(OrderedComparator.getReverse());
+
+        assertEquals(5, answer.get(0).getOrder());
+        assertEquals(4, answer.get(1).getOrder());
+        assertEquals(2, answer.get(2).getOrder());
+        assertEquals(1, answer.get(3).getOrder());
+        assertEquals(0, answer.get(4).getOrder());
+    }
+
     public void testOrderedComparatorReverse() throws Exception {
         List<Ordered> answer = new ArrayList<Ordered>();
         answer.add(new MyOrder(0));

Reply via email to