Author: dblevins Date: Sun Mar 6 16:21:49 2005 New Revision: 156351 URL: http://svn.apache.org/viewcvs?view=rev&rev=156351 Log: WSDescriptorParser now puts all relavent descriptors in the PortInfo
Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/PortInfo.java geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/PortInfo.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/PortInfo.java?view=diff&r1=156350&r2=156351 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/PortInfo.java (original) +++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/PortInfo.java Sun Mar 6 16:21:49 2005 @@ -18,9 +18,11 @@ import javax.xml.namespace.QName; import javax.wsdl.Definition; +import javax.wsdl.Port; import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingType; import org.apache.geronimo.xbeans.j2ee.PortComponentHandlerType; +import org.apache.geronimo.xbeans.j2ee.ServiceEndpointInterfaceMappingType; /** * @version $Rev: $ $Date: $ @@ -30,19 +32,23 @@ private final QName portQName; private final Definition definition; private final JavaWsdlMappingType javaWsdlMapping; - private final String seiInterfaceName; + private final ServiceEndpointInterfaceMappingType seiMapping; + private final String seInterfaceName; private final PortComponentHandlerType[] handlers; + private final Port port; - public PortInfo(String portName, QName portQName, Definition definition, JavaWsdlMappingType javaWsdlMapping, String seiInterfaceName, PortComponentHandlerType[] handlers) { + public PortInfo(String portName, QName portQName, Definition definition, JavaWsdlMappingType javaWsdlMapping, String seiInterfaceName, PortComponentHandlerType[] handlers, Port port, ServiceEndpointInterfaceMappingType seiMapping) { this.portName = portName; this.portQName = portQName; this.definition = definition; this.javaWsdlMapping = javaWsdlMapping; - this.seiInterfaceName = seiInterfaceName; + this.seInterfaceName = seiInterfaceName; this.handlers = handlers; + this.port = port; + this.seiMapping = seiMapping; } - public String getPortName() { + public String getPortComponentName() { return portName; } @@ -50,6 +56,10 @@ return portQName; } + public Port getPort() { + return port; + } + public Definition getDefinition() { return definition; } @@ -58,8 +68,13 @@ return javaWsdlMapping; } - public String getSeiInterfaceName() { - return seiInterfaceName; + public String getServiceEndpointInterfaceName() { + return seInterfaceName; + } + + + public ServiceEndpointInterfaceMappingType getServiceEndpointInterfaceMapping() { + return seiMapping; } public PortComponentHandlerType[] getHandlers() { Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java?view=diff&r1=156350&r2=156351 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java (original) +++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/WSDescriptorParser.java Sun Mar 6 16:21:49 2005 @@ -23,20 +23,10 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.jar.JarFile; -import javax.wsdl.Definition; -import javax.wsdl.Types; -import javax.wsdl.WSDLException; -import javax.wsdl.Service; -import javax.wsdl.Port; -import javax.wsdl.Import; +import java.lang.reflect.Method; +import javax.wsdl.*; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.UnknownExtensibilityElement; import javax.wsdl.extensions.soap.SOAPAddress; @@ -139,6 +129,15 @@ } + /** + * Parses a webservice.xml file and returns a map PortInfo instances indexed by the + * corresponding ejb-link or servlet-link element . + * @param webservicesType + * @param moduleFile + * @param isEJB + * @return + * @throws DeploymentException + */ public static Map parseWebServiceDescriptor(WebservicesType webservicesType, JarFile moduleFile, boolean isEJB) throws DeploymentException { Map portMap = new HashMap(); WebserviceDescriptionType[] webserviceDescriptions = webservicesType.getWebserviceDescriptionArray(); @@ -157,7 +156,16 @@ throw new DeploymentException("Could not construct jaxrpc mapping uri from " + webserviceDescription.getJaxrpcMappingFile(), e); } Definition definition = readWsdl(moduleFile, wsdlURI); + Map wsdlPortMap = WSDescriptorParser.getPortMap(definition); + JavaWsdlMappingType javaWsdlMapping = readJaxrpcMapping(moduleFile, jaxrpcMappingURI); + HashMap seiMappings = new HashMap(); + org.apache.geronimo.xbeans.j2ee.ServiceEndpointInterfaceMappingType[] mappings = javaWsdlMapping.getServiceEndpointInterfaceMappingArray(); + for (int j = 0; j < mappings.length; j++) { + ServiceEndpointInterfaceMappingType seiMapping = mappings[j]; + seiMappings.put(seiMapping.getServiceEndpointInterface().getStringValue(), seiMapping); + } + PortComponentType[] portComponents = webserviceDescription.getPortComponentArray(); for (int j = 0; j < portComponents.length; j++) { PortComponentType portComponent = portComponents[j]; @@ -175,7 +183,16 @@ linkName = serviceImplBeanType.getEjbLink().getStringValue().trim(); } PortComponentHandlerType[] handlers = portComponent.getHandlerArray(); - PortInfo portInfo = new PortInfo(portComponentName, portQName, definition, javaWsdlMapping, seiInterfaceName, handlers); + + Port port = (Port) wsdlPortMap.get(portQName.getLocalPart()); + if (port == null) { + throw new DeploymentException("No WSDL Port definition for port-component " + portComponentName); + } + + ServiceEndpointInterfaceMappingType seiMapping = (ServiceEndpointInterfaceMappingType)seiMappings.get(seiInterfaceName); + + PortInfo portInfo = new PortInfo(portComponentName, portQName, definition, javaWsdlMapping, seiInterfaceName, handlers, port, seiMapping); + if (portMap.put(linkName, portInfo) != null) { throw new DeploymentException("Ambiguous description of port associated with j2ee component " + linkName); } @@ -184,11 +201,37 @@ return portMap; } + + /** + * Gets a map of all the javax.wsdl.Port instance in the WSDL definition keyed by the port's QName + * + * WSDL 1.1 spec: 2.6 "The name attribute provides a unique name among all ports defined within in the enclosing WSDL document." + * + * @param definition + * @return + * @throws DeploymentException + */ + + public static Map getPortMap(Definition definition) throws DeploymentException { + HashMap ports = new HashMap(); + Collection services = definition.getServices().values(); + for (Iterator iterator = services.iterator(); iterator.hasNext();) { + Service service = (Service) iterator.next(); + ports.putAll(service.getPorts()); + } + return ports; + } + public static JavaWsdlMappingType readJaxrpcMapping(JarFile moduleFile, URI jaxrpcMappingURI) throws DeploymentException { + String jaxrpcMappingPath = jaxrpcMappingURI.toString(); + return readJaxrpcMapping(moduleFile, jaxrpcMappingPath); + } + + public static JavaWsdlMappingType readJaxrpcMapping(JarFile moduleFile, String jaxrpcMappingPath) throws DeploymentException { JavaWsdlMappingType mapping; InputStream jaxrpcInputStream = null; try { - jaxrpcInputStream = moduleFile.getInputStream(moduleFile.getEntry(jaxrpcMappingURI.toString())); + jaxrpcInputStream = moduleFile.getInputStream(moduleFile.getEntry(jaxrpcMappingPath)); } catch (IOException e) { throw new DeploymentException("Could not open stream to jaxrpc mapping document", e); } @@ -563,6 +606,23 @@ throw new DeploymentException("Could not find service endpoint interface for port named " + portTypeQName); } + public static javax.wsdl.Service getService(QName serviceQName, Definition definition) throws DeploymentException { + javax.wsdl.Service service; + if (serviceQName != null) { + service = definition.getService(serviceQName); + } else { + Map services = definition.getServices(); + if (services.size() != 1) { + throw new DeploymentException("no serviceQName supplied, and there are " + services.size() + " services"); + } + service = (javax.wsdl.Service) services.values().iterator().next(); + } + if (service == null) { + throw new DeploymentException("No service wsdl for supplied service qname " + serviceQName); + } + return service; + } + public static ExtensibilityElement getExtensibilityElement(Class clazz, List extensibilityElements) throws DeploymentException { for (Iterator iterator = extensibilityElements.iterator(); iterator.hasNext();) { ExtensibilityElement extensibilityElement = (ExtensibilityElement) iterator.next(); @@ -585,6 +645,25 @@ SOAPAddress soapAddress = (SOAPAddress) WSDescriptorParser.getExtensibilityElement(SOAPAddress.class, port.getExtensibilityElements()); soapAddress.setLocationURI(location); } + } + + public static Method getMethodForOperation(Class serviceEndpointInterface, Operation operation) throws DeploymentException { + Method[] methods = serviceEndpointInterface.getMethods(); + String opName = operation.getName(); + Method found = null; + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + if (method.getName().equals(opName)) { + if (found != null) { + throw new DeploymentException("Overloaded methods NYI"); + } + found = method; + } + } + if (found == null) { + throw new DeploymentException("No method found for operation named " + opName); + } + return found; } static class JarWSDLLocator implements WSDLLocator {