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 2012/08/16 15:02:54 UTC

svn commit: r1373814 [1/2] - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ container/openejb-core/src/main/java/org/...

Author: rmannibucau
Date: Thu Aug 16 13:02:53 2012
New Revision: 1373814

URL: http://svn.apache.org/viewvc?rev=1373814&view=rev
Log:
TOMEE-376 reworking the cxf config to let jaxws/jaxrs endpoint be configured through <Service>

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/MapService.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom-config.resources.xml
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom.resources.xml
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/em.resources.xml
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/PropertiesHelper.java
    openejb/trunk/openejb/examples/server-events/src/main/java/org/superbiz/event/MyListener.java
    openejb/trunk/openejb/examples/server-events/src/test/java/org/superbiz/event/ListenerTest.java
    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/CustomExceptionMapperTest.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DiscoverCustomProviderTest.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/FeatureTest.java
    openejb/trunk/openejb/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbEndpoint.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java
    openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java
    openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/FeatureTest.java
    openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
    openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
    openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Thu Aug 16 13:02:53 2012
@@ -36,6 +36,7 @@ public class AppInfo extends InfoObject 
     public final List<ConnectorInfo> connectors = new ArrayList<ConnectorInfo>();
     public final List<WebAppInfo> webApps = new ArrayList<WebAppInfo>();
     public final List<PersistenceUnitInfo> persistenceUnits = new ArrayList<PersistenceUnitInfo>();
+    public List<ServiceInfo> services = new ArrayList<ServiceInfo>();
     public final List<String> libs = new ArrayList<String>();
     public final Set<String> watchedResources = new TreeSet<String>();
     public final Set<String> resourceIds = new TreeSet<String>();

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Thu Aug 16 13:02:53 2012
@@ -1542,15 +1542,15 @@ public class Assembler extends Assembler
     }
 
     public void createService(ServiceInfo serviceInfo) throws OpenEJBException {
-        ObjectRecipe serviceRecipe = createRecipe(serviceInfo);
+        final ObjectRecipe serviceRecipe = createRecipe(serviceInfo);
 
-        Object service = serviceRecipe.create();
+        final Object service = serviceRecipe.create();
         SystemInstance.get().addObserver(service);
 
-        Class serviceClass = service.getClass();
-
         logUnusedProperties(serviceRecipe, serviceInfo);
 
+        final Class<?> serviceClass = service.getClass();
+
         getContext().put(serviceClass.getName(), service);
 
         props.put(serviceClass.getName(), service);
@@ -1914,12 +1914,12 @@ public class Assembler extends Assembler
         logger.getChildLogger("service").debug("createService.success", serviceInfo.service, serviceInfo.id, serviceInfo.className);
     }
 
