Repository: cxf Updated Branches: refs/heads/3.1.x-fixes 1bc57b627 -> e33823c89
[CXF-7213] Fixing FiqlParser issue to do with resolving the collections inside an object, patch from Hector Kikuchi Martins applied Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e33823c8 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e33823c8 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e33823c8 Branch: refs/heads/3.1.x-fixes Commit: e33823c89f1581323772f9c8a6a11390ea897a78 Parents: 1bc57b6 Author: Sergey Beryozkin <sberyoz...@gmail.com> Authored: Thu Jan 26 17:46:09 2017 +0000 Committer: Sergey Beryozkin <sberyoz...@gmail.com> Committed: Thu Jan 26 17:47:01 2017 +0000 ---------------------------------------------------------------------- .../search/AbstractSearchConditionParser.java | 10 +- .../ext/search/fiql/FiqlCollectionsTest.java | 97 ++++++++++++++++++++ 2 files changed, 105 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/e33823c8/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java ---------------------------------------------------------------------- diff --git a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java index 8dfdd80..b28cbdc 100644 --- a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java +++ b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/AbstractSearchConditionParser.java @@ -42,6 +42,7 @@ import org.apache.cxf.jaxrs.utils.InjectionUtils; import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; +import org.apache.olingo.odata2.api.servicedocument.Collection; public abstract class AbstractSearchConditionParser<T> implements SearchConditionParser<T> { @@ -210,8 +211,13 @@ public abstract class AbstractSearchConditionParser<T> implements SearchConditio nextObject = actualReturnType.newInstance(); } Method setterM = actualType.getMethod("set" + nextPart, new Class[]{returnType}); - Object valueObjectValue = lastTry || !returnCollection - ? nextObject : getCollectionSingleton(valueType, nextObject); + Object valueObjectValue = null; + if (lastTry || !returnCollection) { + valueObjectValue = nextObject; + } else { + Class<?> collCls = Collection.class.isAssignableFrom(valueType) ? valueType : returnType; + valueObjectValue = getCollectionSingleton(collCls, nextObject); + } setterM.invoke(valueObject, new Object[]{valueObjectValue}); if (lastTry) { http://git-wip-us.apache.org/repos/asf/cxf/blob/e33823c8/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlCollectionsTest.java ---------------------------------------------------------------------- diff --git a/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlCollectionsTest.java b/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlCollectionsTest.java new file mode 100644 index 0000000..c690af3 --- /dev/null +++ b/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/fiql/FiqlCollectionsTest.java @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cxf.jaxrs.ext.search.fiql; + +import java.util.Set; + +import org.apache.cxf.jaxrs.ext.search.SearchCondition; +import org.apache.cxf.jaxrs.ext.search.SearchParseException; + +import org.junit.Assert; +import org.junit.Test; + +public class FiqlCollectionsTest extends Assert { + @Test + public void testWithCollectionAfterFirstLevelOnCollection() throws SearchParseException { + FiqlParser<Place> placeParser = new FiqlParser<Place>(Place.class); + SearchCondition<Place> placeCondition = placeParser + .parse("specs.features.description==description"); + Place place = placeCondition.getCondition(); + assertNotNull(place); + } + + @Test + public void testWithCollectionAfterFirstLevelOnSingleObject() throws SearchParseException { + FiqlParser<Room> roomParser = new FiqlParser<Room>(Room.class); + SearchCondition<Room> roomCondition = roomParser + .parse("furniture.spec.features.description==description"); + Room room = roomCondition.getCondition(); + assertNotNull(room); + } + + public static class Room { + Set<Furniture> furniture; + public Set<Furniture> getFurniture() { + return furniture; + } + public void setFurniture(Set<Furniture> furniture) { + this.furniture = furniture; + } + } + + public static class Place { + Set<Spec> specs; + public Set<Spec> getSpecs() { + return specs; + } + public void setSpecs(Set<Spec> specs) { + this.specs = specs; + } + } + + public static class Furniture { + Spec spec; + public Spec getSpec() { + return spec; + } + public void setSpec(Spec spec) { + this.spec = spec; + } + } + + public static class Spec { + Set<Feature> features; + public Set<Feature> getFeatures() { + return features; + } + public void setFeatures(Set<Feature> features) { + this.features = features; + } + } + + public static class Feature { + String description; + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + } +}