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