cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From m...@apache.org
Subject svn commit: r514610 - in /incubator/cxf/trunk: tools/common/src/main/java/org/apache/cxf/tools/util/ tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ tools2/common/src/main/java/org/apache/cxf/tools/util/ tools2/javato/s...
Date Mon, 05 Mar 2007 09:01:19 GMT
Author: mmao
Date: Mon Mar  5 01:01:18 2007
New Revision: 514610

URL: http://svn.apache.org/viewvc?view=rev&rev=514610
Log:
Code cleanup
* Port exitOnFinish from tools to tools2 
* Remove commented code
* Refactoring JIRA-356, previous fix is over-engineered, 
  there is no need to copy bunch of code into ProcessorUtil, we can extract the element targetnamespace from the jaxb property, and only doc-lit need this fix. 
* Port the JIRA-356 fix into tools2 

Added:
    incubator/cxf/trunk/tools2/wsdlto/test/src/test/resources/wsdl2java_wsdl/locator.wsdl
Modified:
    incubator/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/util/ProcessorUtil.java
    incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/OperationProcessor.java
    incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor.java
    incubator/cxf/trunk/tools2/common/src/main/java/org/apache/cxf/tools/util/PropertyUtil.java
    incubator/cxf/trunk/tools2/javato/src/test/java/org/apache/cxf/tools/java2wsdl/processor/JavaToWSDLProcessorTest.java
    incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJava.java
    incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJavaContainer.java
    incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java
    incubator/cxf/trunk/tools2/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java

Modified: incubator/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/util/ProcessorUtil.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/util/ProcessorUtil.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/util/ProcessorUtil.java (original)
+++ incubator/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/util/ProcessorUtil.java Mon Mar  5 01:01:18 2007
@@ -24,23 +24,13 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import javax.wsdl.Definition;
-import javax.wsdl.Import;
 import javax.wsdl.Message;
 import javax.wsdl.Operation;
 import javax.wsdl.Part;
-import javax.wsdl.Types;
-import javax.wsdl.extensions.UnknownExtensibilityElement;
-import javax.wsdl.extensions.schema.Schema;
-import javax.wsdl.extensions.schema.SchemaImport;
 import javax.xml.namespace.QName;
 
 import org.w3c.dom.DOMException;
@@ -53,24 +43,13 @@
 
 import org.apache.cxf.helpers.JavaUtils;
 import org.apache.cxf.jaxb.JAXBUtils;
-import org.apache.cxf.resource.XmlSchemaURIResolver;
 import org.apache.cxf.tools.common.DataBindingGenerator;
 import org.apache.cxf.tools.common.ToolConstants;
 import org.apache.cxf.tools.common.ToolContext;
 import org.apache.cxf.tools.common.ToolException;
-import org.apache.ws.commons.schema.XmlSchemaCollection;
-import org.apache.ws.commons.schema.XmlSchemaComplexType;
-import org.apache.ws.commons.schema.XmlSchemaElement;
-import org.apache.ws.commons.schema.XmlSchemaObject;
-import org.apache.ws.commons.schema.XmlSchemaObjectCollection;
-import org.apache.ws.commons.schema.XmlSchemaSequence;
-
-import static org.apache.cxf.helpers.CastUtils.cast;
 
 public final class ProcessorUtil {
-    //private static final Logger LOG = LogUtils.getL7dLogger(ProcessorUtil.class);
     private static final String KEYWORDS_PREFIX = "_";
-    private static Map<String, Element> schemaList = new HashMap<String, Element>();
     private ProcessorUtil() {
     }
 
@@ -171,46 +150,6 @@
         }
     }
     
-    public static String resolvePartNamespace(Part part, Definition definition) {
-        QName qname = part.getElementName();
-        
-        
-
-        if (qname == null) {
-            qname = part.getTypeName();
-        }
-        if (qname != null) {
-            XmlSchemaElement schemaElement = getSchemas(definition).getElementByQName(qname);
-            if (schemaElement != null 
-                && schemaElement.getSchemaType() instanceof XmlSchemaComplexType) {
-                XmlSchemaComplexType xsct = null;
-                
-                xsct = (XmlSchemaComplexType)schemaElement.getSchemaType();
-                if (xsct.getParticle() instanceof XmlSchemaSequence) {
-                    XmlSchemaSequence seq = (XmlSchemaSequence)xsct.getParticle();
-                    XmlSchemaObjectCollection items = seq.getItems();
-
-                    for (int x = 0; x < items.getCount(); x++) {
-                        XmlSchemaObject o = items.getItem(x);
-                        XmlSchemaElement el = null;
-                        if (o instanceof XmlSchemaElement) {   
-                            el = (XmlSchemaElement)o;
-                        }
-                        
-                        if (el != null && el.getRefName() != null) {
-                            return el.getRefName().getNamespaceURI();
-                        }
-                    }
-                }
-                
-                
-            }
-            return qname.getNamespaceURI();
-        } else {
-            return null;
-        }
-    }
-
     public static String mangleNameToClassName(String clzName) {
         return JAXBRIContext.mangleNameToClassName(clzName);
     }
