You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2014/02/11 17:01:33 UTC
svn commit: r1567194 - in /cxf/trunk/rt/rs/extensions/search/src:
main/java/org/apache/cxf/jaxrs/ext/search/
main/java/org/apache/cxf/jaxrs/ext/search/fiql/
main/java/org/apache/cxf/jaxrs/ext/search/odata/
test/java/org/apache/cxf/jaxrs/ext/search/odata/
Author: sergeyb
Date: Tue Feb 11 16:01:32 2014
New Revision: 1567194
URL: http://svn.apache.org/r1567194
Log:
[CXF-5430] Support for cases when the bean and search properties names differ
Modified:
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlParser.java
cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParser.java
cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParserTest.java
Modified: cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java?rev=1567194&r1=1567193&r2=1567194&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java Tue Feb 11 16:01:32 2014
@@ -34,21 +34,52 @@ import org.apache.cxf.jaxrs.ext.search.B
import org.apache.cxf.jaxrs.ext.search.collections.CollectionCheck;
import org.apache.cxf.jaxrs.ext.search.collections.CollectionCheckInfo;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.message.MessageUtils;
public abstract class AbstractSearchConditionParser<T> implements SearchConditionParser<T> {
protected final Map<String, String> contextProperties;
protected final Class<T> conditionClass;
+ protected Beanspector<T> beanspector;
+ protected Map<String, String> beanPropertiesMap;
+
protected AbstractSearchConditionParser(Class<T> tclass) {
- this(tclass, Collections.<String, String>emptyMap());
+ this(tclass, Collections.<String, String>emptyMap(), null);
}
- protected AbstractSearchConditionParser(Class<T> tclass, Map<String, String> contextProperties) {
+ protected AbstractSearchConditionParser(Class<T> tclass,
+ Map<String, String> contextProperties,
+ Map<String, String> beanProperties) {
this.conditionClass = tclass;
this.contextProperties = contextProperties == null
? Collections.<String, String>emptyMap() : contextProperties;
+ beanspector = SearchBean.class.isAssignableFrom(tclass) ? null : new Beanspector<T>(tclass);
+ this.beanPropertiesMap = beanProperties;
+ }
+
+ protected String getActualSetterName(String setter) {
+ String beanPropertyName = beanPropertiesMap == null ? null : beanPropertiesMap.get(setter);
+ return beanPropertyName != null ? beanPropertyName : setter;
+ }
+
+ protected TypeInfo getTypeInfo(String setter, String value)
+ throws SearchParseException, PropertyNotFoundException {
+
+ String name = getSetter(setter);
+
+ TypeInfo typeInfo = null;
+ try {
+ typeInfo = beanspector != null ? beanspector.getAccessorTypeInfo(name)
+ : new TypeInfo(String.class, String.class);
+ } catch (Exception e) {
+ // continue
+ }
+ if (typeInfo == null && !MessageUtils.isTrue(contextProperties.get(SearchUtils.LAX_PROPERTY_MATCH))) {
+ throw new PropertyNotFoundException(name, value);
+ }
+ return typeInfo;
}
protected String getSetter(String setter) {
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=1567194&r1=1567193&r2=1567194&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 Tue Feb 11 16:01:32 2014
@@ -27,15 +27,12 @@ import java.util.regex.Pattern;
import org.apache.cxf.jaxrs.ext.search.AbstractSearchConditionParser;
import org.apache.cxf.jaxrs.ext.search.AndSearchCondition;
-import org.apache.cxf.jaxrs.ext.search.Beanspector;
import org.apache.cxf.jaxrs.ext.search.Beanspector.TypeInfo;
import org.apache.cxf.jaxrs.ext.search.ConditionType;
import org.apache.cxf.jaxrs.ext.search.OrSearchCondition;
-import org.apache.cxf.jaxrs.ext.search.PropertyNotFoundException;
import org.apache.cxf.jaxrs.ext.search.SearchBean;
import org.apache.cxf.jaxrs.ext.search.SearchCondition;
import org.apache.cxf.jaxrs.ext.search.SearchParseException;
-import org.apache.cxf.jaxrs.ext.search.SearchUtils;
import org.apache.cxf.jaxrs.ext.search.SimpleSearchCondition;
import org.apache.cxf.message.MessageUtils;
@@ -99,9 +96,6 @@ public class FiqlParser<T> extends Abstr
COMPARATORS_PATTERN_SINGLE_EQUALS = Pattern.compile(s2);
}
- private Beanspector<T> beanspector;
- private Map<String, String> beanPropertiesMap;
-
private Map<String, ConditionType> operatorsMap = OPERATORS_MAP;
private Pattern comparatorsPattern = COMPARATORS_PATTERN;
/**
@@ -135,12 +129,8 @@ public class FiqlParser<T> extends Abstr
public FiqlParser(Class<T> tclass,
Map<String, String> contextProperties,
Map<String, String> beanProperties) {
- super(tclass, contextProperties);
-
- beanspector = SearchBean.class.isAssignableFrom(tclass)
- ? null : new Beanspector<T>(tclass);
+ super(tclass, contextProperties, beanProperties);
- this.beanPropertiesMap = beanProperties;
if (MessageUtils.isTrue(this.contextProperties.get(SUPPORT_SINGLE_EQUALS))) {
operatorsMap = new HashMap<String, ConditionType>(operatorsMap);
operatorsMap.put("=", ConditionType.EQUALS);
@@ -172,7 +162,6 @@ public class FiqlParser<T> extends Abstr
*/
public SearchCondition<T> parse(String fiqlExpression) throws SearchParseException {
ASTNode<T> ast = parseAndsOrsBrackets(fiqlExpression);
- // System.out.println(ast);
return ast.build();
}
@@ -267,18 +256,13 @@ public class FiqlParser<T> extends Abstr
}
String name = unwrapSetter(propertyName);
- String beanPropertyName = beanPropertiesMap == null ? null : beanPropertiesMap.get(name);
- if (beanPropertyName != null) {
- name = beanPropertyName;
- }
-
+
+ name = getActualSetterName(name);
TypeInfoObject castedValue = parseType(propertyName, name, value);
if (castedValue != null) {
return new Comparison(name, operator, castedValue);
- } else if (MessageUtils.isTrue(contextProperties.get(SearchUtils.LAX_PROPERTY_MATCH))) {
- return null;
} else {
- throw new PropertyNotFoundException(name, value);
+ return null;
}
} else {
throw new SearchParseException("Not a comparison expression: " + expr);
@@ -287,18 +271,9 @@ public class FiqlParser<T> extends Abstr
private TypeInfoObject parseType(String originalName, String setter, String value) throws SearchParseException {
- String name = getSetter(setter);
-
- try {
- TypeInfo typeInfo =
- beanspector != null ? beanspector.getAccessorTypeInfo(name)
- : new TypeInfo(String.class, String.class);
- Object object = parseType(originalName, null, null, setter, typeInfo, value);
- return new TypeInfoObject(object, typeInfo);
- } catch (Exception e) {
- return null;
- }
-
+ TypeInfo typeInfo = getTypeInfo(setter, value);
+ Object object = parseType(originalName, null, null, setter, typeInfo, value);
+ return new TypeInfoObject(object, typeInfo);
}
protected boolean isCount(String propName) {
Modified: cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParser.java?rev=1567194&r1=1567193&r2=1567194&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParser.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParser.java Tue Feb 11 16:01:32 2014
@@ -19,11 +19,12 @@
package org.apache.cxf.jaxrs.ext.search.odata;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
import org.apache.cxf.jaxrs.ext.search.AbstractSearchConditionParser;
import org.apache.cxf.jaxrs.ext.search.AndSearchCondition;
-import org.apache.cxf.jaxrs.ext.search.Beanspector;
import org.apache.cxf.jaxrs.ext.search.Beanspector.TypeInfo;
import org.apache.cxf.jaxrs.ext.search.ConditionType;
import org.apache.cxf.jaxrs.ext.search.OrSearchCondition;
@@ -81,11 +82,9 @@ public class ODataParser<T> extends Abst
private class FilterExpressionVisitor implements ExpressionVisitor {
private final T condition;
- private final Beanspector< T > beanspector;
FilterExpressionVisitor(final T condition) {
this.condition = condition;
- this.beanspector = new Beanspector<T>(condition);
}
@Override
@@ -188,12 +187,9 @@ public class ODataParser<T> extends Abst
@Override
public Object visitProperty(PropertyExpression propertyExpression, String uriLiteral, EdmTyped edmProperty) {
- try {
- final TypeInfo typeInfo = beanspector.getAccessorTypeInfo(uriLiteral);
- return new TypedProperty(typeInfo, uriLiteral);
- } catch (Exception ex) {
- throw new SearchParseException("Failed to get type information from property path: " + uriLiteral, ex);
- }
+ String setter = getActualSetterName(uriLiteral);
+ final TypeInfo typeInfo = ODataParser.this.getTypeInfo(setter, null);
+ return new TypedProperty(typeInfo, setter);
}
@Override
@@ -229,14 +225,41 @@ public class ODataParser<T> extends Abst
}
/**
- * Creates OData 2.0 parser.
+ * Creates OData parser.
*
* @param conditionClass - class of T used to create condition objects. Class T must have
* accessible no-arguments constructor and complementary setters to these used in
- * OData 2.0 $filter expressions.
+ * OData $filter expressions.
*/
public ODataParser(final Class< T > conditionClass) {
- super(conditionClass);
+ this(conditionClass, Collections.<String, String>emptyMap());
+ }
+
+ /**
+ * Creates OData parser.
+ *
+ * @param tclass - class of T used to create condition objects in built syntax tree. Class T must have
+ * accessible no-arg constructor and complementary setters to these used in
+ * OData $filter expressions.
+ * @param contextProperties
+ */
+ public ODataParser(Class<T> tclass, Map<String, String> contextProperties) {
+ this(tclass, contextProperties, null);
+ }
+
+ /**
+ * Creates OData parser.
+ *
+ * @param tclass - class of T used to create condition objects in built syntax tree. Class T must have
+ * accessible no-arg constructor and complementary setters to these used in
+ * OData $filter expressions.
+ * @param contextProperties
+ */
+ public ODataParser(Class<T> tclass,
+ Map<String, String> contextProperties,
+ Map<String, String> beanProperties) {
+ super(tclass, contextProperties, beanProperties);
+
this.parser = new FilterParserImpl(null);
}
Modified: cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParserTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParserTest.java?rev=1567194&r1=1567193&r2=1567194&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParserTest.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/odata/ODataParserTest.java Tue Feb 11 16:01:32 2014
@@ -18,6 +18,8 @@
*/
package org.apache.cxf.jaxrs.ext.search.odata;
+import java.util.Collections;
+
import org.apache.cxf.jaxrs.ext.search.SearchCondition;
import org.apache.cxf.jaxrs.ext.search.SearchParseException;
@@ -73,7 +75,8 @@ public class ODataParserTest extends Ass
@Before
public void setUp() {
- parser = new ODataParser<Person>(Person.class);
+ parser = new ODataParser<Person>(Person.class, Collections.<String, String>emptyMap(),
+ Collections.singletonMap("thename", "FirstName"));
}
@Test
@@ -84,6 +87,13 @@ public class ODataParserTest extends Ass
}
@Test
+ public void testFilterByFirstNameEqualsValueNonMatchingProperty() throws SearchParseException {
+ SearchCondition< Person > filter = parser.parse("thename eq 'Tom'");
+ assertTrue(filter.isMet(new Person("Tom", "Bombadil")));
+ assertFalse(filter.isMet(new Person("Peter", "Bombadil")));
+ }
+
+ @Test
public void testFilterByFirstAndLastNameEqualValue() throws SearchParseException {
SearchCondition< Person > filter = parser.parse("FirstName eq 'Tom' and LastName eq 'Bombadil'");
assertTrue(filter.isMet(new Person("Tom", "Bombadil")));