Author: heiko.braun(a)jboss.com
Date: 2007-04-12 10:32:15 -0400 (Thu, 12 Apr 2007)
New Revision: 2826
Modified:
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/client/ServiceObjectFactory.java
trunk/jbossws-core/src/java/org/jboss/ws/metadata/j2ee/serviceref/ServiceRefMetaDataParser.java
trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ServiceMetaData.java
trunk/jbossws-tests/build.xml
Log:
Container managed port selection based on port-component-ref
Modified:
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/client/ServiceObjectFactory.java
===================================================================
---
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/client/ServiceObjectFactory.java 2007-04-12
09:11:42 UTC (rev 2825)
+++
trunk/jbossws-core/src/java/org/jboss/ws/core/jaxrpc/client/ServiceObjectFactory.java 2007-04-12
14:32:15 UTC (rev 2826)
@@ -24,32 +24,6 @@
// $Id$
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.ObjectInputStream;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.rmi.Remote;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Properties;
-
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.NamingException;
-import javax.naming.RefAddr;
-import javax.naming.Reference;
-import javax.naming.spi.ObjectFactory;
-import javax.wsdl.Definition;
-import javax.xml.namespace.QName;
-import javax.xml.rpc.JAXRPCException;
-import javax.xml.rpc.Service;
-
import org.jboss.logging.Logger;
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
@@ -66,6 +40,20 @@
import org.jboss.ws.metadata.wsse.WSSecurityConfiguration;
import org.jboss.ws.tools.wsdl.WSDL11DefinitionFactory;
+import javax.naming.*;
+import javax.naming.spi.ObjectFactory;
+import javax.wsdl.Definition;
+import javax.xml.namespace.QName;
+import javax.xml.rpc.JAXRPCException;
+import javax.xml.rpc.Service;
+import java.io.*;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.rmi.Remote;
+import java.util.*;
+
/**
* This ServiceObjectFactory reconstructs a javax.xml.rpc.Service
* for a given WSDL when the webservice client does a JNDI lookup
@@ -217,6 +205,8 @@
}
}
+ narrowPortSelection(serviceRef, serviceMetaData);
+
/********************************************************
* Setup the Proxy that implements the service-interface
********************************************************/
@@ -249,6 +239,78 @@
}
/**
+ * Narrow port selection tries to nail down available endpoints
+ * by <port-component-ref> declarations. A selection base upon
+ * Service.getPort(SEI) later on needs to be distinct to an endpoint, or in this case
EndpointMetaData.
+ *
+ * @param serviceRef
+ * @param serviceMetaData
+ */
+ private void narrowPortSelection(UnifiedServiceRefMetaData serviceRef, ServiceMetaData
serviceMetaData)
+ {
+ Map<String, List<UnifiedPortComponentRefMetaData>> seiGroups = new
HashMap<String, List<UnifiedPortComponentRefMetaData>>();
+ for(UnifiedPortComponentRefMetaData pcref : serviceRef.getPortComponentRefs())
+ {
+ String sei = pcref.getServiceEndpointInterface();
+ if(null==seiGroups.get(sei))
+ seiGroups.put(sei, new ArrayList<UnifiedPortComponentRefMetaData>());
+ List<UnifiedPortComponentRefMetaData> group = seiGroups.get(sei);
+ group.add(pcref);
+
+ // Constraint#1: within a service-ref it's not allowed to use a SEI across
different pcref's
+ if(group.size()>1)
+ throw new WSException("Within a <service-ref> it's not allowed
to use a SEI across different <port-component-ref>'s: "+group);
+ }
+
+ // Constraint#2: A pcref may only match one EndpointMetaData
+ for( String sei : seiGroups.keySet())
+ {
+ // Narrow available endpoints by port-component-ref declaration
+ List<QName> narrowedEndpoints = new ArrayList<QName>();
+
+ List<UnifiedPortComponentRefMetaData> group = seiGroups.get(sei);
+ UnifiedPortComponentRefMetaData pcref = group.get(0); // distinct, see above
Constraint#1
+
+ // Constraint#3: Port selection only applies when both SEI and QName are given
+ if(pcref.getServiceEndpointInterface()!=null &&
pcref.getPortQName()!=null)
+ {
+ List<QName> pcRef2EndpointMapping = new ArrayList<QName>();
+ for(EndpointMetaData epMeta : serviceMetaData.getEndpoints())
+ {
+
if(pcref.getServiceEndpointInterface().equals(epMeta.getServiceEndpointInterfaceName()))
+ {
+ pcRef2EndpointMapping.add(epMeta.getPortName());
+ }
+
+ }
+
+ for(QName q : pcRef2EndpointMapping)
+ {
+ EndpointMetaData mappedEndpoint = serviceMetaData.getEndpoint(q);
+ if(! pcref.getPortQName().equals( mappedEndpoint.getPortName()) )
+ narrowedEndpoints.add(q);
+ }
+
+ // Constraint: Dont exclude all of them ;)
+ if(pcRef2EndpointMapping.size()>0 && (pcRef2EndpointMapping.size()
== narrowedEndpoints.size()))
+ throw new WSException("Failed to narrow available endpoints by
<port-component-ref> declaration");
+
+ for(QName q : narrowedEndpoints)
+ {
+ EndpointMetaData removed = serviceMetaData.removeEndpoint(q);
+ log.debug("Narrowed endpoint " + q +
"("+removed+")");
+ }
+ }
+ else
+ {
+ // TODO: In case there is more then one EMPD this should cause an exception
+ log.warn("Unable to narrow port selection for "+ pcref);
+ }
+
+ }
+ }
+
+ /**
* Setup the handler chain(s) for this service
*/
private void setupHandlerChain(ServiceImpl jaxrpcService) throws Exception
@@ -300,4 +362,5 @@
}
return wsdlDefinition;
}
+
}
Modified:
trunk/jbossws-core/src/java/org/jboss/ws/metadata/j2ee/serviceref/ServiceRefMetaDataParser.java
===================================================================
---
trunk/jbossws-core/src/java/org/jboss/ws/metadata/j2ee/serviceref/ServiceRefMetaDataParser.java 2007-04-12
09:11:42 UTC (rev 2825)
+++
trunk/jbossws-core/src/java/org/jboss/ws/metadata/j2ee/serviceref/ServiceRefMetaDataParser.java 2007-04-12
14:32:15 UTC (rev 2826)
@@ -128,6 +128,39 @@
String value = getElementContent(propElement, "prop-value");
pcref.addCallProperty(new UnifiedCallPropertyMetaData(name, value));
}
+
+ // Look for stub-property elements
+ iterator = DOMUtils.getChildElements(root, "stub-property");
+ while (iterator.hasNext())
+ {
+ Element propElement = (Element)iterator.next();
+ String name = getElementContent(propElement, "prop-name");
+ String value = getElementContent(propElement, "prop-value");
+ UnifiedStubPropertyMetaData propMetaData = new UnifiedStubPropertyMetaData();
+ propMetaData.setPropName(name);
+ propMetaData.setPropValue(value);
+ pcref.addStubProperty(propMetaData);
+ }
+
+ // portQName
+ Element portQName = DOMUtils.getFirstChildElement(root, "port-qname");
+ if(portQName!=null)
+ pcref.setPortQName(QName.valueOf(getTextContent(portQName)));
+
+ // config
+ Element configName = DOMUtils.getFirstChildElement(root, "config-name");
+ if(configName!=null)
+ pcref.setConfigName(getTextContent(configName));
+
+ Element configFile = DOMUtils.getFirstChildElement(root, "config-file");
+ if(configFile!=null)
+ pcref.setConfigFile(getTextContent(configFile));
+
+ // service-endpoint-interface
+ Element sei = DOMUtils.getFirstChildElement(root,
"service-endpoint-interface");
+ if(sei!=null)
+ pcref.setServiceEndpointInterface(getTextContent(sei));
+
}
public void importStandardXml(Element root, UnifiedHandlerMetaData href)
Modified: trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
===================================================================
---
trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2007-04-12
09:11:42 UTC (rev 2825)
+++
trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2007-04-12
14:32:15 UTC (rev 2826)
@@ -734,7 +734,7 @@
boolean match;
if (seiName != null && portName != null)
- match = getServiceEndpointInterfaceName().equals(seiName) &&
portName.equals(portName);
+ match = getServiceEndpointInterfaceName().equals(seiName) &&
getPortName().equals(portName);
else match = getServiceEndpointInterfaceName().equals(seiName) ||
getPortName().equals(portName);
return match;
Modified: trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ServiceMetaData.java
===================================================================
--- trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ServiceMetaData.java 2007-04-12
09:11:42 UTC (rev 2825)
+++ trunk/jbossws-core/src/java/org/jboss/ws/metadata/umdm/ServiceMetaData.java 2007-04-12
14:32:15 UTC (rev 2826)
@@ -206,6 +206,11 @@
return endpoints.get(portName);
}
+ public EndpointMetaData removeEndpoint(QName portName)
+ {
+ return endpoints.remove(portName);
+ }
+
public EndpointMetaData getEndpointByServiceEndpointInterface(String seiName)
{
EndpointMetaData epMetaData = null;
Modified: trunk/jbossws-tests/build.xml
===================================================================
--- trunk/jbossws-tests/build.xml 2007-04-12 09:11:42 UTC (rev 2825)
+++ trunk/jbossws-tests/build.xml 2007-04-12 14:32:15 UTC (rev 2826)
@@ -464,7 +464,7 @@
<antcall target="tests-main">
<param name="include.wildcard"
value="org/jboss/test/ws/*/samples/**/*TestCase.class"/>
<param name="exclude.wildcard"
value="org/jboss/test/ws/*/samples/jaxr/**"/>
- <param name="haltonfailure" value="true"/>
+ <param name="haltonfailure" value="false"/>
</antcall>
<antcall target="tests-report"/>
</target>
@@ -474,7 +474,7 @@
<antcall target="tests-main">
<param name="include.wildcard"
value="org/jboss/test/ws/tools/**/*TestCase.class"/>
<param name="exclude.wildcard"
value="no-wildcard-exclude-see-excludesfile"/>
- <param name="haltonfailure" value="true"/>
+ <param name="haltonfailure" value="false"/>
</antcall>
<antcall target="tests-report"/>
</target>
Show replies by date