You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2011/03/05 23:38:23 UTC

svn commit: r1078381 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/ext/search/ test/java/org/apache/cxf/jaxrs/ext/search/

Author: amichalec
Date: Sat Mar  5 22:38:23 2011
New Revision: 1078381

URL: http://svn.apache.org/viewvc?rev=1078381&view=rev
Log:
Fix: using primitive properties in type T of SimpleSearchCondtion is disallowed

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchCondition.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SearchContextImplTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchConditionTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchCondition.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchCondition.java?rev=1078381&r1=1078380&r2=1078381&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchCondition.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchCondition.java Sat Mar  5 22:38:23 2011
@@ -32,7 +32,6 @@ import java.util.Set;
  * {@link #isMet(Object)} description.
  * 
  * @param <T> type of search condition.
- * 
  */
 public class SimpleSearchCondition<T> implements SearchCondition<T> {
 
@@ -47,9 +46,9 @@ public class SimpleSearchCondition<T> im
     }
     private ConditionType joiningType = ConditionType.AND;
     private T condition;
-    
+
     private List<SearchCondition<T>> scts;
-    
+
     /**
      * Creates search condition with same operator (equality, inequality) applied in all comparison; see
      * {@link #isMet(Object)} for details of comparison.
@@ -69,7 +68,7 @@ public class SimpleSearchCondition<T> im
         }
         this.condition = condition;
         scts = createConditions(null, cType);
-                
+
     }
 
     /**
@@ -126,15 +125,17 @@ public class SimpleSearchCondition<T> im
         }
     }
 
-    private List<SearchCondition<T>> createConditions(Map<String, ConditionType> getters2operators, 
+    private List<SearchCondition<T>> createConditions(Map<String, ConditionType> getters2operators,
                                                       ConditionType sharedType) {
         if (isPrimitive(condition)) {
-            return Collections.singletonList(
-                (SearchCondition<T>)new PrimitiveSearchCondition<T>(null, condition, sharedType, condition));
+            return Collections.singletonList((SearchCondition<T>)new PrimitiveSearchCondition<T>(null,
+                                                                                                 condition,
+                                                                                                 sharedType,
+                                                                                                 condition));
         } else {
             List<SearchCondition<T>> list = new ArrayList<SearchCondition<T>>();
             Map<String, Object> get2val = getGettersAndValues();
-            
+
             for (String getter : get2val.keySet()) {
                 ConditionType ct = getters2operators == null ? sharedType : getters2operators.get(getter);
                 if (ct == null) {
@@ -145,7 +146,7 @@ public class SimpleSearchCondition<T> im
                     continue;
                 }
                 list.add(new PrimitiveSearchCondition<T>(getter, rval, ct, condition));
-                
+
             }
             if (list.isEmpty()) {
                 throw new IllegalStateException("This search condition is empty and can not be used");
@@ -153,29 +154,32 @@ public class SimpleSearchCondition<T> im
             return list;
         }
     }
-    
+
     /**
      * Compares given object against template condition object.
      * <p>
-     * For primitive type T like String, Number (precisely, from type T located in subpackage of
-     * "java.lang.*") given object is directly compared with template object. Comparison for
-     * {@link ConditionType#EQUALS} requires correct implementation of {@link Object#equals(Object)}, using
-     * inequalities requires type T implementing {@link Comparable}.
+     * For built-in type T like String, Number (precisely, from type T located in subpackage of "java.lang.*")
+     * given object is directly compared with template object. Comparison for {@link ConditionType#EQUALS}
+     * requires correct implementation of {@link Object#equals(Object)}, using inequalities requires type T
+     * implementing {@link Comparable}.
      * <p>
-     * For other types comparison of given object against template object is done using these <b>getters</b>;
-     * returned "is met" value is <b>conjunction ('and' operator)</b> of comparisons per each getter. Getters
-     * of template object that return null or throw exception are not used in comparison, in extreme if all
-     * getters are excluded it means every given pojo object matches. If
-     * {@link #SimpleSearchCondition(ConditionType, Object) constructor with shared operator} was used, then
-     * getters are compared using the same operator. If {@link #SimpleSearchCondition(Map, Object) constructor
-     * with map of operators} was used then for every getter specified operator is used (getters for missing
-     * mapping are ignored). The way that comparison per getter is done depends on operator type per getter -
-     * comparison for {@link ConditionType#EQUALS} requires correct implementation of
+     * For other types the comparison of given object against template object is done using its
+     * <b>getters</b>; Value returned by {@linkplain #isMet(Object)} operation is <b>conjunction ('and'
+     * operator)</b> of comparisons of each getter accessible in object of type T. Getters of template object
+     * that return null or throw exception are not used in comparison. If type T contains getters that return
+     * primitive not-nullable types (as int, float etc) exception will be thrown. Finally, if all getters
+     * return nulls (are excluded) it is interpreted as no filter (match every pojo).
+     * <p>
+     * If {@link #SimpleSearchCondition(ConditionType, Object) constructor with shared operator} was used,
+     * then getters are compared using the same operator. If {@link #SimpleSearchCondition(Map, Object)
+     * constructor with map of operators} was used then for every getter specified operator is used (getters
+     * for missing mapping are ignored). The way that comparison per-getter is done depending on operator type
+     * per getter - comparison for {@link ConditionType#EQUALS} requires correct implementation of
      * {@link Object#equals(Object)}, using inequalities requires that getter type implements
      * {@link Comparable}.
      * <p>
-     * For equality comparison and String type in template object (either being primitive or getter from
-     * complex type) it is allowed to used asterisk at the beginning or at the end of text as wild card (zero
+     * For equality comparison and String type in template object (either being built-in or getter from client
+     * provided type) it is allowed to used asterisk at the beginning or at the end of text as wild card (zero
      * or more of any characters) e.g. "foo*", "*foo" or "*foo*". Inner asterisks are not interpreted as wild
      * cards.
      * <p>
@@ -189,7 +193,7 @@ public class SimpleSearchCondition<T> im
      * 
      * class Entity {
      *   public String getName() {...
-     *   public int getLevel() {...
+     *   public Integer getLevel() {...
      *   public String getMessage() {...
      * }
      * 
@@ -234,14 +238,25 @@ public class SimpleSearchCondition<T> im
      * @return template (condition) object getters mapped to their non-null values
      */
     private Map<String, Object> getGettersAndValues() {
-        
         Map<String, Object> getters2values = new LinkedHashMap<String, Object>();
         Beanspector<T> beanspector = new Beanspector<T>(condition);
         for (String getter : beanspector.getGettersNames()) {
+            try {
+                if (beanspector.getAccessorType(getter).isPrimitive()) {
+                    String beanType = beanspector.getBean().getClass().getCanonicalName();
+                    throw new IllegalArgumentException("Type '" + beanType + "' has property '" + getter
+                                                       + "' of primitive type and "
+                                                       + "cannot be used as a condition");
+                }
+            } catch (IllegalArgumentException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new IllegalArgumentException(e);
+            }
             Object value = getValue(beanspector, getter, condition);
             getters2values.put(getter, value);
         }
-        //we do not need compare class objects
+        // we do not need compare class objects
         getters2values.keySet().remove("class");
         return getters2values;
     }
@@ -258,7 +273,6 @@ public class SimpleSearchCondition<T> im
         return pojo.getClass().getName().startsWith("java.lang");
     }
 
