Done. Sorry for the delay. -- dims
On 2/12/07, Kevan Miller <[EMAIL PROTECTED]> wrote:
Hey Dims, Looks like we've got more tab chars. Also, no svn props set... --kevan On Feb 12, 2007, at 1:16 PM, [EMAIL PROTECTED] wrote: > Author: dims > Date: Mon Feb 12 10:16:14 2007 > New Revision: 506561 > > URL: http://svn.apache.org/viewvc?view=rev&rev=506561 > Log: > Fix for GERONIMO-2822 - Axis2 Integration - Get invoke() method > working for WSDL provided scenario > > Added: > geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/AxisServiceGenerator.java > Modified: > geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/Axis2WebServiceContainer.java > > Modified: geronimo/server/trunk/modules/geronimo-axis2/src/main/ > java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java > URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/ > geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ > Axis2WebServiceContainer.java?view=diff&rev=506561&r1=506560&r2=506561 > ====================================================================== > ======== > --- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/Axis2WebServiceContainer.java (original) > +++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/Axis2WebServiceContainer.java Mon Feb 12 > 10:16:14 2007 > @@ -138,142 +138,8 @@ > configurationContext.setServicePath > (portInfo.getLocation()); > > if(wsdlDefinition != null){ //WSDL Has been provided > - WSDLToAxisServiceBuilder wsdlBuilder = null; > - > - WSDLFactory factory = WSDLFactory.newInstance(); > - WSDLWriter writer = factory.newWSDLWriter(); > - > - ByteArrayOutputStream out = new ByteArrayOutputStream(); > - writer.writeWSDL(wsdlDefinition, out); > - String wsdlContent = out.toString("UTF-8"); //TODO Pass > correct encoding from WSDL > - > - OMNamespace documentElementNS = ((OMElement) > XMLUtils.toOM(new StringReader(wsdlContent))).getNamespace(); > - > - Map<QName, Service> serviceMap = > wsdlDefinition.getServices(); > - Service wsdlService = serviceMap.values().iterator > ().next(); > - > - Map<String, Port> portMap = wsdlService.getPorts(); > - Port port = portMap.values().iterator().next(); > - String portName = port.getName(); > - QName serviceQName = wsdlService.getQName(); > - > - //Decide on WSDL Version : > - if > (WSDLConstants.WSDL20_2006Constants.DEFAULT_NAMESPACE_URI.equals > (documentElementNS.getNamespaceURI())){ > - wsdlBuilder = new WSDL20ToAxisServiceBuilder(new > StringBufferInputStream(wsdlContent), serviceQName, null); > - } > - else if(Constants.NS_URI_WSDL11.equals > (documentElementNS.getNamespaceURI())){ > - wsdlBuilder = new WSDL11ToAxisServiceBuilder > (wsdlDefinition, serviceQName , portName); > - } > - //populate with axis2 objects > - service = wsdlBuilder.populateService(); > - service.addParameter(new Parameter("ServiceClass", > endpointClassName)); > - service.setWsdlFound(true); > - service.setClassLoader(classLoader); > - > - //Goind to create annotations by hand > - DescriptionBuilderComposite dbc = new > DescriptionBuilderComposite(); > - dbc.setClassLoader(classLoader); > - HashMap<String, DescriptionBuilderComposite> dbcMap = > new HashMap<String, DescriptionBuilderComposite>(); > - > - //Service related annotations > - WebServiceAnnot serviceAnnot = > WebServiceAnnot.createWebServiceAnnotImpl(); > - serviceAnnot.setPortName(portName); > - serviceAnnot.setServiceName(service.getName()); > - serviceAnnot.setName(service.getName()); > - serviceAnnot.setTargetNamespace > (service.getTargetNamespace()); > - //don't set endpointinterface now otherwise you'll > get a > - //Validation error: SEI must not set a value for > @WebService.endpointInterface. > - //The default value is "". > - //serviceAnnot.setEndpointInterface > (endpointClassName); > - > - Class endPointClass = classLoader.loadClass > (endpointClassName); > - Method[] classMethods = endPointClass.getMethods(); > - > - for(Iterator<AxisOperation> opIterator = > service.getOperations() ; opIterator.hasNext() ;){ > - AxisOperation operation = opIterator.next(); > - JAXWSMessageReceiver receiver = > JAXWSMessageReceiver.class.newInstance(); > - operation.setMessageReceiver(receiver); > - > - for(Method method : classMethods){ > - // TODO Is this correct method? > - String axisOpName = operation.getName > ().getLocalPart(); > - > - if(method.getName().equals(axisOpName)){ > - //Method level annotations > - MethodDescriptionComposite mdc = new > MethodDescriptionComposite(); > - WebMethodAnnot webMethodAnnot = > WebMethodAnnot.createWebMethodAnnotImpl(); > - webMethodAnnot.setOperationName(method.getName()); > -// methodAnnot.setAction(operation.get); > -// methodAnnot.setExclude(false); > - > - mdc.setWebMethodAnnot(webMethodAnnot); > - > - mdc.setMethodName(method.getName()); > - mdc.setDescriptionBuilderCompositeRef(dbc); > - > - String MEP = > operation.getMessageExchangePattern(); > - > - if (WSDLUtil.isInputPresentForMEP(MEP)) { > - AxisMessage inAxisMessage = > operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); > - if(inAxisMessage != null){ > - //TODO: Has to explore more > - Class[] paramTypes = method.getParameterTypes > (); > - int i = 0; > - for(Class paramType : paramTypes){ > - //Parameter level annotations > - ParameterDescriptionComposite pdc = new > ParameterDescriptionComposite(); > - WebParamAnnot webParamAnnot = > WebParamAnnot.createWebParamAnnotImpl(); > - > - webParamAnnot.setName("arg"+i); > - webParamAnnot.setName > (inAxisMessage.getElementQName().getLocalPart()); > - webParamAnnot.setTargetNamespace > (inAxisMessage.getElementQName().getNamespaceURI()); > - > - pdc.setWebParamAnnot(webParamAnnot); > - String strParamType = paramType.toString(); > - > - pdc.setMethodDescriptionCompositeRef(mdc); > - pdc.setParameterType(strParamType.split(" ") > [1]); > - mdc.addParameterDescriptionComposite(pdc, i); > - //TODO: Do we need to set these things? > - RequestWrapperAnnot requestWrapAnnot = > RequestWrapperAnnot.createRequestWrapperAnnotImpl(); > - requestWrapAnnot.setLocalName > (inAxisMessage.getElementQName().getLocalPart()); > - requestWrapAnnot.setTargetNamespace > (inAxisMessage.getElementQName().getNamespaceURI()); > - > - mdc.setRequestWrapperAnnot(requestWrapAnnot); > - i++; > - } > - } > - } > - > - if (WSDLUtil.isOutputPresentForMEP(MEP)) { > - AxisMessage outAxisMessage = > operation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE); > - > - if(outAxisMessage != null){ > - mdc.setReturnType(method.getReturnType > ().toString().split(" ")[1]); > - //TODO: > - ResponseWrapperAnnot responseWrapAnnot = > ResponseWrapperAnnot.createResponseWrapperAnnotImpl(); > - responseWrapAnnot.setLocalName > (outAxisMessage.getElementQName().getLocalPart()); > - responseWrapAnnot.setTargetNamespace > (outAxisMessage.getElementQName().getNamespaceURI()); > - mdc.setResponseWrapperAnnot(responseWrapAnnot); > - } > - } > - mdc.setWebMethodAnnot(webMethodAnnot); > - dbc.addMethodDescriptionComposite(mdc); > - > - break; > - } > - } > - } > - > - dbc.setWebServiceAnnot(serviceAnnot); > - dbc.setWsdlDefinition(wsdlDefinition); > - dbc.setClassName(endpointClassName); > - dbc.setCustomWsdlGenerator(new WSDLGeneratorImpl > (wsdlDefinition)); > - dbcMap.put(endpointClassName, dbc); > - List<ServiceDescription> serviceDescList = > DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap); > - ServiceDescription sd = serviceDescList.get(0); > - Parameter serviceDescription = new Parameter > (EndpointDescription.AXIS_SERVICE_PARAMETER, > sd.getEndpointDescriptions()[0]); > - service.addParameter(serviceDescription); > + AxisServiceGenerator serviceGen = new > AxisServiceGenerator(); > + service = serviceGen.getServiceFromWSDL(portInfo, > endpointClassName, wsdlDefinition, classLoader); > > }else { //No WSDL, Axis2 will handle it. Is it ? > service = AxisService.createService > (endpointClassName, configurationContext.getAxisConfiguration(), > JAXWSMessageReceiver.class); > > Added: geronimo/server/trunk/modules/geronimo-axis2/src/main/java/ > org/apache/geronimo/axis2/AxisServiceGenerator.java > URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/ > geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ > AxisServiceGenerator.java?view=auto&rev=506561 > ====================================================================== > ======== > --- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/AxisServiceGenerator.java (added) > +++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/ > apache/geronimo/axis2/AxisServiceGenerator.java Mon Feb 12 10:16:14 > 2007 > @@ -0,0 +1,296 @@ > +/** > + * 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.geronimo.axis2; > + > +import java.io.ByteArrayOutputStream; > +import java.io.StringBufferInputStream; > +import java.io.StringReader; > +import java.lang.reflect.Method; > +import java.net.URI; > +import java.util.HashMap; > +import java.util.Iterator; > +import java.util.List; > +import java.util.Map; > + > +import javax.wsdl.Definition; > +import javax.wsdl.Port; > +import javax.wsdl.Service; > +import javax.wsdl.factory.WSDLFactory; > +import javax.wsdl.xml.WSDLWriter; > +import javax.xml.namespace.QName; > +import javax.xml.ws.WebServiceException; > + > +import org.apache.axiom.om.OMElement; > +import org.apache.axiom.om.OMNamespace; > +import org.apache.axis2.Constants; > +import org.apache.axis2.description.AxisMessage; > +import org.apache.axis2.description.AxisOperation; > +import org.apache.axis2.description.AxisService; > +import org.apache.axis2.description.Parameter; > +import org.apache.axis2.description.WSDL11ToAxisServiceBuilder; > +import org.apache.axis2.description.WSDL20ToAxisServiceBuilder; > +import org.apache.axis2.description.WSDLToAxisServiceBuilder; > +import org.apache.axis2.jaxws.description.DescriptionFactory; > +import org.apache.axis2.jaxws.description.EndpointDescription; > +import org.apache.axis2.jaxws.description.ServiceDescription; > +import > org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite > ; > +import > org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite; > +import > org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposi > te; > +import > org.apache.axis2.jaxws.description.builder.ResponseWrapperAnnot; > +import org.apache.axis2.jaxws.description.builder.WebMethodAnnot; > +import org.apache.axis2.jaxws.description.builder.WebParamAnnot; > +import org.apache.axis2.jaxws.description.builder.WebResultAnnot; > +import org.apache.axis2.jaxws.description.builder.WebServiceAnnot; > +import org.apache.axis2.jaxws.description.builder.WsdlComposite; > +import org.apache.axis2.jaxws.description.builder.WsdlGenerator; > +import org.apache.axis2.jaxws.server.JAXWSMessageReceiver; > +import org.apache.axis2.util.XMLUtils; > +import org.apache.axis2.wsdl.WSDLConstants; > +import org.apache.axis2.wsdl.WSDLUtil; > +import org.apache.ws.commons.schema.XmlSchemaComplexType; > +import org.apache.ws.commons.schema.XmlSchemaElement; > +import org.apache.ws.commons.schema.XmlSchemaObject; > +import org.apache.ws.commons.schema.XmlSchemaSequence; > +import org.apache.ws.commons.schema.XmlSchemaType; > + > +public class AxisServiceGenerator { > + > + public AxisServiceGenerator(){ > + super(); > + } > + > + public AxisService getServiceFromWSDL > (org.apache.geronimo.jaxws.PortInfo portInfo, String > endpointClassName, Definition wsdlDefinition, ClassLoader > classLoader) throws Exception { > + WSDLToAxisServiceBuilder wsdlBuilder = null; > + > + WSDLFactory factory = WSDLFactory.newInstance(); > + WSDLWriter writer = factory.newWSDLWriter(); > + > + ByteArrayOutputStream out = new ByteArrayOutputStream(); > + writer.writeWSDL(wsdlDefinition, out); > + String wsdlContent = out.toString("UTF-8"); //TODO WSDL > Doc must be either UTF-8 or UTF-16 > + > + OMNamespace documentElementNS = ((OMElement)XMLUtils.toOM(new > StringReader(wsdlContent))).getNamespace(); > + > + Map<QName, Service> serviceMap = wsdlDefinition.getServices(); > + Service wsdlService = serviceMap.values().iterator().next(); > + > + Map<String, Port> portMap = wsdlService.getPorts(); > + Port port = portMap.values().iterator().next(); > + String portName = port.getName(); > + QName serviceQName = wsdlService.getQName(); > + > + //Decide WSDL Version : > + if > (WSDLConstants.WSDL20_2006Constants.DEFAULT_NAMESPACE_URI.equals > (documentElementNS.getNamespaceURI())){ > + wsdlBuilder = new WSDL20ToAxisServiceBuilder(new > StringBufferInputStream(wsdlContent), serviceQName, null); > + } > + else if(Constants.NS_URI_WSDL11.equals > (documentElementNS.getNamespaceURI())){ > + wsdlBuilder = new WSDL11ToAxisServiceBuilder(wsdlDefinition, > serviceQName , portName); > + } > + //populate with axis2 objects > + AxisService service = wsdlBuilder.populateService(); > + service.addParameter(new Parameter("ServiceClass", > endpointClassName)); > + service.setWsdlFound(true); > + service.setClassLoader(classLoader); > + > + //Going to create annotations by hand > + DescriptionBuilderComposite dbc = new > DescriptionBuilderComposite(); > + dbc.setClassLoader(classLoader); > + HashMap<String, DescriptionBuilderComposite> dbcMap = new > HashMap<String, DescriptionBuilderComposite>(); > + > + //Service related annotations > + WebServiceAnnot serviceAnnot = > WebServiceAnnot.createWebServiceAnnotImpl(); > + serviceAnnot.setPortName(portName); > + serviceAnnot.setServiceName(service.getName()); > + serviceAnnot.setName(service.getName()); > + serviceAnnot.setTargetNamespace(service.getTargetNamespace > ()); > + > + Class endPointClass = classLoader.loadClass(endpointClassName); > + Method[] classMethods = endPointClass.getMethods(); > + > + for(Iterator<AxisOperation> opIterator = > service.getOperations() ; opIterator.hasNext() ;){ > + AxisOperation operation = opIterator.next(); > + operation.setMessageReceiver > (JAXWSMessageReceiver.class.newInstance()); > + > + for(Method method : classMethods){ > + String axisOpName = operation.getName().getLocalPart(); > + if(method.getName().equals(axisOpName)){ > + fillOperationInformation(method, operation, dbc); > + break; > + } > + } > + } > + > + dbc.setWebServiceAnnot(serviceAnnot); > + dbc.setWsdlDefinition(wsdlDefinition); > + dbc.setClassName(endpointClassName); > + dbc.setCustomWsdlGenerator(new WSDLGeneratorImpl > (wsdlDefinition)); > + dbcMap.put(endpointClassName, dbc); > + List<ServiceDescription> serviceDescList = > DescriptionFactory.createServiceDescriptionFromDBCMap(dbcMap); > + ServiceDescription sd = serviceDescList.get(0); > + Parameter serviceDescription = new Parameter > (EndpointDescription.AXIS_SERVICE_PARAMETER, > sd.getEndpointDescriptions()[0]); > + service.addParameter(serviceDescription); > + > + return service; > + } > + > + private void fillOperationInformation(Method method, > AxisOperation operation, DescriptionBuilderComposite dbc) throws > Exception{ > + > + MethodDescriptionComposite mdc = new MethodDescriptionComposite(); > + WebMethodAnnot webMethodAnnot = > WebMethodAnnot.createWebMethodAnnotImpl(); > + webMethodAnnot.setOperationName(method.getName()); > + > + //TODO: Might need implement more here > +// if(operation.getStyle().equals(AxisOperation.STYLE_DOC)){ > +// > +// }else if(operation.getStyle().equals(AxisOperation.STYLE_RPC)){ > +// > +// } > + > + > + mdc.setWebMethodAnnot(webMethodAnnot); > + mdc.setMethodName(method.getName()); > + > + String MEP = operation.getMessageExchangePattern(); > + > + if (WSDLUtil.isInputPresentForMEP(MEP)) { > + AxisMessage inAxisMessage = operation.getMessage > (WSDLConstants.MESSAGE_LABEL_IN_VALUE); > + if(inAxisMessage != null){ > + > + XmlSchemaType schemaType = inAxisMessage.getSchemaElement > ().getSchemaType(); > + > + if(schemaType instanceof XmlSchemaComplexType){ > + XmlSchemaComplexType complexSchemaType = > (XmlSchemaComplexType)schemaType; > + > + if(complexSchemaType.getParticle() instanceof > XmlSchemaSequence){ > + XmlSchemaSequence sequence = (XmlSchemaSequence) > complexSchemaType.getParticle(); > + for(Iterator iterator = sequence.getItems().getIterator(); > iterator.hasNext();){ > + XmlSchemaObject xmlObject = (XmlSchemaObject)iterator.next > (); > + > + if(xmlObject instanceof XmlSchemaElement){ > + XmlSchemaElement xmlElement = (XmlSchemaElement)xmlObject; > + > + ParameterDescriptionComposite pdc = new > ParameterDescriptionComposite(); > + WebParamAnnot webParamAnnot = > WebParamAnnot.createWebParamAnnotImpl(); > + > + webParamAnnot.setName(xmlElement.getName()); > + pdc.setWebParamAnnot(webParamAnnot); > + > + Class[] paramTypes = method.getParameterTypes(); > + > + for(Class paramType : paramTypes){ > + String strParamType = paramType.toString(); > + pdc.setParameterType(strParamType.split(" ")[1]); > + } > + > + mdc.addParameterDescriptionComposite(pdc); > + } > + > + } > + } > + } > + } > + } > + > + if (WSDLUtil.isOutputPresentForMEP(MEP)) { > + AxisMessage outAxisMessage = operation.getMessage > (WSDLConstants.MESSAGE_LABEL_OUT_VALUE); > + > + if(outAxisMessage != null){ > + > + XmlSchemaType schemaType = outAxisMessage.getSchemaElement > ().getSchemaType(); > + mdc.setReturnType(method.getReturnType().toString().split(" > ")[1]); > + > + if(schemaType instanceof XmlSchemaComplexType){ > + XmlSchemaComplexType complexSchemaType = > (XmlSchemaComplexType)schemaType; > + > + if(complexSchemaType.getParticle() instanceof > XmlSchemaSequence){ > + XmlSchemaSequence sequence = (XmlSchemaSequence) > complexSchemaType.getParticle(); > + for(Iterator iterator = sequence.getItems().getIterator > (); iterator.hasNext();){ > + XmlSchemaObject xmlObject = (XmlSchemaObject) > iterator.next(); > + > + if(xmlObject instanceof XmlSchemaElement){ > + XmlSchemaElement xmlElement = (XmlSchemaElement)xmlObject; > + WebResultAnnot webResult = > WebResultAnnot.createWebResultAnnotImpl(); > + webResult.setName(xmlElement.getName()); > + mdc.setWebResultAnnot(webResult); > + } > + } > + } > + } > + > + ResponseWrapperAnnot responseWrap = > ResponseWrapperAnnot.createResponseWrapperAnnotImpl(); > + responseWrap.setClassName(getWrapperClassName > (outAxisMessage.getElementQName())); > + mdc.setResponseWrapperAnnot(responseWrap); > + } > + } > + mdc.setWebMethodAnnot(webMethodAnnot); > + dbc.addMethodDescriptionComposite(mdc); > + } > + > + //TODO: Has to verify how JAXB default class wrapper class > generation logic > + private String getWrapperClassName(QName element) throws Exception { > + String localPart = element.getLocalPart(); > + String nameSpace = element.getNamespaceURI(); > + > + URI nameSpaceURI = new URI(nameSpace); > + > + String host = nameSpaceURI.getHost(); > + String path = nameSpaceURI.getPath(); > + String[] pathParts = path.split("/"); > + int index = 0; > + > + while(index < host.length()){ > + if(host.charAt(index) == '.'){ > + break; > + } > + index ++; > + } > + > + String packageName = host.substring(index+1, host.length()) > +"."+host.substring(0, index); > + > + for(String pathPart : pathParts){ > + if(!pathPart.equals("")){ > + packageName += ("."+pathPart); > + } > + } > + > + String className = localPart; > + if(Character.isLowerCase(localPart.charAt(0))){ > + className = (char)Character.toUpperCase(localPart.charAt(0)) > +className.substring(1, className.length()); > + } > + > + return packageName + "." + className; > + } > + > + private class WSDLGeneratorImpl implements WsdlGenerator { > + > + private Definition def; > + > + public WSDLGeneratorImpl(Definition def) { > + this.def = def; > + } > + > + public WsdlComposite generateWsdl(String implClass, String > bindingType) throws WebServiceException { > + // Need WSDL generation code > + WsdlComposite composite = new WsdlComposite(); > + composite.setWsdlFileName(implClass); > + HashMap<String, Definition> testMap = new HashMap<String, > Definition>(); > + testMap.put(composite.getWsdlFileName(), def); > + composite.setWsdlDefinition(testMap); > + return composite; > + } > + } > +} > >
-- Davanum Srinivas :: http://wso2.org/ :: Oxygen for Web Services Developers