-    private void logUnusedProperties(ObjectRecipe serviceRecipe, ServiceInfo info) {
+    public static void logUnusedProperties(ObjectRecipe serviceRecipe, ServiceInfo info) {
         Map<String, Object> unsetProperties = serviceRecipe.getUnsetProperties();
         logUnusedProperties(unsetProperties, info);
     }
 
-    private void logUnusedProperties(Map<String, Object> unsetProperties, ServiceInfo info) {
+    private static void logUnusedProperties(Map<String, Object> unsetProperties, ServiceInfo info) {
         for (String property : unsetProperties.keySet()) {
             //TODO: DMB: Make more robust later
             if (property.equalsIgnoreCase("JndiName")) return;
@@ -1939,13 +1939,18 @@ public class Assembler extends Assembler
         }
     }
 
+    public static ObjectRecipe prepareRecipe(final ServiceInfo info) {
+        final String[] constructorArgs = info.constructorArgs.toArray(new String[info.constructorArgs.size()]);
+        final ObjectRecipe serviceRecipe = new ObjectRecipe(info.className, info.factoryMethod, constructorArgs, null);
+        serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+        serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+        return serviceRecipe;
+    }
+
     private ObjectRecipe createRecipe(ServiceInfo info) {
         Logger serviceLogger = logger.getChildLogger("service");
         serviceLogger.info("createService", info.service, info.id, info.className);
-        String[] constructorArgs = info.constructorArgs.toArray(new String[info.constructorArgs.size()]);
-        ObjectRecipe serviceRecipe = new ObjectRecipe(info.className, info.factoryMethod, constructorArgs, null);
-        serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
-        serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+        final ObjectRecipe serviceRecipe = prepareRecipe(info);
         serviceRecipe.setAllProperties(info.properties);
 
         if (serviceLogger.isDebugEnabled()) {

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java?rev=1373814&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java Thu Aug 16 13:02:53 2012
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.assembler.classic.util;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+// mainly an utility class when using services as config. Null is returned if the action is not possible
+// (instead of throwing an exception)
+public final class ServiceInfos {
+    private ServiceInfos() {
+         // no-op
+    }
+
+    public static Object resolve(final Collection<ServiceInfo> services, final String id) {
+        if (id == null) {
+            return null;
+        }
+
+        try {
+            return build(services, find(services, id));
+        } catch (OpenEJBException e) {
+            throw new OpenEJBRuntimeException(e);
+        }
+    }
+
+    public static ServiceInfo find(final Collection<ServiceInfo> services, final String id) {
+        for (ServiceInfo s : services) {
+            if (id.equals(s.id)) {
+                return s;
+            }
+        }
+        return null;
+    }
+
+    public static ServiceInfo findByClass(final Collection<ServiceInfo> services, final String clazz) {
+        for (ServiceInfo s : services) {
+            if (clazz.equals(s.className)) {
+                return s;
+            }
+        }
+        return null;
+    }
+
+    public static List<Object> resolve(final Collection<ServiceInfo> serviceInfos, final String[] ids) {
+        if (ids == null || ids.length == 0) {
+            return null;
+        }
+
+        final List<Object> instances = new ArrayList<Object>();
+        for (String id : ids) {
+            instances.add(resolve(serviceInfos, id));
+        }
+        return instances;
+    }
+
+    public static Properties serviceProperties(final Collection<ServiceInfo> serviceInfos, final String id) {
+        if (id == null) {
+            return null;
+        }
+
+        final ServiceInfo info = find(serviceInfos, id);
+        if (info == null) {
+            return null;
+        }
+        return info.properties;
+    }
+
+    private static Object build(final Collection<ServiceInfo> services, final ServiceInfo info) throws OpenEJBException {
+        if (info == null) {
+            return null;
+        }
+
+        final ObjectRecipe serviceRecipe = Assembler.prepareRecipe(info);
+        // we can't ask to have a setter for existing code
+        serviceRecipe.allow(Option.FIELD_INJECTION);
+        serviceRecipe.allow(Option.PRIVATE_PROPERTIES);
+
+        for (Map.Entry<Object, Object> entry : info.properties.entrySet()) { // manage links
+            final Object value = entry.getValue();
+            if (value instanceof String && value.toString().startsWith("&")) {
+                serviceRecipe.setProperty(entry.getKey().toString(), resolve(services, value.toString().substring(1)));
+            } else {
+                serviceRecipe.setProperty(entry.getKey().toString(), entry.getValue());
+            }
+        }
+
+        final Object service = serviceRecipe.create();
+
+        SystemInstance.get().addObserver(service);
+        Assembler.logUnusedProperties(serviceRecipe, info);
+
+        return service;
+    }
+}

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Thu Aug 16 13:02:53 2012
@@ -33,12 +33,11 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.assembler.classic.PersistenceUnitInfo;
 import org.apache.openejb.assembler.classic.PortInfo;
 import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.assembler.classic.ServletInfo;
 import org.apache.openejb.assembler.classic.ValidatorBuilder;
 import org.apache.openejb.assembler.classic.WebAppInfo;
-import org.apache.openejb.config.sys.Container;
-import org.apache.openejb.config.sys.Resource;
-import org.apache.openejb.config.sys.ServiceProvider;
+import org.apache.openejb.config.sys.*;
 import org.apache.openejb.jee.AdminObject;
 import org.apache.openejb.jee.ApplicationClient;
 import org.apache.openejb.jee.ConfigProperty;
@@ -74,6 +73,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -114,6 +114,7 @@ class AppInfoBuilder {
         if (appInfo.path == null) appInfo.path = appInfo.appId;
 
         buildAppResources(appModule, appInfo);
+        buildAppServices(appModule, appInfo);
 
         //
         //  J2EE Connectors
@@ -278,6 +279,14 @@ class AppInfoBuilder {
 
     }
 
+    private void buildAppServices(final AppModule appModule, final AppInfo appInfo) throws OpenEJBException {
+        final Collection<org.apache.openejb.config.sys.Service> services = appModule.getServices();
+        for (org.apache.openejb.config.sys.Service service : services) {
+            final ServiceInfo info = configFactory.configureService(service, ServiceInfo.class);
+            appInfo.services.add(info);
+        }
+    }
+
     private void buildAppResources(AppModule module, AppInfo info) {
         for (Resource def : module.getResources()) {
             // the resource is already deployed

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java Thu Aug 16 13:02:53 2012
@@ -53,6 +53,7 @@ public class AppModule implements Deploy
     private final Map<String, TransactionType> txTypeByUnit = new HashMap<String, TransactionType>();
     // TODO We could turn this into the Resources JAXB object and support containers and other things as well
     private final Collection<Resource> resources = new HashSet<Resource>();
+    private final Collection<org.apache.openejb.config.sys.Service> services = new HashSet<org.apache.openejb.config.sys.Service>();
     private final ClassLoader classLoader;
     private EntityMappings cmpMappings;
     private final Map<String,Object> altDDs = new HashMap<String,Object>();
@@ -276,6 +277,10 @@ public class AppModule implements Deploy
         return resources;
     }
 
+    public Collection<org.apache.openejb.config.sys.Service> getServices() {
+        return services;
+    }
+
     public Collection<DeploymentModule> getDeploymentModule() {
         ArrayList<DeploymentModule> modules = new ArrayList<DeploymentModule>();
         modules.addAll(ejbModules);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Thu Aug 16 13:02:53 2012
@@ -165,7 +165,7 @@ public class AutoConfig implements Dynam
     public synchronized AppModule deploy(AppModule appModule) throws OpenEJBException {
         AppResources appResources = new AppResources(appModule);
 
-        processDataSourceDefinitions(appModule);
+        processApplicationResources(appModule);
 
         for (EjbModule ejbModule : appModule.getEjbModules()) {
             processActivationConfig(ejbModule);
@@ -846,7 +846,7 @@ public class AutoConfig implements Dynam
         }
     }
 
-    private void processDataSourceDefinitions(AppModule module) throws OpenEJBException {
+    private void processApplicationResources(AppModule module) throws OpenEJBException {
         Collection<Resource> resources = module.getResources();
 
         if (resources.size() == 0) return;

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Thu Aug 16 13:02:53 2012
@@ -404,6 +404,12 @@ public class ConfigurationFactory implem
         sys.containerSystem = new ContainerSystemInfo();
         sys.facilities = new FacilitiesInfo();
 
+        // listener + some config can be defined as service
+        for (Service service : openejb.getServices()) {
+            final ServiceInfo info = configureService(service, ServiceInfo.class);
+            sys.facilities.services.add(info);
+        }
+
         for (final JndiProvider provider : openejb.getJndiProvider()) {
             final JndiContextInfo info = configureService(provider, JndiContextInfo.class);
             sys.facilities.remoteJndiContexts.add(info);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Thu Aug 16 13:02:53 2012
@@ -96,7 +96,7 @@ import static org.apache.openejb.util.UR
  */
 public class DeploymentLoader implements DeploymentFilterable {
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_CONFIG, "org.apache.openejb.util.resources");
-    private static final String OPENEJB_ALTDD_PREFIX = "openejb.altdd.prefix";
+    public static final String OPENEJB_ALTDD_PREFIX = "openejb.altdd.prefix";
     private static final String ddDir = "META-INF/";
     private boolean scanManagedBeans = true;
     private static final Collection<String> KNOWN_DESCRIPTORS = Arrays.asList("web.xml", "ejb-jar.xml", "openejb-jar.xml", "env-entries.properties", "beans.xml", "ra.xml", "application.xml", "application-client.xml", "persistence-fragment.xml", "persistence.xml", "validation.xml", NewLoaderLogic.EXCLUSION_FILE);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java Thu Aug 16 13:02:53 2012
@@ -92,6 +92,7 @@ public class Module {
         this.appModule = appModule;
         if (resources != null) {
             this.appModule.getResources().addAll(resources.getResource());
+            this.appModule.getServices().addAll(resources.getService());
         }
     }
 

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java Thu Aug 16 13:02:53 2012
@@ -260,19 +260,8 @@ public class ReadDescriptors implements 
         URL url = getUrl(module, "resources.xml");
         if (url != null) {
             try {
-                Resources openejb = JaxbOpenejb.unmarshal(Resources.class, IO.read(url));
+                final Resources openejb = JaxbOpenejb.unmarshal(Resources.class, IO.read(url));
                 module.initResources(openejb);
-
-                // warn if other entities than resources were declared
-                if (openejb.getContainer().size() > 0) {
-                    logger.warning("containers can't be declared at module level");
-                }
-                if (openejb.getConnectionManager() != null) {
-                    logger.warning("connection manager can't be declared at module level");
-                }
-                if (openejb.getJndiProvider().size() > 0) {
-                    logger.warning("jndi providers can't be declared at module level");
-                }
             } catch (Exception e) {
                 logger.warning("can't read " + url.toString() + " to load resources for module " + module.toString(), e);
             }

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/MapService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/MapService.java?rev=1373814&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/MapService.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/MapService.java Thu Aug 16 13:02:53 2012
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.config.sys;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "")
+@XmlRootElement(name = "Maps")
+public class MapService extends AbstractService implements Map<Object, Object> {
+    @Override
+    public int size() {
+        return getProperties().size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return getProperties().isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+        return getProperties().containsKey(key);
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+        return getProperties().containsValue(value);
+    }
+
+    @Override
+    public Object get(Object key) {
+        return getProperties().get(key);
+    }
+
+    @Override
+    public Object put(Object key, Object value) {
+        return getProperties().put(key, value);
+    }
+
+    @Override
+    public Object remove(Object key) {
+        return getProperties().remove(key);
+    }
+
+    @Override
+    public void putAll(Map<? extends Object, ? extends Object> m) {
+        getProperties().putAll(m);
+    }
+
+    @Override
+    public void clear() {
+        getProperties().clear();
+    }
+
+    @Override
+    public Set<Object> keySet() {
+        return getProperties().keySet();
+    }
+
+    @Override
+    public Collection<Object> values() {
+        return getProperties().values();
+    }
+
+    @Override
+    public Set<Entry<Object, Object>> entrySet() {
+        return getProperties().entrySet();
+    }
+}

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java Thu Aug 16 13:02:53 2012
@@ -35,11 +35,8 @@ import java.util.List;
  *   &lt;complexContent>
  *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
  *       &lt;sequence>
- *         &lt;element ref="{http://www.openejb.org/System/Configuration}Container" maxOccurs="unbounded"/>
- *         &lt;element ref="{http://www.openejb.org/System/Configuration}JndiProvider" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element ref="{http://www.openejb.org/System/Configuration}ConnectionManager" minOccurs="0"/>
- *         &lt;element ref="{http://www.openejb.org/System/Configuration}Connector" maxOccurs="unbounded" minOccurs="0"/>
  *         &lt;element ref="{http://www.openejb.org/System/Configuration}Resource" maxOccurs="unbounded" minOccurs="0"/>
+ *         &lt;element ref="{http://www.openejb.org/System/Configuration}Service" maxOccurs="unbounded" minOccurs="0"/>
  *       &lt;/sequence>
  *     &lt;/restriction>
  *   &lt;/complexContent>
@@ -47,116 +44,16 @@ import java.util.List;
  * </pre>
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {"container", "jndiProvider", "connectionManager", "resource"})
+@XmlType(name = "", propOrder = {"resource", "service"})
 @XmlRootElement(name = "resources")
 public class Resources {
 
-    @XmlElement(name = "Container", required = true)
-    protected List<Container> container;
-
-    @XmlElement(name = "JndiProvider")
-    protected List<JndiProvider> jndiProvider;
-
-    @XmlElement(name = "ConnectionManager")
-    protected ConnectionManager connectionManager;
-
     @XmlElement(name = "Resource")
     protected List<Resource> resource;
 
-    /**
-     * Gets the value of the container property.
-     * <p/>
-     * <p/>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the container property.
-     * <p/>
-     * <p/>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getContainer().add(newItem);
-     * </pre>
-     * <p/>
-     * <p/>
-     * <p/>
-     * Objects of the following type(s) are allowed in the list
-     * {@link org.apache.openejb.config.sys.Container }
-     */
-    public List<Container> getContainer() {
-        if (container == null) {
-            container = new ArrayList<Container>();
-        }
-        return this.container;
-    }
-
-    /**
-     * Gets the value of the jndiProvider property.
-     * <p/>
-     * <p/>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the jndiProvider property.
-     * <p/>
-     * <p/>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getJndiProvider().add(newItem);
-     * </pre>
-     * <p/>
-     * <p/>
-     * <p/>
-     * Objects of the following type(s) are allowed in the list
-     * {@link org.apache.openejb.config.sys.JndiProvider }
-     */
-    public List<JndiProvider> getJndiProvider() {
-        if (jndiProvider == null) {
-            jndiProvider = new ArrayList<JndiProvider>();
-        }
-        return this.jndiProvider;
-    }
+    @XmlElement(name = "Service")
+    protected List<Service> service;
 
-    /**
-     * Gets the value of the connectionManager property.
-     *
-     * @return possible object is
-     *         {@link org.apache.openejb.config.sys.ConnectionManager }
-     */
-    public ConnectionManager getConnectionManager() {
-        return connectionManager;
-    }
-
-    /**
-     * Sets the value of the connectionManager property.
-     *
-     * @param value allowed object is
-     *              {@link org.apache.openejb.config.sys.ConnectionManager }
-     */
-    public void setConnectionManager(ConnectionManager value) {
-        this.connectionManager = value;
-    }
-
-    /**
-     * Gets the value of the resource property.
-     * <p/>
-     * <p/>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the resource property.
-     * <p/>
-     * <p/>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getResource().add(newItem);
-     * </pre>
-     * <p/>
-     * <p/>
-     * <p/>
-     * Objects of the following type(s) are allowed in the list
-     * {@link org.apache.openejb.config.sys.Resource }
-     */
     public List<Resource> getResource() {
         if (resource == null) {
             resource = new ArrayList<Resource>();
@@ -165,15 +62,18 @@ public class Resources {
         return this.resource;
     }
 
+    public List<Service> getService() {
+        if (service == null) {
+            service = new ArrayList<Service>();
+        }
+        return service;
+    }
+
     public void add(Object service) {
-        if (service instanceof Container) {
-            getContainer().add((Container) service);
-        } else if (service instanceof Resource) {
+        if (service instanceof Resource) {
             getResource().add((Resource) service);
-        } else if (service instanceof JndiProvider) {
-            getJndiProvider().add((JndiProvider) service);
-        } else if (service instanceof ConnectionManager) {
-            setConnectionManager((ConnectionManager) service);
+        } else if (service instanceof Service) {
+            getService().add((Service) service);
         }
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/PropertiesHelper.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/PropertiesHelper.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/PropertiesHelper.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/PropertiesHelper.java Thu Aug 16 13:02:53 2012
@@ -17,6 +17,8 @@
 package org.apache.openejb.util;
 
 import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 public final class PropertiesHelper {
@@ -37,4 +39,12 @@ public final class PropertiesHelper {
         }
         return new String(baos.toByteArray());
     }
+
+    public static Map<String, Object> map(final Properties props) {
+        final Map<String, Object> map = new HashMap<String, Object>();
+        for (Map.Entry<Object, Object> entry : props.entrySet()) {
+            map.put((String) entry.getKey(), entry.getValue());
+        }
+        return map;
+    }
 }

Modified: openejb/trunk/openejb/examples/server-events/src/main/java/org/superbiz/event/MyListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/server-events/src/main/java/org/superbiz/event/MyListener.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/server-events/src/main/java/org/superbiz/event/MyListener.java (original)
+++ openejb/trunk/openejb/examples/server-events/src/main/java/org/superbiz/event/MyListener.java Thu Aug 16 13:02:53 2012
@@ -23,13 +23,13 @@ import java.util.logging.Logger;
 /**
  * registered as service in openejb.xml, tomee.xml, resources.xml or openejb system properties:
  *
- * listener = new://Service?type=org.superbiz.event.MyListener
+ * listener = new://Service?class-name=org.superbiz.event.MyListener
  * listener.logAllEvent = true
  */
 public class MyListener {
     private static final Logger LOGGER = Logger.getLogger(MyListener.class.getName());
 
-    private boolean logAllEvent = false;
+    private static boolean logAllEvent = false; // static for testing
 
     public void global(@Observes final Object event) {
         LOGGER.info(">>> an event occured -> " + event.toString());
@@ -39,4 +39,8 @@ public class MyListener {
     public void setLogAllEvent(boolean logAllEvent) {
         this.logAllEvent = logAllEvent;
     }
+
+    public static boolean isLogAllEvent() {
+        return logAllEvent;
+    }
 }

Modified: openejb/trunk/openejb/examples/server-events/src/test/java/org/superbiz/event/ListenerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/server-events/src/test/java/org/superbiz/event/ListenerTest.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/server-events/src/test/java/org/superbiz/event/ListenerTest.java (original)
+++ openejb/trunk/openejb/examples/server-events/src/test/java/org/superbiz/event/ListenerTest.java Thu Aug 16 13:02:53 2012
@@ -26,6 +26,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 @RunWith(Arquillian.class)
 public class ListenerTest {
@@ -39,5 +40,6 @@ public class ListenerTest {
     @Test
     public void check() {
         assertEquals("listener-test", AutoDiscoveredListener.getAppName());
+        assertTrue(MyListener.isLogAllEvent());
     }
 }

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=1373814&r1=1373813&r2=1373814&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 Thu Aug 16 13:02:53 2012
@@ -17,7 +17,6 @@
 package org.apache.openejb.server.cxf.rs;
 
 import org.apache.cxf.endpoint.Server;
-import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
@@ -28,70 +27,38 @@ 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.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.util.ServiceInfos;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpRequestImpl;
 import org.apache.openejb.server.httpd.HttpResponse;
 import org.apache.openejb.server.rest.RsHttpListener;
-import org.apache.openejb.util.ListConfigurator;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.openejb.util.ObjectRecipeHelper;
 import org.apache.webbeans.config.WebBeansContext;
-import org.apache.xbean.recipe.ObjectRecipe;
 
 import javax.naming.Context;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.ws.rs.core.Application;
 import javax.xml.bind.Marshaller;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-/**
- * System property:
- * <ul>
- *     <li>-Dopenejb.cxf.jax-rs.providers=&lt;qualified name&gt;:default</li>
- * </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);
+    private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_RS, CxfRsHttpListener.class);
 
-    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.jaxb.properties";
-
-    public static final String OPENEJB_JAXRS_READ_PROPERTIES = "openejb.jaxrs.read-properties";
-    public static final String OPENEJB_JAXRS_CXF_FEATURES = "openejb.jaxrs.cxf.features";
-
-    private static final List<Object> PROVIDERS = createConfiguredProviderList("", CxfRsHttpListener.class.getClassLoader());
-    private static final Map<String, Object> cxfProperties = toMap(SystemInstance.get().getProperty(OPENEJB_CXF_PROPERTIES));
+    public static final String CXF_JAXRS_PREFIX = "cxf.jaxrs.";
+    public static final String PROVIDERS_KEY = CXF_JAXRS_PREFIX + "providers";
 
     private HTTPTransportFactory transportFactory;
     private AbstractHTTPDestination destination;
     private Server server;
 
-    private static List<AbstractFeature> GLOBAL_FEATURES = new ArrayList<AbstractFeature>();
-    static {
-        final List<AbstractFeature> features = ListConfigurator.getList(
-                SystemInstance.get().getProperties(), OPENEJB_JAXRS_CXF_FEATURES,
-                CxfRsHttpListener.class.getClassLoader(), AbstractFeature.class);
-        if (features != null) {
-            GLOBAL_FEATURES.addAll(features);
-        }
-    }
-
     public CxfRsHttpListener(HTTPTransportFactory httpTransportFactory) {
         transportFactory = httpTransportFactory;
     }
@@ -114,26 +81,25 @@ public class CxfRsHttpListener implement
     }
 
     @Override
-    public void deploySingleton(String fullContext, Object o, Application appInstance, Collection<Class<?>> additionalProviders) {
-        deploy(o.getClass(), fullContext, new SingletonResourceProvider(o), o, appInstance, null, additionalProviders);
+    public void deploySingleton(String fullContext, Object o, Application appInstance,
+                                Collection<Class<?>> additionalProviders, Collection<ServiceInfo> services) {
+        deploy(o.getClass(), fullContext, new SingletonResourceProvider(o), o, appInstance, null, additionalProviders, services);
     }
 
     @Override
-    public void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, Context context, WebBeansContext owbCtx, Collection<Class<?>> additionalProviders) {
-        deploy(loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loadedClazz, injections, context, owbCtx), null, app, null, additionalProviders);
+    public void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections,
+                           Context context, WebBeansContext owbCtx, Collection<Class<?>> additionalProviders, Collection<ServiceInfo> services) {
+        deploy(loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loadedClazz, injections, context, owbCtx),
+                            null, app, null, additionalProviders, services);
     }
 
     @Override
-    public void deployEJB(String fullContext, BeanContext beanContext, Collection<Class<?>> additionalProviders) {
-        deploy(beanContext.getBeanClass(), fullContext, null, null, null, new OpenEJBEJBInvoker(beanContext), additionalProviders);
+    public void deployEJB(String fullContext, BeanContext beanContext, Collection<Class<?>> additionalProviders, Collection<ServiceInfo> services) {
+        deploy(beanContext.getBeanClass(), fullContext, null, null, null, new OpenEJBEJBInvoker(beanContext), additionalProviders, services);
     }
 
-    private void deploy(Class<?> clazz, String address, ResourceProvider rp, Object serviceBean, Application app, Invoker invoker, Collection<Class<?>> additionalProviders) {
-        final List<Object> providers = createConfiguredProviderList(nameForProviders(clazz), clazz.getClassLoader());
-        if (additionalProviders != null && !additionalProviders.isEmpty()) {
-            providers.addAll(instantiate(additionalProviders));
-        }
-
+    private void deploy(Class<?> clazz, String address, ResourceProvider rp, Object serviceBean, Application app, Invoker invoker,
+                        Collection<Class<?>> additionalProviders, Collection<ServiceInfo> services) {
         final String impl;
         if (serviceBean != null) {
             impl = serviceBean.getClass().getName();
@@ -141,35 +107,34 @@ public class CxfRsHttpListener implement
             impl = clazz.getName();
         }
 
-        final Map<String, Object> specificProperties = toMap(SystemInstance.get().getProperty(OPENEJB_CXF_PROPERTIES + "." + impl + "."));
-
         final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
         factory.setResourceClasses(clazz);
         factory.setDestinationFactory(transportFactory);
         factory.setBus(transportFactory.getBus());
         factory.setAddress(address);
-        factory.setProviders(providers);
-        if (factory.getProperties() == null) {
-            factory.setProperties(new HashMap<String, Object>());
-        }
 
-        if (specificProperties != null) {
-            factory.getProperties().putAll(specificProperties);
-        } else if (cxfProperties != null) {
-            factory.getProperties().putAll(cxfProperties);
-        }
+        CxfUtil.configureEndpoint(factory, services, CXF_JAXRS_PREFIX, impl);
 
-        if (SystemInstance.get().getOptions().get(OPENEJB_JAXRS_READ_PROPERTIES, false)) {
-            List<AbstractFeature> features = ListConfigurator.getList(
-                    SystemInstance.get().getProperties(), clazz.getName() + "." + OPENEJB_JAXRS_CXF_FEATURES,
-                    clazz.getClassLoader(), AbstractFeature.class);
-            if (features == null) {
-                features = new ArrayList<AbstractFeature>();
+        // providers
+        final ServiceInfo info = ServiceInfos.findByClass(services, impl);
+        List<Object> providers = null;
+        if (info != null) {
+            final String provider = info.properties.getProperty(PROVIDERS_KEY);
+            if (provider != null) {
+                providers = ServiceInfos.resolve(services, provider.split(","));
+                if (providers != null && additionalProviders != null && !additionalProviders.isEmpty()) {
+                    providers.addAll(providers(services, info, additionalProviders));
+                }
+                factory.setProviders(providers);
             }
-            features.addAll(GLOBAL_FEATURES);
-            if (!features.isEmpty()) {
-                factory.setFeatures(features);
+        }
+        if (providers == null) {
+            providers = new ArrayList<Object>();
+            providers.addAll(defaultProviders());
+            if (additionalProviders != null && !additionalProviders.isEmpty()) {
+                providers.addAll(providers(services, info, additionalProviders));
             }
+            factory.setProviders(providers);
         }
 
         if (rp != null) {
@@ -191,117 +156,44 @@ public class CxfRsHttpListener implement
         destination = (AbstractHTTPDestination) server.getDestination();
     }
 
-    private Collection<Object> instantiate(final Collection<Class<?>> classes) {
-        final List<Object> instances = new ArrayList<Object>();
-        for (Class<?> clazz : classes) {
-            try {
-                instances.add(clazz.newInstance());
-            } catch (InstantiationException e) {
-                LOGGER.warning("can't instantiate '" + clazz.getName() + "'", e);
-            } catch (IllegalAccessException e) {
-                LOGGER.warning("can't access '" + clazz.getName() + "'", e);
-            }
+    private Collection<Object> providers(final Collection<ServiceInfo> services, final ServiceInfo service, final Collection<Class<?>> additionalProviders) {
+        final Collection<Object> instances = new ArrayList<Object>();
+
+        final String prefix;
+        if (service != null) {
+            prefix = service.id + ".";
+        } else {
+            prefix = "";
         }
-        return instances;
-    }
 
-    private String nameForProviders(Class<?> clazz) {
-        if (clazz == null) {
-            return "default"; // whatever it is it will be overriden by default providers
+        for (Class<?> clazz : additionalProviders) {
+            final Object instance = ServiceInfos.resolve(services, prefix + clazz.getName());
+            if (instance != null) {
+                instances.add(instance);
+            } else {
+                try {
+                    instances.add(clazz.newInstance());
+                } catch (Exception e) {
+                    LOGGER.error("can't instantiate " + clazz.getName(), e);
+                }
+            }
         }
-        return clazz.getName();
+        return instances;
     }
 
     public void undeploy() {
         server.stop();
     }
 
-    private static List<Object> createConfiguredProviderList(final String prefix, final ClassLoader loader) {
-        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
-        if (PROVIDERS != null && (providersProperty == null || providersProperty.trim().isEmpty())) {
-            return PROVIDERS;
-        }
-
+    private static List<Object> defaultProviders() {
         final JAXBElementProvider jaxb = new JAXBElementProvider();
         final Map<String, Object> jaxbProperties = new HashMap<String, Object> ();
         jaxbProperties.put(Marshaller.JAXB_FRAGMENT, true);
         jaxb.setMarshallerProperties(jaxbProperties);
 
-        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()) {
-            String[] providers = providersProperty.split(",|;| ");
-            for (String provider : providers) {
-                if (DEFAULT_CXF_JAXRS_PROVIDERS_KEY.equals(provider)) {
-                    providerList.add(json);
-                    providerList.add(jaxb);
-                } else {
-                    try {
-                        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
-                    }
-                }
-            }
-            return providerList;
-        }
-
-        providerList.add(jaxb);
-        providerList.add(json);
-        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;
-            }
+        final JSONProvider json = new JSONProvider();
+        json.setSerializeAsArray(true);
 
-            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;
-        }
-
-        final Map<String, Object> properties = new HashMap<String, Object>();
-        for (String str : property.split(",| ")) {
-            final String[] kv = str.split("=");
-            if (kv.length == 2) {
-                properties.put(kv[0], kv[1]);
-            } else {
-                properties.put(str, "");
-            }
-        }
-        return properties;
+        return Arrays.asList((Object) jaxb, json);
     }
 }

Modified: openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomExceptionMapperTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomExceptionMapperTest.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomExceptionMapperTest.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomExceptionMapperTest.java Thu Aug 16 13:02:53 2012
@@ -17,33 +17,32 @@
 
 package org.apache.openejb.server.cxf.rs;
 
-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.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.config.DeploymentFilterable;
+import org.apache.openejb.config.DeploymentLoader;
 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.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import java.util.Properties;
+
 import static junit.framework.Assert.assertEquals;
 
 public class CustomExceptionMapperTest {
     private static EJBContainer container;
-    private static String providers;
 
     @BeforeClass public static void start() throws Exception {
-        providers = System.getProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
         final Properties properties = new Properties();
         properties.setProperty(DeploymentFilterable.CLASSPATH_INCLUDE, ".*openejb-cxf-rs.*");
         properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
-        properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, EM.class.getName());
+        properties.setProperty(DeploymentLoader.OPENEJB_ALTDD_PREFIX, "em");
         container = EJBContainer.createEJBContainer(properties);
     }
 
@@ -51,11 +50,6 @@ public class CustomExceptionMapperTest {
         if (container != null) {
             container.close();
         }
-        if (providers == null) {
-            System.clearProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
-        } else {
-            System.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, providers);
-        }
     }
 
     @Test public void exceptionMapper() {

Modified: 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=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderTest.java Thu Aug 16 13:02:53 2012
@@ -20,6 +20,7 @@ package org.apache.openejb.server.cxf.rs
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.config.DeploymentFilterable;
+import org.apache.openejb.config.DeploymentLoader;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -43,15 +44,12 @@ import static junit.framework.Assert.ass
 
 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();
+        final Properties properties = new Properties();
         properties.setProperty(DeploymentFilterable.CLASSPATH_INCLUDE, ".*openejb-cxf-rs.*");
         properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
-        properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, ReverseProvider.class.getName());
-        properties.setProperty(CustomSpecificService.class.getName() + CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_SUFFIX, ConstantProvider.class.getName());
+        properties.setProperty(DeploymentLoader.OPENEJB_ALTDD_PREFIX, "custom");
         container = EJBContainer.createEJBContainer(properties);
     }
 
@@ -59,11 +57,6 @@ public class CustomProviderTest {
         if (container != null) {
             container.close();
         }
-        if (providers == null) {
-            System.clearProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY);
-        } else {
-            System.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, providers);
-        }
     }
 
     @Test public void customProvider() {

Modified: 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=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CustomProviderWithConfigTest.java Thu Aug 16 13:02:53 2012
@@ -16,11 +16,14 @@
  */
 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 org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.config.DeploymentFilterable;
+import org.apache.openejb.config.DeploymentLoader;
+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;
@@ -30,12 +33,11 @@ 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.apache.openejb.config.DeploymentFilterable;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
+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;
 
@@ -47,9 +49,8 @@ public class CustomProviderWithConfigTes
         final Properties properties = new Properties();
         properties.setProperty(DeploymentFilterable.CLASSPATH_INCLUDE, ".*openejb-cxf-rs.*");
         properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
-        properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY, ConfigurableProvider.class.getName());
-        properties.setProperty("openejb.cxf.rs.jaxb.properties", "faultStackTraceEnabled=true");
-        properties.setProperty(CxfRsHttpListener.OPENEJB_CXF_JAXRS_PROVIDERS_KEY + "." + ConfigurableProvider.class.getName() + ".str", "done!");
+        properties.setProperty(DeploymentLoader.OPENEJB_ALTDD_PREFIX, "custom-config");
+        // cxf.jaxrs.properties = faultStackTraceEnabled=true
         container = EJBContainer.createEJBContainer(properties);
     }
 

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=1373814&r1=1373813&r2=1373814&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 Thu Aug 16 13:02:53 2012
@@ -50,7 +50,7 @@ public class DiscoverCustomProviderTest 
         properties.setProperty(DeploymentFilterable.CLASSPATH_INCLUDE, ".*openejb-cxf-rs.*");
         properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
         properties.setProperty(RESTService.OPENEJB_JAXRS_PROVIDERS_AUTO_PROP, "true");
-        properties.setProperty("openejb.cxf.rs.jaxb.properties", "faultStackTraceEnabled=true");
+        properties.setProperty(CxfRsHttpListener.CXF_JAXRS_PREFIX + "debug", "true");
         container = EJBContainer.createEJBContainer(properties);
     }
 

Modified: openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/FeatureTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/FeatureTest.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/FeatureTest.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/FeatureTest.java Thu Aug 16 13:02:53 2012
@@ -4,11 +4,16 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.feature.AbstractFeature;
 import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.config.sys.Resources;
+import org.apache.openejb.config.sys.Service;
+import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.StatelessBean;
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.junit.Configuration;
 import org.apache.openejb.junit.Module;
 import org.apache.openejb.server.cxf.rs.beans.MySecondRestClass;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -22,16 +27,32 @@ public class FeatureTest {
     public Properties config() {
         return new Properties() {{
             setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
-            setProperty(CxfRsHttpListener.OPENEJB_JAXRS_READ_PROPERTIES, "true");
-            setProperty(MySecondRestClass.class.getName() + "." + CxfRsHttpListener.OPENEJB_JAXRS_CXF_FEATURES, MyFeature.class.getName());
         }};
     }
 
     @Module
-    public StatelessBean app() {
+    public EjbModule app() {
         final StatelessBean bean = (StatelessBean) new StatelessBean(MySecondRestClass.class).localBean();
         bean.setRestService(true);
-        return bean;
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(bean);
+
+        final EjbModule module = new EjbModule(ejbJar);
+        final Resources resources = new Resources();
+
+        final Service beanService = new Service(null);
+        beanService.setClassName(MySecondRestClass.class.getName());
+        beanService.getProperties().setProperty(CxfRsHttpListener.CXF_JAXRS_PREFIX + CxfUtil.FEATURES, "my-feature");
+        resources.getService().add(beanService);
+
+        final Service feature = new Service("my-feature", null);
+        feature.setClassName(MyFeature.class.getName());
+        resources.getService().add(feature);
+
+        module.initResources(resources);
+
+        return module;
     }
 
     @Test

Added: openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom-config.resources.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom-config.resources.xml?rev=1373814&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom-config.resources.xml (added)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom-config.resources.xml Thu Aug 16 13:02:53 2012
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+      contributor license agreements.  See the NOTICE file distributed with
+      this work for additional information regarding copyright ownership.
+      The ASF licenses this file to You under the Apache License, Version 2.0
+      (the "License"); you may not use this file except in compliance with
+      the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<resources>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderWithConfigTest$CustomizedService">
+    cxf.jaxrs.providers = configured
+  </Service>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderWithConfigTest$ConfigurableProvider" id="configured">
+    str = done!
+  </Service>
+</resources>

Added: openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom.resources.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom.resources.xml?rev=1373814&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom.resources.xml (added)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/custom.resources.xml Thu Aug 16 13:02:53 2012
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+      contributor license agreements.  See the NOTICE file distributed with
+      this work for additional information regarding copyright ownership.
+      The ASF licenses this file to You under the Apache License, Version 2.0
+      (the "License"); you may not use this file except in compliance with
+      the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<resources>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderTest$CustomService">
+    cxf.jaxrs.providers = reverse
+  </Service>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderTest$ReverseProvider" id="reverse" />
+
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderTest$CustomSpecificService">
+    cxf.jaxrs.providers = constant
+  </Service>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomProviderTest$ConstantProvider" id="constant" />
+</resources>

Added: openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/em.resources.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/em.resources.xml?rev=1373814&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/em.resources.xml (added)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/test/resources/META-INF/em.resources.xml Thu Aug 16 13:02:53 2012
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+      contributor license agreements.  See the NOTICE file distributed with
+      this work for additional information regarding copyright ownership.
+      The ASF licenses this file to You under the Apache License, Version 2.0
+      (the "License"); you may not use this file except in compliance with
+      the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<resources>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomExceptionMapperTest$RestWithExceptionMapper">
+    cxf.jaxrs.providers = em
+  </Service>
+  <Service class-name="org.apache.openejb.server.cxf.rs.CustomExceptionMapperTest$EM" id="em" />
+</resources>

Modified: openejb/trunk/openejb/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java Thu Aug 16 13:02:53 2012
@@ -19,8 +19,32 @@ package org.apache.openejb.server.cxf.tr
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
+import org.apache.cxf.databinding.DataBinding;
+import org.apache.cxf.endpoint.AbstractEndpointFactory;
+import org.apache.cxf.feature.AbstractFeature;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.message.Message;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.util.ServiceInfos;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.PropertiesHelper;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
 
 public final class CxfUtil {
+    public static final String ENDPOINT_PROPERTIES = "properties";
+    public static final String FEATURES = "features";
+    public static final String IN_INTERCEPTORS = "in-interceptors";
+    public static final String IN_FAULT_INTERCEPTORS = "in-fault-interceptors";
+    public static final String OUT_INTERCEPTORS = "out-interceptors";
+    public static final String OUT_FAULT_INTERCEPTORS = "out-fault-interceptors";
+    public static final String DATABINDING = "databinding";
+    public static final String ADDRESS = "address";
+    public static final String DEBUG = "debug";
+
     private CxfUtil() {
         // no-op
     }
@@ -48,4 +72,80 @@ public final class CxfUtil {
             Thread.currentThread().setContextClassLoader(cl);
         }
     }
+
+    public static void configureEndpoint(final AbstractEndpointFactory svrFactory, final Collection<ServiceInfo> availableServices, final String prefix, final String beanId) {
+        final ServiceInfo beanInfo = ServiceInfos.findByClass(availableServices, beanId);
+        if (beanInfo != null) {
+            final Properties beanConfig = beanInfo.properties;
+
+            // endpoint properties
+            final Properties properties = ServiceInfos.serviceProperties(availableServices, beanConfig.getProperty(prefix + ENDPOINT_PROPERTIES));
+            if (properties != null) {
+                svrFactory.setProperties(PropertiesHelper.map(properties));
+            }
+            if (SystemInstance.get().getOptions().get(prefix + DEBUG, false)) {
+                svrFactory.getProperties(true).put("faultStackTraceEnabled", "true");
+            }
+
+            // endpoint features
+            final String featuresIds = beanConfig.getProperty(prefix + FEATURES);
+            if (featuresIds != null) {
+                final List<?> features = ServiceInfos.resolve(availableServices, featuresIds.split(","));
+                for (Object instance : features) {
+                    if (!AbstractFeature.class.isInstance(instance)) {
+                        throw new OpenEJBRuntimeException("feature should inherit from " + AbstractFeature.class.getName());
+                    }
+                }
+                svrFactory.setFeatures((List<AbstractFeature>) features);
+            }
+
+            // interceptors
+            final String inInterceptorsIds = beanConfig.getProperty(prefix + IN_INTERCEPTORS);
+            if (inInterceptorsIds != null && !inInterceptorsIds.trim().isEmpty()) {
+                svrFactory.setInInterceptors(createInterceptors(availableServices, inInterceptorsIds));
+            }
+
+            final String inFaultInterceptorsIds = beanConfig.getProperty(prefix + IN_FAULT_INTERCEPTORS);
+            if (inFaultInterceptorsIds != null && !inFaultInterceptorsIds.trim().isEmpty()) {
+                svrFactory.setInFaultInterceptors(createInterceptors(availableServices, inFaultInterceptorsIds));
+            }
+
+            final String outInterceptorsIds = beanConfig.getProperty(prefix + OUT_INTERCEPTORS);
+            if (outInterceptorsIds != null && !outInterceptorsIds.trim().isEmpty()) {
+                svrFactory.setOutInterceptors(createInterceptors(availableServices, outInterceptorsIds));
+            }
+
+            final String outFaultInterceptorsIds = beanConfig.getProperty(prefix + OUT_FAULT_INTERCEPTORS);
+            if (outFaultInterceptorsIds != null && !outFaultInterceptorsIds.trim().isEmpty()) {
+                svrFactory.setOutFaultInterceptors(createInterceptors(availableServices, outFaultInterceptorsIds));
+            }
+
+            // databinding
+            final String databinding = beanConfig.getProperty(prefix + DATABINDING);
+            if (databinding != null && !databinding.trim().isEmpty()) {
+                final Object instance = ServiceInfos.resolve(availableServices, databinding);
+                if (!DataBinding.class.isInstance(instance)) {
+                    throw new OpenEJBRuntimeException(instance + " is not a " + DataBinding.class.getName()
+                            + ", please check configuration of service [id=" + databinding + "]");
+                }
+                svrFactory.setDataBinding((DataBinding) instance);
+            }
+
+            // address: easier than using openejb-jar.xml
+            final String changedAddress = beanConfig.getProperty(prefix + ADDRESS);
+            if (changedAddress != null && !changedAddress.trim().isEmpty()) {
+                svrFactory.setAddress(changedAddress);
+            }
+        }
+    }
+
+    private static List<Interceptor<? extends Message>> createInterceptors(final Collection<ServiceInfo> availableServices, final String ids) {
+        final List<?> instances = ServiceInfos.resolve(availableServices, ids.split(","));
+        for (Object instance : instances) {
+            if (!Interceptor.class.isInstance(instance)) {
+                throw new OpenEJBRuntimeException("interceptors should implement " + Interceptor.class.getName());
+            }
+        }
+        return (List<Interceptor<? extends Message>>) instances;
+    }
 }

Modified: openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java Thu Aug 16 13:02:53 2012
@@ -18,19 +18,26 @@
 package org.apache.openejb.server.cxf;
 
 import org.apache.cxf.Bus;
+import org.apache.cxf.databinding.DataBinding;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.endpoint.ServerImpl;
 import org.apache.cxf.feature.AbstractFeature;
+import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
 import org.apache.cxf.jaxws.handler.PortInfoImpl;
 import org.apache.cxf.jaxws.support.JaxWsEndpointImpl;
 import org.apache.cxf.jaxws.support.JaxWsImplementorInfo;
 import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean;
+import org.apache.cxf.message.Message;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.util.ServiceInfos;
 import org.apache.openejb.core.webservices.HandlerResolverImpl;
 import org.apache.openejb.core.webservices.PortData;
-import org.apache.openejb.util.ListConfigurator;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
+import org.apache.openejb.util.PropertiesHelper;
 
 import javax.naming.Context;
 import javax.xml.transform.Source;
@@ -38,13 +45,15 @@ import javax.xml.ws.Binding;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.http.HTTPBinding;
 import javax.xml.ws.soap.SOAPBinding;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.Executor;
 
 public abstract class CxfEndpoint {
-	protected Bus bus;
+    public static final String CXF_JAXWS_PREFIX = "cxf.jaxws.";
+    protected Bus bus;
 
 	protected PortData port;
 	
@@ -64,13 +73,16 @@ public abstract class CxfEndpoint {
 	
 	protected HTTPTransportFactory httpTransportFactory;
 
-	public CxfEndpoint(Bus bus, PortData port, Context context,
-			Object implementor, HTTPTransportFactory httpTransportFactory) {
+    protected Collection<ServiceInfo> availableServices;
+
+    public CxfEndpoint(Bus bus, PortData port, Context context,
+			Object implementor, HTTPTransportFactory httpTransportFactory, Collection<ServiceInfo> services) {
 		this.bus = bus;
 		this.port = port;
 		this.context = context;
 		this.implementor = implementor;
 		this.httpTransportFactory = httpTransportFactory;
+        this.availableServices = services;
 		this.bus.setExtension(this, CxfEndpoint.class);
 	}
 
@@ -151,8 +163,9 @@ public abstract class CxfEndpoint {
 		svrFactory.setStart(false);
 		svrFactory.setServiceBean(implementor);
         svrFactory.setDestinationFactory(httpTransportFactory);
-        svrFactory.setProperties(getEndpointProperties());
-        svrFactory.setFeatures(ListConfigurator.getList(getFeaturesProperties(), getFeaturePropertyKey(), getImplementorClass().getClassLoader(), AbstractFeature.class));
+
+        // look for bean info if exists
+        CxfUtil.configureEndpoint(svrFactory, availableServices, CXF_JAXWS_PREFIX, getImplementorClass().getName());
 
 		if (HTTPBinding.HTTP_BINDING.equals(implInfo.getBindingType())) {
 			svrFactory.setTransportId("http://cxf.apache.org/bindings/xformat");
@@ -172,14 +185,6 @@ public abstract class CxfEndpoint {
 		server.start();
 	}
 
-    protected abstract Properties getFeaturesProperties();
-
-    protected abstract String getFeaturePropertyKey();
-
-    protected Map<String,Object> getEndpointProperties() {
-        return null;
-    }
-
     protected void init() {
         // no-op
 	}

Modified: openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java Thu Aug 16 13:02:53 2012
@@ -21,6 +21,8 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
 import org.apache.cxf.feature.AbstractFeature;
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.core.webservices.PortData;
 import org.apache.openejb.server.cxf.client.SaajInterceptor;
 import org.apache.openejb.server.cxf.ejb.EjbWsContainer;
@@ -32,13 +34,14 @@ import org.apache.openejb.util.ListConfi
 
 import javax.naming.Context;
 import java.net.URL;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TreeMap;
 
 public class CxfService extends WsService {
-    public static final String OPENEJB_JAXWS_CXF_FEATURES = "openejb.jaxws.cxf.features";
+    public static final String OPENEJB_JAXWS_CXF_FEATURES = "features";
 
     private final Map<String, CxfWsContainer> wsContainers = new TreeMap<String, CxfWsContainer>();
 
@@ -65,12 +68,12 @@ public class CxfService extends WsServic
         }
     }
 
-    protected HttpListener createEjbWsContainer(URL moduleBaseUrl, PortData port, BeanContext beanContext) {
+    protected HttpListener createEjbWsContainer(URL moduleBaseUrl, PortData port, BeanContext beanContext, Collection<ServiceInfo> services) {
         Bus bus = CxfUtil.getBus();
 
         CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, "META-INF/jax-ws-catalog.xml");
 
-        EjbWsContainer container = new EjbWsContainer(bus, port, beanContext);
+        EjbWsContainer container = new EjbWsContainer(bus, port, beanContext, services);
         container.start();
         wsContainers.put(beanContext.getDeploymentID().toString(), container);
         return container;
@@ -83,12 +86,12 @@ public class CxfService extends WsServic
         }
     }
 
-    protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs) {
+    protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs, Collection<ServiceInfo> services) {
         Bus bus = CxfUtil.getBus();
 
         CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, "META-INF/jax-ws-catalog.xml");
 
-        PojoWsContainer container = new PojoWsContainer(bus, port, context, target, bdgs);
+        PojoWsContainer container = new PojoWsContainer(bus, port, context, target, bdgs, services);
         container.start();
         wsContainers.put(serviceId, container);
         return container;

Modified: openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java?rev=1373814&r1=1373813&r2=1373814&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java Thu Aug 16 13:02:53 2012
@@ -22,6 +22,7 @@ import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.core.webservices.PortData;
 import org.apache.openejb.server.cxf.transport.HttpTransportFactory;
 import org.apache.openejb.server.httpd.HttpListener;
@@ -29,6 +30,7 @@ import org.apache.openejb.server.httpd.H
 import org.apache.openejb.server.httpd.HttpResponse;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 public abstract class CxfWsContainer implements HttpListener {
@@ -37,10 +39,12 @@ public abstract class CxfWsContainer imp
     protected AbstractHTTPDestination destination;
     protected CxfEndpoint endpoint;
     protected HTTPTransportFactory httpTransportFactory;
+    protected final Collection<ServiceInfo> availableServices;
 
-    public CxfWsContainer(Bus bus, PortData port) {
+    public CxfWsContainer(Bus bus, PortData port, Collection<ServiceInfo> services) {
         this.bus = bus;
         this.port = port;
+        this.availableServices = services;
         
         List<String> ids = new ArrayList<String>();
         ids.add("http://schemas.xmlsoap.org/wsdl/soap/");