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 2013/07/10 15:12:01 UTC
svn commit: r1501756 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/
Author: sergeyb
Date: Wed Jul 10 13:12:01 2013
New Revision: 1501756
URL: http://svn.apache.org/r1501756
Log:
[CXF-5108] Ignoring Maps with complex values and better support for Maps with simple values when dealing with parameter extensions
Added:
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java (with props)
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1501756&r1=1501755&r2=1501756&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Wed Jul 10 13:12:01 2013
@@ -621,23 +621,41 @@ public final class InjectionUtils {
ParameterType pathParam, Message message) {
// CHECKSTYLE:ON
ParameterizedType paramType = (ParameterizedType) genericType;
- ParameterizedType valueParamType = (ParameterizedType) InjectionUtils
- .getType(paramType.getActualTypeArguments(), 1);
- Class<?> valueType = (Class<?>) InjectionUtils.getType(valueParamType
- .getActualTypeArguments(), 0);
-
- MultivaluedMap<String, Object> theValues = new MetadataMap<String, Object>();
-
- Set<Map.Entry<String, List<String>>> processedValuesEntrySet = processedValues.entrySet();
- for (Map.Entry<String, List<String>> processedValuesEntry : processedValuesEntrySet) {
- List<String> valuesList = processedValuesEntry.getValue();
- for (String value : valuesList) {
- Object o = InjectionUtils.handleParameter(value,
- decoded, valueType, paramAnns, pathParam, message);
- theValues.add(processedValuesEntry.getKey(), o);
+ Class<?> keyType = (Class<?>)paramType.getActualTypeArguments()[0];
+ Type secondType = InjectionUtils.getType(paramType.getActualTypeArguments(), 1);
+
+ if (secondType instanceof ParameterizedType) {
+ MultivaluedMap<Object, Object> theValues = new MetadataMap<Object, Object>();
+ ParameterizedType valueParamType = (ParameterizedType) secondType;
+ Class<?> valueType = (Class<?>) InjectionUtils.getType(valueParamType
+ .getActualTypeArguments(), 0);
+
+ for (Map.Entry<String, List<String>> processedValuesEntry : processedValues.entrySet()) {
+ List<String> valuesList = processedValuesEntry.getValue();
+ for (String value : valuesList) {
+ Object o = InjectionUtils.handleParameter(value,
+ decoded, valueType, paramAnns, pathParam, message);
+ theValues.add(convertStringToPrimitive(processedValuesEntry.getKey(), keyType), o);
+ }
+ }
+ return theValues;
+ } else {
+ Map<Object, Object> theValues = new HashMap<Object, Object>();
+ Class<?> valueType =
+ (Class<?>) InjectionUtils.getType(paramType.getActualTypeArguments(), 1);
+ for (Map.Entry<String, List<String>> processedValuesEntry : processedValues.entrySet()) {
+ List<String> valuesList = processedValuesEntry.getValue();
+ for (String value : valuesList) {
+ Object o = InjectionUtils.handleParameter(value,
+ decoded, valueType, paramAnns, pathParam, message);
+ theValues.put(
+ convertStringToPrimitive(processedValuesEntry.getKey(), keyType),
+ o);
+ }
}
+ return theValues;
}
- return theValues;
+
}
@@ -648,19 +666,25 @@ public final class InjectionUtils {
if (paramType.getActualTypeArguments().length == 2) {
Class<?> firstType = getRawType(getType(paramType.getActualTypeArguments(), 0));
Type secondType = getType(paramType.getActualTypeArguments(), 1);
- if (secondType instanceof ParameterizedType) {
- Class<?> secondRawType = getRawType(secondType);
- if (String.class == firstType && List.class.isAssignableFrom(secondRawType)) {
- Class<?> listtype = getRawType(
- getType(((ParameterizedType)secondType).getActualTypeArguments(), 0));
- return InjectionUtils.isPrimitive(listtype);
- }
- }
+ Class<?> secondRawType = getRawType(secondType);
+
+ return InjectionUtils.isPrimitive(firstType)
+ && (InjectionUtils.isPrimitive(secondRawType)
+ || allowedMapListValue(secondRawType, secondType));
}
}
return false;
}
+ private static boolean allowedMapListValue(Class<?> cls, Type type) {
+ if (List.class.isAssignableFrom(cls)) {
+ Class<?> listtype = getRawType(
+ getType(((ParameterizedType)type).getActualTypeArguments(), 0));
+ return InjectionUtils.isPrimitive(listtype);
+ }
+ return false;
+ }
+
private static List<MultivaluedMap<String, String>> processValues(Class<?> type, Type genericType,
MultivaluedMap<String, String> values,
boolean isbean) {
@@ -1097,6 +1121,14 @@ public final class InjectionUtils {
theValues = CastUtils.cast((List<?>)value);
}
values.put(propertyName, theValues);
+ } else if (Map.class.isAssignableFrom(value.getClass())) {
+ if (isSupportedMap(m.getGenericReturnType())) {
+ Map<Object, Object> map = CastUtils.cast((Map<?, ?>)value);
+ for (Map.Entry<Object, Object> entry : map.entrySet()) {
+ values.add(propertyName + "." + entry.getKey().toString(),
+ entry.getValue().toString());
+ }
+ }
} else {
fillInValuesFromBean(value, propertyName, values);
}
Added: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java?rev=1501756&view=auto
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java (added)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java Wed Jul 10 13:12:01 2013
@@ -0,0 +1,135 @@
+/**
+ * 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.systest.jaxrs;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+@XmlRootElement(name = "Book")
+public class BookBean {
+ private String name;
+ private long id;
+ private Map<Long, Chapter> chapters = new HashMap<Long, Chapter>();
+ private Map<Long, String> comments = new HashMap<Long, String>();
+
+ public BookBean() {
+ init();
+ //System.out.println("----chapters: " + chapters.size());
+ }
+
+ public BookBean(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;
+ }
+
+ @PUT
+ public void cloneState(BookBean book) {
+ id = book.getId();
+ name = book.getName();
+ }
+
+ @GET
+ public BookBean retrieveState() {
+ return this;
+ }
+
+ @GET
+ @Path("chapters/{chapterid}/")
+ @Produces("application/xml;charset=ISO-8859-1")
+ public Chapter getChapter(@PathParam("chapterid")int chapterid) {
+ return chapters.get(new Long(chapterid));
+ }
+
+ @GET
+ @Path("chapters/acceptencoding/{chapterid}/")
+ @Produces("application/xml")
+ public Chapter getChapterAcceptEncoding(@PathParam("chapterid")int chapterid) {
+ return chapters.get(new Long(chapterid));
+ }
+
+ @GET
+ @Path("chapters/badencoding/{chapterid}/")
+ @Produces("application/xml;charset=UTF-48")
+ public Chapter getChapterBadEncoding(@PathParam("chapterid")int chapterid) {
+ return chapters.get(new Long(chapterid));
+ }
+
+ @Path("chapters/sub/{chapterid}/")
+ public Chapter getSubChapter(@PathParam("chapterid")int chapterid) {
+ return chapters.get(new Long(chapterid));
+ }
+
+ @Path("chaptersobject/sub/{chapterid}/")
+ public Object getSubChapterObject(@PathParam("chapterid")int chapterid) {
+ return getSubChapter(chapterid);
+ }
+
+
+ final void init() {
+ Chapter c1 = new Chapter();
+ c1.setId(1);
+ c1.setTitle("chapter 1");
+ chapters.put(c1.getId(), c1);
+ Chapter c2 = new Chapter();
+ c2.setId(2);
+ c2.setTitle("chapter 2");
+ chapters.put(c2.getId(), c2);
+ }
+
+ public Map<Long, Chapter> getChapters() {
+ return chapters;
+ }
+
+ public void setChapters(Map<Long, Chapter> chapters) {
+ this.chapters = chapters;
+ }
+
+ public Map<Long, String> getComments() {
+ return comments;
+ }
+
+ public void setComments(Map<Long, String> comments) {
+ this.comments = comments;
+ }
+
+}
Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookBean.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java?rev=1501756&r1=1501755&r2=1501756&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresource.java Wed Jul 10 13:12:01 2013
@@ -94,7 +94,7 @@ public interface BookSubresource {
@GET
@Path("/thebook5")
@Produces("application/xml")
- Book getTheBookQueryBean(@QueryParam("") Book book) throws BookNotFoundFault;
+ BookBean getTheBookQueryBean(@QueryParam("") BookBean book) throws BookNotFoundFault;
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java?rev=1501756&r1=1501755&r2=1501756&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookSubresourceImpl.java Wed Jul 10 13:12:01 2013
@@ -20,6 +20,7 @@
package org.apache.cxf.systest.jaxrs;
import java.util.List;
+import java.util.Map;
import javax.ws.rs.core.UriInfo;
@@ -111,8 +112,15 @@ public class BookSubresourceImpl impleme
return new Book(name, bookid);
}
- public Book getTheBookQueryBean(Book book) throws BookNotFoundFault {
- return book;
+ public BookBean getTheBookQueryBean(BookBean book) throws BookNotFoundFault {
+ Map<Long, String> comments = book.getComments();
+ String comment1 = comments.get(1L);
+ String comment2 = comments.get(2L);
+ if ("Good".equals(comment1) && "Good".equals(comment2)) {
+ return book;
+ } else {
+ return null;
+ }
}
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=1501756&r1=1501755&r2=1501756&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Wed Jul 10 13:12:01 2013
@@ -548,8 +548,10 @@ public class JAXRSSoapBookTest extends A
BookStoreJaxrsJaxws.class);
WebClient.getConfig(proxy).getOutInterceptors().add(new LoggingOutInterceptor());
BookSubresource bs = proxy.getBookSubresource("139");
- Book bean = new Book("CXF Rocks", 139L);
- Book b = bs.getTheBookQueryBean(bean);
+ BookBean bean = new BookBean("CXF Rocks", 139L);
+ bean.getComments().put(1L, "Good");
+ bean.getComments().put(2L, "Good");
+ BookBean b = bs.getTheBookQueryBean(bean);
assertEquals(139, b.getId());
assertEquals("CXF Rocks", b.getName());
}