Author: rmannibucau
Date: Mon Apr 23 20:03:45 2012
New Revision: 1329412

URL: http://svn.apache.org/viewvc?rev=1329412&view=rev
Log:
allowing to configure jaxrs providers through system properties

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/ObjectRecipeHelper.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java
Modified:
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/ObjectRecipeHelper.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/ObjectRecipeHelper.java?rev=1329412&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/ObjectRecipeHelper.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/ObjectRecipeHelper.java
 Mon Apr 23 20:03:45 2012
@@ -0,0 +1,47 @@
+package org.apache.openejb.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
+
+public final class ObjectRecipeHelper {
+    private ObjectRecipeHelper() {
+        // no-op
+    }
+
+    public static Object createMeFromSystemProps(final String prefix, final 
String suffix, final Class<?> clazz) {
+        final Properties props = SystemInstance.get().getProperties();
+        final Map<String, Object> usedOnes = new HashMap<String, Object>();
+
+        for (Map.Entry<Object, Object> entry : props.entrySet()) {
+            final String key = entry.getKey().toString();
+            if (prefix != null && !key.startsWith(prefix)) {
+                continue;
+            }
+            if (suffix != null && !key.endsWith(suffix)) {
+                continue;
+            }
+
+            String newKey = key;
+            if (prefix != null) {
+                newKey = newKey.substring(prefix.length());
+            }
+            if (suffix != null) {
+                newKey = newKey.substring(0, newKey.length() - 
suffix.length());
+            }
+            usedOnes.put(newKey, entry.getValue());
+        }
+
+        final ObjectRecipe recipe = new ObjectRecipe(clazz);
+        recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+        recipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+        recipe.allow(Option.PRIVATE_PROPERTIES);
+        recipe.allow(Option.FIELD_INJECTION);
+        recipe.allow(Option.NAMED_PARAMETERS);
+        recipe.setAllProperties(usedOnes);
+        return recipe.create();
+    }
+}

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=1329412&r1=1329411&r2=1329412&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
 Mon Apr 23 20:03:45 2012
@@ -46,6 +46,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.openejb.util.ObjectRecipeHelper;
 import org.apache.webbeans.config.WebBeansContext;
 
 /**
@@ -139,11 +140,14 @@ public class CxfRsHttpListener implement
     }
 
     private static List<?> createProviderList(final String prefix, final 
ClassLoader loader) {
-        String key;
+        final String key;
+        final String systPropPrefix;
         if (prefix == null || prefix.trim().isEmpty()) {
             key = OPENEJB_CXF_JAXRS_PROVIDERS_KEY;
+            systPropPrefix = key + ".";
         } else {
             key = prefix + OPENEJB_CXF_JAXRS_PROVIDERS_SUFFIX;
+            systPropPrefix = prefix + ".";
         }
         String providersProperty = SystemInstance.get().getProperty(key);
         // if no overriding
@@ -168,9 +172,7 @@ public class CxfRsHttpListener implement
                     providerList.add(jaxb);
                 } else {
                     try {
-                        Class<?> providerClass = loader.loadClass(provider);
-                        Object providerInstance = providerClass.newInstance();
-                        providerList.add(providerInstance);
+                        
providerList.add(ObjectRecipeHelper.createMeFromSystemProps(systPropPrefix, 
null, loader.loadClass(provider)));
                     } catch (Exception e) {
                         LOGGER.error("can't add jax-rs provider " + provider + 
" in the current webapp"); // don't print this exception
                     }

Added: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java?rev=1329412&view=auto
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java
 (added)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java
 Mon Apr 23 20:03:45 2012
@@ -0,0 +1,81 @@
+package org.apache.openejb.server.cxf.rs;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Properties;
+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 org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.OpenEjbContainer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+public class CustomProviderWithConfigTest {
+    private static EJBContainer container;
+
+    @BeforeClass
+    public static void start() throws Exception {
+        Properties properties = new Properties();
+        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, 
"true");
+        
properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, 
ConfigurableProvider.class.getName());
+        
properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY + 
".str", "done!");
+        container = EJBContainer.createEJBContainer(properties);
+    }
+
+    @AfterClass
+    public static void close() throws Exception {
+        if (container != null) {
+            container.close();
+        }
+    }
+
+    @Test
+    public void config() {
+        final String response = 
WebClient.create("http://localhost:4204/openejb-cxf-rs";).accept("openejb/conf")
+                .path("/customized/").get(String.class);
+        assertEquals("done!", response);
+    }
+
+    @Singleton
+    @Path("/customized")
+    public static class CustomizedService {
+        @GET
+        @Produces("openejb/conf")
+        public String go() {
+            return "";
+        }
+    }
+
+    @Provider
+    @Produces("openejb/conf")
+    public static class ConfigurableProvider<T> implements 
MessageBodyWriter<T> {
+        private String str;
+
+        @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(str.getBytes());
+        }
+    }
+}


Reply via email to