@@ -522,127 +461,4 @@
         return clone;
     }
     
-    public static XmlSchemaCollection getSchemas(Definition def) {
-        XmlSchemaCollection schemaCol = new XmlSchemaCollection();
-        
-        List<Definition> defList = new ArrayList<Definition>();
-        parseImports(def, defList);
-        extractSchema(def, schemaCol);
-        // added
-        getSchemaList(def);
-        for (Definition def2 : defList) {
-            extractSchema(def2, schemaCol);
-            // added
-            getSchemaList(def2);
-        }
-
-        return schemaCol;
-    }
-
-    private static void parseImports(Definition def, List<Definition> defList) {
-        List<Import> importList = new ArrayList<Import>();
-
-        Collection<List<Import>> ilist = cast(def.getImports().values());
-        for (List<Import> list : ilist) {
-            importList.addAll(list);
-        }
-        for (Import impt : importList) {
-            parseImports(impt.getDefinition(), defList);
-            defList.add(impt.getDefinition());
-        }
-    }
-
-    private static void extractSchema(Definition def, XmlSchemaCollection schemaCol) {
-        Types typesElement = def.getTypes();
-        if (typesElement != null) {
-            for (Object obj : typesElement.getExtensibilityElements()) {
-                org.w3c.dom.Element schemaElem = null;
-                if (obj instanceof Schema) {
-                    Schema schema = (Schema)obj;
-                    schemaElem = schema.getElement();
-                } else if (obj instanceof UnknownExtensibilityElement) {
-                    org.w3c.dom.Element elem = ((UnknownExtensibilityElement)obj).getElement();
-                    if (elem.getLocalName().equals("schema")) {
-                        schemaElem = elem;
-                    }
-                }
-                if (schemaElem != null) { // && schemaElem.getNodeValue() != null) {
-                    for (Object prefix : def.getNamespaces().keySet()) {
-                        String ns = (String)def.getNamespaces().get(prefix);
-                        if (!"".equals(prefix) && !schemaElem.hasAttribute("xmlns:" + prefix)) {
-                            schemaElem.setAttributeNS(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
-                                                      "xmlns:" + prefix, ns);
-                        }
-                    }
-                    try {
-                        schemaCol.setBaseUri(def.getDocumentBaseURI());
-                        schemaCol.setSchemaResolver(new XmlSchemaURIResolver());
-                   
-                        schemaCol.read(schemaElem);
-                    } catch (Exception e) {
-                        //e.printStackTrace();
-                    }
-                    
-                }
-            }
-        }
-    }
-
-    private static void getSchemaList(Definition def) {
-        Types typesElement = def.getTypes();
-        if (typesElement != null) {
-            Iterator ite = typesElement.getExtensibilityElements().iterator();
-            while (ite.hasNext()) {
-                Object obj = ite.next();
-                if (obj instanceof Schema) {
-                    Schema schema = (Schema)obj;
-                    addSchema(schema);
-                }
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private static void addSchema(Schema schema) {
-        if (schemaList.get(schema.getDocumentBaseURI()) == null) {
-            schemaList.put(schema.getDocumentBaseURI(), schema.getElement());
-        } else {
-            String tns = schema.getDocumentBaseURI() + "#"
-                         + schema.getElement().getAttribute("targetNamespace");
-            if (schemaList.get(tns) == null) {
-                schemaList.put(tns, schema.getElement());
-            }
-        }
-        
-        Map<String, List> imports = schema.getImports();
-        if (imports != null && imports.size() > 0) {
-            Collection<String> importKeys = imports.keySet();
-            for (String importNamespace : importKeys) {
-                if (importNamespace != null 
-                    && !isSchemaParsed(schema.getDocumentBaseURI(), importNamespace)) {
-                    List<SchemaImport> schemaImports = imports.get(importNamespace);
-                    for (SchemaImport schemaImport : schemaImports) {
-                        Schema tempImport = schemaImport.getReferencedSchema();
-                        if (tempImport != null && !schemaList.containsValue(tempImport.getElement())) {
-                            addSchema(tempImport);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private static boolean isSchemaParsed(String baseUri, String ns) {
-        if (schemaList.get(baseUri) != null) {
-            Element ele = schemaList.get(baseUri);
-            String tns = ele.getAttribute("targetNamespace");
-            if (ns.equals(tns)) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    
-
 }

Modified: incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/OperationProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/OperationProcessor.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/OperationProcessor.java (original)
+++ incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/OperationProcessor.java Mon Mar  5 01:01:18 2007
@@ -26,7 +26,6 @@
 import java.util.logging.Level;
 
 import javax.jws.soap.SOAPBinding;
-//import javax.wsdl.Definition;
 import javax.wsdl.Fault;
 import javax.wsdl.Message;
 import javax.wsdl.Operation;

Modified: incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor.java (original)
+++ incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor.java Mon Mar  5 01:01:18 2007
@@ -105,7 +105,7 @@
 
     private JavaParameter getParameterFromPart(JavaMethod method, Part part, JavaType.Style style) {
         String name = ProcessorUtil.resolvePartName(part);
-        String namespace = ProcessorUtil.resolvePartNamespace(part, definition);
+        String namespace = ProcessorUtil.resolvePartNamespace(part);
         String type = ProcessorUtil.resolvePartType(part, this.env);
 
         JavaParameter parameter = new JavaParameter(name, type, namespace);
@@ -174,7 +174,7 @@
         String name = part == null ? "return" : part.getName();
         String type = part == null ? "void" : ProcessorUtil.resolvePartType(part, this.env);
  
-        String namespace = part == null ? null : ProcessorUtil.resolvePartNamespace(part, definition);
+        String namespace = part == null ? null : ProcessorUtil.resolvePartNamespace(part);
               
         JavaReturn returnType = new JavaReturn(name, type, namespace);
         returnType.setQName(ProcessorUtil.getElementName(part));
@@ -439,9 +439,9 @@
 
     private JavaParameter getParameterFromProperty(Property property, JavaType.Style style, Part part) {
         JType t = property.type();
-        String targetNamespace = ProcessorUtil.resolvePartNamespace(part, definition);
+        String targetNamespace = property.elementName().getNamespaceURI();
         if (targetNamespace == null) {
-            targetNamespace = property.elementName().getNamespaceURI();
+            targetNamespace = ProcessorUtil.resolvePartNamespace(part);
         }
         JavaParameter parameter = new JavaParameter(property.name(), t.fullName(), targetNamespace);
         parameter.setStyle(style);
@@ -456,9 +456,9 @@
 
     private JavaReturn getReturnFromProperty(Property property, Part part) {
         JType t = property.type();
-        String targetNamespace = ProcessorUtil.resolvePartNamespace(part, definition);
+        String targetNamespace = property.elementName().getNamespaceURI();
         if (targetNamespace == null) {
-            targetNamespace = property.elementName().getNamespaceURI();
+            targetNamespace = ProcessorUtil.resolvePartNamespace(part);
         }
         JavaReturn returnType = new JavaReturn(property.name(), t.fullName(), targetNamespace);
         returnType.setQName(property.elementName());

Modified: incubator/cxf/trunk/tools2/common/src/main/java/org/apache/cxf/tools/util/PropertyUtil.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/common/src/main/java/org/apache/cxf/tools/util/PropertyUtil.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/common/src/main/java/org/apache/cxf/tools/util/PropertyUtil.java (original)
+++ incubator/cxf/trunk/tools2/common/src/main/java/org/apache/cxf/tools/util/PropertyUtil.java Mon Mar  5 01:01:18 2007
@@ -19,8 +19,14 @@
 
 package org.apache.cxf.tools.util;
 
-import java.io.*;
-import java.util.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
 import org.apache.cxf.common.util.StringUtils;
 
 public class PropertyUtil {

Modified: incubator/cxf/trunk/tools2/javato/src/test/java/org/apache/cxf/tools/java2wsdl/processor/JavaToWSDLProcessorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/javato/src/test/java/org/apache/cxf/tools/java2wsdl/processor/JavaToWSDLProcessorTest.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/javato/src/test/java/org/apache/cxf/tools/java2wsdl/processor/JavaToWSDLProcessorTest.java (original)
+++ incubator/cxf/trunk/tools2/javato/src/test/java/org/apache/cxf/tools/java2wsdl/processor/JavaToWSDLProcessorTest.java Mon Mar  5 01:01:18 2007
@@ -37,7 +37,6 @@
 import org.apache.cxf.tools.common.ToolException;
 import org.apache.cxf.tools.common.WSDLConstants;
 import org.apache.cxf.tools.common.extensions.soap.SoapBinding;
-import org.apache.cxf.tools.common.toolspec.ToolSpec;
 import org.apache.cxf.tools.util.SOAPBindingUtil;
 import org.apache.cxf.tools.wsdlto.frontend.jaxws.JAXWSContainer;
 
@@ -49,9 +48,6 @@
     private String serviceName = "cxfService";
     private WSDLHelper wsdlHelper = new WSDLHelper();
     private File classFile;
-    private String toolspecFile = "/org/apache/cxf/tools/wsdlto/frontend/jaxws/jaxws-toolspec.xml";
-    private InputStream ins = getClass().getResourceAsStream(toolspecFile);
-    private ToolSpec toolspec = new ToolSpec(ins, true);
     
     public void setUp() throws Exception {
 

Modified: incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJava.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJava.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJava.java (original)
+++ incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJava.java Mon Mar  5 01:01:18 2007
@@ -19,8 +19,9 @@
 
 package org.apache.cxf.tools.wsdlto;
 
-import java.io.*;
-import java.util.*;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
 
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.tools.common.ToolConstants;
@@ -61,6 +62,14 @@
         return pluginLoader.getDataBindingProfile(name);
     }
     
+    private boolean isExitOnFinish() {
+        String exit = System.getProperty("exitOnFinish");
+        if (StringUtils.isEmpty(exit)) {
+            return false;
+        }
+        return "YES".equalsIgnoreCase(exit) || "TRUE".equalsIgnoreCase(exit);
+    }
+
     public void run(ToolContext context) throws Exception {
         FrontEndProfile frontend = null;
         if (args != null) {
@@ -87,6 +96,7 @@
                            toolspecStream,
                            false,
                            args,
+                           isExitOnFinish(),
                            context);
     }
         

Modified: incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJavaContainer.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJavaContainer.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJavaContainer.java (original)
+++ incubator/cxf/trunk/tools2/wsdlto/core/src/main/java/org/apache/cxf/tools/wsdlto/WSDLToJavaContainer.java Mon Mar  5 01:01:18 2007
@@ -182,13 +182,22 @@
             if (isVerboseOn()) {
                 ex.printStackTrace();
             }
+            if (exitOnFinish) {
+                System.exit(1);
+            }            
         } catch (Exception ex) {
             System.err.println("Error : " + ex.getMessage());
             System.err.println();
             if (isVerboseOn()) {
                 ex.printStackTrace();
             }
+            if (exitOnFinish) {
+                System.exit(1);
+            }      
         }
+        if (exitOnFinish) {
+            System.exit(0);
+        }        
     }
 
     @SuppressWarnings("unchecked")

Modified: incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java (original)
+++ incubator/cxf/trunk/tools2/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java Mon Mar  5 01:01:18 2007
@@ -98,7 +98,6 @@
     private JavaParameter addParameter(JavaMethod method, JavaParameter parameter) throws ToolException {
         parameter.setMethod(method);
         parameter.annotate(new WebParamAnnotator());
-        //new WebParamAnnotator().annotate(method, parameter);
         method.addParameter(parameter);
         return parameter;
     }
@@ -145,27 +144,6 @@
             addParameter(method, getParameterFromQName(part.getElementQName(), 
                                                        item, JavaType.Style.IN, part));
         }
-        
-        /*Map<String, Part> inputPartsMap = inputMessage.getParts();
-        Collection<Part> inputParts = inputPartsMap.values();
-        if (inputParts.size() > 1) {
-            processInput(method, inputMessage);
-            return;
-        } else if (inputParts.isEmpty()) {
-            return;
-        }
-        Part part = inputParts.iterator().next();
-        
-        List<? extends Property> block = dataBinder.getBlock(part);
-        if (block != null) {
-            if (block.size() == 0) {
-                // complete
-            }
-            for (Property item : block) {
-                addParameter(method, getParameterFromProperty(item, JavaType.Style.IN, part));
-            }
-        }*/
-        
     }
 
     @SuppressWarnings("unchecked")
@@ -190,7 +168,6 @@
                     outParts.add(outpart);
                     continue;
                 }
-                // outParts.add(outpart);
             }
         }
 
@@ -318,10 +295,11 @@
         fullJavaName = this.dataBinding.getWrappedElementType(wrapperElement, item);
         
         
-        String targetNamespace = ProcessorUtil.resolvePartNamespace(part);
+        String targetNamespace = item.getNamespaceURI();
         if (targetNamespace == null) {
-            targetNamespace = wrapperElement.getNamespaceURI();
+            targetNamespace = ProcessorUtil.resolvePartNamespace(part);
         }
+
         
         String jpname = ProcessorUtil.mangleNameToVariableName(item.getLocalPart());
         JavaParameter parameter = new JavaParameter(jpname, fullJavaName, targetNamespace);

Modified: incubator/cxf/trunk/tools2/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java?view=diff&rev=514610&r1=514609&r2=514610
==============================================================================
--- incubator/cxf/trunk/tools2/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java (original)
+++ incubator/cxf/trunk/tools2/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java Mon Mar  5 01:01:18 2007
@@ -758,6 +758,35 @@
         }
     }
 
+    public void testRefTNS() throws Exception {
+        env.put(ToolConstants.CFG_WSDLURL, getLocation("/wsdl2java_wsdl/locator.wsdl"));
+        processor.setContext(env);
+        processor.execute();
+
+        assertNotNull(output);
+
+        File org = new File(output, "org");
+        assertTrue(org.exists());
+        File apache = new File(org, "apache");
+        assertTrue(apache.exists());
+        File locator = new File(apache, "locator");
+        assertTrue(locator.exists());
+        File locatorService = new File(locator, "LocatorService.java");
+        assertTrue(locatorService.exists());
+        
+
+        Class<?> clz = classLoader.loadClass("org.apache.locator.LocatorService");
+
+        javax.jws.WebService ws = AnnotationUtil.getPrivClassAnnotation(clz, javax.jws.WebService.class);
+        assertTrue("Webservice annotation wsdlLocation should begin with file", ws.wsdlLocation()
+                   .startsWith("file"));
+        
+        Class<?> paraClass = classLoader.loadClass("org.apache.locator.query.QuerySelectType");
+        Method method = clz.getMethod("queryEndpoints", new Class[] {paraClass});
+        WebParam webParamAnn = AnnotationUtil.getWebParam(method, "select");
+        assertEquals("http://apache.org/locator/query", webParamAnn.targetNamespace());
+    }
+
     private String getLocation(String wsdlFile) {
         return this.getClass().getResource(wsdlFile).getFile();
     }

Added: incubator/cxf/trunk/tools2/wsdlto/test/src/test/resources/wsdl2java_wsdl/locator.wsdl
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools2/wsdlto/test/src/test/resources/wsdl2java_wsdl/locator.wsdl?view=auto&rev=514610
==============================================================================
--- incubator/cxf/trunk/tools2/wsdlto/test/src/test/resources/wsdl2java_wsdl/locator.wsdl (added)
+++ incubator/cxf/trunk/tools2/wsdlto/test/src/test/resources/wsdl2java_wsdl/locator.wsdl Mon Mar  5 01:01:18 2007
@@ -0,0 +1,514 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License. You may obtain a copy of the License at
+                                                                                                                                                             
+  http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                             
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied. See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<definitions targetNamespace="http://apache.org/locator" 
+    xmlns="http://schemas.xmlsoap.org/wsdl/" 
+    xmlns:ls="http://apache.org/locator" 
+    xmlns:query="http://apache.org/locator/query" 
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
+    xmlns:tns="http://apache.org/locator/types" 
+    xmlns:wsa="http://www.w3.org/2005/08/addressing" 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <types>
+        <xs:schema attributeFormDefault="unqualified" blockDefault="#all" 
+            elementFormDefault="qualified" finalDefault="" 
+            targetNamespace="http://www.w3.org/2005/08/addressing" 
+            xmlns:tns="http://www.w3.org/2005/08/addressing">
+            <xs:element name="EndpointReference" type="tns:EndpointReferenceType"/>
+            <xs:complexType mixed="false" name="EndpointReferenceType">
+                <xs:sequence>
+                    <xs:element name="Address" type="tns:AttributedURIType"/>
+                    <xs:element minOccurs="0" name="ReferenceParameters" 
+                        type="tns:ReferenceParametersType"/>
+                    <xs:element minOccurs="0" ref="tns:Metadata"/>
+                    <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" 
+                        processContents="lax"/>
+                </xs:sequence>
+                <xs:anyAttribute namespace="##other" processContents="lax"/>
+            </xs:complexType>
+            <xs:complexType mixed="false" name="ReferenceParametersType">
+                <xs:sequence>
+                    <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##any" 
+                        processContents="lax"/>
+                </xs:sequence>
+                <xs:anyAttribute namespace="##other" processContents="lax"/>
+            </xs:complexType>
+            <xs:element name="Metadata" type="tns:MetadataType"/>
+            <xs:complexType mixed="false" name="MetadataType">
+                <xs:sequence>
+                    <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##any" 
+                        processContents="lax"/>
+                </xs:sequence>
+                <!--
+    Until anyAttribute is supported, explicitly include the
+             wsdlLocation attribute definition.
+
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+-->
+                <xs:attribute name="wsdlLocation" type="xs:string" use="optional"/>
+            </xs:complexType>
+            <xs:element name="MessageID" type="tns:AttributedURIType"/>
+            <xs:element name="RelatesTo" type="tns:RelatesToType"/>
+            <xs:complexType mixed="false" name="RelatesToType">
+                <xs:simpleContent>
+                    <xs:extension base="xs:anyURI">
+                        <xs:attribute name="RelationshipType" 
+                            type="tns:RelationshipTypeOpenEnum" use="optional"/>
+                        <xs:anyAttribute namespace="##other" processContents="lax"/>
+                    </xs:extension>
+                </xs:simpleContent>
+            </xs:complexType>
+            <xs:simpleType name="RelationshipTypeOpenEnum">
+                <xs:union memberTypes="tns:RelationshipType xs:anyURI"/>
+            </xs:simpleType>
+            <xs:simpleType name="RelationshipType">
+                <xs:restriction base="xs:anyURI">
+                    <xs:enumeration value="http://www.w3.org/2005/08/addressing/reply"/>
+                </xs:restriction>
+            </xs:simpleType>
+            <xs:element name="ReplyTo" type="tns:EndpointReferenceType"/>
+            <xs:element name="From" type="tns:EndpointReferenceType"/>
+            <xs:element name="FaultTo" type="tns:EndpointReferenceType"/>
+            <xs:element name="To" type="tns:AttributedURIType"/>
+            <xs:element name="Action" type="tns:AttributedURIType"/>
+            <xs:complexType mixed="false" name="AttributedURIType">
+                <xs:simpleContent>
+                    <xs:extension base="xs:anyURI">
+                        <xs:anyAttribute namespace="##other" processContents="lax"/>
+                    </xs:extension>
+                </xs:simpleContent>
+            </xs:complexType>
+            <xs:attribute name="IsReferenceParameter" type="xs:boolean"/>
+            <xs:simpleType name="FaultCodesOpenEnumType">
+                <xs:union memberTypes="tns:FaultCodesType xs:QName"/>
+            </xs:simpleType>
+            <xs:simpleType name="FaultCodesType">
+                <xs:restriction base="xs:QName">
+                    <xs:enumeration value="tns:InvalidAddressingHeader"/>
+                    <xs:enumeration value="tns:InvalidAddress"/>
+                    <xs:enumeration value="tns:InvalidEPR"/>
+                    <xs:enumeration value="tns:InvalidCardinality"/>
+                    <xs:enumeration value="tns:MissingAddressInEPR"/>
+                    <xs:enumeration value="tns:DuplicateMessageID"/>
+                    <xs:enumeration value="tns:ActionMismatch"/>
+                    <xs:enumeration value="tns:MessageAddressingHeaderRequired"/>
+                    <xs:enumeration value="tns:DestinationUnreachable"/>
+                    <xs:enumeration value="tns:ActionNotSupported"/>
+                    <xs:enumeration value="tns:EndpointUnavailable"/>
+                </xs:restriction>
+            </xs:simpleType>
+            <xs:element name="RetryAfter" type="tns:AttributedUnsignedLongType"/>
+            <xs:complexType mixed="false" name="AttributedUnsignedLongType">
+                <xs:simpleContent>
+                    <xs:extension base="xs:unsignedLong">
+                        <xs:anyAttribute namespace="##other" processContents="lax"/>
+                    </xs:extension>
+                </xs:simpleContent>
+            </xs:complexType>
+            <xs:element name="ProblemHeaderQName" type="tns:AttributedQNameType"/>
+            <xs:complexType mixed="false" name="AttributedQNameType">
+                <xs:simpleContent>
+                    <xs:extension base="xs:QName">
+                        <xs:anyAttribute namespace="##other" processContents="lax"/>
+                    </xs:extension>
+                </xs:simpleContent>
+            </xs:complexType>
+            <xs:element name="ProblemHeader" type="tns:AttributedAnyType"/>
+            <xs:complexType mixed="false" name="AttributedAnyType">
+                <xs:sequence>
+                    <xs:any maxOccurs="1" minOccurs="1" namespace="##any" 
+                        processContents="lax"/>
+                </xs:sequence>
+                <xs:anyAttribute namespace="##other" processContents="lax"/>
+            </xs:complexType>
+            <xs:element name="ProblemIRI" type="tns:AttributedURIType"/>
+            <xs:element name="ProblemAction" type="tns:ProblemActionType"/>
+            <xs:complexType mixed="false" name="ProblemActionType">
+                <xs:sequence>
+                    <xs:element minOccurs="0" ref="tns:Action"/>
+                    <xs:element minOccurs="0" name="SoapAction" type="xs:anyURI"/>
+                </xs:sequence>
+                <xs:anyAttribute namespace="##other" processContents="lax"/>
+            </xs:complexType>
+        </xs:schema>
+        <xs:schema elementFormDefault="qualified" 
+            targetNamespace="http://apache.org/locator/query" 
+            xmlns:tns="http://apache.org/locator/query">
+            <xs:simpleType name="FieldEnumeratedType">
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="GROUP"/>
+                    <xs:enumeration value="SERVICE"/>
+                    <xs:enumeration value="PORTNAME"/>
+                    <xs:enumeration value="INTERFACE"/>
+                    <xs:enumeration value="BINDING"/>
+                    <xs:enumeration value="EXTENSOR"/>
+                </xs:restriction>
+            </xs:simpleType>
+            <xs:simpleType name="FilterFieldType">
+                <xs:union memberTypes="tns:FieldEnumeratedType xs:string"/>
+            </xs:simpleType>
+            <xs:complexType name="FilterType">
+                <xs:simpleContent>
+                    <xs:extension base="xs:string">
+                        <xs:attribute name="field" type="tns:FilterFieldType" 
+                            use="required"/>
+                    </xs:extension>
+                </xs:simpleContent>
+            </xs:complexType>
+            <xs:complexType name="QuerySelectType">
+                <xs:sequence>
+                    <xs:element maxOccurs="unbounded" minOccurs="0" name="filter" 
+                        type="tns:FilterType"/>
+                    <xs:any minOccurs="0" namespace="##other" processContents="lax"/>
+                </xs:sequence>
+            </xs:complexType>
+            <xs:element name="select" type="tns:QuerySelectType"/>
+        </xs:schema>
+        <xs:schema targetNamespace="http://apache.org/locator/extensions">
+            <xs:element name="group" type="xs:string"/>
+        </xs:schema>
+        <xs:schema targetNamespace="http://apache.org/locator/types">
+            <xs:import namespace="http://www.w3.org/2005/08/addressing"/>
+            <xs:import namespace="http://apache.org/locator/query"/>
+            <xs:complexType name="EmptyMessage">
+                <xs:sequence/>
+            </xs:complexType>
+            <xs:complexType name="EndpointIdentity">
+                <xs:annotation>
+                    <xs:documentation>Extensible endpoint identity type.</xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="node_id" type="xs:string"/>
+                    <xs:element name="service_qname" type="xs:QName"/>
+                    <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" 
+                        processContents="lax"/>
+                </xs:sequence>
+            </xs:complexType>
+            <xs:element name="registerPeerManager">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;registerPeerManager&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="peer_manager" type="wsa:EndpointReferenceType"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="registerPeerManagerResponse">
+                <xs:annotation>
+                    <xs:documentation>Output message element for &quot;registerPeerManager&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="peer_manager_reference" 
+                            type="wsa:EndpointReferenceType"/>
+                        <xs:element name="node_id" type="xs:string"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="deregisterPeerManager">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;deregisterPeerManager&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="node_id" type="xs:string"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="deregisterPeerManagerResponse" type="tns:EmptyMessage"/>
+            <xs:element name="registerEndpoint">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;registerEndpoint&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="endpoint_id" type="tns:EndpointIdentity"/>
+                        <xs:element name="endpoint_reference" 
+                            type="wsa:EndpointReferenceType"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="registerEndpointResponse" type="tns:EmptyMessage"/>
+            <xs:element name="deregisterEndpoint">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;deregisterEndpoint&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="endpoint_id" type="tns:EndpointIdentity"/>
+                        <xs:element name="endpoint_reference" 
+                            type="wsa:EndpointReferenceType"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="deregisterEndpointResponse" type="tns:EmptyMessage"/>
+            <xs:element name="lookupEndpoint">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;lookupEndpoint&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="service_qname" type="xs:QName"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="lookupEndpointResponse">
+                <xs:annotation>
+                    <xs:documentation>Output message element for &quot;lookupEndpoint&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="service_endpoint" 
+                            type="wsa:EndpointReferenceType"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="listEndpoints" type="tns:EmptyMessage"/>
+            <xs:element name="listEndpointsResponse">
+                <xs:annotation>
+                    <xs:documentation>Output message element for &quot;listEndpoints&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element maxOccurs="unbounded" minOccurs="0" name="endpoint">
+                            <xs:complexType>
+                                <xs:sequence>
+                                    <xs:element name="endpoint_id" 
+                                        type="tns:EndpointIdentity"/>
+                                    <xs:element name="endpoint_reference" 
+                                        type="wsa:EndpointReferenceType"/>
+                                </xs:sequence>
+                            </xs:complexType>
+                        </xs:element>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="queryEndpoints">
+                <xs:annotation>
+                    <xs:documentation>Input message element for &quot;queryEndpoints&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element ref="query:select"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="queryEndpointsResponse">
+                <xs:annotation>
+                    <xs:documentation>Output message element for &quot;queryEndpoints&quot; operation.</xs:documentation>
+                </xs:annotation>
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element maxOccurs="unbounded" minOccurs="0" name="endpoint">
+                            <xs:complexType>
+                                <xs:sequence>
+                                    <xs:element name="endpoint_id" 
+                                        type="tns:EndpointIdentity"/>
+                                    <xs:element name="endpoint_reference" 
+                                        type="wsa:EndpointReferenceType"/>
+                                </xs:sequence>
+                            </xs:complexType>
+                        </xs:element>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:complexType name="EndpointNotExistFaultException">
+                <xs:annotation>
+                    <xs:documentation>Fault exception when no endpoint available.</xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="error" type="xs:string"/>
+                </xs:sequence>
+            </xs:complexType>
+            <xs:element name="EndpointNotExistFault" 
+                type="tns:EndpointNotExistFaultException"/>
+        </xs:schema>
+    </types>
+    <message name="registerPeerManagerInput">
+        <part element="tns:registerPeerManager" name="parameters"/>
+    </message>
+    <message name="registerPeerManagerOutput">
+        <part element="tns:registerPeerManagerResponse" name="parameters"/>
+    </message>
+    <message name="deregisterPeerManagerInput">
+        <part element="tns:deregisterPeerManager" name="parameters"/>
+    </message>
+    <message name="deregisterPeerManagerOutput">
+        <part element="tns:deregisterPeerManagerResponse" name="parameters"/>
+    </message>
+    <message name="registerEndpointInput">
+        <part element="tns:registerEndpoint" name="parameters"/>
+    </message>
+    <message name="registerEndpointOutput">
+        <part element="tns:registerEndpointResponse" name="parameters"/>
+    </message>
+    <message name="deregisterEndpointInput">
+        <part element="tns:deregisterEndpoint" name="parameters"/>
+    </message>
+    <message name="deregisterEndpointOutput">
+        <part element="tns:deregisterEndpointResponse" name="parameters"/>
+    </message>
+    <message name="lookupEndpointInput">
+        <part element="tns:lookupEndpoint" name="parameters"/>
+    </message>
+    <message name="lookupEndpointOutput">
+        <part element="tns:lookupEndpointResponse" name="parameters"/>
+    </message>
+    <message name="listEndpointInput">
+        <part element="tns:listEndpoints" name="parameters"/>
+    </message>
+    <message name="listEndpointOutput">
+        <part element="tns:listEndpointsResponse" name="parameters"/>
+    </message>
+    <message name="queryEndpointInput">
+        <part element="tns:queryEndpoints" name="parameters"/>
+    </message>
+    <message name="queryEndpointOutput">
+        <part element="tns:queryEndpointsResponse" name="parameters"/>
+    </message>
+    <message name="endpointNotExistFault">
+        <part element="tns:EndpointNotExistFault" name="parameters"/>
+    </message>
+    <portType name="LocatorService">
+        <operation name="registerPeerManager">
+            <xs:documentation>
+        Register a peer endpoint manager with the locator service. Once registered, 
+        the Locator associates the peer_id with the peer endpoint manager.
+      </xs:documentation>
+            <input message="ls:registerPeerManagerInput"/>
+            <output message="ls:registerPeerManagerOutput"/>
+        </operation>
+        <operation name="deregisterPeerManager">
+            <xs:documentation>
+        Deregister a peer endpoint manager with the locator service. Deregistering a
+        peer manager also deregisters all endpoints that were registered by it.
+      </xs:documentation>
+            <input message="ls:deregisterPeerManagerInput"/>
+            <output message="ls:deregisterPeerManagerOutput"/>
+        </operation>
+        <operation name="registerEndpoint">
+            <xs:documentation>
+        Register an endpoint to become available in the locator.  Once registered, an  
+        endpoint will be returned in response to the &quot;list_endpoints&quot; and &quot;query_endpoints&quot; operations.
+      </xs:documentation>
+            <input message="ls:registerEndpointInput"/>
+            <output message="ls:registerEndpointOutput"/>
+        </operation>
+        <operation name="deregisterEndpoint">
+            <xs:documentation>
+        Deregister an endpoint from the locator. Once deregistered an endpoint will
+        no longer be returned in response to the &quot;list_endpoints&quot; and &quot;query_endpoints operations.
+      </xs:documentation>
+            <input message="ls:deregisterEndpointInput"/>
+            <output message="ls:deregisterEndpointOutput"/>
+        </operation>
+        <operation name="lookupEndpoint">
+            <xs:documentation>Lookup an endpoint from the locator based on a QName.</xs:documentation>
+            <input message="ls:lookupEndpointInput"/>
+            <output message="ls:lookupEndpointOutput"/>
+            <fault message="ls:endpointNotExistFault" name="fault"/>
+        </operation>
+        <operation name="listEndpoints">
+            <xs:documentation>List all endpoints available in the locator.</xs:documentation>
+            <input message="ls:listEndpointInput"/>
+            <output message="ls:listEndpointOutput"/>
+        </operation>
+        <operation name="queryEndpoints">
+            <xs:documentation>List all endpoints available in the locator based on selection filters.</xs:documentation>
+            <input message="ls:queryEndpointInput"/>
+            <output message="ls:queryEndpointOutput"/>
+        </operation>
+    </portType>
+    <binding name="LocatorServiceBinding" type="ls:LocatorService">
+        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+        <operation name="registerPeerManager">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="deregisterPeerManager">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="registerEndpoint">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="deregisterEndpoint">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="lookupEndpoint">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+            <fault name="fault">
+                <soap:fault name="fault" use="literal"/>
+            </fault>
+        </operation>
+        <operation name="listEndpoints">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="queryEndpoints">
+            <soap:operation/>
+            <input>
+                <soap:body use="literal"/>
+            </input>
+            <output>
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="LocatorService">
+        <port binding="ls:LocatorServiceBinding" name="LocatorServicePort">
+            <soap:address location="http://localhost:6006/services/LocatorService"/>
+        </port>
+    </service>
+</definitions>



Mime
View raw message