Author: davsclaus
Date: Sun Nov 30 07:05:17 2008
New Revision: 721827

URL: http://svn.apache.org/viewvc?rev=721827&view=rev
Log:
CAMEL-1112: Added file language expression based sorting incl. grouping (quite 
fancy)

Added:
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByIgnoreCaseExpressionTest.java
      - copied, changed from r721798, 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByExpressionTest.java
Modified:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/DefaultFileSorter.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/DefaultFileSorter.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/DefaultFileSorter.java?rev=721827&r1=721826&r2=721827&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/DefaultFileSorter.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/DefaultFileSorter.java
 Sun Nov 30 07:05:17 2008
@@ -97,7 +97,7 @@
      * @return the comparator
      */
     public static Comparator<FileExchange> sortByFileLanguage(final String 
expression, final boolean reverse) {
-        return sortByFileLanguage(expression, reverse, null);
+        return sortByFileLanguage(expression, reverse, false, null);
     }
 
     /**
@@ -105,17 +105,31 @@
      *
      * @param expression  the file language expression
      * @param reverse  true to reverse order
+     * @param ignoreCase  ignore case if comparing strings
+     * @return the comparator
+     */
+    public static Comparator<FileExchange> sortByFileLanguage(final String 
expression, final boolean reverse,
+                                                              final boolean 
ignoreCase) {
+        return sortByFileLanguage(expression, reverse, ignoreCase, null);
+    }
+
+    /**
+     * Returns a new sory by file language expression
+     *
+     * @param expression  the file language expression
+     * @param reverse  true to reverse order
+     * @param ignoreCase  ignore case if comparing strings
      * @param nested  nested comparator for sub group sorting, can be null
      * @return the comparator
      */
     public static Comparator<FileExchange> sortByFileLanguage(final String 
expression, final boolean reverse,
-                                                              final 
Comparator<FileExchange> nested) {
+                                                              final boolean 
ignoreCase, final Comparator<FileExchange> nested) {
         return new Comparator<FileExchange>() {
             public int compare(FileExchange o1, FileExchange o2) {
                 final Expression exp = FileLanguage.file(expression);
                 Object result1 = exp.evaluate(o1);
                 Object result2 = exp.evaluate(o2);
-                int answer = ObjectHelper.compare(result1, result2);
+                int answer = ObjectHelper.compare(result1, result2, 
ignoreCase);
                 // if equal then sub sort by nested comparator
                 if (answer == 0 && nested != null) {
                     answer = nested.compare(o1, o2);

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java?rev=721827&r1=721826&r2=721827&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileComponent.java
 Sun Nov 30 07:05:17 2008
@@ -109,12 +109,17 @@
         }
 
         String group = it.next();
+
         boolean reverse = group.startsWith("reverse:");
         String reminder = reverse ? ifStartsWithReturnRemainder("reverse:", 
group) : group;
+
+        boolean ignoreCase = reminder.startsWith("ignoreCase:");
+        reminder = ignoreCase ? ifStartsWithReturnRemainder("ignoreCase:", 
reminder) : reminder;
+
         ObjectHelper.notNull(reminder, "sortBy option does not contain the 
expression");
 
         // recursive add nested sorters
-        return DefaultFileSorter.sortByFileLanguage(reminder, reverse, 
createSortByComparator(it));
+        return DefaultFileSorter.sortByFileLanguage(reminder, reverse, 
ignoreCase, createSortByComparator(it));
     }
 
 }

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=721827&r1=721826&r2=721827&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
 Sun Nov 30 07:05:17 2008
@@ -107,6 +107,18 @@
      * handling nulls and objects which do not handle sorting gracefully
      */
     public static int compare(Object a, Object b) {
+        return compare(a, b, false);
+    }
+
+    /**
+     * A helper method for performing an ordered comparison on the objects
+     * handling nulls and objects which do not handle sorting gracefully
+     *
+     * @param a  the first object
+     * @param b  the second object
+     * @param ignoreCase  ignore case for string comparison
+     */
+    public static int compare(Object a, Object b, boolean ignoreCase) {
         if (a == b) {
             return 0;
         }
@@ -116,6 +128,9 @@
         if (b == null) {
             return 1;
         }
+        if (ignoreCase && a instanceof String && b instanceof String) {
+            return ((String) a).compareToIgnoreCase((String) b);
+        }
         if (a instanceof Comparable) {
             Comparable comparable = (Comparable)a;
             return comparable.compareTo(b);

Copied: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByIgnoreCaseExpressionTest.java
 (from r721798, 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByExpressionTest.java)
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByIgnoreCaseExpressionTest.java?p2=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByIgnoreCaseExpressionTest.java&p1=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByExpressionTest.java&r1=721798&r2=721827&rev=721827&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByExpressionTest.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileSortByIgnoreCaseExpressionTest.java
 Sun Nov 30 07:05:17 2008
@@ -23,7 +23,7 @@
 /**
  * Unit test for  the file sort by expression
  */
-public class FileSortByExpressionTest extends ContextTestSupport {
+public class FileSortByIgnoreCaseExpressionTest extends ContextTestSupport {
 
     private String fileUrl = "file://target/filesorter/?noop=true";
 
@@ -33,21 +33,24 @@
         deleteDirectory("target/filesorter");
 
         template.sendBodyAndHeader("file:target/filesorter/", "Hello Paris",
-            FileComponent.HEADER_FILE_NAME, "paris.dat");
+            FileComponent.HEADER_FILE_NAME, "report-3.dat");
 
         template.sendBodyAndHeader("file:target/filesorter/", "Hello London",
-            FileComponent.HEADER_FILE_NAME, "london.txt");
+            FileComponent.HEADER_FILE_NAME, "REPORT-2.txt");
 
         template.sendBodyAndHeader("file:target/filesorter/", "Hello 
Copenhagen",
-            FileComponent.HEADER_FILE_NAME, "copenhagen.xml");
+            FileComponent.HEADER_FILE_NAME, "Report-1.xml");
     }
 
     public void testSortFiles() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedBodiesReceived("Hello Paris", "Hello London", "Hello 
Copenhagen");
+        mock.expectedBodiesReceived("Hello London", "Hello Copenhagen", "Hello 
Paris");
 
-        MockEndpoint reverse = getMockEndpoint("mock:reverse");
-        reverse.expectedBodiesReceived("Hello Copenhagen", "Hello London", 
"Hello Paris");
+        MockEndpoint nocase = getMockEndpoint("mock:nocase");
+        nocase.expectedBodiesReceived("Hello Copenhagen", "Hello London", 
"Hello Paris");
+
+        MockEndpoint nocasereverse = getMockEndpoint("mock:nocasereverse");
+        nocasereverse.expectedBodiesReceived("Hello Paris", "Hello London", 
"Hello Copenhagen");
 
         assertMockEndpointsSatisfied();
     }
@@ -55,9 +58,11 @@
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                from(fileUrl + "&sortBy=file:name.ext").to("mock:result");
+                from(fileUrl + "&sortBy=file:name").to("mock:result");
+
+                from(fileUrl + 
"&sortBy=ignoreCase:file:name").to("mock:nocase");
 
-                from(fileUrl + 
"&sortBy=reverse:file:name.ext").to("mock:reverse");
+                from(fileUrl + 
"&sortBy=reverse:ignoreCase:file:name").to("mock:nocasereverse");
             }
         };
     }


Reply via email to