You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/11/13 23:06:15 UTC

svn commit: r1201530 - in /openejb/trunk/openejb/server/openejb-cxf-rs/src: main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java

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());
+        }
+    }
+}



Re: File Jiras (Re: svn commit: r1201530)

Posted by Jacek Laskowski <ja...@japila.pl>.
On Mon, Nov 14, 2011 at 5:33 PM, David Blevins <da...@gmail.com> wrote:
> 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.

I meant to chime in on this as well and you beat me to it! :)

Jacek

-- 
Jacek Laskowski
Java EE, functional languages and IBM WebSphere - http://blog.japila.pl
Warszawa JUG conference = Confitura (formerly Javarsovia) :: http://confitura.pl
"Hoping to save time by spending it" by David Blevins (Apache OpenEJB)

File Jiras (Re: svn commit: r1201530)

Posted by David Blevins <da...@gmail.com>.
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, rmannibucau@apache.org 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());
> +        }
> +    }
> +}
> 
> 
>