Reminder that we use JIRA to generate the release notes, so don't forget to add 
JIRAs for anything users will want to know about.

We didn't really generate release notes for the beta-1, but we definitely will 
for beta-2.

-David

On Nov 13, 2011, at 4:06 PM, [email protected] wrote:

> Author: rmannibucau
> Date: Sun Nov 13 22:06:14 2011
> New Revision: 1201530
> 
> URL: http://svn.apache.org/viewvc?rev=1201530&view=rev
> Log:
> allowing to add custom jaxrs providers
> 
> Added:
>    
> openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java
> Modified:
>    
> openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
> 
> Modified: 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
> URL: 
> http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1201530&r1=1201529&r2=1201530&view=diff
> ==============================================================================
> --- 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
>  (original)
> +++ 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
>  Sun Nov 13 22:06:14 2011
> @@ -16,17 +16,6 @@
>  */
> package org.apache.openejb.server.cxf.rs;
> 
> -import java.net.URI;
> -import java.net.URISyntaxException;
> -import java.util.Arrays;
> -import java.util.Collection;
> -import java.util.HashMap;
> -import java.util.List;
> -import java.util.Map;
> -import javax.naming.Context;
> -import javax.servlet.http.HttpServletRequestWrapper;
> -import javax.ws.rs.core.Application;
> -import javax.xml.bind.Marshaller;
> import org.apache.cxf.endpoint.Server;
> import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
> import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
> @@ -38,14 +27,41 @@ import org.apache.cxf.transport.http.Abs
> import org.apache.cxf.transport.http.HTTPTransportFactory;
> import org.apache.openejb.BeanContext;
> import org.apache.openejb.Injection;
> +import org.apache.openejb.loader.SystemInstance;
> import org.apache.openejb.server.httpd.HttpRequest;
> import org.apache.openejb.server.httpd.HttpResponse;
> import org.apache.openejb.server.rest.RsHttpListener;
> +import org.apache.openejb.util.LogCategory;
> +import org.apache.openejb.util.Logger;
> +
> +import javax.naming.Context;
> +import javax.servlet.http.HttpServletRequestWrapper;
> +import javax.ws.rs.core.Application;
> +import javax.xml.bind.Marshaller;
> +import java.net.URI;
> +import java.net.URISyntaxException;
> +import java.util.ArrayList;
> +import java.util.Arrays;
> +import java.util.Collection;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> 
> /**
> - * @author Romain Manni-Bucau
> + * System property:
> + * <ul>
> + *     <li>-Dopenejb.cxf.jax-rs.providers=&lt;qualified name&gt;:default</li>
> + * </ul>
> + * Note: default means jaxb and json
> + *
> + * @author rmannibucau
>  */
> public class CxfRsHttpListener implements RsHttpListener {
> +    private static final Logger LOGGER = Logger.getInstance(LogCategory.CXF, 
> CxfRsHttpListener.class);
> +
> +    public static final String OPENEJB_CXF_JAXRS_PROVIDERS_KEY = 
> "openejb.cxf.jax-rs.providers";
> +    public static final String DEFAULT_CXF_JAXRS_PROVIDERS_KEY = "default";
> +
>     private static final List<?> PROVIDERS = createProviderList();
> 
>     private HTTPTransportFactory transportFactory;
> @@ -115,6 +131,8 @@ public class CxfRsHttpListener implement
>     }
> 
>     private static List<?> createProviderList() {
> +        String providersProperty = 
> SystemInstance.get().getProperty(OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
> +
>         JAXBElementProvider jaxb = new JAXBElementProvider();
>         Map<String, Object> jaxbProperties = new HashMap<String, Object> ();
>         jaxbProperties.put(Marshaller.JAXB_FRAGMENT, true);
> @@ -123,6 +141,31 @@ public class CxfRsHttpListener implement
>         JSONProvider json = new JSONProvider();
>         json.setSerializeAsArray(true);
> 
> +        if (providersProperty != null && 
> !providersProperty.trim().isEmpty()) {
> +            String[] providers = providersProperty.split(",|;| ");
> +            ClassLoader cl = Thread.currentThread().getContextClassLoader();
> +            if (cl == null) {
> +                cl = CxfRsHttpListener.class.getClassLoader();
> +            }
> +
> +            List<Object> providerList = new ArrayList<Object>();
> +            for (String provider : providers) {
> +                if (DEFAULT_CXF_JAXRS_PROVIDERS_KEY.equals(provider)) {
> +                    providerList.add(json);
> +                    providerList.add(jaxb);
> +                } else {
> +                    try {
> +                        Class<?> providerClass = cl.loadClass(provider);
> +                        Object providerInstance = 
> providerClass.newInstance();
> +                        providerList.add(providerInstance);
> +                    } catch (Exception e) {
> +                        LOGGER.error("can't add jax-rs provider " + 
> provider, e);
> +                    }
> +                }
> +            }
> +            return providerList;
> +        }
> +
>         return Arrays.asList(jaxb, json);
>     }
> }
> 
> Added: 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java
> URL: 
> http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java?rev=1201530&view=auto
> ==============================================================================
> --- 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java
>  (added)
> +++ 
> openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java
>  Sun Nov 13 22:06:14 2011
> @@ -0,0 +1,96 @@
> +package org.apache.openejb.server.cxf.rs;
> +
> +import org.apache.cxf.jaxrs.client.WebClient;
> +import org.apache.openejb.OpenEjbContainer;
> +import org.junit.AfterClass;
> +import org.junit.BeforeClass;
> +import org.junit.Test;
> +
> +import javax.ejb.Singleton;
> +import javax.ejb.embeddable.EJBContainer;
> +import javax.ws.rs.GET;
> +import javax.ws.rs.Path;
> +import javax.ws.rs.Produces;
> +import javax.ws.rs.core.MediaType;
> +import javax.ws.rs.core.MultivaluedMap;
> +import javax.ws.rs.ext.MessageBodyWriter;
> +import javax.ws.rs.ext.Provider;
> +import java.io.IOException;
> +import java.io.OutputStream;
> +import java.lang.annotation.Annotation;
> +import java.lang.reflect.Type;
> +import java.util.Properties;
> +
> +import static junit.framework.Assert.assertEquals;
> +
> +/**
> + * @author rmannibucau
> + */
> +public class CustomProviderTest {
> +    private static EJBContainer container;
> +    private static String providers;
> +
> +    @BeforeClass public static void start() throws Exception {
> +        providers = 
> System.getProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
> +        Properties properties = new Properties();
> +        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, 
> "true");
> +        
> properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, 
> ReverseProvider.class.getName());
> +        container = EJBContainer.createEJBContainer(properties);
> +    }
> +
> +    @AfterClass public static void close() throws Exception {
> +        if (container != null) {
> +            container.close();
> +        }
> +        if (providers == null) {
> +            
> System.getProperties().remove(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
> +        } else {
> +            
> System.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, 
> providers);
> +        }
> +    }
> +
> +    @Test public void customProvider() {
> +        String response = 
> WebClient.create("http://localhost:4204";).accept("openejb/reverse")
> +            .path("/custom/provider").get(String.class);
> +        assertEquals("provider", response);
> +    }
> +
> +    @Singleton
> +    @Path("/custom")
> +    public static class CustomService {
> +        @GET @Path("/provider") @Produces("openejb/reverse") public String 
> go() {
> +            return "redivorp";
> +        }
> +    }
> +
> +    @Provider
> +    @Produces("openejb/reverse")
> +    public static class ReverseProvider<T> implements MessageBodyWriter<T> {
> +        private String reverse(String str) {
> +            if (str == null) {
> +                return "";
> +            }
> +
> +            StringBuilder s = new StringBuilder(str.length());
> +            for (int i = str.length() - 1; i >= 0; i--) {
> +                s.append(str.charAt(i));
> +            }
> +            return s.toString();
> +        }
> +
> +        @Override
> +        public long getSize(T t, Class<?> rawType, Type genericType, 
> Annotation[] annotations, MediaType mediaType) {
> +            return -1;
> +        }
> +
> +        @Override
> +        public boolean isWriteable(Class<?> rawType, Type genericType, 
> Annotation[] annotations, MediaType mediaType) {
> +            return true;
> +        }
> +
> +        @Override
> +        public void writeTo(T t, Class<?> rawType, Type genericType, 
> Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> 
> httpHeaders, OutputStream entityStream) throws IOException {
> +            entityStream.write(reverse((String) t).getBytes());
> +        }
> +    }
> +}
> 
> 
> 

Reply via email to