| /* |
| * 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.axis2.wsdl.codegen.emitter; |
| |
| import org.apache.axis2.description.AxisBindingOperation; |
| import org.apache.axis2.description.AxisMessage; |
| import org.apache.axis2.description.AxisOperation; |
| import org.apache.axis2.description.PolicyInclude; |
| import org.apache.axis2.util.JavaUtils; |
| import org.apache.axis2.util.PolicyUtil; |
| import org.apache.axis2.util.Utils; |
| import org.apache.axis2.wsdl.HTTPHeaderMessage; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| import org.apache.axis2.wsdl.WSDLUtil; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| import org.apache.axis2.description.WSDL2Constants; |
| import org.apache.axis2.wsdl.SOAPHeaderMessage; |
| import org.apache.axis2.wsdl.codegen.CodeGenConfiguration; |
| import org.apache.axis2.wsdl.codegen.CodeGenerationException; |
| import org.apache.axis2.wsdl.codegen.writer.CBuildScriptWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CServiceXMLWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CSkelHeaderWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CSkelSourceWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CStubHeaderWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CStubSourceWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CSvcSkeletonWriter; |
| import org.apache.axis2.wsdl.codegen.writer.CVCProjectWriter; |
| import org.apache.axis2.wsdl.codegen.writer.FileWriter; |
| import org.apache.axis2.wsdl.databinding.CUtils; |
| import org.apache.axis2.wsdl.databinding.TypeMapper; |
| import org.apache.axis2.wsdl.databinding.CTypeMapper; |
| import org.apache.neethi.Policy; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| |
| import javax.xml.namespace.QName; |
| import java.io.File; |
| import java.util.*; |
| |
| //import com.ibm.wsdl.util.xml.DOM2Writer; |
| |
| public class CEmitter extends AxisServiceBasedMultiLanguageEmitter { |
| protected static final String C_STUB_PREFIX = "axis2_stub_"; |
| protected static final String C_SKEL_PREFIX = "axis2_skel_"; |
| protected static final String C_SVC_SKEL_PREFIX = "axis2_svc_skel_"; |
| protected static final String C_STUB_SUFFIX = ""; |
| protected static final String C_SKEL_SUFFIX = ""; |
| protected static final String C_SVC_SKEL_SUFFIX = ""; |
| |
| protected static final String JAVA_DEFAULT_TYPE = "org.apache.axiom.om.OMElement"; |
| protected static final String C_DEFAULT_TYPE = "axiom_node_t*"; |
| |
| protected static final String C_OUR_TYPE_PREFIX = "axis2_"; |
| protected static final String C_OUR_TYPE_SUFFIX = "_t*"; |
| protected static final String C_GEN_NO_MESSAGE_CONTEXT = "nmc"; |
| |
| |
| public CEmitter() { |
| super(); |
| } |
| |
| /** @param configuration */ |
| public CEmitter(CodeGenConfiguration configuration) { |
| super(); |
| this.codeGenConfiguration = configuration; |
| this.mapper = new CTypeMapper(); |
| |
| |
| } |
| |
| /** |
| * @param configuration |
| * @param mapper |
| */ |
| public CEmitter(CodeGenConfiguration configuration, TypeMapper mapper) { |
| super(); |
| this.codeGenConfiguration = configuration; |
| this.mapper = mapper; |
| |
| |
| } |
| |
| /** |
| * Emit the stub |
| * |
| * @throws CodeGenerationException |
| */ |
| public void emitStub() throws CodeGenerationException { |
| |
| try { |
| // write interface implementations |
| writeCStub(); |
| |
| writeVCProjectFile(); |
| |
| } catch (Exception e) { |
| //log the error here |
| e.printStackTrace(); |
| } |
| } |
| |
| |
| |
| /** |
| * Emit the skeltons |
| * |
| * @throws CodeGenerationException |
| */ |
| public void emitSkeleton() throws CodeGenerationException { |
| try { |
| // write skeleton |
| writeCSkel(); |
| |
| // write a Service Skeleton for this particular service. |
| writeCServiceSkeleton(); |
| //create the build script |
| emitBuildScript(); |
| |
| writeServiceXml(); |
| |
| writeVCProjectFile(); |
| |
| } |
| catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| /** |
| * Emit the build script |
| * |
| * @throws CodeGenerationException |
| */ |
| public void emitBuildScript() throws CodeGenerationException { |
| try { |
| writeBuildScript(); |
| } |
| catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| |
| /** |
| * Writes the Stub. |
| * |
| * @throws Exception |
| */ |
| protected void writeCStub() throws Exception { |
| |
| // first check for the policies in this service and write them |
| Document interfaceImplModel = createDOMDocumentForInterfaceImplementation(); |
| |
| CStubHeaderWriter writerHStub = |
| new CStubHeaderWriter(getOutputDirectory(codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(interfaceImplModel, writerHStub); |
| |
| |
| CStubSourceWriter writerCStub = |
| new CStubSourceWriter(getOutputDirectory(codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(interfaceImplModel, writerCStub); |
| } |
| |
| private void addGenerateMessageContextAttr(Document model) |
| { |
| Element rootEle = model.getDocumentElement(); |
| Map<Object,Object> propertyMap = this.codeGenConfiguration.getProperties(); |
| boolean generateMsgCtx = true; |
| if(propertyMap.containsKey(C_GEN_NO_MESSAGE_CONTEXT)) |
| { |
| if(Boolean.valueOf(propertyMap.get(C_GEN_NO_MESSAGE_CONTEXT).toString()).booleanValue()) |
| { |
| generateMsgCtx = false; |
| } |
| } |
| addAttribute(model, "generateMsgCtx",generateMsgCtx ? "1" : "0", rootEle); |
| |
| } |
| /** |
| * Writes the Skel. |
| * |
| * @throws Exception |
| */ |
| protected void writeCSkel() throws Exception { |
| |
| Document skeletonModel = createDOMDocumentForSkeleton(codeGenConfiguration.isServerSideInterface()); |
| addGenerateMessageContextAttr(skeletonModel); |
| |
| CSkelHeaderWriter skeletonWriter = new CSkelHeaderWriter( |
| getOutputDirectory(this.codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| this.codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(skeletonModel, skeletonWriter); |
| |
| CSkelSourceWriter skeletonWriterStub = new CSkelSourceWriter( |
| getOutputDirectory(this.codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| this.codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(skeletonModel, skeletonWriterStub); |
| |
| |
| } |
| |
| /** @throws Exception */ |
| protected void writeCServiceSkeleton() throws Exception { |
| |
| Document skeletonModel = createDOMDocumentForServiceSkeletonXML(); |
| addGenerateMessageContextAttr(skeletonModel); |
| CSvcSkeletonWriter writer = |
| new CSvcSkeletonWriter(getOutputDirectory(codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| codeGenConfiguration.getOutputLanguage()); |
| writeFile(skeletonModel, writer); |
| } |
| |
| /** |
| * Write VC Projects |
| */ |
| |
| protected void writeVCProjectFile() throws Exception { |
| Document doc = createDOMDocumentForInterfaceImplementation(); |
| CodeGenConfiguration codegen = this.codeGenConfiguration; |
| Element rootElement = doc.getDocumentElement(); |
| String outputLocation = codegen.getOutputLocation().getPath(); |
| String targetSourceLocation = codegen.getSourceLocation(); |
| addAttribute(doc, "targetSourceLocation",targetSourceLocation, rootElement); |
| if(codegen.isSetoutputSourceLocation() && !outputLocation.equals(".") && !outputLocation.equals("")){ |
| if(!codegen.isFlattenFiles()){ |
| addAttribute(doc,"option","1",rootElement); |
| } else{ |
| addAttribute(doc,"option","0",rootElement); |
| } |
| addAttribute(doc,"outputlocation",outputLocation,rootElement); |
| } |
| else |
| { |
| addAttribute(doc,"option","0",rootElement); |
| } |
| addAttribute(doc,"isServer",codeGenConfiguration.isServerSide() ? "1": "0", rootElement); |
| CVCProjectWriter writer = new CVCProjectWriter( |
| getOutputDirectory( |
| this.codeGenConfiguration.getOutputLocation(), |
| this.codeGenConfiguration.getSourceLocation()), |
| this.codeGenConfiguration.getOutputLanguage(), |
| axisService.getName(), |
| this.codeGenConfiguration.isServerSide() |
| ); |
| writeFile(doc, writer); |
| } |
| |
| /** |
| * Write the Build Script |
| * |
| * @throws Exception |
| */ |
| |
| protected void writeBuildScript() throws Exception { |
| if (this.codeGenConfiguration.isGenerateDeployementDescriptor()) { |
| |
| // Write the service xml in a folder with the |
| Document buildXMLModel = createDOMDocumentForBuildScript(this.codeGenConfiguration); |
| FileWriter buildXmlWriter = |
| new CBuildScriptWriter( |
| getOutputDirectory(this.codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getSourceLocation()), |
| this.codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(buildXMLModel, buildXmlWriter); |
| } |
| } |
| |
| protected void writeServiceXml() throws Exception { |
| if (this.codeGenConfiguration.isGenerateDeployementDescriptor()) { |
| |
| // Write the service xml in a folder with the |
| Document serviceXMLModel = createDOMDocumentForServiceXML(); |
| FileWriter serviceXmlWriter = |
| new CServiceXMLWriter( |
| getOutputDirectory(this.codeGenConfiguration.getOutputLocation(), |
| codeGenConfiguration.getResourceLocation()), |
| this.codeGenConfiguration.getOutputLanguage()); |
| |
| writeFile(serviceXMLModel, serviceXmlWriter); |
| } |
| } |
| /** Creates the DOM tree for implementations. */ |
| protected Document createDOMDocumentForInterfaceImplementation() throws Exception { |
| |
| String serviceName = axisService.getName(); |
| String serviceTns = axisService.getTargetNamespace(); |
| String serviceCName = makeCClassName(axisService.getName()); |
| String stubName = C_STUB_PREFIX + serviceCName + C_STUB_SUFFIX; |
| Document doc = getEmptyDocument(); |
| Element rootElement = doc.createElement("class"); |
| |
| addAttribute(doc, "name", stubName, rootElement); |
| addAttribute(doc, "caps-name", stubName.toUpperCase(), rootElement); |
| addAttribute(doc, "prefix", stubName, rootElement); //prefix to be used by the functions |
| addAttribute(doc, "qname", serviceName + "|" + serviceTns, rootElement); |
| addAttribute(doc, "servicename", serviceCName, rootElement); |
| addAttribute(doc, "package", "", rootElement); |
| |
| addAttribute(doc, "namespace", serviceTns, rootElement); |
| addAttribute(doc, "interfaceName", serviceCName, rootElement); |
| |
| /* The following block of code is same as for the |
| * AxisServiceBasedMultiLanguageEmitter createDOMDocumentForInterfaceImplementation() |
| */ |
| // add the wrap classes flag |
| if (codeGenConfiguration.isPackClasses()) { |
| addAttribute(doc, "wrapped", "yes", rootElement); |
| } |
| |
| // add SOAP version |
| addSoapVersion(doc, rootElement); |
| |
| // add the end point |
| addEndpoint(doc, rootElement); |
| |
| // set the sync/async attributes |
| fillSyncAttributes(doc, rootElement); |
| |
| // ########################################################################################### |
| // this block of code specifically applies to the integration of databinding code into the |
| // generated classes tightly (probably as inner classes) |
| // ########################################################################################### |
| // check for the special models in the mapper and if they are present process them |
| if (mapper.isObjectMappingPresent()) { |
| |
| // add an attribute to the root element showing that the writing has been skipped |
| addAttribute(doc, "skip-write", "yes", rootElement); |
| |
| // process the mapper objects |
| processModelObjects(mapper.getAllMappedObjects(), rootElement, doc); |
| } |
| |
| // ############################################################################################# |
| |
| // load the operations |
| loadOperations(doc, rootElement, null); |
| |
| // add the databind supporters. Now the databind supporters are completly contained inside |
| // the stubs implementation and not visible outside |
| rootElement.appendChild(createDOMElementforDatabinders(doc, false)); |
| |
| Object stubMethods; |
| |
| //if some extension has added the stub methods property, add them to the |
| //main document |
| if ((stubMethods = codeGenConfiguration.getProperty("stubMethods")) != null) { |
| rootElement.appendChild(doc.importNode((Element)stubMethods, true)); |
| } |
| |
| //add another element to have the unique list of faults |
| rootElement.appendChild(getUniqueListofFaults(doc)); |
| |
| ///////////////////////////////////////////////////// |
| // System.out.println(DOM2Writer.nodeToString(rootElement)); |
| ///////////////////////////////////////////////////// |
| |
| |
| doc.appendChild(rootElement); |
| return doc; |
| } |
| |
| protected Document createDOMDocumentForSkeleton(boolean isSkeletonInterface) { |
| Document doc = getEmptyDocument(); |
| Element rootElement = doc.createElement("interface"); |
| |
| String serviceCName = makeCClassName(axisService.getName()); |
| String skelName = C_SKEL_PREFIX + serviceCName + C_SKEL_SUFFIX; |
| |
| // only the name is used |
| addAttribute(doc, "name", skelName, rootElement); |
| addAttribute(doc, "caps-name", skelName.toUpperCase(), rootElement); |
| addAttribute(doc, "package", "", rootElement); |
| String serviceName = axisService.getName(); |
| String serviceTns = axisService.getTargetNamespace(); |
| addAttribute(doc, "prefix", skelName, rootElement); //prefix to be used by the functions |
| addAttribute(doc, "qname", serviceName + "|" + serviceTns, rootElement); |
| |
| |
| fillSyncAttributes(doc, rootElement); |
| loadOperations(doc, rootElement, null); |
| |
| //attach a list of faults |
| rootElement.appendChild(getUniqueListofFaults(doc)); |
| |
| doc.appendChild(rootElement); |
| |
| |
| ///////////////////////////////////////////////////// |
| // System.out.println(DOM2Writer.nodeToString(rootElement)); |
| ///////////////////////////////////////////////////// |
| |
| return doc; |
| |
| } |
| |
| protected Document createDOMDocumentForServiceSkeletonXML() { |
| Document doc = getEmptyDocument(); |
| Element rootElement = doc.createElement("interface"); |
| |
| String localPart = makeCClassName(axisService.getName()); |
| String svcSkelName = C_SVC_SKEL_PREFIX + localPart + C_SVC_SKEL_SUFFIX; |
| String skelName = C_SKEL_PREFIX + localPart + C_SKEL_SUFFIX; |
| |
| // only the name is used |
| addAttribute(doc, "name", svcSkelName, rootElement); |
| addAttribute(doc, "caps-svc-name", skelName.toUpperCase(), rootElement); |
| addAttribute(doc, "prefix", svcSkelName, rootElement); //prefix to be used by the functions |
| String serviceName = axisService.getName(); |
| String serviceTns = axisService.getTargetNamespace(); |
| addAttribute(doc, "qname", serviceName + "|" + serviceTns, rootElement); |
| |
| addAttribute(doc, "svcname", skelName, rootElement); |
| addAttribute(doc, "svcop_prefix", skelName, rootElement); |
| addAttribute(doc, "package", "", rootElement); |
| |
| fillSyncAttributes(doc, rootElement); |
| loadOperations(doc, rootElement, null); |
| |
| // add SOAP version |
| addSoapVersion(doc, rootElement); |
| |
| //attach a list of faults |
| rootElement.appendChild(getUniqueListofFaults(doc)); |
| |
| doc.appendChild(rootElement); |
| return doc; |
| |
| } |
| |
| protected Document createDOMDocumentForBuildScript(CodeGenConfiguration codegen) { |
| Document doc = getEmptyDocument(); |
| Element rootElement = doc.createElement("interface"); |
| |
| String serviceCName = makeCClassName(axisService.getName()); |
| // String skelName = C_SKEL_PREFIX + serviceCName + C_SKEL_SUFFIX; |
| addAttribute(doc,"servicename",serviceCName,rootElement); |
| //if user specify a location for the source |
| if(codegen.isSetoutputSourceLocation()){ |
| String outputLocation = codegen.getOutputLocation().getPath(); |
| String targetsourceLocation = codegen.getSourceLocation(); |
| addAttribute(doc,"option","1",rootElement); |
| addAttribute(doc,"outputlocation",outputLocation,rootElement); |
| addAttribute(doc,"targetsourcelocation",targetsourceLocation,rootElement); |
| } |
| else |
| { |
| addAttribute(doc,"option","0",rootElement); |
| } |
| fillSyncAttributes(doc, rootElement); |
| loadOperations(doc, rootElement, null); |
| // add SOAP version |
| addSoapVersion(doc, rootElement); |
| |
| //attach a list of faults |
| rootElement.appendChild(getUniqueListofFaults(doc)); |
| |
| doc.appendChild(rootElement); |
| return doc; |
| |
| } |
| |
| /** |
| * @param word |
| * @return Returns character removed string. |
| */ |
| protected String makeCClassName(String word) { |
| //currently avoid only java key words and service names with '.' characters |
| |
| if (CUtils.isCKeyword(word)) { |
| return CUtils.makeNonCKeyword(word); |
| } |
| String outWord = word.replace('.', '_'); |
| return outWord.replace('-', '_'); |
| } |
| |
| |
| /** |
| * Loads the operations |
| * |
| * @param doc |
| * @param rootElement |
| * @param mep |
| * @return operations found |
| */ |
| protected boolean loadOperations(Document doc, Element rootElement, String mep) { |
| Element methodElement; |
| String portTypeName = makeCClassName(axisService.getName()); |
| |
| Iterator bindingOperations = this.axisBinding.getChildren(); |
| boolean opsFound = false; |
| AxisOperation axisOperation = null; |
| AxisBindingOperation axisBindingOperation = null; |
| |
| while (bindingOperations.hasNext()) { |
| |
| axisBindingOperation = (AxisBindingOperation) bindingOperations.next(); |
| axisOperation = axisBindingOperation.getAxisOperation(); |
| |
| // populate info holder with mep information. This will used in determining which |
| // message receiver to use, etc., |
| |
| String messageExchangePattern = axisOperation.getMessageExchangePattern(); |
| if (infoHolder.get(messageExchangePattern) == null) { |
| infoHolder.put(messageExchangePattern, Boolean.TRUE); |
| } |
| |
| if (mep == null) { |
| |
| opsFound = true; |
| |
| List soapHeaderInputParameterList = new ArrayList(); |
| List soapHeaderOutputParameterList = new ArrayList(); |
| |
| methodElement = doc.createElement("method"); |
| |
| String localPart = axisOperation.getName().getLocalPart(); |
| String opCName = makeCClassName(localPart); |
| String opNS = axisOperation.getName().getNamespaceURI(); |
| |
| addAttribute(doc, "name", opCName, methodElement); |
| addAttribute(doc, "caps-name", opCName.toUpperCase(), methodElement); |
| addAttribute(doc, "localpart", localPart, methodElement); |
| addAttribute(doc, "qname", localPart + "|" + opNS, methodElement); |
| |
| addAttribute(doc, "namespace", opNS, methodElement); |
| String style = axisOperation.getStyle(); |
| addAttribute(doc, "style", style, methodElement); |
| addAttribute(doc, "dbsupportname", |
| portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX, |
| methodElement); |
| |
| |
| addAttribute(doc, "mep", Utils.getAxisSpecifMEPConstant( |
| axisOperation.getMessageExchangePattern()) + "", methodElement); |
| addAttribute(doc, "mepURI", axisOperation.getMessageExchangePattern(), |
| methodElement); |
| |
| |
| addSOAPAction(doc, methodElement, axisBindingOperation.getName()); |
| //add header ops for input |
| addHeaderOperations(soapHeaderInputParameterList, axisBindingOperation, true); |
| //add header ops for output |
| addHeaderOperations(soapHeaderOutputParameterList, axisBindingOperation, false); |
| |
| PolicyInclude policyInclude = axisOperation.getPolicyInclude(); |
| Policy policy = policyInclude.getPolicy(); |
| if (policy != null) { |
| try { |
| addAttribute(doc, "policy", PolicyUtil.policyComponentToString(policy), |
| methodElement); |
| } catch (Exception ex) { |
| throw new RuntimeException("can't serialize the policy to a String ", ex); |
| } |
| } |
| |
| methodElement.appendChild( |
| getInputElement(doc, axisBindingOperation, soapHeaderInputParameterList)); |
| methodElement.appendChild( |
| getOutputElement(doc, axisBindingOperation, soapHeaderOutputParameterList)); |
| methodElement.appendChild(getFaultElement(doc, axisOperation)); |
| |
| rootElement.appendChild(methodElement); |
| } else { |
| //mep is present - we move ahead only if the given mep matches the mep of this operation |
| |
| if (mep.equals(axisOperation.getMessageExchangePattern())) { |
| //at this point we know it's true |
| opsFound = true; |
| List soapHeaderInputParameterList = new ArrayList(); |
| List soapHeaderOutputParameterList = new ArrayList(); |
| methodElement = doc.createElement("method"); |
| String localPart = axisOperation.getName().getLocalPart(); |
| String opCName = makeCClassName(localPart); |
| String opNS = axisOperation.getName().getNamespaceURI(); |
| |
| addAttribute(doc, "name", opCName, methodElement); |
| addAttribute(doc, "caps-name", opCName.toUpperCase(), methodElement); |
| addAttribute(doc, "localpart", localPart, methodElement); |
| addAttribute(doc, "qname", localPart + "|" + opNS, methodElement); |
| |
| addAttribute(doc, "namespace", axisOperation.getName().getNamespaceURI(), |
| methodElement); |
| addAttribute(doc, "style", axisOperation.getStyle(), methodElement); |
| addAttribute(doc, "dbsupportname", |
| portTypeName + localPart + DATABINDING_SUPPORTER_NAME_SUFFIX, |
| methodElement); |
| |
| addAttribute(doc, "mep", Utils.getAxisSpecifMEPConstant( |
| axisOperation.getMessageExchangePattern()) + "", methodElement); |
| addAttribute(doc, "mepURI", axisOperation.getMessageExchangePattern(), |
| methodElement); |
| |
| |
| addSOAPAction(doc, methodElement, axisBindingOperation.getName()); |
| addHeaderOperations(soapHeaderInputParameterList, axisBindingOperation, true); |
| addHeaderOperations(soapHeaderOutputParameterList, axisBindingOperation, false); |
| |
| /* |
| * Setting the policy of the operation |
| */ |
| |
| Policy policy = axisOperation.getPolicyInclude().getPolicy(); |
| if (policy != null) { |
| try { |
| addAttribute(doc, "policy", |
| PolicyUtil.policyComponentToString(policy), |
| methodElement); |
| } catch (Exception ex) { |
| throw new RuntimeException("can't serialize the policy to a String", |
| ex); |
| } |
| } |
| |
| |
| methodElement.appendChild(getInputElement(doc, |
| axisBindingOperation, |
| soapHeaderInputParameterList)); |
| methodElement.appendChild(getOutputElement(doc, |
| axisBindingOperation, |
| soapHeaderOutputParameterList)); |
| methodElement.appendChild(getFaultElement(doc, |
| axisOperation)); |
| rootElement.appendChild(methodElement); |
| ////////////////////// |
| } |
| |
| } |
| |
| } |
| |
| return opsFound; |
| } |
| |
| |
| /** |
| * A convenient method for the generating the parameter element |
| * |
| * @param doc |
| * @param paramName |
| * @param paramType |
| * @param opName |
| * @param paramName |
| */ |
| protected Element generateParamComponent(Document doc, |
| String paramName, |
| String paramType, |
| QName opName, |
| QName paramQName, |
| String partName, |
| boolean isPrimitive, |
| boolean isArray) { |
| |
| Element paramElement = doc.createElement("param"); |
| //return paramElement;/* |
| addAttribute(doc, "name", |
| paramName, paramElement); |
| |
| String typeMappingStr = (paramType == null) |
| ? "" |
| : paramType; |
| |
| |
| if (JAVA_DEFAULT_TYPE.equals(typeMappingStr)) { |
| typeMappingStr = C_DEFAULT_TYPE; |
| } |
| |
| addAttribute(doc, "type", typeMappingStr, paramElement); |
| //adds the short type |
| addShortType(paramElement, (paramQName == null) ? null : paramQName.getLocalPart()); |
| |
| addAttribute(doc, "caps-type", typeMappingStr.toUpperCase(), paramElement); |
| |
| // add an extra attribute to say whether the type mapping is the default |
| if (mapper.getDefaultMappingName().equals(paramType)) { |
| addAttribute(doc, "default", "yes", paramElement); |
| } |
| addAttribute(doc, "value", getParamInitializer(paramType), paramElement); |
| // add this as a body parameter |
| addAttribute(doc, "location", "body", paramElement); |
| |
| //if the opName and partName are present , add them |
| if (opName != null) { |
| addAttribute(doc, "opname", opName.getLocalPart(), paramElement); |
| |
| } |
| |
| if (paramQName != null) { |
| Element qNameElement = doc.createElement("qname"); |
| addAttribute(doc, "nsuri", paramQName.getNamespaceURI(), qNameElement); |
| addAttribute(doc, "localname", paramQName.getLocalPart(), qNameElement); |
| paramElement.appendChild(qNameElement); |
| } |
| |
| if (partName != null) { |
| addAttribute(doc, "partname", |
| JavaUtils.capitalizeFirstChar(partName), |
| paramElement); |
| } |
| |
| if (isPrimitive) { |
| addAttribute(doc, "primitive", "yes", paramElement); |
| } |
| |
| if (isArray) { |
| addAttribute(doc, "array", "yes", paramElement); |
| } |
| |
| // the new trick to identify adb types |
| boolean isOurs = true; |
| |
| if (typeMappingStr.length() != 0 && !typeMappingStr.equals("void") && |
| !typeMappingStr.equals(C_DEFAULT_TYPE)) { |
| addAttribute(doc, "ours", "yes", paramElement); |
| isOurs = true; |
| } else { |
| isOurs = false; |
| } |
| |
| if (isOurs) { |
| typeMappingStr = C_OUR_TYPE_PREFIX + typeMappingStr + C_OUR_TYPE_SUFFIX; |
| } |
| |
| addAttribute(doc, "axis2-type", typeMappingStr, paramElement); |
| addAttribute(doc, "axis2-caps-type", typeMappingStr.toUpperCase(), paramElement); |
| |
| return paramElement; //*/ |
| } |
| |
| /** |
| * @param doc |
| * @param operation |
| * @param param |
| */ |
| protected void addCSpecifcAttributes(Document doc, AxisOperation operation, Element param, |
| String messageType) { |
| String typeMappingStr; |
| AxisMessage message; |
| |
| if (messageType.equals(WSDLConstants.MESSAGE_LABEL_IN_VALUE)) { |
| message = operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE); |
| } else { |
| message = operation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE); |
| } |
| |
| String paramType = this.mapper.getTypeMappingName(message.getElementQName()); |
| if (doc == null || paramType == null || param == null) { |
| return; |
| } |
| |
| String type = this.mapper.getTypeMappingName(message.getElementQName()); |
| typeMappingStr = (type == null) ? "" : type; |
| addAttribute(doc, "caps-type", paramType.toUpperCase(), param); |
| |
| if (!paramType.equals("") && !paramType.equals("void") && |
| !typeMappingStr.equals(C_DEFAULT_TYPE) && typeMappingStr.contains("adb_")) { |
| addAttribute(doc, "ours", "yes", param); |
| } |
| } |
| |
| /** |
| * @param doc |
| * @param operation |
| * @return Returns the parameter element. |
| */ |
| protected Element[] getInputParamElement(Document doc, AxisOperation operation) { |
| Element[] param = super.getInputParamElement(doc, operation); |
| for (int i = 0; i < param.length; i++) { |
| addCSpecifcAttributes(doc, operation, param[i], WSDLConstants.MESSAGE_LABEL_IN_VALUE); |
| } |
| |
| return param; |
| } |
| |
| /** |
| * @param doc |
| * @param operation |
| * @return Returns Element. |
| */ |
| protected Element getOutputParamElement(Document doc, AxisOperation operation) { |
| Element param = super.getOutputParamElement(doc, operation); |
| addCSpecifcAttributes(doc, operation, param, WSDLConstants.MESSAGE_LABEL_OUT_VALUE); |
| |
| return param; |
| } |
| |
| /** |
| * Gets the output directory for source files. |
| * |
| * @param outputDir |
| * @return Returns File. |
| */ |
| protected File getOutputDirectory(File outputDir, String dir2) { |
| if (dir2 != null && !"".equals(dir2)) { |
| if (outputDir.getName().equals(".")) { |
| outputDir = new File(outputDir, dir2); |
| } |
| } |
| |
| if (!outputDir.exists() && !outputDir.mkdirs()){ |
| log.warn("Could not create output directory " + outputDir.getAbsolutePath()); |
| } |
| |
| return outputDir; |
| } |
| |
| /** |
| * @param doc |
| * @param parameters |
| * @param location |
| */ |
| protected List getParameterElementList(Document doc, List parameters, String location) { |
| List parameterElementList = new ArrayList(); |
| |
| if ((parameters != null) && !parameters.isEmpty()) { |
| int count = parameters.size(); |
| |
| for (int i = 0; i < count; i++) { |
| Element param = doc.createElement("param"); |
| SOAPHeaderMessage header = (SOAPHeaderMessage) parameters.get(i); |
| QName name = header.getElement(); |
| |
| addAttribute(doc, "name", this.mapper.getParameterName(name), param); |
| |
| String typeMapping = this.mapper.getTypeMappingName(name); |
| String typeMappingStr = (typeMapping == null) |
| ? "" |
| : typeMapping; |
| |
| addAttribute(doc, "type", typeMappingStr, param); |
| addAttribute(doc, "location", location, param); |
| if (header.isMustUnderstand()) { |
| addAttribute(doc, "mustUnderstand", "true", param); |
| } |
| |
| if (name != null) { |
| Element qNameElement = doc.createElement("qname"); |
| addAttribute(doc, "nsuri", name.getNamespaceURI(), qNameElement); |
| addAttribute(doc, "localname", name.getLocalPart(), qNameElement); |
| param.appendChild(qNameElement); |
| } |
| parameterElementList.add(param); |
| |
| // the new trick to identify adb types |
| boolean isOurs = true; |
| |
| if (typeMappingStr.length() != 0 && !typeMappingStr.equals("void") && |
| !typeMappingStr.equals(C_DEFAULT_TYPE)) { |
| addAttribute(doc, "ours", "yes", param); |
| isOurs = true; |
| } else { |
| isOurs = false; |
| } |
| |
| if (isOurs) { |
| typeMappingStr = C_OUR_TYPE_PREFIX + typeMappingStr + C_OUR_TYPE_SUFFIX; |
| } |
| |
| addAttribute(doc, "axis2-type", typeMappingStr, param); |
| |
| } |
| } |
| return parameterElementList; |
| } |
| |
| /** |
| * A util method that returns a unique list of faults for a given mep |
| * |
| * @param doc |
| * @return DOM element |
| */ |
| protected Element getUniqueListofFaultsofMep(Document doc, String mep) { |
| |
| // list to keep fault message qnames for this mep |
| Set faultListForMep = new HashSet(); |
| |
| Iterator iter = this.axisService.getOperations(); |
| AxisOperation axisOperation; |
| |
| for (; iter.hasNext();) { |
| axisOperation = (AxisOperation) iter.next(); |
| if (mep == null) { |
| // add the fault messages |
| addFaultMessages(axisOperation.getFaultMessages(), faultListForMep); |
| } else { |
| if (mep.equals(axisOperation.getMessageExchangePattern())) { |
| // add the fault messages |
| addFaultMessages(axisOperation.getFaultMessages(), faultListForMep); |
| } |
| } |
| } |
| |
| Element rootElement = doc.createElement("fault-list"); |
| Element faultElement; |
| String key; |
| Iterator iterator = faultListForMep.iterator(); |
| while (iterator.hasNext()) { |
| faultElement = doc.createElement("fault"); |
| key = (String) iterator.next(); |
| |
| //as for the name of a fault, we generate an exception |
| addAttribute(doc, "name", |
| (String) fullyQualifiedFaultClassNameMap.get(key), |
| faultElement); |
| addAttribute(doc, "shortName", |
| (String) faultClassNameMap.get(key), |
| faultElement); |
| |
| //the type represents the type that will be wrapped by this |
| //name |
| String typeMapping = |
| this.mapper.getTypeMappingName((QName) faultElementQNameMap.get(key)); |
| addAttribute(doc, "type", (typeMapping == null) |
| ? "" |
| : typeMapping, faultElement); |
| String attribValue = (String) instantiatableMessageClassNames. |
| get(key); |
| |
| addAttribute(doc, "instantiatableType", |
| attribValue == null ? "" : attribValue, |
| faultElement); |
| |
| String exceptionName = ((QName) faultElementQNameMap.get(key)).getLocalPart(); |
| addAttribute(doc, "localname", |
| exceptionName == null ? "" : exceptionName, |
| faultElement); |
| |
| addAttribute(doc, "caps-localname", |
| exceptionName == null ? "" : exceptionName.toUpperCase(), |
| faultElement); |
| |
| // add an extra attribute to say whether the type mapping is |
| // the default |
| if (mapper.getDefaultMappingName().equals(typeMapping)) { |
| addAttribute(doc, "default", "yes", faultElement); |
| } |
| addAttribute(doc, "value", getParamInitializer(typeMapping), |
| faultElement); |
| |
| |
| rootElement.appendChild(faultElement); |
| } |
| return rootElement; |
| } |
| |
| |
| /** |
| * @param doc |
| * @param operation |
| * @return Returns the parameter element. |
| */ |
| protected Element[] getFaultParamElements(Document doc, AxisOperation operation) { |
| ArrayList params = new ArrayList(); |
| ArrayList faultMessages = operation.getFaultMessages(); |
| |
| if (faultMessages != null && !faultMessages.isEmpty()) { |
| Element paramElement; |
| AxisMessage msg; |
| for (int i = 0; i < faultMessages.size(); i++) { |
| paramElement = doc.createElement("param"); |
| msg = (AxisMessage) faultMessages.get(i); |
| |
| if (msg.getElementQName() == null) { |
| throw new RuntimeException("Element QName is null for " + msg.getName() + "!"); |
| } |
| |
| //as for the name of a fault, we generate an exception |
| String faultComment = ""; |
| if (msg.getDocumentation() != null){ |
| faultComment = msg.getDocumentation().trim(); |
| } |
| addAttribute(doc, "comment", faultComment, paramElement); |
| addAttribute(doc, "name", |
| (String) fullyQualifiedFaultClassNameMap.get(msg.getName()), |
| paramElement); |
| addAttribute(doc, "shortName", |
| (String) faultClassNameMap.get(msg.getName()), |
| paramElement); |
| |
| // attach the namespace and the localName |
| addAttribute(doc, "namespace", |
| msg.getElementQName().getNamespaceURI(), |
| paramElement); |
| addAttribute(doc, "localname", |
| msg.getElementQName().getLocalPart(), |
| paramElement); |
| addAttribute(doc, "caps-localname", |
| msg.getElementQName().getLocalPart().toUpperCase(), |
| paramElement); |
| |
| if (msg.getElementQName() != null) { |
| Element qNameElement = doc.createElement("qname"); |
| addAttribute(doc, "nsuri", msg.getElementQName().getNamespaceURI(), qNameElement); |
| addAttribute(doc, "localname", msg.getElementQName().getLocalPart(), qNameElement); |
| paramElement.appendChild(qNameElement); |
| } |
| //the type represents the type that will be wrapped by this |
| //name |
| String typeMapping = |
| this.mapper.getTypeMappingName(msg.getElementQName()); |
| addAttribute(doc, "type", (typeMapping == null) |
| ? "" |
| : typeMapping, paramElement); |
| |
| //add the short name |
| addShortType(paramElement, (msg.getElementQName() == null) ? null : |
| msg.getElementQName().getLocalPart()); |
| |
| String attribValue = (String) instantiatableMessageClassNames. |
| get(msg.getElementQName()); |
| addAttribute(doc, "instantiatableType", |
| attribValue == null ? "" : attribValue, |
| paramElement); |
| |
| // add an extra attribute to say whether the type mapping is |
| // the default |
| if (mapper.getDefaultMappingName().equals(typeMapping)) { |
| addAttribute(doc, "default", "yes", paramElement); |
| } |
| addAttribute(doc, "value", getParamInitializer(typeMapping), |
| paramElement); |
| |
| Iterator iter = msg.getExtensibilityAttributes().iterator(); |
| while (iter.hasNext()) { |
| // process extensibility attributes |
| } |
| params.add(paramElement); |
| } |
| |
| return (Element[]) params.toArray(new Element[params.size()]); |
| } else { |
| return new Element[]{};//return empty array |
| } |
| |
| |
| } |
| |
| /** |
| * Finds the output element. |
| * |
| * @param doc |
| * @param bindingOperation |
| * @param headerParameterQNameList |
| */ |
| protected Element getOutputElement(Document doc, |
| AxisBindingOperation bindingOperation, |
| List headerParameterQNameList) { |
| AxisOperation operation = bindingOperation.getAxisOperation(); |
| Element outputElt = doc.createElement("output"); |
| String mep = operation.getMessageExchangePattern(); |
| |
| |
| if (WSDLUtil.isOutputPresentForMEP(mep)) { |
| |
| Element param = getOutputParamElement(doc, operation); |
| |
| if (param != null) { |
| outputElt.appendChild(param); |
| } |
| |
| List outputElementList = getParameterElementList(doc, headerParameterQNameList, |
| WSDLConstants.SOAP_HEADER); |
| outputElementList.addAll(getParameterElementListForHttpHeader(doc, |
| (ArrayList) getBindingPropertyFromMessage( |
| WSDL2Constants.ATTR_WHTTP_HEADER, |
| operation.getName(), |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT), |
| WSDLConstants.HTTP_HEADER)); |
| |
| for (int i = 0; i < outputElementList.size(); i++) { |
| outputElt.appendChild((Element) outputElementList.get(i)); |
| } |
| |
| /* |
| * Setting the effective policy for the output message. |
| */ |
| Policy policy = getBindingPolicyFromMessage(bindingOperation, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT); |
| |
| if (policy != null) { |
| try { |
| addAttribute(doc, "policy", |
| PolicyUtil.getSafeString(PolicyUtil.policyComponentToString(policy)), |
| outputElt); |
| } catch (Exception ex) { |
| throw new RuntimeException("can't serialize the policy .."); |
| } |
| } |
| } |
| return outputElt; |
| } |
| |
| /** |
| * Get the input element |
| * |
| * @param doc |
| * @param bindingOperation |
| * @param headerParameterQNameList |
| * @return DOM element |
| */ |
| protected Element getInputElement(Document doc, |
| AxisBindingOperation bindingOperation, |
| List headerParameterQNameList) { |
| AxisOperation operation = bindingOperation.getAxisOperation(); |
| Element inputElt = doc.createElement("input"); |
| String mep = operation.getMessageExchangePattern(); |
| |
| if (WSDLUtil.isInputPresentForMEP(mep)) { |
| |
| Element[] param = getInputParamElement(doc, operation); |
| for (int i = 0; i < param.length; i++) { |
| inputElt.appendChild(param[i]); |
| } |
| |
| List parameterElementList = getParameterElementList(doc, headerParameterQNameList, |
| WSDLConstants.SOAP_HEADER); |
| parameterElementList.addAll(getParameterElementListForHttpHeader(doc, |
| (ArrayList) getBindingPropertyFromMessage( |
| WSDL2Constants.ATTR_WHTTP_HEADER, |
| operation.getName(), |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_IN), |
| WSDLConstants.HTTP_HEADER)); |
| parameterElementList.addAll(getParameterElementListForSOAPModules(doc, |
| (ArrayList) getBindingPropertyFromMessage( |
| WSDL2Constants.ATTR_WSOAP_MODULE, |
| operation.getName(), |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_IN))); |
| |
| for (int i = 0; i < parameterElementList.size(); i++) { |
| inputElt.appendChild((Element) parameterElementList.get(i)); |
| } |
| |
| /* |
| * Setting the effective policy of input message |
| */ |
| Policy policy = getBindingPolicyFromMessage(bindingOperation, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_IN); |
| |
| if (policy != null) { |
| try { |
| addAttribute(doc, "policy", |
| PolicyUtil.getSafeString(PolicyUtil.policyComponentToString(policy)), |
| inputElt); |
| } catch (Exception ex) { |
| throw new RuntimeException("can't serialize the policy .."); |
| } |
| } |
| |
| } |
| return inputElt; |
| } |
| |
| } |
| |