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