Author: sergeyb
Date: Thu Dec  6 13:43:44 2012
New Revision: 1417880

URL: http://svn.apache.org/viewvc?rev=1417880&view=rev
Log:
Updating SearchContext to accept bean property mappings, and the parser to 
support Sets

Modified:
    
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContext.java
    
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContextImpl.java
    
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java

Modified: 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContext.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContext.java?rev=1417880&r1=1417879&r2=1417880&view=diff
==============================================================================
--- 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContext.java
 (original)
+++ 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContext.java
 Thu Dec  6 13:43:44 2012
@@ -18,6 +18,8 @@
  */
 package org.apache.cxf.jaxrs.ext.search;
 
+import java.util.Map;
+
 /**
  * Represents the current search expression.
  */
@@ -34,6 +36,18 @@ public interface SearchContext {
      */
     <T> SearchCondition<T> getCondition(Class<T> cls);
     
+    /**
+     * Returns the typed search condition representing 
+     * the search expression which is extracted from 
+     * the request URI
+     * 
+     * @param cls the type of the bean(s) the new search condition will 
+     *        attempt to match
+     * @param beanProperties mapping between search and bean properties       
+     * @return the search condition
+     */
+    <T> SearchCondition<T> getCondition(Class<T> cls, Map<String, String> 
beanProperties);
+    
     
     /**
      * Returns the typed search condition representing 
@@ -46,6 +60,18 @@ public interface SearchContext {
      */
     <T> SearchCondition<T> getCondition(String expression, Class<T> cls);
     
+    /**
+     * Returns the typed search condition representing 
+     * the provided search expression
+     * 
+     * @param expression the search expression
+     * @param cls the type of the bean(s) the new search condition will 
+     *        attempt to match
+     * @param beanProperties mapping between search and bean properties       
+     * @return the search condition
+     */
+    <T> SearchCondition<T> getCondition(String expression, Class<T> cls, 
Map<String, String> beanProperties);
+    
     
     /**
      * Returns the search expression

Modified: 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContextImpl.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContextImpl.java?rev=1417880&r1=1417879&r2=1417880&view=diff
==============================================================================
--- 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContextImpl.java
 (original)
+++ 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/SearchContextImpl.java
 Thu Dec  6 13:43:44 2012
@@ -47,15 +47,24 @@ public class SearchContextImpl implement
         return getCondition(null, cls);
     }
     
+    public <T> SearchCondition<T> getCondition(Class<T> cls, Map<String, 
String> beanProperties) {
+        return getCondition(null, cls, beanProperties);
+    }
+    
     public <T> SearchCondition<T> getCondition(String expression, Class<T> 
cls) {
-        
+        return getCondition(expression, cls, null);
+    }
+    
+    public <T> SearchCondition<T> getCondition(String expression, 
+                                               Class<T> cls, 
+                                               Map<String, String> 
beanProperties) {    
         if (InjectionUtils.isPrimitive(cls)) {
             String errorMessage = "Primitive condition types are not 
supported"; 
             LOG.warning(errorMessage);
             throw new IllegalArgumentException(errorMessage);
         }
         
-        SearchConditionParser<T> parser = getParser(cls);
+        SearchConditionParser<T> parser = getParser(cls, beanProperties);
         
         String theExpression = expression == null 
             ? getSearchExpression() : expression;
@@ -88,7 +97,7 @@ public class SearchContextImpl implement
         }
     }
     
-    private <T> SearchConditionParser<T> getParser(Class<T> cls) {
+    private <T> SearchConditionParser<T> getParser(Class<T> cls, Map<String, 
String> beanProperties) {
         // we can use this method as a parser factory, ex
         // we can get parsers capable of parsing XQuery and other languages
         // depending on the properties set by a user
@@ -100,8 +109,13 @@ public class SearchContextImpl implement
         props.put(SearchUtils.LAX_PROPERTY_MATCH, 
                   
(String)message.getContextualProperty(SearchUtils.LAX_PROPERTY_MATCH));
         
-        Map<String, String> beanProps = 
-            CastUtils.cast((Map<?, 
?>)message.getContextualProperty(SearchUtils.BEAN_PROPERTY_MAP));
+        Map<String, String> beanProps = null;
+            
+        if (beanProperties == null) {    
+            beanProps = CastUtils.cast((Map<?, 
?>)message.getContextualProperty(SearchUtils.BEAN_PROPERTY_MAP));
+        } else {
+            beanProps = beanProperties;
+        }
         
         return new FiqlParser<T>(cls, props, beanProps); 
     }

Modified: 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java?rev=1417880&r1=1417879&r2=1417880&view=diff
==============================================================================
--- 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java
 (original)
+++ 
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java
 Thu Dec  6 13:43:44 2012
@@ -26,6 +26,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -298,7 +299,7 @@ public class FiqlParser<T> implements Se
                     try {
                         castedValue = 
InjectionUtils.convertStringToPrimitive(value, actualType);
                         if (isCollection) {
-                            castedValue = 
Collections.singletonList(castedValue);
+                            castedValue = getCollectionSingleton(valueType, 
castedValue);
                         }
                     } catch (Exception e) {
                         throw new SearchParseException("Cannot convert String 
value \"" + value
@@ -309,7 +310,7 @@ public class FiqlParser<T> implements Se
                     try {
                         Method setterM = valueType.getMethod("set" + 
getMethodNameSuffix(setter),
                                                              new 
Class[]{classType});
-                        Object objectValue = !isCollection ? value : 
Collections.singletonList(value);
+                        Object objectValue = !isCollection ? value : 
getCollectionSingleton(valueType, value);
                         setterM.invoke(ownerBean, new Object[]{objectValue});
                         castedValue = objectValue; 
                     } catch (Throwable ex) {
@@ -367,6 +368,14 @@ public class FiqlParser<T> implements Se
         }
     }
     
+    private Object getCollectionSingleton(Class<?> collectionCls, Object 
value) {
+        if (Set.class.isAssignableFrom(collectionCls)) {
+            return Collections.singleton(value);
+        } else {
+            return Collections.singletonList(value);
+        }
+    }
+    
     private Object convertToDate(String value) throws SearchParseException {
         try {
             DateFormat df = SearchUtils.getDateFormat(contextProperties);


Reply via email to