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


Reply via email to