-
     public List<T> findAll(Collection<T> pojos) {
         List<T> result = new ArrayList<T>();
         for (T pojo : pojos) {
@@ -272,7 +286,7 @@ public class SimpleSearchCondition<T> im
     public String toSQL(String table, String... columns) {
         return SearchUtils.toSQL(this, table, columns);
     }
-    
+
     public PrimitiveStatement getStatement() {
         if (scts.size() == 1) {
             return scts.get(0).getStatement();
@@ -284,6 +298,5 @@ public class SimpleSearchCondition<T> im
     public void accept(SearchConditionVisitor<T> visitor) {
         visitor.visit(this);
     }
-    
-    
+
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java?rev=1078381&r1=1078380&r2=1078381&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java Sat Mar  5 22:38:23 2011
@@ -289,11 +289,11 @@ public class FiqlParserTest extends Asse
             this.name = name;
         }
 
-        public int getLevel() {
+        public Integer getLevel() {
             return level;
         }
 
-        public void setLevel(int level) {
+        public void setLevel(Integer level) {
             this.level = level;
         }
 

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SearchContextImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SearchContextImplTest.java?rev=1078381&r1=1078380&r2=1078381&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SearchContextImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SearchContextImplTest.java Sat Mar  5 22:38:23 2011
@@ -21,11 +21,11 @@ package org.apache.cxf.jaxrs.ext.search;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cxf.jaxrs.resources.Book;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageImpl;
 
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class SearchContextImplTest extends Assert {
@@ -67,4 +67,48 @@ public class SearchContextImplTest exten
         assertEquals(1, found.size());
         assertEquals(new Book("CXF Rocks", 125L), found.get(0));
     }
+    
+    @Ignore
+    public static class Book {
+        private String name;
+        private long id;
+        
+        public Book() {
+        }
+        
+        public Book(String name, long id) {
+            this.name = name;
+            this.id = id;
+        }
+        
+        public void setName(String n) {
+            name = n;
+        }
+
+        public String getName() {
+            return name;
+        }
+        
+        public void setId(Long i) {
+            id = i;
+        }
+        public Long getId() {
+            return id;
+        }
+        
+        public int hashCode() { 
+            return name.hashCode() * 37 + new Long(id).hashCode();
+        }
+        
+        public boolean equals(Object o) {
+            if (!(o instanceof Book)) {
+                return false;
+            }
+            Book other = (Book)o;
+            
+            return other.name.equals(name) && other.id == id;
+            
+        }
+    }
+
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchConditionTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchConditionTest.java?rev=1078381&r1=1078380&r2=1078381&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchConditionTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/SimpleSearchConditionTest.java Sat Mar  5 22:38:23 2011
@@ -332,6 +332,11 @@ public class SimpleSearchConditionTest {
         assertTrue(ssc.isMet("fooba*rbaz"));
         assertFalse(ssc.isMet("foobarbaz"));
     }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void testPrimitivePropertyOfCondition() {
+        new SimpleSearchCondition<PrimitiveProp>(ConditionType.EQUALS, new PrimitiveProp(123));
+    }
 
     static class SingleAttr {
         private String foo;
@@ -368,4 +373,22 @@ public class SimpleSearchConditionTest {
             return bar;
         }
     }
+    
+    static class PrimitiveProp {
+        private Integer foo;
+
+        public PrimitiveProp(Integer foo) {
+            super();
+            this.foo = foo;
+        }
+        
+        //primitives getter will be detected
+        public int getFoo() {
+            return foo;
+        }
+
+        public void setFoo(int foo) {
+            this.foo = foo;
+        }        
+    }
 }