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 2014/12/01 19:10:46 UTC
tomee git commit: TOMEE-1463 support WsFeatures in @WebServiceRef
Repository: tomee
Updated Branches:
refs/heads/tomee-1.7.x 00a1d74a3 -> dc1587868
TOMEE-1463 support WsFeatures in @WebServiceRef
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/dc158786
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/dc158786
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/dc158786
Branch: refs/heads/tomee-1.7.x
Commit: dc1587868b5a24385d10a4ea646555a27ebecec2
Parents: 00a1d74
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Mon Dec 1 19:10:06 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Mon Dec 1 19:10:06 2014 +0100
----------------------------------------------------------------------
.../core/ivm/naming/JaxWsServiceReference.java | 27 ++++++++++--
.../client/WebServiceInjectionConfigurator.java | 45 +++++++++++++++++---
2 files changed, 64 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/dc158786/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java
index 72f9026..b139075 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java
@@ -32,6 +32,7 @@ import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
+import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.handler.HandlerResolver;
import java.net.MalformedURLException;
import java.net.URL;
@@ -144,10 +145,18 @@ public class JaxWsServiceReference extends Reference {
instance.setHandlerResolver(handlerResolver);
}
+ final WebServiceClientCustomizer customizer = SystemInstance.get().getComponent(WebServiceClientCustomizer.class);
+ final Properties configuration = properties == null ? new Properties() : properties;
+
final Object port;
if (referenceClass != null && !Service.class.isAssignableFrom(referenceClass)) {
+ final WebServiceFeature[] features = customizer == null ? null : customizer.features(serviceQName, configuration);
// do port lookup
- port = instance.getPort(referenceClass);
+ if (features == null || features.length == 0) {
+ port = instance.getPort(referenceClass);
+ } else {
+ port = instance.getPort(referenceClass, features);
+ }
} else {
// return service
port = instance;
@@ -163,9 +172,8 @@ public class JaxWsServiceReference extends Reference {
portRefs);
ServiceRefData.putServiceRefData(port, serviceRefData);
- final WebServiceClientCustomizer customizer = SystemInstance.get().getComponent(WebServiceClientCustomizer.class);
if (customizer != null) {
- customizer.customize(port, properties == null ? new Properties() : properties);
+ customizer.customize(port, configuration);
}
return port;
@@ -182,6 +190,19 @@ public class JaxWsServiceReference extends Reference {
}
public interface WebServiceClientCustomizer {
+ /**
+ * @param qname QName of the webservice
+ * @param properties app configuration
+ * @return ws features associated with this endpoint
+ */
+ WebServiceFeature[] features(QName qname, Properties properties);
+
+ /**
+ * Note: it is recommanded to use same key type as in features() impl (ie qname)
+ *
+ * @param port the client instance
+ * @param properties configuration of the application
+ */
void customize(Object port, Properties properties);
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/dc158786/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java b/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java
index 609b7c1..e5840ce 100644
--- a/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java
+++ b/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java
@@ -22,6 +22,7 @@ import org.apache.cxf.frontend.ClientProxy;
import org.apache.openejb.OpenEJBException;
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.config.ConfigurationFactory;
import org.apache.openejb.config.sys.Openejb;
import org.apache.openejb.config.sys.Service;
@@ -30,9 +31,12 @@ import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
+import javax.xml.namespace.QName;
+import javax.xml.ws.WebServiceFeature;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
@@ -54,11 +58,37 @@ import static org.apache.openejb.server.cxf.transport.util.CxfUtil.configureInte
* Note: resources.xml are ignored for now (to be enhanced)
*/
public class WebServiceInjectionConfigurator implements JaxWsServiceReference.WebServiceClientCustomizer {
+ private static final String CXF_JAXWS_CLIENT_PREFIX = "cxf.jaxws.client.";
+
+ @Override
+ public WebServiceFeature[] features(final QName qname, final Properties properties) {
+ Collection<WebServiceFeature> list = null;
+ for (final String suffix : asList("", (qname == null ? "_" : qname.toString()) + ".")) {
+ final String wsFeatures = properties.getProperty(CXF_JAXWS_CLIENT_PREFIX + suffix + "wsFeatures");
+ if (wsFeatures != null) {
+ final Collection<Object> instances = ServiceInfos.resolve(createServiceInfos(properties), wsFeatures.split(" *, *"));
+ if (instances != null && !instances.isEmpty()) {
+ for (final Object i : instances) {
+ if (!WebServiceFeature.class.isInstance(i)) {
+ throw new IllegalArgumentException("Not a WebServiceFeature: " + i);
+ }
+ if (list == null) { // lazy to avoid useless allocation in most of cases
+ list = new LinkedList<WebServiceFeature>();
+ }
+ list.add(WebServiceFeature.class.cast(i));
+ }
+ }
+ }
+ }
+ return list != null ? list.toArray(new WebServiceFeature[list.size()]) : null;
+ }
+
@Override
public void customize(final Object o, final Properties properties) {
try {
if (!javax.xml.ws.Service.class.isInstance(o)) {
- configure(ClientProxy.getClient(o), properties);
+ final Client client = ClientProxy.getClient(o);
+ configure(client, properties);
}
} catch (final Exception e) {
Logger.getInstance(LogCategory.CXF, WebServiceInjectionConfigurator.class.getName())
@@ -74,13 +104,18 @@ public class WebServiceInjectionConfigurator implements JaxWsServiceReference.We
for (final String suffix : asList("", client.getEndpoint().getEndpointInfo().getName().toString() + ".")) {
// here (ie at runtime) we have no idea which services were linked to the app
// so using tomee.xml ones for now (not that shocking since we externalize the config with this class)
- final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
- final List<ServiceInfo> services = new ArrayList<ServiceInfo>(config.facilities != null && config.facilities.services != null ? config.facilities.services : Collections.<ServiceInfo>emptyList());
- services.addAll(getServices(properties));
- configureInterceptors(client, "cxf.jaxws.client." + suffix, services, properties);
+ final List<ServiceInfo> services = createServiceInfos(properties);
+ configureInterceptors(client, CXF_JAXWS_CLIENT_PREFIX + suffix, services, properties);
}
}
+ private List<ServiceInfo> createServiceInfos(final Properties properties) {
+ final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
+ final List<ServiceInfo> services = new ArrayList<ServiceInfo>(config.facilities != null && config.facilities.services != null ? config.facilities.services : Collections.<ServiceInfo>emptyList());
+ services.addAll(getServices(properties));
+ return services;
+ }
+
private Collection<ServiceInfo> getServices(final Properties properties) {
final ConfigurationFactory cf = SystemInstance.get().getComponent(ConfigurationFactory.class);
if (cf == null || !ConfigurationFactory.class.isInstance(cf)) {