You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by kk...@apache.org on 2004/10/28 06:08:58 UTC

cvs commit: xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool CommandLine.java SchemaCompiler.java

kkrouse     2004/10/27 21:08:58

  Modified:    v2/src/common/org/apache/xmlbeans/impl/common
                        QNameHelper.java
               v2/src/typeimpl/org/apache/xmlbeans/impl/schema
                        StscState.java
               v2/src/xmlcomp/org/apache/xmlbeans/impl/tool
                        CommandLine.java SchemaCompiler.java
  Log:
  XMLBEANS-58: Ability to pass URLs instead of Files for Wsdl/Schemas
      scomp parameters that look like urls will be downloaded and compiled
  
  Contributed by Jacob Danner, Sal Campana
  
  Revision  Changes    Path
  1.6       +3 -2      xml-xmlbeans/v2/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java
  
  Index: QNameHelper.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- QNameHelper.java	5 Mar 2004 00:57:10 -0000	1.5
  +++ QNameHelper.java	28 Oct 2004 04:08:58 -0000	1.6
  @@ -104,7 +104,8 @@
       // 256 characters, which are prohibited on Windows NT.
      
       public static final int MAX_NAME_LENGTH = 64;
  -    
  +    public static final String URI_SHA1_PREFIX = "URI_SHA_1_";
  +
       public static String hexsafe(String s)
       {
           StringBuffer result = new StringBuffer();
  @@ -156,7 +157,7 @@
               }
               byte[] digest = md.digest(inputBytes);
               assert(digest.length == 20); // SHA1 160 bits == 20 bytes
  -            result = new StringBuffer("URI_SHA_1_");
  +            result = new StringBuffer(URI_SHA1_PREFIX);
               for (int j = 0; j < digest.length; j++)
               {
                   result.append(hexdigits[(digest[j] >> 4) & 0xF]);
  
  
  
  1.14      +25 -2     xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java
  
  Index: StscState.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- StscState.java	1 Oct 2004 04:35:01 -0000	1.13
  +++ StscState.java	28 Oct 2004 04:08:58 -0000	1.14
  @@ -39,6 +39,7 @@
   import java.util.*;
   import java.net.URISyntaxException;
   import java.net.URI;
  +import java.net.URL;
   import java.io.File;
   
   
  @@ -364,10 +365,21 @@
       {
           XmlError err =
               XmlError.forLocation(
  +                code,
  +                args,
  +                XmlError.SEVERITY_ERROR,
  +                location.toURI().toString(), 0, 0, 0);
  +        errorListener.add(err);
  +    }
  +
  +    public static void addError(Collection errorListener, String code, Object[] args, URL location)
  +    {
  +        XmlError err =
  +            XmlError.forLocation(
                 code,
                 args,
                 XmlError.SEVERITY_ERROR,
  -              location.toURI().toString(), 0, 0, 0);
  +              location.toString(), 0, 0, 0);
           errorListener.add(err);
       }
   
  @@ -1389,7 +1401,18 @@
   
           int lastslash = uri.lastIndexOf('/');
           String dir = QNameHelper.hexsafe(lastslash == -1 ? "" : uri.substring(0, lastslash));
  -        return dir + "/" + uri.substring(lastslash + 1);
  +
  +        int question = uri.indexOf('?', lastslash + 1);
  +        if (question == -1)
  +            return dir + "/" + uri.substring(lastslash + 1);
  +
  +        String query = QNameHelper.hexsafe(question == -1 ? "" : uri.substring(question));
  +
  +        // if encoded query part is longer than 64 characters, just drop it
  +        if (query.startsWith(QNameHelper.URI_SHA1_PREFIX))
  +            return dir + "/" + uri.substring(lastslash + 1, question);
  +        else
  +            return dir + "/" + uri.substring(lastslash + 1, question) + query;
       }
   
       /**
  
  
  
  1.6       +43 -1     xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/CommandLine.java
  
  Index: CommandLine.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/CommandLine.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CommandLine.java	30 Sep 2004 21:35:13 -0000	1.5
  +++ CommandLine.java	28 Oct 2004 04:08:58 -0000	1.6
  @@ -19,6 +19,8 @@
   
   import java.io.File;
   import java.net.URI;
  +import java.net.URL;
  +import java.net.MalformedURLException;
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Collections;
  @@ -121,8 +123,10 @@
       }
   
       private List _files;
  +    private List _urls;
       private File _baseDir;
       private static final File[] EMPTY_FILEARRAY = new File[0];
  +    private static final URL[] EMPTY_URLARRAY = new URL[0];
   
       private List getFileList()
       {
  @@ -158,6 +162,44 @@
           return _files;
       }
   
  +    private List getUrlList()
  +    {
  +        if (_urls == null)
  +        {
  +            String[] args = args();
  +            List urls = new ArrayList();
  +
  +            for (int i = 0; i < args.length; i++)
  +            {
  +                if (looksLikeURL(args[i]))
  +                {
  +                    try
  +                    {
  +                        urls.add(new URL(args[i]));
  +                    }
  +                    catch (MalformedURLException mfEx)
  +                    {
  +                        System.err.println("ignoring invalid url: " + args[i] + ": " + mfEx.getMessage());
  +                    }
  +                }
  +            }
  +
  +            _urls = Collections.unmodifiableList(urls);
  +        }
  +
  +        return _urls;
  +    }
  +
  +    private static boolean looksLikeURL(String str)
  +    {
  +        return str.startsWith("http:") || str.startsWith("https:") || str.startsWith("ftp:") || str.startsWith("file:");
  +    }
  +
  +    public URL[] getURLs()
  +    {
  +        return (URL[]) getUrlList().toArray(EMPTY_URLARRAY);
  +    }
  +
       public File[] getFiles()
       {
           return (File[])getFileList().toArray(EMPTY_FILEARRAY);
  @@ -174,7 +216,7 @@
           for (Iterator i = getFileList().iterator(); i.hasNext(); )
           {
               File f = (File)i.next();
  -            if (f.getName().endsWith(ext))
  +            if (f.getName().endsWith(ext) && !looksLikeURL(f.getPath()))
                   result.add(f);
           }
           return (File[])result.toArray(EMPTY_FILEARRAY);
  
  
  
  1.16      +107 -35   xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
  
  Index: SchemaCompiler.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- SchemaCompiler.java	30 Sep 2004 21:35:14 -0000	1.15
  +++ SchemaCompiler.java	28 Oct 2004 04:08:58 -0000	1.16
  @@ -37,8 +37,13 @@
   import org.apache.xml.xmlbeans.x2004.x02.xbean.config.ConfigDocument;
   
   import java.io.File;
  +import java.io.IOException;
  +import java.io.FileOutputStream;
   import java.util.*;
   import java.net.URI;
  +import java.net.URL;
  +import java.net.MalformedURLException;
  +import java.net.URISyntaxException;
   
   import org.w3.x2001.xmlSchema.SchemaDocument;
   import org.xml.sax.EntityResolver;
  @@ -284,8 +289,9 @@
           File[] wsdlFiles = cl.filesEndingWith(".wsdl");
           File[] javaFiles = cl.filesEndingWith(".java");
           File[] configFiles = cl.filesEndingWith(".xsdconfig");
  +        URL[] urlFiles = cl.getURLs();
   
  -        if (xsdFiles.length + wsdlFiles.length == 0)
  +        if (xsdFiles.length + wsdlFiles.length + urlFiles.length == 0)
           {
               System.err.println("Could not find any xsd or wsdl files to process.");
               System.exit(1);
  @@ -303,6 +309,7 @@
           params.setWsdlFiles(wsdlFiles);
           params.setJavaFiles(javaFiles);
           params.setConfigFiles(configFiles);
  +        params.setUrlFiles(urlFiles);
           params.setClasspath(classpath);
           params.setOutputJar(jarfile);
           params.setName(name);
  @@ -345,6 +352,7 @@
           private File[] wsdlFiles;
           private File[] javaFiles;
           private File[] configFiles;
  +        private URL[] urlFiles;
           private File[] classpath;
           private File outputJar;
           private String name;
  @@ -420,6 +428,16 @@
               this.configFiles = configFiles;
           }
   
  +        public URL[] getUrlFiles()
  +        {
  +            return urlFiles;
  +        }
  +
  +        public void setUrlFiles(URL[] urlFiles)
  +        {
  +            this.urlFiles = urlFiles;
  +        }
  +
           public File[] getClasspath()
           {
               return classpath;
  @@ -659,8 +677,7 @@
           }
       }
   
  -    private static SchemaTypeSystem loadTypeSystem(
  -        String name, File[] xsdFiles, File[] wsdlFiles, File[] configFiles,
  +    private static SchemaTypeSystem loadTypeSystem(String name, File[] xsdFiles, File[] wsdlFiles, URL[] urlFiles, File[] configFiles,
           File[] javaFiles, ResourceLoader cpResourceLoader,
           boolean download, boolean noUpa, boolean noPvr, boolean noAnn,
           Set mdefNamespaces, File baseDir, Map sourcesToCopyMap,
  @@ -697,10 +714,7 @@
                       }
                       else
                       {
  -                        StscState.addInfo(errorListener, "Loading schema file " + xsdFiles[i]);
  -                        XmlOptions opts = new XmlOptions().setErrorListener(errorListener);
  -                        if (schemadoc.validate(opts))
  -                            scontentlist.add(((SchemaDocument)schemadoc).getSchema());
  +                        addSchema(xsdFiles[i].toString(), (SchemaDocument)schemadoc, errorListener, scontentlist);
                       }
                   }
                   catch (XmlException e)
  @@ -711,7 +725,6 @@
                   {
                       StscState.addError(errorListener, XmlErrorCodes.CANNOT_LOAD_FILE,
                           new Object[] { "xsd", xsdFiles[i], e.getMessage() }, xsdFiles[i]);
  -e.printStackTrace();
                   }
               }
           }
  @@ -737,31 +750,7 @@
                               new Object[] { wsdlFiles[i], "wsdl" }, wsdldoc);
                       else
                       {
  -                        if (wsdlContainsEncoded(wsdldoc))
  -                            StscState.addWarning(errorListener, "The WSDL " + wsdlFiles[i] + " uses SOAP encoding. SOAP encoding is not compatible with literal XML Schema.", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
  -                        StscState.addInfo(errorListener, "Loading wsdl file " + wsdlFiles[i]);
  -                        XmlObject[] types = ((org.apache.internal.xmlbeans.wsdlsubst.DefinitionsDocument)wsdldoc).getDefinitions().getTypesArray();
  -                        int count = 0;
  -                        for (int j = 0; j < types.length; j++)
  -                        {
  -                            XmlObject[] schemas = types[j].selectPath("declare namespace xs=\"http://www.w3.org/2001/XMLSchema\" xs:schema");
  -                            if (schemas.length == 0)
  -                            {
  -                                StscState.addWarning(errorListener, "The WSDL " + wsdlFiles[i] + " did not have any schema documents in namespace 'http://www.w3.org/2001/XMLSchema'", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
  -                                continue;
  -                            }
  -
  -                            for (int k = 0; k < schemas.length; k++)
  -                            {
  -                                if (schemas[k] instanceof SchemaDocument.Schema &&
  -                                    schemas[k].validate(new XmlOptions().setErrorListener(errorListener)))
  -                                {
  -                                    count++;
  -                                    scontentlist.add(schemas[k]);
  -                                }
  -                            }
  -                        }
  -                        StscState.addInfo(errorListener, "Processing " + count + " schema(s) in " + wsdlFiles[i].toString());
  +                        addWsdlSchemas(wsdlFiles[i].toString(), (org.apache.internal.xmlbeans.wsdlsubst.DefinitionsDocument)wsdldoc, errorListener, scontentlist);
                       }
                   }
                   catch (XmlException e)
  @@ -772,7 +761,50 @@
                   {
                       StscState.addError(errorListener, XmlErrorCodes.CANNOT_LOAD_FILE,
                           new Object[] { "wsdl", wsdlFiles[i], e.getMessage() }, wsdlFiles[i]);
  -e.printStackTrace();
  +                }
  +            }
  +        }
  +
  +        // step 3, parse all URL files
  +        // XMLBEANS-58 - Ability to pass URLs instead of Files for Wsdl/Schemas
  +        if (urlFiles != null)
  +        {
  +            for (int i = 0; i < urlFiles.length; i++)
  +            {
  +                try
  +                {
  +                    XmlOptions options = new XmlOptions();
  +                    options.setLoadLineNumbers();
  +                    options.setLoadSubstituteNamespaces(Collections.singletonMap("http://schemas.xmlsoap.org/wsdl/", "http://www.apache.org/internal/xmlbeans/wsdlsubst"));
  +                    options.setEntityResolver(entResolver);
  +
  +                    XmlObject urldoc = loader.parse(urlFiles[i], null, options);
  +
  +                    boolean isXsd = false;
  +                    if ((urldoc instanceof org.apache.internal.xmlbeans.wsdlsubst.DefinitionsDocument))
  +                    {
  +                        addWsdlSchemas(urlFiles[i].toString(), (org.apache.internal.xmlbeans.wsdlsubst.DefinitionsDocument)urldoc, errorListener, scontentlist);
  +                    }
  +                    else if ((urldoc instanceof SchemaDocument))
  +                    {
  +                        isXsd = true;
  +                        addSchema(urlFiles[i].toString(), (SchemaDocument)urldoc, errorListener, scontentlist);
  +                    }
  +                    else
  +                    {
  +                        StscState.addError(errorListener, XmlErrorCodes.INVALID_DOCUMENT_TYPE,
  +                            new Object[]{urlFiles[i], "wsdl or schema"}, urldoc);
  +                    }
  +
  +                }
  +                catch (XmlException e)
  +                {
  +                    errorListener.add(e.getError());
  +                }
  +                catch (Exception e)
  +                {
  +                    StscState.addError(errorListener, XmlErrorCodes.CANNOT_LOAD_FILE,
  +                        new Object[]{"url", urlFiles[i], e.getMessage()}, urlFiles[i]);
                   }
               }
           }
  @@ -853,11 +885,51 @@
           return SchemaTypeSystemCompiler.compile(params);
       }
   
  +    private static void addSchema(String name, SchemaDocument schemadoc,
  +          XmlErrorWatcher errorListener, List scontentlist)
  +    {
  +        StscState.addInfo(errorListener, "Loading schema file " + name);
  +        XmlOptions opts = new XmlOptions().setErrorListener(errorListener);
  +        if (schemadoc.validate(opts))
  +            scontentlist.add((schemadoc).getSchema());
  +    }
  +
  +    private static void addWsdlSchemas(String name, org.apache.internal.xmlbeans.wsdlsubst.DefinitionsDocument wsdldoc,
  +                                  XmlErrorWatcher errorListener, List scontentlist)
  +    {
  +        if (wsdlContainsEncoded(wsdldoc))
  +            StscState.addWarning(errorListener, "The WSDL " + name + " uses SOAP encoding. SOAP encoding is not compatible with literal XML Schema.", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
  +        StscState.addInfo(errorListener, "Loading wsdl file " + name);
  +        XmlObject[] types = wsdldoc.getDefinitions().getTypesArray();
  +        int count = 0;
  +        for (int j = 0; j < types.length; j++)
  +        {
  +            XmlObject[] schemas = types[j].selectPath("declare namespace xs=\"http://www.w3.org/2001/XMLSchema\" xs:schema");
  +            if (schemas.length == 0)
  +            {
  +                StscState.addWarning(errorListener, "The WSDL " + name + " did not have any schema documents in namespace 'http://www.w3.org/2001/XMLSchema'", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
  +                continue;
  +            }
  +
  +            for (int k = 0; k < schemas.length; k++)
  +            {
  +                if (schemas[k] instanceof SchemaDocument.Schema &&
  +                    schemas[k].validate(new XmlOptions().setErrorListener(errorListener)))
  +                {
  +                    count++;
  +                    scontentlist.add(schemas[k]);
  +                }
  +            }
  +        }
  +        StscState.addInfo(errorListener, "Processing " + count + " schema(s) in " + name);
  +    }
  +
       public static boolean compile(Parameters params)
       {
           File baseDir = params.getBaseDir();
           File[] xsdFiles = params.getXsdFiles();
           File[] wsdlFiles = params.getWsdlFiles();
  +        URL[] urlFiles = params.getUrlFiles();
           File[] javaFiles = params.getJavaFiles();
           File[] configFiles = params.getConfigFiles();
           File[] classpath = params.getClasspath();
  @@ -908,7 +980,7 @@
   
           // build the in-memory type system
           XmlErrorWatcher errorListener = new XmlErrorWatcher(outerErrorListener);
  -        SchemaTypeSystem system = loadTypeSystem(name, xsdFiles, wsdlFiles, configFiles,
  +        SchemaTypeSystem system = loadTypeSystem(name, xsdFiles, wsdlFiles, urlFiles, configFiles,
               javaFiles, cpResourceLoader, download, noUpa, noPvr, noAnn, mdefNamespaces,
               baseDir, sourcesToCopyMap, errorListener, schemasDir, cmdLineEntRes, classpath);
           if (errorListener.hasError())
  
  
  

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