/*=============================================================================*
* Copyright 2006 The Apache Software Foundation
*
* Licensed 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.muse.tools.generator.synthesizer;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.muse.tools.generator.util.ConfigurationData;
import org.apache.muse.tools.generator.util.ConfigurationDataDescriptor;
import org.apache.muse.tools.generator.util.LocalEnvironment;
import org.apache.muse.tools.inspector.ResourceInspector;
import org.apache.muse.util.ReflectUtils;
import org.apache.muse.util.xml.XmlUtils;
import org.apache.muse.util.xml.XsdUtils;
import org.apache.muse.ws.resource.metadata.WsrmdConstants;
import org.apache.muse.ws.wsdl.WsdlUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*
* ProxySynthesizer is a tool for creating web service proxies, with extra
* support for WS-Addressing and manageability interfaces. It can create
* a remote interface and implementation class from a WSDL that describes
* a resource type. The tool can be run from the command line or invoked
* directly from Java code.
*
* @author Dan Jemiolo (danj)
* @author Andrew Eberbach (aeberbac)
*
*/
public class ProxySynthesizer implements Synthesizer
{
static ConfigurationDataDescriptor[] REQUIRED_PARAMETERS =
new ConfigurationDataDescriptor[] {
};
private static final String TARGET_NS_ATTR = "targetNamespace";
private LocalEnvironment _environment = new LocalEnvironment(false);
private int _prefixCounter = 0;
private HashMap _prefixes = new HashMap();
private String createProxyClass(ResourceInspector inspector,
String interfaceName,
String proxyName)
{
StringBuffer writer = new StringBuffer(10000);
generateProxyHeader(writer, inspector, interfaceName, proxyName);
generateMethods(writer, inspector, false);
generateProxyConstructors(writer, inspector, proxyName);
generateProxyFooter(writer, inspector);
return writer.toString();
}
private String createProxyName(String interfaceName)
{
return interfaceName + "Proxy";
}
private String createRemoteInterface(ResourceInspector inspector, String interfaceName)
{
StringBuffer writer = new StringBuffer(10000);
generateRemoteHeader(writer, inspector, interfaceName);
generateMethods(writer, inspector, true);
generateRemoteFooter(writer, inspector);
return writer.toString();
}
/**
*
* Top-level code generation method - this kicks off the interface
* and class creation tasks.
*
* @param interfaceName
* The desired interface name for the new proxy.
*
* @param inspector
* The ResourceInspector that has analyzed the WSDL.
*
* @return A Map of file names (String) to Java code (String).
*
*/
private Map generate(String interfaceName, ResourceInspector inspector)
{
String interfaceJava = createRemoteInterface(inspector, interfaceName);
String proxyName = createProxyName(interfaceName);
String proxyJava = createProxyClass(inspector, interfaceName, proxyName);
Map results = new HashMap();
results.put(createFileName(interfaceName), interfaceJava);
results.put(createFileName(proxyName), proxyJava);
return results;
}
private void generateActions(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final String[] _ACTIONS = {\n");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
writer.append("\t\t\"");
writer.append(inspector.getAction(name));
writer.append("\",");
writer.append('\n');
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateClassDef(StringBuffer writer,
String proxyClassName,
String extendsType,
String interfaceType)
{
writer.append("public class ");
writer.append(ReflectUtils.getShortName(proxyClassName));
writer.append('\n');
writer.append("\textends ");
writer.append(ReflectUtils.getShortName(extendsType));
writer.append(' ');
writer.append("implements ");
writer.append(ReflectUtils.getShortName(interfaceType));
writer.append("\n{");
}
private void generateComment(StringBuffer writer, String className)
{
String shortName = ReflectUtils.getShortName(className);
String fileName = shortName + ".java";
writer.append("//\n");
writer.append("// " + fileName + '\n');
writer.append("// " + new Date() + '\n');
writer.append("// Generated by the Apache Muse Client Generation Tool, v2.0\n");
writer.append("//\n\n");
}
private void generateFields(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\n\tprivate static final Map _HANDLERS_BY_NAME = new HashMap();\n\n");
//
// this would be better if java had function pointers. I can't be
// bothered to write a class for each of these
//
generateMethodNames(writer, inspector);
generateReturnTypes(writer, inspector);
generateActions(writer, inspector);
generateRequestNames(writer, inspector);
generateResponseNames(writer, inspector);
generateRequestParams(writer, inspector);
}
private void generateGetHandler(StringBuffer writer)
{
writer.append("\n\tprotected ProxyHandler getHandler(String methodName)\n");
writer.append("\t{\n");
writer.append("\t\treturn (ProxyHandler)_HANDLERS_BY_NAME.get(methodName);\n");
writer.append("\t}\n");
}
private void generateHandler(StringBuffer writer, String methodName)
{
writer.append("\t\tProxyHandler handler = getHandler(\"");
writer.append(methodName);
writer.append("\");\n");
}
private void generateInterfaceDef(StringBuffer writer,
String remoteClassName,
List extendsTypes)
{
writer.append("public interface ");
writer.append(ReflectUtils.getShortName(remoteClassName));
if(extendsTypes.size() > 0) {
writer.append(" extends ");
Iterator i = extendsTypes.iterator();
while (i.hasNext())
{
Class type = (Class)i.next();
writer.append(ReflectUtils.getShortName(type));
if (i.hasNext())
writer.append(", ");
}
}
writer.append("\n{");
}
private void generateInvoke(StringBuffer writer,
ResourceInspector inspector,
String methodName)
{
writer.append("\t\t");
Class returnType = inspector.getReturnType(methodName);
if (returnType == void.class)
writer.append("invoke(handler, params);\n");
else if (!returnType.isPrimitive())
{
writer.append("return (");
writer.append(ReflectUtils.getShortName(returnType));
writer.append(")invoke(handler, params);\n");
}
else
{
String className = getPrimitiveClassName(returnType);
String convertMethodName = getPrimitiveConvertMethodName(className);
writer.append(className);
writer.append(" result = (");
writer.append(className);
writer.append(")invoke(handler, params);\n");
writer.append("\t\treturn result.");
writer.append(convertMethodName);
writer.append("();\n");
}
}
private void generateMethod(StringBuffer writer,
ResourceInspector inspector,
String methodName,
boolean justSignature)
{
writer.append("\n\t");
if (!justSignature)
writer.append("public ");
Class returnType = inspector.getReturnType(methodName);
writer.append(ReflectUtils.getShortName(returnType));
writer.append(' ');
writer.append(methodName);
String[] paramNames = inspector.getParameterNames(methodName);
Class[] paramTypes = inspector.getParameterTypes(methodName);
generateParamList(writer, paramNames, paramTypes);
writer.append("\t\tthrows SoapFault");
if (justSignature)
writer.append(';');
else
{
writer.append("\n\t{\n");
generateParamConversion(writer, inspector, methodName);
generateHandler(writer, methodName);
generateInvoke(writer, inspector, methodName);
writer.append("\t}");
}
writer.append('\n');
}
private void generateMethodNames(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final String[] _METHOD_NAMES = {\n");
writer.append("\t\t");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
writer.append('\"');
writer.append(name);
writer.append('\"');
writer.append(", ");
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateMethods(StringBuffer writer,
ResourceInspector inspector,
boolean justSignature)
{
Iterator i = inspector.getOperations().iterator();
while (i.hasNext())
{
String name = (String)i.next();
if (!inspector.isBasicResourceOperation(name))
generateMethod(writer, inspector, name, justSignature);
}
if(inspector.getProperties() == null) {
return;
}
i = inspector.getProperties().iterator();
int index = 0;
while (i.hasNext())
{
QName property = (QName)i.next();
generatePropertyGet(writer, inspector, property, index, justSignature);
if (inspector.isPropertyAppendable(property))
generatePropertyInsert(writer, inspector, property, index, justSignature);
if (inspector.isPropertyMutable(property))
{
generatePropertyUpdate(writer, inspector, property, index, justSignature);
generatePropertyDelete(writer, inspector, property, index, justSignature);
}
++index;
}
}
private void generatePackage(StringBuffer writer, String className)
{
String packageName = ReflectUtils.getPackageName(className);
if (packageName != null)
writer.append("package " + packageName + ";\n\n");
}
private void generateParamConversion(StringBuffer writer,
ResourceInspector inspector,
String operation)
{
String[] paramNames = inspector.getParameterNames(operation);
Class[] paramTypes = inspector.getParameterTypes(operation);
writer.append("\t\tObject[] params = new Object[");
writer.append(paramTypes.length);
writer.append("];\n");
if (paramTypes.length > 0)
writer.append('\n');
for (int n = 0; n < paramTypes.length; ++n)
{
writer.append("\t\tparams[");
writer.append(n);
writer.append("] = ");
String name = ResourceInspector.getMethodName(paramNames[n]);
writer.append(getObjectName(name, paramTypes[n]));
writer.append(";\n");
}
writer.append('\n');
}
private void generateParamList(StringBuffer writer,
String[] names,
Class[] types)
{
writer.append('(');
for (int n = 0; n < types.length; ++n)
{
writer.append(ReflectUtils.getShortName(types[n]));
writer.append(' ');
if (names != null)
writer.append(ResourceInspector.getMethodName(names[n]));
else
writer.append("arg" + n);
if (n != types.length - 1)
writer.append(", ");
}
writer.append(")\n");
}
private void generateProperties(StringBuffer writer,
ResourceInspector inspector)
{
Collection properties = inspector.getProperties();
writer.append("\n\tQName[] PROPERTIES = {\n");
Iterator i = properties.iterator();
while (i.hasNext())
{
writer.append("\t\t");
generateQName(writer, (QName)i.next());
writer.append(',');
writer.append('\n');
}
int length = writer.length();
writer.delete(length - 2, length);
writer.append("\n\t};\n");
}
private void generatePropertyDelete(StringBuffer writer,
ResourceInspector inspector,
QName propertyName,
int propertyIndex,
boolean justSignature)
{
writer.append("\n\t");
if (!justSignature)
writer.append("public ");
Class type = inspector.getPropertyType(propertyName);
if (type.isArray())
type = ReflectUtils.getClassFromArrayClass(type);
writer.append("void delete" + propertyName.getLocalPart());
writer.append("()\n");
writer.append("\t\tthrows SoapFault");
if (justSignature)
writer.append(';');
else
{
writer.append("\n\t{\n");
writer.append("\t\tdeleteResourceProperty(PROPERTIES[");
writer.append(propertyIndex);
writer.append("]);\n");
writer.append("\t}");
}
writer.append('\n');
}
private void generatePropertyGet(StringBuffer writer,
ResourceInspector inspector,
QName propertyName,
int propertyIndex,
boolean justSignature)
{
writer.append("\n\t");
if (!justSignature)
writer.append("public ");
Class type = inspector.getPropertyType(propertyName);
writer.append(ReflectUtils.getShortName(type));
writer.append(' ');
writer.append("get" + propertyName.getLocalPart());
writer.append("()\n");
writer.append("\t\tthrows SoapFault");
if (justSignature)
writer.append(';');
else
{
writer.append("\n\t{\n");
if (type.isArray())
{
writer.append("\t\treturn (");
writer.append(ReflectUtils.getShortName(type));
writer.append(")getPropertyAsObject(");
writer.append("PROPERTIES[");
writer.append(propertyIndex);
writer.append("], ");
type = ReflectUtils.getClassFromArrayClass(type);
writer.append(ReflectUtils.getShortName(type));
writer.append(".class);\n");
}
else
{
writer.append("\t\t");
Class array = ReflectUtils.getArrayClassFromClass(type);
writer.append(ReflectUtils.getShortName(array));
writer.append(" results = (");
writer.append(ReflectUtils.getShortName(array));
writer.append(")getPropertyAsObject(");
writer.append("PROPERTIES[");
writer.append(propertyIndex);
writer.append("], ");
writer.append(ReflectUtils.getShortName(type));
writer.append(".class);\n");
writer.append("\t\treturn results.length == 0 ? ");
writer.append(getNullValue(type));
writer.append(" : results[0];\n");
}
writer.append("\t}");
}
writer.append('\n');
}
private void generatePropertyInsert(StringBuffer writer,
ResourceInspector inspector,
QName propertyName,
int propertyIndex,
boolean justSignature)
{
generatePropertySet(writer, inspector, propertyName, propertyIndex, justSignature, "insert");
}
private void generatePropertySet(StringBuffer writer,
ResourceInspector inspector,
QName propertyName,
int propertyIndex,
boolean justSignature,
String setType)
{
writer.append("\n\t");
if (!justSignature)
writer.append("public ");
Class type = inspector.getPropertyType(propertyName);
writer.append("void ");
writer.append(setType);
writer.append(propertyName.getLocalPart());
writer.append('(');
writer.append(ReflectUtils.getShortName(type));
writer.append(" value)\n");
writer.append("\t\tthrows SoapFault");
if (justSignature)
writer.append(';');
else
{
writer.append("\n\t{\n\t\t");
writer.append(setType);
writer.append("ResourceProperty(PROPERTIES[");
writer.append(propertyIndex);
writer.append("], ");
if (type.isArray())
writer.append("value");
else
{
writer.append("new Object[]{ ");
writer.append(getArrayValue(type));
writer.append(" }");
}
writer.append(");\n");
writer.append("\t}");
}
writer.append('\n');
}
private void generatePropertyUpdate(StringBuffer writer,
ResourceInspector inspector,
QName propertyName,
int propertyIndex,
boolean justSignature)
{
generatePropertySet(writer, inspector, propertyName, propertyIndex, justSignature, "update");
}
private void generateProxyConstructors(StringBuffer writer,
ResourceInspector inspector,
String proxyClassName)
{
int dot = proxyClassName.lastIndexOf('.');
String className = proxyClassName.substring(dot + 1);
Class baseType = inspector.getBaseProxyClass();
Constructor[] ctors = baseType.getConstructors();
for (int n = 0; n < ctors.length; ++n)
{
writer.append("\n\tpublic ");
writer.append(className);
Class[] params = ctors[n].getParameterTypes();
generateParamList(writer, null, ctors[n].getParameterTypes());
writer.append("\t{\n");
writer.append("\t\tsuper(");
for (int i = 0; i < params.length; ++i)
{
writer.append("arg" + i);
if (i != params.length - 1)
writer.append(", ");
}
writer.append(");\n");
writer.append("\t}\n");
}
}
private void generateProxyFooter(StringBuffer writer,
ResourceInspector inspector)
{
generateFields(writer, inspector);
generateGetHandler(writer);
generateStatic(writer);
writer.append("}\n");
}
private void generateProxyHeader(StringBuffer writer,
ResourceInspector inspector,
String interfaceName,
String proxyName)
{
Class extendsType = inspector.getBaseProxyClass();
String extendsName = extendsType.getName();
generateComment(writer, proxyName);
generatePackage(writer, proxyName);
generateProxyImports(writer, extendsName);
generateClassDef(writer, proxyName, extendsName, interfaceName);
}
private void generateProxyImports(StringBuffer writer, String extendsType)
{
writer.append("import java.lang.reflect.Array;\n");
writer.append("import org.apache.muse.ws.addressing.soap.SoapFault;\n");
writer.append("import java.util.Date;\n");
writer.append("import java.util.HashMap;\n");
writer.append("import java.net.URI;\n");
writer.append("import java.util.Map;\n\n");
writer.append("import javax.xml.namespace.QName;\n\n");
writer.append("import org.w3c.dom.Element;\n\n");
writer.append("import org.apache.muse.core.Environment;\n");
writer.append("import org.apache.muse.core.proxy.ProxyHandler;\n");
writer.append("import org.apache.muse.core.proxy.ReflectionProxyHandler;\n");
writer.append("import org.apache.muse.ws.addressing.EndpointReference;\n");
writer.append("import org.apache.muse.ws.addressing.soap.SoapClient;\n\n");
writer.append("import " + extendsType + ";\n\n");
}
private void generateQName(StringBuffer writer, QName qname)
{
generateQName(writer, qname.getNamespaceURI(), qname.getLocalPart());
}
private void generateQName(StringBuffer writer, String uri, String name)
{
writer.append("new QName(\"");
if (uri != null && uri.length() > 0)
{
writer.append(uri);
writer.append("\", \"");
}
writer.append(name);
writer.append("\", \"");
writer.append(getPrefix(uri));
writer.append("\")");
}
private String getPrefix(String uri) {
String prefix = (String)_prefixes.get(uri);
if(prefix == null) {
prefix = "pfx" + _prefixCounter++;
_prefixes.put(uri, prefix);
}
return prefix;
}
private void generateRemoteFooter(StringBuffer writer,
ResourceInspector inspector)
{
if(inspector.getProperties() != null) {
generateProperties(writer, inspector);
}
writer.append("}\n");
}
private void generateRemoteHeader(StringBuffer writer,
ResourceInspector inspector,
String remoteClassName)
{
List extendsTypes = getRemoteExtends(inspector);
generateComment(writer, remoteClassName);
generatePackage(writer, remoteClassName);
generateRemoteImports(writer, extendsTypes);
generateInterfaceDef(writer, remoteClassName, extendsTypes);
}
private void generateRemoteImports(StringBuffer writer, List extendsTypes)
{
writer.append("import java.util.Date;\n\n");
writer.append("import org.apache.muse.ws.addressing.soap.SoapFault;\n\n");
writer.append("import javax.xml.namespace.QName;\n\n");
writer.append("import java.net.URI;\n");
writer.append("import org.w3c.dom.Element;\n\n");
writer.append("import org.apache.muse.ws.addressing.EndpointReference;\n");
Iterator i = extendsTypes.iterator();
while (i.hasNext()) {
Class type = (Class) i.next();
writer.append("import " + type.getName() + ";\n");
}
writer.append('\n');
}
private void generateRequestNames(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final QName[] _REQUEST_NAMES = {\n");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
writer.append("\t\t");
generateQName(writer, inspector.getRequestName(name));
writer.append(",\n");
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateRequestParams(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final QName[][] _REQUEST_PARAM_NAMES = {\n");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
QName[] paramNames = inspector.getParameterQNames(name);
writer.append("\t\t{\n");
for (int n = 0; n < paramNames.length; ++n)
{
writer.append("\t\t\t");
generateQName(writer, paramNames[n]);
if (n != paramNames.length - 1)
writer.append(',');
writer.append('\n');
}
writer.append("\t\t}");
writer.append(',');
writer.append('\n');
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateResponseNames(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final QName[] _RESPONSE_NAMES = {\n");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
writer.append("\t\t");
QName returnName = inspector.getReturnName(name);
if (returnName != null && !returnName.equals(XsdUtils.ANY_TYPE_QNAME))
generateQName(writer, returnName);
else
writer.append("null");
writer.append(',');
writer.append('\n');
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateReturnTypes(StringBuffer writer,
ResourceInspector inspector)
{
writer.append("\tprivate static final Class[] _RETURN_TYPES = {\n");
writer.append("\t\t");
Iterator i = inspector.getOperations().iterator();
boolean hasUserDefinedOperation = false;
while (i.hasNext())
{
String name = (String)i.next();
if (inspector.isBasicResourceOperation(name))
continue;
hasUserDefinedOperation = true;
Class returnType = inspector.getReturnType(name);
writer.append(ReflectUtils.getShortName(returnType));
writer.append(".class");
writer.append(", ");
}
if (hasUserDefinedOperation)
{
int length = writer.length();
writer.delete(length - 2, length);
}
writer.append("\n\t};\n\n");
}
private void generateStatic(StringBuffer writer)
{
writer.append("\n\tstatic\n");
writer.append("\t{\n");
writer.append("\t\tfor (int n = 0; n < _METHOD_NAMES.length; ++n)\n");
writer.append("\t\t{\n");
writer.append("\t\t\tProxyHandler handler = new ReflectionProxyHandler();\n");
writer.append("\t\t\thandler.setAction(_ACTIONS[n]);\n");
writer.append("\t\t\thandler.setRequestName(_REQUEST_NAMES[n]);\n");
writer.append("\t\t\thandler.setRequestParameterNames(_REQUEST_PARAM_NAMES[n]);\n");
writer.append("\t\t\thandler.setResponseName(_RESPONSE_NAMES[n]);\n");
writer.append("\t\t\thandler.setReturnType(_RETURN_TYPES[n]);\n\n");
writer.append("\t\t\t_HANDLERS_BY_NAME.put(_METHOD_NAMES[n], handler);\n");
writer.append("\t\t}\n");
writer.append("\t}\n");
}
private String getObjectName(String name, Class type)
{
if (!type.isPrimitive())
return name;
else if (type == boolean.class)
return "new Boolean(" + name + ')';
else if (type == double.class)
return "new Double(" + name + ')';
else if (type == float.class)
return "new Float(" + name + ')';
else if (type == int.class)
return "new Integer(" + name + ')';
else if (type == long.class)
return "new Long(" + name + ')';
return "new Short(" + name + ')';
}
private String getPrimitiveClassName(Class type)
{
if (type == boolean.class)
return "Boolean";
else if (type == float.class || type == double.class)
return "Float";
return "Integer";
}
private String getPrimitiveConvertMethodName(String type)
{
if (type.endsWith("Boolean"))
return "booleanValue";
else if (type.endsWith("Float") || type.endsWith("Double"))
return "floatValue";
return "intValue";
}
private String getArrayValue(Class type)
{
if (!type.isPrimitive())
return "value";
if (type == boolean.class)
return "Boolean.toString(value)";
else if (type == float.class || type == double.class)
return "Double.toString(value)";
return "Long.toString(value)";
}
public Element getMetadata(String wsdlPath,
Element wsdl,
ResourceInspector inspector)
{
QName portType = inspector.getPortType();
Element portTypeMatch = WsdlUtils.getPortType(wsdl, portType);
String metadataLocation = XmlUtils.getAttribute(portTypeMatch, WsrmdConstants.DESCRIPTOR_LOCATION_ATTR_QNAME);
if (metadataLocation == null || metadataLocation.length() == 0)
return null;
String path = _environment.createRelativePath(wsdlPath, metadataLocation);
Document rmdDoc = _environment.getDocument(path);
return XmlUtils.getFirstElement(rmdDoc);
}
private String getNullValue(Class type)
{
if (!type.isPrimitive())
return "null";
if (type == boolean.class)
return "false";
return "0";
}
private List getRemoteExtends(ResourceInspector inspector)
{
List types = new ArrayList();
//TODO was this needed?
// types.add(Resource.class);
//
// Class proxyClass = inspector.getBaseProxyClass();
//
// if (proxyClass.equals(NotificationProducerClient.class))
// types.add(NotificationProducerClient.class);
//
// if (proxyClass.equals(NotificationConsumerClient.class))
// types.add(NotificationConsumerClient.class);
return types;
}
public ConfigurationData synthesize(ConfigurationData data) throws Exception {
Document[] wsdlDocuments = (Document[]) data.getParameter(ConfigurationData.WSDL_DOCUMENT_LIST);
Map[] filesMaps = new HashMap[wsdlDocuments.length];
for(int i = 0; i < wsdlDocuments.length; i++) {
Element wsdlDef = XmlUtils.getFirstElement(wsdlDocuments[i]);
WsdlUtils.removeSchemaReferences(wsdlDef);
ResourceInspector inspector = new ResourceInspector();
inspector.run(wsdlDef, _environment);
//TODO later
// Element rmd = getMetadata(wsdlPath, wsdlDef, inspector);
// if (rmd != null)
// inspector.setMetadata(rmd);
String interfaceName = createInterface(wsdlDocuments[i]);
filesMaps[i] = generate(interfaceName, inspector);
}
ConfigurationData configuration = (ConfigurationData)data.clone();
configuration.addParameter(ConfigurationData.FILES_MAP_LIST, filesMaps);
return configuration;
}
private String createInterface(Document wsdlDocument) {
String packageName =
ClassInfo.getPackageName(wsdlDocument.getDocumentElement().getAttribute(TARGET_NS_ATTR));
return packageName + "." + WsdlUtils.getServiceName(XmlUtils.getDocumentRoot(wsdlDocument));
}
private String createFileName(String interfaceName) {
return interfaceName.replaceAll("\\.", "\\" + File.separator) + ".java";
}
public ConfigurationDataDescriptor[] getConfigurationDataDescriptions() {
return REQUIRED_PARAMETERS;
}
}