Thanks Sergey,
I've created a sub task for this:
https://issues.apache.org/jira/browse/CXF-1455
I'll tidy up my code, change it to use MultivaluedMap and create a patch.
Barry
On Wed, Feb 27, 2008 at 6:34 PM, Sergey Beryozkin <[EMAIL PROTECTED]>
wrote:
> Hi Barry
>
> I think it's actually required, but it should be
>
>
> @ConsumeMime("application/x-www-form-urlencoded")
> public Response createAuthorisation(MutivaluedMap<String, String> params)
> throws Exception {
> }
>
> Please check a 3.1.4 section
>
> We already have a MetadataMap<K, V> in the trunk which implements
> MutivaluedMap, so if you could update your provider to support
> MutivaluedMaps then it would be super...I'm not sure about Map<String,
> String>. Does Jersey supports it ? If so then it'd likely be
> spec-uncompliant...
>
>
> Thanks, Sergey
>
> ----- Original Message -----
> From: Barry Fitzgerald
> To: [email protected]
> Sent: Wednesday, February 27, 2008 6:02 PM
> Subject: JAX-RS Form Encoding Provider
>
>
> Hi all,
>
> I've taken the time to write a provider that decodes post parameters into
> a hashmap (code below).
>
> There is a similar implementation in Jersey. My implementation is a bit
> rough and ready but works. I thought it might be useful for some people.
>
> A example use would be a form post to a url with parameter username and
> password. Once the provider is registered it could be used like so:
>
>
> @POST
> @Path("/authorisation")
> @ConsumeMime("application/x-www-form-urlencoded")
> @ProduceMime("text/xml")
> public Response createAuthorisation(Map<String, String> params)
> throws Exception {
> System.out.println("----invoking createAuthorisation, params: " +
> params);
> String username = params.get("username");
> ....create & return auth Response
>
> }
>
>
> This isn't required for the JAX-RS standard but if there is a desire to
> get this into the project I can tidy it up a bit, let me know!
>
> Barry
>
> Code Below:
>
> package org.barry;
>
> import java.io.ByteArrayOutputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.OutputStream;
> import java.util.Arrays;
> import java.util.HashMap;
> import java.util.LinkedHashMap;
> import java.util.List;
> import java.util.Map;
>
> import javax.ws.rs.ConsumeMime;
> import javax.ws.rs.core.MediaType;
> import javax.ws.rs.core.MultivaluedMap;
> import javax.ws.rs.ext.MessageBodyReader;
>
> import org.apache.cxf.common.util.StringUtils;
>
> @ConsumeMime("application/x-www-form-urlencoded")
> public final class FormEncodingReaderProvider implements
> MessageBodyReader<Object> {
>
> public boolean isReadable(Class<?> type) {
> return type.isAssignableFrom(HashMap.class);
> }
>
> public Object readFrom(Class<Object> type, MediaType m,
> MultivaluedMap<String, String> headers,
> InputStream is) {
> try {
>
> String charset = "UTF-8";
>
> ByteArrayOutputStream bos = new ByteArrayOutputStream();
> copy(is, bos, 1024);
> String postBody = new String(bos.toByteArray(), charset);
>
> Map<String, String> params = getParams(postBody);
>
> return params;
> } catch (Exception e) {
> e.printStackTrace();
> }
>
> return null;
> }
>
> protected 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);
> }
> }
>
> /**
> * Retrieve map of parameters from the passed in message
> * @param message
> * @return a Map of parameters.
> */
> protected static Map<String, String> getParams(String body) {
> Map<String, String> params = new LinkedHashMap<String, String>();
> if (!StringUtils.isEmpty(body)) {
> List<String> parts = Arrays.asList(body.split("&"));
> for (String part : parts) {
> String[] keyValue = part.split("=");
> params.put(keyValue[0], keyValue[1]);
> }
> }
> return params;
> }
> }
>
>
> ----------------------------
> IONA Technologies PLC (registered in Ireland)
> Registered Number: 171387
> Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
>