Author: rmannibucau
Date: Wed May 30 14:49:26 2012
New Revision: 1344284
URL: http://svn.apache.org/viewvc?rev=1344284&view=rev
Log:
TOMEE-206 jaxrs provider config, dont use serializeasaarray by default it leads
to issues (with PUT/POST in particular)
Modified:
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.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=1344284&r1=1344283&r2=1344284&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
Wed May 30 14:49:26 2012
@@ -16,6 +16,8 @@
*/
package org.apache.openejb.server.cxf.rs;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -36,6 +38,7 @@ 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.Options;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.httpd.HttpRequest;
import org.apache.openejb.server.httpd.HttpRequestImpl;
@@ -45,6 +48,7 @@ import org.apache.openejb.util.LogCatego
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.ObjectRecipeHelper;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.xbean.recipe.ObjectRecipe;
/**
* System property:
@@ -53,6 +57,9 @@ import org.apache.webbeans.config.WebBea
* </ul>
* Note: default means jaxb and json
*
+ * Providers are created from system properties so config is done:
+ * [<service class
name>.providers.</service>|openejb.cxf.jax-rs.providers].<provider
class>.<property name>=<value>
+ *
*/
public class CxfRsHttpListener implements RsHttpListener {
private static final Logger LOGGER = Logger.getInstance(LogCategory.CXF,
CxfRsHttpListener.class);
@@ -60,7 +67,7 @@ public class CxfRsHttpListener implement
public static final String OPENEJB_CXF_JAXRS_PROVIDERS_KEY =
"openejb.cxf.jax-rs.providers";
public static final String OPENEJB_CXF_JAXRS_PROVIDERS_SUFFIX =
".providers";
public static final String DEFAULT_CXF_JAXRS_PROVIDERS_KEY = "default";
- public static final String OPENEJB_CXF_PROPERTIES =
"openejb.cxf.rs.properties";
+ public static final String OPENEJB_CXF_PROPERTIES =
"openejb.cxf.rs.jaxb.properties";
private static final List<Object> PROVIDERS =
createConfiguredProviderList("", CxfRsHttpListener.class.getClassLoader());
private static final Map<String, Object> cxfProperties =
toMap(SystemInstance.get().getProperty(OPENEJB_CXF_PROPERTIES));
@@ -180,13 +187,14 @@ public class CxfRsHttpListener implement
return PROVIDERS;
}
- JAXBElementProvider jaxb = new JAXBElementProvider();
- Map<String, Object> jaxbProperties = new HashMap<String, Object> ();
+ final JAXBElementProvider jaxb = new JAXBElementProvider();
+ final Map<String, Object> jaxbProperties = new HashMap<String, Object>
();
jaxbProperties.put(Marshaller.JAXB_FRAGMENT, true);
jaxb.setMarshallerProperties(jaxbProperties);
- JSONProvider json = new JSONProvider();
- json.setSerializeAsArray(true);
+ final JSONProvider json = buildProvider(JSONProvider.class, loader,
+ OPENEJB_CXF_JAXRS_PROVIDERS_KEY + "." +
JSONProvider.class.getName() + ".",
+ systPropPrefix + JSONProvider.class.getName() + ".");
List<Object> providerList = new ArrayList<Object>();
if (providersProperty != null && !providersProperty.trim().isEmpty()) {
@@ -197,7 +205,7 @@ public class CxfRsHttpListener implement
providerList.add(jaxb);
} else {
try {
-
providerList.add(ObjectRecipeHelper.createMeFromSystemProps(systPropPrefix,
null, loader.loadClass(provider)));
+
providerList.add(ObjectRecipeHelper.createMeFromSystemProps(systPropPrefix +
provider + ".", 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
}
@@ -211,6 +219,29 @@ public class CxfRsHttpListener implement
return providerList;
}
+ // generally faster than looping all system properties
+ // Note: should respect general format of custom provider config
+ private static <T> T buildProvider(final Class<T> clazz, final ClassLoader
classloader, final String globalPrefix, final String prefix) {
+ // quick look in clazz (and not parent) if we can look for some
property
+ final Map<String, Object> properties = new HashMap<String, Object>();
+ final Options options = SystemInstance.get().getOptions();
+ for (Field field : clazz.getDeclaredFields()) {
+ if (Modifier.isStatic(field.getModifiers())) {
+ continue;
+ }
+
+ if (prefix != null) {
+ final String key = prefix + field.getName();
+ if (options.has(key)) {
+ properties.put(field.getName(),
options.getProperties().get(key));
+ } else if (options.has(globalPrefix + field.getName())) {
+ properties.put(field.getName(),
options.getProperties().get(globalPrefix + field.getName()));
+ }
+ }
+ }
+ return clazz.cast(new ObjectRecipe(clazz,
properties).create(classloader));
+ }
+
private static Map<String, Object> toMap(String property) {
if (property == null || property.isEmpty()) {
return null;
Modified:
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.java?rev=1344284&r1=1344283&r2=1344284&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.java
(original)
+++
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.java
Wed May 30 14:49:26 2012
@@ -48,7 +48,7 @@ public class DiscoverCustomProviderTest
final Properties properties = new Properties();
properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE,
"true");
properties.setProperty(RESTService.OPENEJB_JAXRS_PROVIDERS_AUTO_PROP,
"true");
- properties.setProperty("openejb.cxf.rs.properties",
"faultStackTraceEnabled=true");
+ properties.setProperty("openejb.cxf.rs.jaxb.properties",
"faultStackTraceEnabled=true");
container = EJBContainer.createEJBContainer(properties);
}