Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 50149 invoked from network); 25 Nov 2008 13:47:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 Nov 2008 13:47:00 -0000 Received: (qmail 55335 invoked by uid 500); 25 Nov 2008 13:47:11 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 55283 invoked by uid 500); 25 Nov 2008 13:47:10 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 55274 invoked by uid 99); 25 Nov 2008 13:47:10 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Nov 2008 05:47:10 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Nov 2008 13:45:52 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 83F352388878; Tue, 25 Nov 2008 05:46:08 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r720497 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/provider/ main/java/org/apache/cxf/jaxrs/utils/ test/java/org/apache/cxf/jaxrs/ test/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/utils/ Date: Tue, 25 Nov 2008 13:46:08 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081125134608.83F352388878@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Tue Nov 25 05:46:07 2008 New Revision: 720497 URL: http://svn.apache.org/viewvc?rev=720497&view=rev Log: JAXRS : support for FormParams, improving the way MatrixParam are dealt with Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java (with props) Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProviderTest.java cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProvider.java Tue Nov 25 05:46:07 2008 @@ -19,40 +19,29 @@ package org.apache.cxf.jaxrs.provider; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.List; import javax.ws.rs.Consumes; +import javax.ws.rs.Encoded; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.Provider; -import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.jaxrs.impl.MetadataMap; +import org.apache.cxf.jaxrs.utils.AnnotationUtils; +import org.apache.cxf.jaxrs.utils.FormUtils; @Consumes("application/x-www-form-urlencoded") @Provider public final class FormEncodingReaderProvider implements MessageBodyReader { - private static final char SPACE_CHAR = '+'; - private static final String NEXT_LINE = "%0D%0A"; - - - private boolean decode; private FormValidator validator; - public void setDecode(boolean formDecoding) { - decode = formDecoding; - } - public void setValidator(FormValidator formValidator) { validator = formValidator; } @@ -68,14 +57,9 @@ throws IOException { try { - String charset = "UTF-8"; - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - copy(is, bos, 1024); - String postBody = new String(bos.toByteArray(), charset); - MultivaluedMap params = createMap(clazz); - populateMap(params, postBody); + populateMap(params, is, + AnnotationUtils.getAnnotation(annotations, Encoded.class) == null); validateMap(params); return params; } catch (WebApplicationException e) { @@ -85,17 +69,6 @@ } } - public static void copy(final InputStream input, final OutputStream output, final int bufferSize) - throws IOException { - final byte[] buffer = new byte[bufferSize]; - int n = 0; - n = input.read(buffer); - while (-1 != n) { - output.write(buffer, 0, n); - n = input.read(buffer); - } - } - @SuppressWarnings("unchecked") protected MultivaluedMap createMap(Class clazz) throws Exception { if (clazz == MultivaluedMap.class) { @@ -111,27 +84,9 @@ * @return a Map of parameters. */ protected void populateMap(MultivaluedMap params, - String body) { - if (!StringUtils.isEmpty(body)) { - List parts = Arrays.asList(body.split("&")); - for (String part : parts) { - String[] keyValue = part.split("="); - // Change to add blank string if key but not value is specified - if (keyValue.length == 2) { - if (decode) { - String[] values = keyValue[1].split(NEXT_LINE); - for (String value : values) { - params.add(keyValue[0], - value.replace(SPACE_CHAR, ' ')); - } - } else { - params.add(keyValue[0], keyValue[1]); - } - } else { - params.add(keyValue[0], ""); - } - } - } + InputStream is, + boolean decode) { + FormUtils.populateMap(params, FormUtils.readBody(is), decode); } protected void validateMap(MultivaluedMap params) { Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/PrimitiveTextProvider.java Tue Nov 25 05:46:07 2008 @@ -25,6 +25,7 @@ import java.lang.reflect.Type; import javax.ws.rs.Consumes; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; @@ -32,6 +33,7 @@ import javax.ws.rs.ext.MessageBodyWriter; import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.jaxrs.utils.AnnotationUtils; import org.apache.cxf.jaxrs.utils.InjectionUtils; @Produces("text/plain") @@ -52,7 +54,9 @@ public Object readFrom(Class type, Type genType, Annotation[] anns, MediaType mt, MultivaluedMap headers, InputStream is) throws IOException { return InjectionUtils.handleParameter( - IOUtils.readStringFromStream(is).toString(), type); + IOUtils.readStringFromStream(is).toString(), + type, + AnnotationUtils.getAnnotation(anns, PathParam.class) != null); } public long getSize(Object t, Class type, Type genericType, Annotation[] annotations, MediaType mt) { Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java?rev=720497&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java Tue Nov 25 05:46:07 2008 @@ -0,0 +1,69 @@ +/** + * 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.utils; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MultivaluedMap; + +import org.apache.cxf.common.util.StringUtils; +import org.apache.cxf.helpers.IOUtils; + +public final class FormUtils { + + private FormUtils() { + + } + + public static String readBody(InputStream is) { + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + IOUtils.copy(is, bos, 1024); + return new String(bos.toByteArray(), "UTF-8"); + } catch (Exception ex) { + throw new WebApplicationException(ex); + } + } + + public static void populateMap(MultivaluedMap params, + String postBody, boolean decode) { + if (!StringUtils.isEmpty(postBody)) { + List parts = Arrays.asList(postBody.split("&")); + for (String part : parts) { + String[] keyValue = part.split("="); + // Change to add blank string if key but not value is specified + if (keyValue.length == 2) { + if (decode) { + params.add(keyValue[0], + JAXRSUtils.uriDecode(keyValue[1])); + } else { + params.add(keyValue[0], keyValue[1]); + } + } else { + params.add(keyValue[0], ""); + } + } + } + } +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java ------------------------------------------------------------------------------ svn:keywords = Rev Date 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=720497&r1=720496&r2=720497&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 Tue Nov 25 05:46:07 2008 @@ -44,6 +44,7 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.PathSegment; import javax.ws.rs.core.Request; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; @@ -54,6 +55,7 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.util.PrimitiveUtils; import org.apache.cxf.jaxrs.ext.MessageContext; +import org.apache.cxf.jaxrs.impl.PathSegmentImpl; import org.apache.cxf.jaxrs.impl.tl.ThreadLocalContextResolver; import org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpHeaders; import org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest; @@ -138,7 +140,17 @@ } } - public static Object handleParameter(String value, Class pClass) { + public static Object handleParameter(String value, Class pClass, boolean pathParam) { + + if (pathParam) { + PathSegment ps = new PathSegmentImpl(value, false); + if (PathSegment.class.isAssignableFrom(pClass)) { + return ps; + } else { + value = ps.getPath(); + } + } + if (pClass.isPrimitive()) { return PrimitiveUtils.read(value, pClass); } @@ -160,10 +172,12 @@ } catch (Exception ex) { // no luck } + return null; } - public static Object handleBean(Class paramType, MultivaluedMap values) { + public static Object handleBean(Class paramType, MultivaluedMap values, + boolean pathParam) { Object bean = null; try { bean = paramType.newInstance(); @@ -173,7 +187,8 @@ if (m.getName().equalsIgnoreCase("set" + entry.getKey()) && m.getParameterTypes().length == 1) { Object paramValue = handleParameter(entry.getValue().get(0), - m.getParameterTypes()[0]); + m.getParameterTypes()[0], + pathParam); if (paramValue != null) { injectThroughMethod(bean, m, paramValue); injected = true; @@ -187,7 +202,7 @@ for (Field f : paramType.getFields()) { if (f.getName().equalsIgnoreCase(entry.getKey())) { Object paramValue = handleParameter(entry.getValue().get(0), - f.getType()); + f.getType(), pathParam); if (paramValue != null) { injectFieldValue(f, bean, paramValue); break; @@ -205,14 +220,14 @@ @SuppressWarnings("unchecked") public static Object injectIntoList(Type genericType, List values, - boolean decoded) { + boolean decoded, boolean pathParam) { Class realType = InjectionUtils.getActualType(genericType); List theValues = new ArrayList(); for (String r : values) { if (decoded) { r = JAXRSUtils.uriDecode(r); } - Object o = InjectionUtils.handleParameter(r, realType); + Object o = InjectionUtils.handleParameter(r, realType, pathParam); if (o != null) { theValues.add(o); } @@ -224,14 +239,14 @@ @SuppressWarnings("unchecked") public static Object injectIntoSet(Type genericType, List values, - boolean sorted, boolean decoded) { + boolean sorted, boolean decoded, boolean pathParam) { Class realType = InjectionUtils.getActualType(genericType); Set theValues = sorted ? new TreeSet() : new HashSet(); for (String r : values) { if (decoded) { r = JAXRSUtils.uriDecode(r); } - Object o = InjectionUtils.handleParameter(r, realType); + Object o = InjectionUtils.handleParameter(r, realType, pathParam); if (o != null) { theValues.add(o); } @@ -244,7 +259,8 @@ Type genericType, String defaultValue, boolean isLast, - boolean decoded) { + boolean decoded, + boolean pathParam) { if (paramValues == null) { if (defaultValue != null) { @@ -260,11 +276,11 @@ } if (List.class.isAssignableFrom(paramType)) { - return InjectionUtils.injectIntoList(genericType, paramValues, decoded); + return InjectionUtils.injectIntoList(genericType, paramValues, decoded, pathParam); } else if (Set.class.isAssignableFrom(paramType)) { - return InjectionUtils.injectIntoSet(genericType, paramValues, false, decoded); + return InjectionUtils.injectIntoSet(genericType, paramValues, false, decoded, pathParam); } else if (SortedSet.class.isAssignableFrom(paramType)) { - return InjectionUtils.injectIntoSet(genericType, paramValues, true, decoded); + return InjectionUtils.injectIntoSet(genericType, paramValues, true, decoded, pathParam); } else { String result = null; if (paramValues.size() > 0) { @@ -275,7 +291,7 @@ if (decoded) { result = JAXRSUtils.uriDecode(result); } - return InjectionUtils.handleParameter(result, paramType); + return InjectionUtils.handleParameter(result, paramType, pathParam); } else { return null; } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Tue Nov 25 05:46:07 2008 @@ -47,6 +47,7 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; import javax.ws.rs.CookieParam; +import javax.ws.rs.FormParam; import javax.ws.rs.HeaderParam; import javax.ws.rs.MatrixParam; import javax.ws.rs.PathParam; @@ -390,35 +391,43 @@ boolean isEncoded = AnnotationUtils.isEncoded(anns, ori); String defaultValue = AnnotationUtils.getDefaultParameterValue(anns, ori); + Object result = null; + PathParam pathParam = AnnotationUtils.getAnnotation(anns, PathParam.class); if (pathParam != null) { - return readFromUriParam(pathParam, parameterClass, genericParam, path, + result = readFromUriParam(pathParam, parameterClass, genericParam, path, values, defaultValue, !isEncoded); } QueryParam qp = AnnotationUtils.getAnnotation(anns, QueryParam.class); if (qp != null) { - return readQueryString(qp, parameterClass, genericParam, message, + result = readQueryString(qp, parameterClass, genericParam, message, defaultValue, !isEncoded); } MatrixParam mp = AnnotationUtils.getAnnotation(anns, MatrixParam.class); if (mp != null) { - return processMatrixParam(message, mp.value(), parameterClass, genericParam, + result = processMatrixParam(message, mp.value(), parameterClass, genericParam, + defaultValue, !isEncoded); + } + + FormParam fp = AnnotationUtils.getAnnotation(anns, FormParam.class); + if (fp != null) { + result = processFormParam(message, fp.value(), parameterClass, genericParam, defaultValue, !isEncoded); } CookieParam cookie = AnnotationUtils.getAnnotation(anns, CookieParam.class); if (cookie != null) { - return processCookieParam(message, cookie.value(), parameterClass, genericParam, defaultValue); + result = processCookieParam(message, cookie.value(), parameterClass, genericParam, defaultValue); } HeaderParam hp = AnnotationUtils.getAnnotation(anns, HeaderParam.class); if (hp != null) { - return processHeaderParam(message, hp.value(), parameterClass, genericParam, defaultValue); + result = processHeaderParam(message, hp.value(), parameterClass, genericParam, defaultValue); } - return null; + return result; } private static Object processMatrixParam(Message m, String key, @@ -428,20 +437,63 @@ List segments = JAXRSUtils.getPathSegments( (String)m.get(Message.REQUEST_URI), decode); if (segments.size() > 0) { - MultivaluedMap params = - segments.get(segments.size() - 1).getMatrixParameters(); - List values = params.get(key); - return InjectionUtils.createParameterObject(values, + MultivaluedMap params = new MetadataMap(); + for (PathSegment ps : segments) { + MultivaluedMap matrix = ps.getMatrixParameters(); + for (Map.Entry> entry : matrix.entrySet()) { + for (String value : entry.getValue()) { + params.add(entry.getKey(), value); + } + } + } + + if ("".equals(key)) { + return InjectionUtils.handleBean(pClass, params, false); + } else { + List values = params.get(key); + return InjectionUtils.createParameterObject(values, + pClass, + genericType, + defaultValue, + false, + false, + true); + } + } + + return null; + } + + private static Object processFormParam(Message m, String key, + Class pClass, Type genericType, + String defaultValue, + boolean decode) { + MultivaluedMap params = new MetadataMap(); + String body = (String)m.get("org.apache.cxf.jaxrs.provider.form.body"); + if (body == null) { + body = FormUtils.readBody(m.getContent(InputStream.class)); + m.put("org.apache.cxf.jaxrs.provider.form.body", body); + } + // TODO : this is done per every form parameter hence it needs to be refactored + FormUtils.populateMap(params, body, decode); + + if ("".equals(key)) { + return InjectionUtils.handleBean(pClass, params, false); + } else { + List results = params.get(key); + + return InjectionUtils.createParameterObject(results, pClass, genericType, defaultValue, false, + false, false); + } - - return null; } + public static MultivaluedMap getMatrixParams(String path, boolean decode) { int index = path.indexOf(';'); return index == -1 ? new MetadataMap() @@ -462,7 +514,8 @@ } } } - return sb.length() > 0 ? InjectionUtils.handleParameter(sb.toString(), pClass) : defaultValue; + return sb.length() > 0 ? InjectionUtils.handleParameter(sb.toString(), pClass, false) + : defaultValue; } @SuppressWarnings("unchecked") @@ -479,7 +532,8 @@ if (pClass.isAssignableFrom(Cookie.class)) { return Cookie.valueOf(value.length() == 0 ? defaultValue : value); } - return value.length() > 0 ? InjectionUtils.handleParameter(value, pClass) : defaultValue; + return value.length() > 0 ? InjectionUtils.handleParameter(value, pClass, false) + : defaultValue; } public static Object createContextValue(Message m, Type genericType, Class clazz) { @@ -549,20 +603,16 @@ boolean decoded) { String parameterName = uriParamAnnotation.value(); if ("".equals(parameterName)) { - return InjectionUtils.handleBean(paramType, values); + return InjectionUtils.handleBean(paramType, values, true); } else { List results = values.get(parameterName); - if (PathSegment.class.isAssignableFrom(paramType) - && results != null && results.size() > 0) { - return new PathSegmentImpl(results.get(0), decoded); - } else { - return InjectionUtils.createParameterObject(results, - paramType, - genericType, - defaultValue, - true, - decoded); - } + return InjectionUtils.createParameterObject(results, + paramType, + genericType, + defaultValue, + true, + decoded, + true); } } @@ -578,7 +628,9 @@ String queryName = queryParam.value(); if ("".equals(queryName)) { - return InjectionUtils.handleBean(paramType, new UriInfoImpl(m, null).getQueryParameters()); + return InjectionUtils.handleBean(paramType, + new UriInfoImpl(m, null).getQueryParameters(), + false); } else { List results = getStructuredParams((String)m.get(Message.QUERY_STRING), "&", @@ -589,6 +641,7 @@ genericType, defaultValue, false, + false, false); } Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Tue Nov 25 05:46:07 2008 @@ -19,11 +19,14 @@ package org.apache.cxf.jaxrs; +import java.util.List; + import javax.annotation.Resource; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; +import javax.ws.rs.FormParam; import javax.ws.rs.HeaderParam; import javax.ws.rs.MatrixParam; import javax.ws.rs.Path; @@ -32,6 +35,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.PathSegment; import javax.ws.rs.core.Request; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; @@ -94,6 +98,12 @@ public void testPathBean(@PathParam("") CustomerBean cb) { } + public void testFormBean(@FormParam("") CustomerBean cb) { + + } + public void testMatrixBean(@MatrixParam("") CustomerBean cb) { + + } public UriInfo getUriInfo() { return uriInfo; @@ -194,6 +204,12 @@ } @Produces("text/xml") + public void testPathSegment(@PathParam("ps") PathSegment ps, + @PathParam("ps") String path) { + // complete + } + + @Produces("text/xml") public void testMultipleQuery(@QueryParam("query") String queryString, @QueryParam("query2") String queryString2, @QueryParam("query3") Long queryString3, @@ -203,8 +219,16 @@ } @Produces("text/xml") - public void testMatrixParam(@MatrixParam("p1") String queryString, - @MatrixParam("p2") String queryString2) { + public void testMatrixParam(@MatrixParam("p1") String mp1, + @MatrixParam("p2") String mp2, + @MatrixParam("p3") String mp3, + @MatrixParam("p4") String mp4, + @MatrixParam("p4") List mp4List) { + // complete + } + + public void testFormParam(@FormParam("p1") String fp1, + @FormParam("p2") List fp2) { // complete } Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProviderTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProviderTest.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProviderTest.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/FormEncodingReaderProviderTest.java Tue Nov 25 05:46:07 2008 @@ -21,13 +21,16 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.lang.annotation.Annotation; import java.util.List; import javax.ws.rs.Consumes; +import javax.ws.rs.Encoded; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MultivaluedMap; import org.apache.cxf.jaxrs.impl.MetadataMap; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -46,7 +49,7 @@ public void testReadFrom() throws Exception { InputStream is = getClass().getResourceAsStream("singleValPostBody.txt"); MultivaluedMap mvMap = - ferp.readFrom((Class)MultivaluedMap.class, null, null, null, null, is); + ferp.readFrom((Class)MultivaluedMap.class, null, new Annotation[]{}, null, null, is); assertEquals("Wrong entry for foo", "bar", mvMap.getFirst("foo")); assertEquals("Wrong entry for boo", "far", mvMap.getFirst("boo")); @@ -55,11 +58,11 @@ @SuppressWarnings("unchecked") @Test public void testDecoded() throws Exception { - ferp.setDecode(true); String values = "foo=1+2&bar=1+3"; MultivaluedMap mvMap = - ferp.readFrom((Class)MultivaluedMap.class, null, null, null, null, + ferp.readFrom((Class)MultivaluedMap.class, null, + new Annotation[]{}, null, null, new ByteArrayInputStream(values.getBytes())); assertEquals("Wrong entry for foo", "1 2", mvMap.getFirst("foo")); assertEquals("Wrong entry for boo", "1 3", mvMap.getFirst("bar")); @@ -68,12 +71,25 @@ @SuppressWarnings("unchecked") @Test + public void testEncoded() throws Exception { + String values = "foo=1+2&bar=1+3"; + + MultivaluedMap mvMap = + ferp.readFrom((Class)MultivaluedMap.class, null, + new Annotation[]{CustomMap.class.getAnnotations()[0]}, null, null, + new ByteArrayInputStream(values.getBytes())); + assertEquals("Wrong entry for foo", "1+2", mvMap.getFirst("foo")); + assertEquals("Wrong entry for boo", "1+3", mvMap.getFirst("bar")); + + } + + @SuppressWarnings("unchecked") + @Test public void testCustomMapImpl() throws Exception { - ferp.setDecode(true); String values = "foo=1+2&bar=1+3&baz=4"; MultivaluedMap mvMap = - ferp.readFrom((Class)CustomMap.class, null, null, null, null, + ferp.readFrom((Class)CustomMap.class, null, new Annotation[]{}, null, null, new ByteArrayInputStream(values.getBytes())); assertEquals(3, mvMap.size()); assertEquals(1, mvMap.get("foo").size()); @@ -88,19 +104,19 @@ @SuppressWarnings("unchecked") @Test public void testMultiLines() throws Exception { - ferp.setDecode(true); String values = "foo=1+2&bar=line1%0D%0Aline+2&baz=4"; MultivaluedMap mvMap = - ferp.readFrom((Class)CustomMap.class, null, null, null, null, + ferp.readFrom((Class)CustomMap.class, null, + new Annotation[]{}, null, null, new ByteArrayInputStream(values.getBytes())); assertEquals(3, mvMap.size()); assertEquals(1, mvMap.get("foo").size()); - assertEquals(2, mvMap.get("bar").size()); + assertEquals(1, mvMap.get("bar").size()); assertEquals(1, mvMap.get("baz").size()); assertEquals("Wrong entry for foo", "1 2", mvMap.getFirst("foo")); - assertEquals("Wrong first line for boo", "line1", mvMap.get("bar").get(0)); - assertEquals("Wrong first line for boo", "line 2", mvMap.get("bar").get(1)); + assertEquals("Wrong entry line for bar", + JAXRSUtils.uriDecode("line1%0D%0Aline+2"), mvMap.get("bar").get(0)); assertEquals("Wrong entry for baz", "4", mvMap.getFirst("baz")); } @@ -112,7 +128,7 @@ String values = "foo=1+2&bar=1+3"; try { - ferp.readFrom((Class)CustomMap.class, null, null, null, null, + ferp.readFrom((Class)CustomMap.class, null, new Annotation[]{}, null, null, new ByteArrayInputStream(values.getBytes())); fail(); } catch (WebApplicationException ex) { @@ -128,7 +144,7 @@ InputStream is = getClass().getResourceAsStream("multiValPostBody.txt"); MultivaluedMap mvMap = - ferp.readFrom((Class)MultivaluedMap.class, null, null, null, null, is); + ferp.readFrom((Class)MultivaluedMap.class, null, new Annotation[]{}, null, null, is); List vals = mvMap.get("foo"); assertEquals("Wrong size for foo params", 2, vals.size()); @@ -150,6 +166,7 @@ .value()[0]); } + @Encoded public static class CustomMap extends MetadataMap { } Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=720497&r1=720496&r2=720497&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Tue Nov 25 05:46:07 2008 @@ -19,6 +19,8 @@ package org.apache.cxf.jaxrs.utils; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; @@ -503,6 +505,42 @@ } @Test + public void testMatrixParametersBean() throws Exception { + Class[] argType = {Customer.CustomerBean.class}; + Method m = Customer.class.getMethod("testMatrixBean", argType); + MessageImpl messageImpl = new MessageImpl(); + messageImpl.put(Message.REQUEST_URI, "/bar;a=aValue/baz;b=123"); + List params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), + new MetadataMap(), + messageImpl); + assertEquals("Bean should be created", 1, params.size()); + Customer.CustomerBean cb = (Customer.CustomerBean)params.get(0); + assertNotNull(cb); + + assertEquals("aValue", cb.getA()); + assertEquals(new Long(123), cb.getB()); + } + + @Test + public void testFormParametersBean() throws Exception { + Class[] argType = {Customer.CustomerBean.class}; + Method m = Customer.class.getMethod("testFormBean", argType); + MessageImpl messageImpl = new MessageImpl(); + messageImpl.put(Message.REQUEST_URI, "/bar"); + String body = "a=aValue&b=123"; + messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes())); + List params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), + new MetadataMap(), + messageImpl); + assertEquals("Bean should be created", 1, params.size()); + Customer.CustomerBean cb = (Customer.CustomerBean)params.get(0); + assertNotNull(cb); + + assertEquals("aValue", cb.getA()); + assertEquals(new Long(123), cb.getB()); + } + + @Test public void testMultipleQueryParameters() throws Exception { Class[] argType = {String.class, String.class, Long.class, Boolean.TYPE, String.class}; @@ -525,21 +563,73 @@ "", params.get(4)); } + @SuppressWarnings("unchecked") @Test public void testMatrixParameters() throws Exception { - Class[] argType = {String.class, String.class}; + Class[] argType = {String.class, String.class, String.class, String.class, List.class}; Method m = Customer.class.getMethod("testMatrixParam", argType); MessageImpl messageImpl = new MessageImpl(); - messageImpl.put(Message.REQUEST_URI, "/foo/bar;p1=1;p2"); + messageImpl.put(Message.REQUEST_URI, "/foo;p4=0;p3=3/bar;p1=1;p2/baz;p4=4;p4=5"); List params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), null, messageImpl); - assertEquals("2 Matrix params should've been identified", 2, params.size()); + assertEquals("5 Matrix params should've been identified", 5, params.size()); - assertEquals("First Matrix Parameter of multiple was not matched correctly", + assertEquals("First Matrix Parameter not matched correctly", "1", params.get(0)); - assertEquals("Second Matrix Parameter of multiple was not matched correctly", + assertEquals("Second Matrix Parameter was not matched correctly", "", params.get(1)); + assertEquals("Third Matrix Parameter was not matched correctly", + "3", params.get(2)); + assertEquals("Fourth Matrix Parameter was not matched correctly", + "0", params.get(3)); + List list = (List)params.get(4); + assertEquals(3, list.size()); + assertEquals("0", list.get(0)); + assertEquals("4", list.get(1)); + assertEquals("5", list.get(2)); + } + + @SuppressWarnings("unchecked") + @Test + public void testMatrixAndPathSegmentParameters() throws Exception { + Class[] argType = {PathSegment.class, String.class}; + Method m = Customer.class.getMethod("testPathSegment", argType); + MessageImpl messageImpl = new MessageImpl(); + messageImpl.put(Message.REQUEST_URI, "/bar%20foo;p4=0%201"); + MultivaluedMap values = new MetadataMap(); + values.add("ps", "bar%20foo;p4=0%201"); + List params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), + values, + messageImpl); + assertEquals("2 params should've been identified", 2, params.size()); + + PathSegment ps = (PathSegment)params.get(0); + assertEquals("bar foo", ps.getPath()); + assertEquals(1, ps.getMatrixParameters().size()); + assertEquals("0 1", ps.getMatrixParameters().getFirst("p4")); + assertEquals("bar foo", params.get(1)); + } + + @SuppressWarnings("unchecked") + @Test + public void testFormParameters() throws Exception { + Class[] argType = {String.class, List.class}; + Method m = Customer.class.getMethod("testFormParam", argType); + MessageImpl messageImpl = new MessageImpl(); + String body = "p1=1&p2=2&p2=3"; + messageImpl.put(Message.REQUEST_URI, "/foo"); + messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes())); + List params = JAXRSUtils.processParameters(new OperationResourceInfo(m, null), + null, messageImpl); + assertEquals("2 form params should've been identified", 2, params.size()); + + assertEquals("First Form Parameter not matched correctly", + "1", params.get(0)); + List list = (List)params.get(1); + assertEquals(2, list.size()); + assertEquals("2", list.get(0)); + assertEquals("3", list.get(1)); } @Test