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;
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
- * <element ref="{http://www.openejb.org/System/Configuration}Container" maxOccurs="unbounded"/>
- * <element ref="{http://www.openejb.org/System/Configuration}JndiProvider" maxOccurs="unbounded" minOccurs="0"/>
- * <element ref="{http://www.openejb.org/System/Configuration}ConnectionManager" minOccurs="0"/>
- * <element ref="{http://www.openejb.org/System/Configuration}Connector" maxOccurs="unbounded" minOccurs="0"/>
* <element ref="{http://www.openejb.org/System/Configuration}Resource" maxOccurs="unbounded" minOccurs="0"/>
+ * <element ref="{http://www.openejb.org/System/Configuration}Service" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </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=<qualified name>: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/");