Author: rmannibucau
Date: Thu Aug 16 20:28:16 2012
New Revision: 1374039

URL: http://svn.apache.org/viewvc?rev=1374039&view=rev
Log:
TOMEE-377 ability to configure cxf bus

Added:
    
openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
Modified:
    
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/junit/ApplicationComposer.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.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/CxfService.java

Modified: 
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=1374039&r1=1374038&r2=1374039&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/util/ServiceInfos.java
 Thu Aug 16 20:28:16 2012
@@ -97,6 +97,10 @@ public final class ServiceInfos {
         }
 
         final ObjectRecipe serviceRecipe = Assembler.prepareRecipe(info);
+        return build(services, info, serviceRecipe);
+    }
+
+    public static Object build(final Collection<ServiceInfo> services, final 
ServiceInfo info, final ObjectRecipe serviceRecipe) {
         // we can't ask to have a setter for existing code
         serviceRecipe.allow(Option.FIELD_INJECTION);
         serviceRecipe.allow(Option.PRIVATE_PROPERTIES);

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java?rev=1374039&r1=1374038&r2=1374039&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
 Thu Aug 16 20:28:16 2012
@@ -293,6 +293,8 @@ public class ApplicationComposer extends
                 Assembler assembler = new Assembler();
                 SystemInstance.get().setComponent(Assembler.class, assembler);
 
+                
assembler.buildContainerSystem(config.getOpenEjbConfiguration());
+
                 if 
("true".equals(configuration.getProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE,
 "false"))) {
                     try {
                         serviceManager = new ServiceManagerProxy();
@@ -302,8 +304,6 @@ public class ApplicationComposer extends
                     }
                 }
 
-                
assembler.buildContainerSystem(config.getOpenEjbConfiguration());
-
                 final AppInfo appInfo = config.configureApplication(appModule);
 
                 final AppContext appContext = 
assembler.createApplication(appInfo);

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java?rev=1374039&r1=1374038&r2=1374039&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
 Thu Aug 16 20:28:16 2012
@@ -33,28 +33,35 @@ public class CxfRSService extends RESTSe
     private HttpTransportFactory httpTransportFactory;
 
 
-    @Override public void service(InputStream in, OutputStream out) throws 
ServiceException, IOException {
+    @Override
+    public void service(InputStream in, OutputStream out) throws 
ServiceException, IOException {
         throw new UnsupportedOperationException(getClass().getName() + " 
cannot be invoked directly");
     }
 
-    @Override public void service(Socket socket) throws ServiceException, 
IOException {
+    @Override
+    public void service(Socket socket) throws ServiceException, IOException {
         throw new UnsupportedOperationException(getClass().getName() + " 
cannot be invoked directly");
     }
 
-    @Override public String getName() {
+    @Override
+    public String getName() {
         return NAME;
     }
 
-    @Override public void init(Properties properties) throws Exception {
-        // no-op
+    @Override
+    public void init(Properties properties) throws Exception {
+        super.init(properties);
+        CxfUtil.configureBus(getName());
     }
 
-    @Override protected void beforeStart() {
+    @Override
+    protected void beforeStart() {
         super.beforeStart();
         httpTransportFactory = new HttpTransportFactory(CxfUtil.getBus());
     }
 
-    @Override protected RsHttpListener createHttpListener() {
+    @Override
+    protected RsHttpListener createHttpListener() {
         return new CxfRsHttpListener(httpTransportFactory);
     }
 }

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=1374039&r1=1374038&r2=1374039&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 20:28:16 2012
@@ -18,13 +18,16 @@ package org.apache.openejb.server.cxf.tr
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.CXFBusImpl;
 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.AbstractBasicInterceptorProvider;
 import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.message.Message;
 import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
 import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.assembler.classic.util.ServiceInfos;
 import org.apache.openejb.loader.SystemInstance;
@@ -44,6 +47,7 @@ public final class CxfUtil {
     public static final String DATABINDING = "databinding";
     public static final String ADDRESS = "address";
     public static final String DEBUG = "debug";
+    public static final String BUS_PREFIX = "bus-";
 
     private CxfUtil() {
         // no-op
@@ -90,35 +94,11 @@ public final class CxfUtil {
             // 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());
-                    }
-                }
+                final List<?> features = createFeatures(availableServices, 
featuresIds);
                 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));
-            }
+            configureInterceptors(svrFactory, prefix, availableServices, 
beanConfig);
 
             // databinding
             final String databinding = beanConfig.getProperty(prefix + 
DATABINDING);
@@ -139,6 +119,39 @@ public final class CxfUtil {
         }
     }
 
+    private static void configureInterceptors(final 
AbstractBasicInterceptorProvider abip, final String prefix, final 
Collection<ServiceInfo> availableServices, final Properties beanConfig) {
+        // interceptors
+        final String inInterceptorsIds = beanConfig.getProperty(prefix + 
IN_INTERCEPTORS);
+        if (inInterceptorsIds != null && !inInterceptorsIds.trim().isEmpty()) {
+            
abip.getInInterceptors().addAll(createInterceptors(availableServices, 
inInterceptorsIds));
+        }
+
+        final String inFaultInterceptorsIds = beanConfig.getProperty(prefix + 
IN_FAULT_INTERCEPTORS);
+        if (inFaultInterceptorsIds != null && 
!inFaultInterceptorsIds.trim().isEmpty()) {
+            
abip.getInFaultInterceptors().addAll(createInterceptors(availableServices, 
inFaultInterceptorsIds));
+        }
+
+        final String outInterceptorsIds = beanConfig.getProperty(prefix + 
OUT_INTERCEPTORS);
+        if (outInterceptorsIds != null && 
!outInterceptorsIds.trim().isEmpty()) {
+            
abip.getOutInterceptors().addAll(createInterceptors(availableServices, 
outInterceptorsIds));
+        }
+
+        final String outFaultInterceptorsIds = beanConfig.getProperty(prefix + 
OUT_FAULT_INTERCEPTORS);
+        if (outFaultInterceptorsIds != null && 
!outFaultInterceptorsIds.trim().isEmpty()) {
+            
abip.getOutFaultInterceptors().addAll(createInterceptors(availableServices, 
outFaultInterceptorsIds));
+        }
+    }
+
+    private static List<AbstractFeature> createFeatures(final 
Collection<ServiceInfo> availableServices, final String featuresIds) {
+        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());
+            }
+        }
+        return (List<AbstractFeature>) features;
+    }
+
     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) {
@@ -148,4 +161,32 @@ public final class CxfUtil {
         }
         return (List<Interceptor<? extends Message>>) instances;
     }
