blob: 930c62fb440c6e9f6f63ee48e362dc45f97e9c6b [file] [log] [blame]
/*
* 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;
}
}