Package org.apache.muse.tools.generator.synthesizer

Source Code of org.apache.muse.tools.generator.synthesizer.ProxySynthesizer

/*=============================================================================*
*  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;
  }
}
TOP

Related Classes of org.apache.muse.tools.generator.synthesizer.ProxySynthesizer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.