blob: bd9c4567220823ad0f26b6d00f0aa109e6d43074 [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.jaxws;
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
import org.apache.axis2.wsdl.codegen.CodeGenerationException;
import org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter;
import org.apache.axis2.wsdl.codegen.writer.ExceptionWriter;
import org.apache.axis2.wsdl.codegen.writer.FileWriter;
import org.apache.axis2.wsdl.codegen.writer.InterfaceImplementationWriter;
import org.apache.axis2.wsdl.codegen.writer.SkeletonInterfaceWriter;
import org.apache.axis2.wsdl.codegen.writer.SkeletonWriter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.Iterator;
import java.util.Map;
public abstract class JAXWSEmitter extends AxisServiceBasedMultiLanguageEmitter {
protected final static String TYPE_SUFFIX = "Type";
protected final static String SERVICE_SUFFIX = "Service";
protected final static String EXCEPTION_SUFFIX = "Exception";
protected final static String JAXWS_PORT_TYPE_NAME = "JaxwsPortTypeName";
protected final static String JAXWS_IMPL_SUFFIX = "Impl";
public void setCodeGenConfiguration(CodeGenConfiguration configuration) {
super.setCodeGenConfiguration(configuration);
}
public void emitSkeleton() throws CodeGenerationException {
try {
Map originalMap = getNewCopy(this.mapper.getAllMappedNames());
// we are going to generate following files seperately per service
for (Iterator axisServicesIter = this.axisServices.iterator();
axisServicesIter.hasNext();) {
this.axisService = (AxisService) axisServicesIter.next();
this.axisBinding =
axisService.getEndpoint(axisService.getEndpointName()).getBinding();
// see the comment at updateMapperClassnames for details and reasons for
// calling this method
if (mapper.isObjectMappingPresent()) {
copyMap(originalMap, this.mapper.getAllMappedNames());
updateMapperForMessageReceiver();
} else {
copyToFaultMap();
}
//handle faults
generateAndPopulateFaultNames();
//write the Exceptions
writeExceptions();
//write the Service Endpoint Interface
writeServiceEndpointInterface();
//write the Service Endpoint Interface
writeServiceEndpointInterfaceImpl();
//write the Service Class
writeServiceClass();
}
// save back type map
if (this.mapper.isObjectMappingPresent()) {
copyMap(originalMap, this.mapper.getAllMappedNames());
}
// write service xml
// if asked
if (codeGenConfiguration.isGenerateDeployementDescriptor()) {
writeServiceXml();
}
//write the ant build
//we skip this for the flattened case
if (!codeGenConfiguration.isFlattenFiles()) {
writeAntBuild();
}
} catch (CodeGenerationException cgExp) {
throw cgExp;
} catch (Exception e) {
throw new CodeGenerationException(e);
}
}
/**
* Write the service endpoint interface
*
* @throws Exception
*/
protected void writeServiceEndpointInterface() throws Exception {
Document skeletonModel = createDOMDocumentForSEI();
debugLogDocument("Document for Service Endpoint Interface:", skeletonModel);
FileWriter skeletonInterfaceWriter = new SkeletonInterfaceWriter(
codeGenConfiguration.isFlattenFiles() ?
getOutputDirectory(codeGenConfiguration.getOutputLocation(), null) :
getOutputDirectory(codeGenConfiguration.getOutputLocation(),
codeGenConfiguration.getSourceLocation())
, this.codeGenConfiguration.getOutputLanguage());
writeFile(skeletonModel, skeletonInterfaceWriter);
}
protected void writeServiceEndpointInterfaceImpl() throws Exception {
Document skeletonModel = createDOMDocumentForSEIImpl();
debugLogDocument("Document for Service Endpoint Interface:", skeletonModel);
FileWriter interfaceImplementationWriter = new InterfaceImplementationWriter(
codeGenConfiguration.isFlattenFiles() ?
getOutputDirectory(codeGenConfiguration.getOutputLocation(), null) :
getOutputDirectory(codeGenConfiguration.getOutputLocation(),
codeGenConfiguration.getSourceLocation())
, this.codeGenConfiguration.getOutputLanguage());
writeFile(skeletonModel, interfaceImplementationWriter);
}
/**
* Writes the exception calsses.
*/
protected void writeExceptions() throws Exception {
String key;
Iterator iterator = fullyQualifiedFaultClassNameMap.keySet().iterator();
while (iterator.hasNext()) {
key = (String) iterator.next();
Document skeletonModel = createDOMDocumentForException(key);
debugLogDocument("Document for Exception Class:", skeletonModel);
ExceptionWriter exceptionWriter =
new ExceptionWriter(
codeGenConfiguration.isFlattenFiles() ?
getOutputDirectory(codeGenConfiguration.getOutputLocation(),
null) :
getOutputDirectory(codeGenConfiguration.getOutputLocation(),
codeGenConfiguration.getSourceLocation()),
codeGenConfiguration.getOutputLanguage());
writeFile(skeletonModel, exceptionWriter);
}
}
/**
* Write the service class
*
* @throws Exception
*/
protected void writeServiceClass() throws Exception {
Document skeletonModel = createDOMDocumentForServiceClass();
debugLogDocument("Document for Service Endpoint Interface:", skeletonModel);
FileWriter skeletonInterfaceWriter = new SkeletonWriter(
codeGenConfiguration.isFlattenFiles() ?
getOutputDirectory(codeGenConfiguration.getOutputLocation(), null) :
getOutputDirectory(codeGenConfiguration.getOutputLocation(),
codeGenConfiguration.getSourceLocation())
, this.codeGenConfiguration.getOutputLanguage());
writeFile(skeletonModel, skeletonInterfaceWriter);
}
protected Document createDOMDocumentForServiceXML() {
Document doc = getEmptyDocument();
String className = null;
String serviceName = null;
Element rootElement = doc.createElement("interfaces");
doc.appendChild(rootElement);
for (Iterator iter = this.axisServices.iterator(); iter.hasNext();) {
this.axisService = (AxisService) iter.next();
this.axisBinding = axisService.getEndpoint(axisService.getEndpointName()).getBinding();
serviceName = axisService.getName();
className = (String)axisService.getParameter(JAXWS_PORT_TYPE_NAME).getValue() + JAXWS_IMPL_SUFFIX;
rootElement.appendChild(getServiceElement(serviceName, className, doc));
}
return doc;
}
/**
* Creates the XML model for the Service Endpoint interface
*
* @return DOM Document
*/
protected abstract Document createDOMDocumentForSEI() throws AxisFault;
/**
* Creates the XML model for the Service Endpoint interface Implementation class
*
* @return DOM Document
*/
protected abstract Document createDOMDocumentForSEIImpl() throws AxisFault;
/**
* Creates the XML model for the Service Class
*
* @return DOM Document
*/
protected abstract Document createDOMDocumentForServiceClass();
/**
* Creates the XML model for a Exception Class
*
* @param key String
* @return DOM Document
*/
protected abstract Document createDOMDocumentForException(String key);
/**
* A resusable method to return the service element for creating the service xml
*
* @param serviceName
* @param className
* @param doc
* @return DOM Element
*/
protected Element getServiceElement(String serviceName, String className, Document doc) {
if (allServiceInfoHolder.get(serviceName) != null) {
this.infoHolder = (Map) allServiceInfoHolder.get(serviceName);
}
Element rootElement = doc.createElement("interface");
addAttribute(doc, "package", "", rootElement);
addAttribute(doc, "classpackage", codeGenConfiguration.getPackageName(), rootElement);
addAttribute(doc, "name", className, rootElement);
if (!codeGenConfiguration.isWriteTestCase()) {
addAttribute(doc, "testOmit", "true", rootElement);
}
addAttribute(doc, "servicename", serviceName, rootElement);
Iterator it = mepToClassMap.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
if (Boolean.TRUE.equals(infoHolder.get(key))) {
Element elt = addElement(doc, "messagereceiver",
makeJavaClassName(serviceName) + mepToSuffixMap.get(key),
rootElement);
addAttribute(doc, "mepURI", key.toString(), elt);
}
}
loadOperations(doc, rootElement, null);
return rootElement;
}
//Util methods
public String extratClassName(String fullyQualifiedName) {
if (fullyQualifiedName == null) {
return "";
}
String className = fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf('.'),
fullyQualifiedName.length());
if (className.charAt(0) == '.') {
return className.substring(1);
}
return className;
}
protected String getFullyQualifiedName(String className, String packageName) {
// className = makeJavaClassName(className);
return packageName + "." + className;
}
protected String resolveNameCollision(String className, String packageName, String suffix) {
className = makeJavaClassName(className);
String fullQualifiedName = getFullyQualifiedName(className, packageName);
Map map = mapper.getAllMappedNames();
if (map.containsValue(fullQualifiedName)) {
return className + suffix;
}
return className;
}
}