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