You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-commits@ws.apache.org by da...@apache.org on 2006/07/17 22:38:29 UTC

svn commit: r422853 [2/3] - in /webservices/muse/trunk/modules: muse-tools/ muse-tools/src/org/apache/muse/tools/generator/ muse-tools/src/org/apache/muse/tools/generator/analyzer/ muse-tools/src/org/apache/muse/tools/generator/projectizer/ muse-tools/...

Added: webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ProxySynthesizer.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ProxySynthesizer.java?rev=422853&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ProxySynthesizer.java (added)
+++ webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ProxySynthesizer.java Mon Jul 17 13:38:27 2006
@@ -0,0 +1,1272 @@
+/*=============================================================================*
+ *  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.io.FileWriter;
+import java.io.IOException;
+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.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.muse.core.Resource;
+import org.apache.muse.tools.generator.LocalEnvironment;
+import org.apache.muse.tools.inspector.ResourceInspector;
+import org.apache.muse.util.CommandLine;
+import org.apache.muse.util.ReflectUtils;
+import org.apache.muse.util.messages.Messages;
+import org.apache.muse.util.messages.MessagesFactory;
+import org.apache.muse.util.xml.XmlUtils;
+import org.apache.muse.util.xml.XsdUtils;
+import org.apache.muse.ws.notification.remote.NotificationConsumerClient;
+import org.apache.muse.ws.notification.remote.NotificationProducerClient;
+import org.apache.muse.ws.resource.metadata.WsrmdConstants;
+import org.apache.muse.ws.wsdl.WsdlUtils;
+
+/**
+ *
+ * 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)
+ * 
+ * @see #main(String[])
+ * @see #run(String, String)
+ *
+ */
+
+public class ProxySynthesizer implements Synthesizer
+{
+    //
+    // Used to lookup all exception messages
+    //
+    private static Messages _MESSAGES = MessagesFactory.get(ProxySynthesizer.class);
+    
+    //
+    // Used to request trace info during code gen
+    //
+    private static final String _VERBOSE_FLAG = "-v";
+        
+    /**
+     * 
+     * Creates a web service proxy class from a WSDL file.
+     *
+     * @param args
+     *        <ol>
+     *        <li>WSDL file - The WSDL that contains the resource type's
+     *        portType.</li>
+     *        <li>Java interface - The name of the interface that the tool 
+     *        should generate and the proxy class will implement.</li>
+     *        </ol>
+     *        <br><br>
+     *        <b>There is also</b> a <em>-v</em> flag that can be used (at 
+     *        any point) to turn on verbose mode (useful for debugging).
+     * 
+     * @see #run(String, String)
+     *
+     */
+    public static void main(String[] args) throws Exception
+    {
+        CommandLine cmdLine = new CommandLine();        
+        cmdLine.parse(args);
+        
+        boolean verbose = cmdLine.hasFlag(_VERBOSE_FLAG);
+        args = cmdLine.getArguments();
+        
+        if (args.length != 2)
+            printUsageAndQuit();
+        
+        ProxySynthesizer theApp = new ProxySynthesizer();
+        theApp.setVerbose(verbose);
+        
+        try
+        {
+            Map files = theApp.run(args[0], args[1]);
+            Iterator i = files.keySet().iterator();
+            
+            while (i.hasNext())
+            {
+                String typeName = (String)i.next();
+                theApp.writeToFile(typeName, (String)files.get(typeName));
+            }
+        }
+        
+        catch (Throwable error)
+        {
+            error.printStackTrace();
+        }
+    }
+    
+    private static void printUsageAndQuit()
+    {
+        System.err.println("\nUsage is:\n");
+        System.err.println("\t> ProxyGenerator [WSDL file] [Java interface name]\n");
+        
+        System.exit(0);
+    }
+    
+    private LocalEnvironment _environment = new LocalEnvironment(false);
+    
+    //
+    // True if the tool should print trace info to stdout during code gen
+    //
+    private boolean _isVerbose = false;
+        
+    private String createProxyClass(ResourceInspector inspector, 
+                                    String interfaceName, 
+                                    String proxyName)
+    {   
+        if (isVerbose())
+        {
+            Object[] filler = { proxyName };
+            System.out.println(_MESSAGES.get("StartCodeGen", filler));
+        }
+        
+        StringBuffer writer = new StringBuffer(10000);
+        
+        generateProxyHeader(writer, inspector, interfaceName, proxyName);
+        generateMethods(writer, inspector, false);        
+        generateProxyConstructors(writer, inspector, proxyName);
+        generateProxyFooter(writer, inspector);
+        
+        if (isVerbose())
+        {
+            Object[] filler = { proxyName };
+            System.out.println(_MESSAGES.get("FinishCodeGen", filler));
+        }
+        
+        return writer.toString();
+    }
+    
+    private String createProxyName(String interfaceName)
+    {
+        return interfaceName + "Proxy";
+    }
+
+    private String createRemoteInterface(ResourceInspector inspector, String interfaceName)
+    {
+        if (isVerbose())
+        {
+            Object[] filler = { interfaceName };
+            System.out.println(_MESSAGES.get("StartCodeGen", filler));
+        }
+        
+        StringBuffer writer = new StringBuffer(10000);
+        
+        generateRemoteHeader(writer, inspector, interfaceName);
+        generateMethods(writer, inspector, true);        
+        generateRemoteFooter(writer, inspector);
+        
+        if (isVerbose())
+        {
+            Object[] filler = { interfaceName };
+            System.out.println(_MESSAGES.get("FinishCodeGen", filler));
+        }
+        
+        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(interfaceName, interfaceJava);
+        results.put(proxyName, proxyJava);
+        
+        return results;
+    }
+        
+    private void generateActions(StringBuffer writer, 
+                                 ResourceInspector inspector)
+    {
+        writer.append("\tprivate static final URI[] _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\tURI.create(\"");            
+            writer.append(inspector.getAction(name));
+            writer.append("\")");
+            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 Cowbell, an IBM project\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));
+        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)
+    {
+        if (isVerbose())
+        {
+            Object[] filler = { methodName };
+            System.out.println(_MESSAGES.get("MethodGen", filler));
+        }
+
+        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 RemoteException");
+        
+        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);
+        }
+        
+        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();
+        
+        if (isVerbose())
+        {
+            Object[] filler = { new Integer(properties.size()) };
+            System.out.println(_MESSAGES.get("PropertiesGen", filler));
+        }
+        
+        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)
+    {
+        if (isVerbose())
+        {
+            Object[] filler = { "delete" + propertyName.getLocalPart() };
+            System.out.println(_MESSAGES.get("MethodGen", filler));
+        }
+
+        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 RemoteException");
+        
+        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)
+    {
+        if (isVerbose())
+        {
+            Object[] filler = { "get" + propertyName.getLocalPart() };
+            System.out.println(_MESSAGES.get("MethodGen", filler));
+        }
+
+        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 RemoteException");
+        
+        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)
+    {
+        if (isVerbose())
+        {
+            Object[] filler = { setType + propertyName.getLocalPart() };
+            System.out.println(_MESSAGES.get("MethodGen", filler));
+        }
+
+        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 RemoteException");
+        
+        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();
+        
+        if (isVerbose())
+        {
+            Object[] filler = { proxyName, extendsName };
+            System.out.println(_MESSAGES.get("Extending", filler));
+        }
+        
+        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 java.net.URI;\n");
+        writer.append("import java.rmi.RemoteException;\n");
+        writer.append("import java.util.Date;\n");
+        writer.append("import java.util.HashMap;\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 com.ibm.cowbell.proxy.ProxyHandler;\n");
+        writer.append("import com.ibm.cowbell.proxy.ReflectionProxyHandler;\n");
+        writer.append("import com.ibm.ws.addressing.EndpointReference;\n");
+        writer.append("import com.ibm.ws.resource.Environment;\n");        
+        writer.append("import com.ibm.ws.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("\")");
+    }
+    
+    private void generateRemoteFooter(StringBuffer writer, 
+                                      ResourceInspector inspector)
+    {
+        generateProperties(writer, inspector);
+        writer.append("}\n");        
+    }
+    
+    private void generateRemoteHeader(StringBuffer writer, 
+                                      ResourceInspector inspector, 
+                                      String remoteClassName)
+    {
+        List extendsTypes = getRemoteExtends(inspector);
+        
+        if (isVerbose())
+        {
+            Object[] filler = { remoteClassName, extendsTypes };
+            System.out.println(_MESSAGES.get("Extending", filler));
+        }
+        
+        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 java.rmi.RemoteException;\n\n");
+        writer.append("import javax.xml.namespace.QName;\n\n");
+        writer.append("import org.w3c.dom.Element;\n\n");
+        
+        writer.append("import com.ibm.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();
+        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 File getWorkingDirectory()
+    {
+        return _environment.getRealDirectory();
+    }
+    
+    public boolean isVerbose()
+    {
+        return _isVerbose;
+    }
+    
+    /**
+     * 
+     * Allows users to execute the proxy generator from their own Java 
+     * code rather than running from a command line (via main()).
+     * 
+     * @param wsdlPath 
+     *        The path of the WSDL file to analyze.
+     * 
+     * @param interfaceName
+     *        The desired interface name for the new proxy.
+     * 
+     * @return A Map of Java type names (String) to Java code (String).
+     * 
+     */
+    public Map run(String wsdlPath, String interfaceName)
+    {
+        Document wsdlDoc = WsdlUtils.createWSDL(_environment, wsdlPath, true);
+        Element wsdlDef = XmlUtils.getFirstElement(wsdlDoc);
+        
+        removeXsdImports(wsdlDef);
+        
+        ResourceInspector inspector = new ResourceInspector();
+        inspector.run(wsdlDef, _environment);
+        
+        Element rmd = getMetadata(wsdlPath, wsdlDef, inspector);
+        
+        if (rmd != null)
+            inspector.setMetadata(rmd);
+        
+        return generate(interfaceName, inspector);
+    }
+        
+    public void setVerbose(boolean isVerbose)
+    {
+        _isVerbose = isVerbose;
+    }
+    
+    public void setWorkingDirectory(File directory)
+    {
+        _environment.setRealDirectory(directory);
+    }
+    
+    public void writeToFile(String javaName, String javaCode)
+        throws IOException
+    {
+        String fileName = javaName.replace('.', '/') + ".java";
+        File javaFile = new File(_environment.getRealDirectory(), fileName);
+        
+        File dir = javaFile.getParentFile();
+        dir.mkdirs();
+        
+        FileWriter writer = new FileWriter(javaFile);
+        writer.write(javaCode);
+        writer.flush();
+        writer.close();
+    }
+    
+    public static Element removeXsdImports(Element wsdl)
+    {
+        Element types = XmlUtils.getElement(wsdl, WsdlUtils.TYPES_QNAME);
+        Element[] schemas = XmlUtils.getElements(types, XsdUtils.SCHEMA_QNAME);
+        
+        for (int i = 0; i < schemas.length; ++i)
+        {        	
+            ResourceInspector.removeImports(schemas[i]);
+            ResourceInspector.removeIncludes(schemas[i]);            
+        }
+        
+        return wsdl;
+    }
+
+	public Map generateFiles(Map capabilities) {
+		// TODO Auto-generated method stub
+		return new HashMap();
+	}
+}

Added: webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ServerSynthesizer.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ServerSynthesizer.java?rev=422853&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ServerSynthesizer.java (added)
+++ webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/ServerSynthesizer.java Mon Jul 17 13:38:27 2006
@@ -0,0 +1,444 @@
+/*=============================================================================*
+ *  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.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.apache.muse.core.AbstractCapability;
+import org.apache.muse.tools.generator.Capability;
+import org.apache.muse.tools.inspector.JavaMethod;
+import org.apache.muse.tools.inspector.JavaProperty;
+import org.apache.muse.util.ReflectUtils;
+import org.apache.muse.ws.resource.WsResourceCapability;
+import org.apache.muse.ws.resource.impl.AbstractWsResourceCapability;
+
+/**
+ * 
+ * ServerSynthesizer is ...
+ *
+ * @author Andrew Eberbach
+ *
+ */
+
+public class ServerSynthesizer implements Synthesizer {
+
+	private static final String INDENT = "    ";
+	
+	private HashMap _files;
+
+	public Map generateFiles(Map capabilities) {
+		_files = new HashMap();
+		
+		for (Iterator i = capabilities.values().iterator(); i.hasNext();) {
+			Capability capability = (Capability)i.next();
+			if(!capability.isBuiltIn()) {
+				generateCapability(capability);
+			}
+		}
+		
+		return _files;
+	}
+	
+	private void generateCapability(Capability capability) {
+		ClassInfo classInfo = new ClassInfo(capability);
+			
+		makeInterface(classInfo);
+		makeAbstractClass(classInfo);
+	}
+
+	private void makeInterface(ClassInfo classInfo) {
+		StringBuffer code = new StringBuffer();
+		
+		generatePackageHeader(classInfo, code);
+		generateImports(classInfo, false, code);
+		generateInterfaceDeclaration(classInfo, code);
+
+		generateOpenBlock(code);
+		newLine(code);
+
+		generateNSDeclarations(classInfo, code);
+		generatePropertyOperations(classInfo, code, false);
+		generateOperations(classInfo, code, false);
+		
+		generateCloseBlock(code);
+		
+		String className = makeFileName(classInfo, false);
+		
+		_files.put(className, code.toString());
+	}
+	
+	private void makeAbstractClass(ClassInfo classInfo) {		
+		StringBuffer code = new StringBuffer();
+		
+		generatePackageHeader(classInfo, code);
+		generateImports(classInfo, true, code);
+		generateClassDeclaration(classInfo, code);
+
+		generateOpenBlock(code);
+		newLine(code);
+
+		generatePropertiesDeclarations(classInfo, code);
+		generatePropertyOperations(classInfo, code, true);
+		generateOperations(classInfo, code, true);
+		
+		generateCloseBlock(code);
+		
+		String className = makeFileName(classInfo, true);
+		
+		_files.put(className, code.toString());
+	}
+
+	private void generateInterfaceDeclaration(ClassInfo classInfo, StringBuffer code) {
+		Capability capability = classInfo.getCapability();
+		code.append("public interface " 
+			+ classInfo.getClassShortName() 
+			+ " extends "
+			+ convertType(getBaseClass(capability, false),classInfo));
+		newLine(code);
+	}
+
+	private void generateClassDeclaration(ClassInfo classInfo, StringBuffer code) {
+		Capability capability = classInfo.getCapability();
+		code.append("public class " 
+			+ ReflectUtils.getShortName(capability.getImplementingClass())
+			+ " extends "
+			+ convertType(getBaseClass(capability, true),classInfo));
+		code.append(" implements " + classInfo.getClassShortName());
+		newLine(code);
+	}
+
+	private void generatePropertiesDeclarations(ClassInfo classInfo, StringBuffer code) {
+		Capability capability = classInfo.getCapability();
+		
+		if(capability.getProperties().size() == 0) {
+			return;
+		}
+		
+		indent(code);
+		code.append("private static final " 
+			+ convertType(QName.class, classInfo) 
+			+ "[] _PROPERTIES = new " 
+			+ convertType(QName.class, classInfo) 
+			+ "[]");
+		newLine(code);
+		
+		indent(code);
+		generateOpenBlock(code);
+		newLine(code);
+		
+		for(Iterator i=capability.getProperties().iterator(); i.hasNext();) {
+			JavaProperty property = (JavaProperty)i.next();
+			indent(2,code);
+			code.append("new " 
+				+ convertType(QName.class, classInfo) 
+				+ "(NAMESPACE_URI, \"" 
+				+ getPropertyName(property) 
+				+ "\", PREFIX)");
+			if(i.hasNext()) {
+				code.append(",");
+			}
+			newLine(code);
+		}
+		
+		indent(code);
+		generateCloseBlock(code);
+		statement(";",code);
+		newLine(2,code);
+		
+		indent(code);
+		code.append("public " 
+			+ convertType(QName.class, classInfo) 
+			+ "[] getPropertyNames()");
+		newLine(code);
+		
+		indent(code);
+		generateOpenBlock(code);
+		newLine(code);
+		
+		indent(2,code);
+		code.append("return _PROPERTIES;");
+		
+		newLine(code);
+		indent(code);
+		generateCloseBlock(code);
+		newLine(2,code);
+		
+		for(Iterator i=capability.getProperties().iterator(); i.hasNext();) {
+			JavaProperty property = (JavaProperty)i.next();
+			indent(code);
+			code.append("private " 
+				+ convertType(property.getJavaType(), classInfo) 
+				+ " _" 
+				+ getPropertyName(property) 
+				+ ";");
+			newLine(2, code);
+		}
+	}
+
+	private String getPropertyName(JavaProperty property) {
+		return property.getName().getLocalPart(); 
+	}
+
+	private void generateOperations(ClassInfo classInfo, StringBuffer code, boolean generateBody) {
+		Capability capability = classInfo.getCapability();
+		
+		for(Iterator i=capability.getOperations().iterator(); i.hasNext();) {
+			JavaMethod method = (JavaMethod)i.next();		
+			
+			indent(code);
+			code.append("public "
+				+ convertType(method.getReturnType(), classInfo) 
+				+ " " + getMethodName(method));
+			
+			Class[] params = method.getParameterTypes();
+			code.append("(");
+			
+			if (params.length > 0) {
+				int j;
+				for (j = 0; j < params.length - 1; j++) {
+					code.append(convertType(params[j], classInfo)
+						+ " "
+						+ "param" 
+						+ j
+						+ ", ");
+				}
+				code.append(convertType(params[j], classInfo) 
+					+ " "
+					+ "param" + j);
+			}
+			
+			code.append(")");
+			
+			if(generateBody) {
+				indent(code);
+				generateOpenBlock(code);
+				newLine(code);
+				
+				indent(2,code);
+				code.append("throw new RuntimeException(\"Unimplemented Method\");");
+				newLine(code);
+				
+				indent(code);
+				generateCloseBlock(code);
+			} else {
+				code.append(";");
+			}
+			newLine(2,code);
+		}
+	}
+
+	private void generatePropertyOperations(ClassInfo classInfo, StringBuffer code, boolean generateBody) {
+		Capability capability = classInfo.getCapability();
+		
+		if(capability.getProperties().size() == 0) {
+			return;
+		}
+		
+		for(Iterator i=capability.getProperties().iterator(); i.hasNext();) {
+			JavaProperty property = (JavaProperty)i.next();
+			indent(code);
+			code.append("public "
+				+ convertType(property.getJavaType(), classInfo)
+				+ " get" 
+				+ getPropertyName(property) 
+				+ "()");
+			
+			if(generateBody) {
+				newLine(code);
+				indent(code);
+				generateOpenBlock(code);
+				newLine(code);
+				
+				indent(2,code);
+				statement("return _" 
+					+ getPropertyName(property) 
+					+  ";",code);
+				newLine(code);
+				
+				indent(code);
+				generateCloseBlock(code);
+			} else {
+				code.append(";");
+			}
+			newLine(2,code);
+			
+			indent(code);
+			code.append("public void");
+			code.append(" set" 
+				+ getPropertyName(property) 
+				+ "(" 
+				+ convertType(property.getJavaType(), classInfo) 
+				+ " param0)");
+			
+			if(generateBody) {
+				newLine(code);
+				indent(code);
+				generateOpenBlock(code);
+				newLine(code);
+				
+				indent(2,code);
+				statement("_" 
+					+ getPropertyName(property) 
+					+ " = param0;",code);				
+				newLine(code);
+				
+				indent(code);
+				generateCloseBlock(code);				
+			} else {
+				code.append(";");
+			}
+			newLine(2,code);
+		}
+	}
+
+	private void generateNSDeclarations(ClassInfo classInfo, StringBuffer code) {
+		Capability capability = classInfo.getCapability();
+		indent(code);
+		statement("String PREFIX = \"tns\";", code);
+		newLine(2,code);
+		
+		indent(code);
+		statement("String NAMESPACE_URI = \""+ capability.getURI() +"\";", code);
+		newLine(2,code);
+	}
+
+	private void generateImports(ClassInfo classInfo, boolean isImpl, StringBuffer code) {
+		Set imports = classInfo.getImports();
+		
+		Class baseClass = getBaseClass(classInfo.getCapability(), isImpl);
+			
+		if(!imports.contains(baseClass)) {
+			generateImport(baseClass, code);
+		}
+		
+		if(classInfo.getCapability().getProperties().size() > 0) {		
+			if(!imports.contains(QName.class)) {
+				generateImport(QName.class, code);
+			}
+		}
+
+		for (Iterator i = imports.iterator(); i.hasNext(); ) {
+			generateImport((Class)i.next(),code);
+		}
+		
+		newLine(code);
+	}
+
+	private void generateImport(Class theClass, StringBuffer code) {
+		String className = needsImport(theClass);
+		if (className != null) {
+			code.append("import " + className + ";");
+			code.append("\n");
+		}
+	}
+
+
+	private void generatePackageHeader(ClassInfo classInfo, StringBuffer code) {
+		statement("package " + classInfo.getPackageName() + ";",code);
+		newLine(2, code);
+	}
+	
+	private String getMethodName(JavaMethod method) {
+		String name = method.getName().getLocalPart();
+		name = name.substring(0,1).toLowerCase() + name.substring(1);
+		return name;
+	}
+
+	private String needsImport(Class className) {
+		if(className.isPrimitive()) {
+			return null;
+		}
+		if(className.isArray()) {
+			className = ReflectUtils.getClassFromArrayClass(className);
+		}		
+		if(className.getName().startsWith("java.lang.")) {
+			return null;
+		}
+		return className.getName();
+ 	 }
+	
+	private String convertType(Class returnType, ClassInfo classInfo) {
+		boolean isArray = returnType.isArray();
+		returnType = isArray?ReflectUtils.getClassFromArrayClass(returnType):returnType;
+		
+		//Use fully-qualified name if conflict exists
+		if(classInfo.hasConflict(returnType)) {			
+			return returnType.getName();	
+		}
+        return ReflectUtils.getShortName(returnType);		
+	}
+
+	private Class getBaseClass(Capability capability, boolean isImpl) {
+		if(isImpl) {
+			if(capability.getProperties().size() > 0) {
+				return AbstractWsResourceCapability.class;
+			}
+            return AbstractCapability.class;
+		}
+        if(capability.getProperties().size() > 0) {
+        	return WsResourceCapability.class;
+        }
+        return org.apache.muse.core.Capability.class;
+	}
+	
+	private String makeFileName(ClassInfo classInfo, boolean isImpl) {
+		String name = null;
+		if(isImpl) {
+			name = classInfo.getCapability().getImplementingClass();
+		} else {
+			name = classInfo.getClassFullName();
+		}
+		return name.replaceAll("\\.", "\\\\") + ".java";
+	}
+
+	private void statement(String statement, StringBuffer code) {
+		code.append(statement);
+	}
+
+	private void newLine(StringBuffer code) {
+		newLine(1,code);
+	}
+	
+	private void newLine(int n, StringBuffer code) {
+		for(int i=0; i < n; i++) {
+			code.append("\n");
+		}
+	}
+
+	private void generateCloseBlock(StringBuffer code) {
+		code.append("}");
+	}
+
+	private void generateOpenBlock(StringBuffer code) {
+		code.append("{");
+	}
+
+	private void indent(StringBuffer code) {
+		indent(1,code);
+	}
+	
+	private void indent(int indent, StringBuffer code) {
+		for(int i=0; i < indent; i++) {
+			code.append(INDENT);
+		}
+	}
+}

Added: webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/Synthesizer.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/Synthesizer.java?rev=422853&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/Synthesizer.java (added)
+++ webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/generator/synthesizer/Synthesizer.java Mon Jul 17 13:38:27 2006
@@ -0,0 +1,30 @@
+/*=============================================================================*
+ *  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.util.Map;
+
+/**
+ * Interface for code generators. These classes take a map
+ * of capabilities and produce the necessary implementation
+ * classes and write them out to disk.
+ * 
+ * @author Andrew Eberbach 
+ */
+public interface Synthesizer  {	
+	Map generateFiles(Map capabilities);
+}

Modified: webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaMethod.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaMethod.java?rev=422853&r1=422852&r2=422853&view=diff
==============================================================================
--- webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaMethod.java (original)
+++ webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaMethod.java Mon Jul 17 13:38:27 2006
@@ -1,91 +1,118 @@
-package org.apache.muse.tools.inspector;
-
-import javax.xml.namespace.QName;
-
-/**
- * 
- * @author Dan Jemiolo (danj)
- *
- */
-
-class JavaMethod
-{
-    private QName _name = null;
-    
-    private QName[] _parameterTypeNames = null;   
-    private QName[] _parameterSchemaTypes = null;
-    private Class[] _parameterTypes = null;
-    
-    private QName _returnName = null;
-    private QName _returnSchemaType = null;
-    private Class _returnType = null;
-    
-    public QName getName()
-    {
-        return _name;
-    }
-    
-    public void setName(QName name)
-    {
-        _name = name;
-    }
-    
-    public QName[] getParameterSchemaTypes()
-    {
-        return _parameterSchemaTypes;
-    }
-    
-    public void setParameterSchemaTypes(QName[] parameterSchemaTypes)
-    {
-        _parameterSchemaTypes = parameterSchemaTypes;
-    }
-    
-    public QName[] getParameterTypeNames()
-    {
-        return _parameterTypeNames;
-    }
-    
-    public void setParameterTypeNames(QName[] parameterTypeNames)
-    {
-        _parameterTypeNames = parameterTypeNames;
-    }
-    
-    public Class[] getParameterTypes()
-    {
-        return _parameterTypes;
-    }
-    public void setParameterTypes(Class[] parameterTypes)
-    {
-        _parameterTypes = parameterTypes;
-    }
-    
-    public QName getReturnName()
-    {
-        return _returnName;
-    }
-    
-    public void setReturnName(QName returnName)
-    {
-        _returnName = returnName;
-    }
-    
-    public QName getReturnSchemaType()
-    {
-        return _returnSchemaType;
-    }
-    
-    public void setReturnSchemaType(QName returnSchemaType)
-    {
-        _returnSchemaType = returnSchemaType;
-    }
-    
-    public Class getReturnType()
-    {
-        return _returnType;
-    }
-    
-    public void setReturnType(Class returnType)
-    {
-        _returnType = returnType;
-    }
-}
+/*=============================================================================*
+ *  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.inspector;
+
+import javax.xml.namespace.QName;
+
+/**
+ * 
+ * @author Dan Jemiolo (danj)
+ *
+ */
+
+public class JavaMethod
+{
+    private QName _name = null;
+    
+    private QName[] _parameterTypeNames = null;   
+    private QName[] _parameterSchemaTypes = null;
+    private Class[] _parameterTypes = null;
+    
+    private QName _returnName = null;
+    private QName _returnSchemaType = null;
+    private Class _returnType = null;
+
+	private String _actionURI;
+    
+    public QName getName()
+    {
+        return _name;
+    }
+    
+    public void setName(QName name)
+    {
+        _name = name;
+    }
+    
+    public QName[] getParameterSchemaTypes()
+    {
+        return _parameterSchemaTypes;
+    }
+    
+    public void setParameterSchemaTypes(QName[] parameterSchemaTypes)
+    {
+        _parameterSchemaTypes = parameterSchemaTypes;
+    }
+    
+    public QName[] getParameterTypeNames()
+    {
+        return _parameterTypeNames;
+    }
+    
+    public void setParameterTypeNames(QName[] parameterTypeNames)
+    {
+        _parameterTypeNames = parameterTypeNames;
+    }
+    
+    public Class[] getParameterTypes()
+    {
+        return _parameterTypes;
+    }
+    
+    public void setParameterTypes(Class[] parameterTypes)
+    {
+        _parameterTypes = parameterTypes;
+    }
+    
+    public QName getReturnName()
+    {
+        return _returnName;
+    }
+    
+    public void setReturnName(QName returnName)
+    {
+        _returnName = returnName;
+    }
+    
+    public QName getReturnSchemaType()
+    {
+        return _returnSchemaType;
+    }
+    
+    public void setReturnSchemaType(QName returnSchemaType)
+    {
+        _returnSchemaType = returnSchemaType;
+    }
+    
+    public Class getReturnType()
+    {
+        return _returnType;
+    }
+    
+    public void setReturnType(Class returnType)
+    {
+        _returnType = returnType;
+    }
+
+    public String getActionURI() {
+    	return _actionURI;
+    }
+    
+	public void setActionURI(String actionURI) {
+		_actionURI = actionURI;
+	}	
+}

Added: webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaProperty.java
URL: http://svn.apache.org/viewvc/webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaProperty.java?rev=422853&view=auto
==============================================================================
--- webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaProperty.java (added)
+++ webservices/muse/trunk/modules/muse-tools/src/org/apache/muse/tools/inspector/JavaProperty.java Mon Jul 17 13:38:27 2006
@@ -0,0 +1,46 @@
+/*=============================================================================*
+ *  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.inspector;
+
+import javax.xml.namespace.QName;
+
+/**
+ * 
+ * @author Andrew Eberbach
+ * 
+ */
+public class JavaProperty {
+
+	private QName _name;
+	private Class _type;
+
+	public void setQName(QName property) {
+		_name = property;
+	}
+
+	public QName getName() {
+		return _name;
+	}
+	
+	public void setJavaType(Class propertyType) {
+		_type = propertyType;
+	}
+
+	public Class getJavaType() {
+		return _type;
+	}
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: muse-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-commits-help@ws.apache.org