+
+    public static void configureBus(final String name) {
+        final Bus bus = getDefaultBus();
+        if (bus instanceof CXFBusImpl) {
+            final CXFBusImpl busImpl = (CXFBusImpl) bus;
+            final List<ServiceInfo> serviceInfos = SystemInstance.get()
+                                                        
.getComponent(OpenEjbConfiguration.class).facilities.services;
+            for (ServiceInfo service : serviceInfos) {
+                if (service.id.equals(BUS_PREFIX + name)) {
+                    final String featuresIds = 
service.properties.getProperty(FEATURES);
+                    if (featuresIds != null) {
+                        final List<AbstractFeature> features = 
createFeatures(serviceInfos, featuresIds);
+                        if (features != null) {
+                            features.addAll(busImpl.getFeatures());
+                            busImpl.setFeatures(features);
+                        }
+                    }
+
+                    final Properties properties = 
ServiceInfos.serviceProperties(serviceInfos, 
service.properties.getProperty(ENDPOINT_PROPERTIES));
+                    if (properties != null) {
+                        
busImpl.getProperties().putAll(PropertiesHelper.map(properties));
+                    }
+
+                    configureInterceptors(busImpl, "", serviceInfos, 
service.properties);
+                }
+            }
+        }
+    }
 }

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=1374039&r1=1374038&r2=1374039&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 20:28:16 2012
@@ -18,10 +18,7 @@
 package org.apache.openejb.server.cxf;
 
 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;
@@ -30,12 +27,10 @@ import org.apache.openejb.server.cxf.poj
 import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpListener;
 import org.apache.openejb.server.webservices.WsService;
-import org.apache.openejb.util.ListConfigurator;
 
 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;
@@ -55,17 +50,7 @@ public class CxfService extends WsServic
 
     public void init(final Properties props) throws java.lang.Exception {
         super.init(props);
-
-        // set bus features
-        final Bus bus = CxfUtil.getBus();
-        if (bus instanceof ExtensionManagerBus) { // always true normally
-            final List<AbstractFeature> features = ListConfigurator.getList(
-                    new Properties(props), OPENEJB_JAXWS_CXF_FEATURES,
-                    CxfUtil.class.getClassLoader(), AbstractFeature.class);
-            if (features != null) {
-                ((ExtensionManagerBus) bus).setFeatures(features);
-            }
-        }
+        CxfUtil.configureBus(getName());
     }
 
     protected HttpListener createEjbWsContainer(URL moduleBaseUrl, PortData 
port, BeanContext beanContext, Collection<ServiceInfo> services) {

Added: 
openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java?rev=1374039&view=auto
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
 (added)
+++ 
openejb/trunk/openejb/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
 Thu Aug 16 20:28:16 2012
@@ -0,0 +1,63 @@
+/**
+ *
+ * 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.server.cxf;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.feature.LoggingFeature;
+import org.apache.openejb.OpenEjbContainer;
+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.fault.AuthenticatorServiceBean;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+@RunWith(ApplicationComposer.class)
+public class GlobalFeatureConfigTest {
+    @Configuration
+    public Properties p() {
+        return new Properties() {{
+            setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
+
+            setProperty("bus-cxf", 
"new://Service?class-name=java.util.Properties");
+            setProperty("bus-cxf.features", "logging");
+
+            setProperty("logging", "new://Service?class-name=" + 
LoggingFeature.class.getName());
+        }};
+    }
+
+    @Module
+    public StatelessBean bean() {
+        return (StatelessBean) new 
StatelessBean(AuthenticatorServiceBean.class).localBean();
+    }
+
+    @Test
+    public void run() {
+        final Bus bus = CxfUtil.getDefaultBus();
+        assertEquals(1, bus.getFeatures().size());
+        assertThat(bus.getFeatures().iterator().next(), 
instanceOf(LoggingFeature.class));
+    }
+}


Reply via email to