blob: f7d2c1f938dc6c9a538387fc93b7489795c3139b [file] [log] [blame]
/* Copyright 2004 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.xmlbeans.impl.xsd2inst;
import org.apache.xmlbeans.XmlObject;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.io.File;
import java.util.HashSet;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.impl.xsd2inst.SampleXmlUtil;
import java.util.Set;
import org.apache.xmlbeans.XmlException;
import java.util.Iterator;
import java.util.List;
import java.util.Collection;
import org.apache.xmlbeans.impl.tool.CommandLine;
public class SchemaInstanceGenerator
{
public static class Xsd2InstOptions
{
private boolean _downloads = false;
private boolean _nopvr = false;
private boolean _noupa = false;
/**
* @return true if network downloads are allowed, false othervise
* Default is false.
*/
public boolean isNetworkDownloads()
{
return _downloads;
}
/**
* set true to allow network downloads, false othervise
*/
public void setNetworkDownloads(boolean downloads)
{
this._downloads = downloads;
}
/**
* @return true to disable particle valid (restriction) rule, false othervise
* Default is false.
*/
public boolean isNopvr()
{
return _nopvr;
}
/**
* set true to disable particle valid (restriction) rule, false othervise
*/
public void setNopvr(boolean nopvr)
{
this._nopvr = nopvr;
}
/**
* @return true to disable unique particle attribution rule, false othervise
* Default is false.
*/
public boolean isNoupa()
{
return _noupa;
}
/**
* set true to disable unique particle attribution rule, false othervise
*/
public void setNoupa(boolean noupa)
{
this._noupa = noupa;
}
}
public static void printUsage()
{
System.out.println("Generates a document based on the given Schema file");
System.out.println("having the given element as root.");
System.out.println("The tool makes reasonable attempts to create a valid document,");
System.out.println("but this is not always possible since, for example, ");
System.out.println("there are schemas for which no valid instance document ");
System.out.println("can be produced.");
System.out.println("Usage: xsd2inst [flags] schema.xsd -name element_name");
System.out.println("Flags:");
System.out.println(" -name the name of the root element");
System.out.println(" -dl enable network downloads for imports and includes");
System.out.println(" -nopvr disable particle valid (restriction) rule");
System.out.println(" -noupa disable unique particle attribution rule");
System.out.println(" -license prints license information");
System.out.println(" -version prints version information");
}
public static void main(String[] args)
{
Set flags = new HashSet();
Set opts = new HashSet();
flags.add("h");
flags.add("help");
flags.add("usage");
flags.add("license");
flags.add("version");
flags.add("dl");
flags.add("noupa");
flags.add("nopvr");
flags.add("partial");
opts.add("name");
CommandLine cl = new CommandLine(args, flags, opts);
if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null)
{
printUsage();
return;
}
String[] badOpts = cl.getBadOpts();
if (badOpts.length > 0)
{
for (int i = 0; i < badOpts.length; i++)
System.out.println("Unrecognized option: " + badOpts[i]);
printUsage();
return;
}
if (cl.getOpt("license") != null)
{
CommandLine.printLicense();
System.exit(0);
return;
}
if (cl.getOpt("version") != null)
{
CommandLine.printVersion();
System.exit(0);
return;
}
boolean dl = (cl.getOpt("dl") != null);
boolean nopvr = (cl.getOpt("nopvr") != null);
boolean noupa = (cl.getOpt("noupa") != null);
File[] schemaFiles = cl.filesEndingWith(".xsd");
String rootName = cl.getOpt("name");
if (rootName == null)
{
System.out.println("Required option \"-name\" must be present");
return;
}
// Process Schema files
List sdocs = new ArrayList();
for (int i = 0; i < schemaFiles.length; i++)
{
try
{
sdocs.add(XmlObject.Factory.parse(schemaFiles[i],
(new XmlOptions()).setLoadLineNumbers().setLoadMessageDigest()));
}
catch (Exception e)
{
System.err.println("Can not load schema file: " + schemaFiles[i] + ": ");
e.printStackTrace();
}
}
XmlObject[] schemas = (XmlObject[]) sdocs.toArray(new XmlObject[sdocs.size()]);
Xsd2InstOptions options = new Xsd2InstOptions();
options.setNetworkDownloads(dl);
options.setNopvr(nopvr);
options.setNoupa(noupa);
String result = xsd2inst(schemas, rootName, options);
/* SchemaTypeSystem sts = null;
if (schemas.length > 0)
{
Collection errors = new ArrayList();
XmlOptions compileOptions = new XmlOptions();
if (dl)
compileOptions.setCompileDownloadUrls();
if (nopvr)
compileOptions.setCompileNoPvrRule();
if (noupa)
compileOptions.setCompileNoUpaRule();
try
{
sts = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), compileOptions);
}
catch (Exception e)
{
if (errors.isEmpty() || !(e instanceof XmlException))
e.printStackTrace();
System.out.println("Schema compilation errors: ");
for (Iterator i = errors.iterator(); i.hasNext(); )
System.out.println(i.next());
}
}
if (sts == null)
{
System.out.println("No Schemas to process.");
return;
}
SchemaType[] globalElems = sts.documentTypes();
SchemaType elem = null;
for (int i = 0; i < globalElems.length; i++)
{
if (rootName.equals(globalElems[i].getDocumentElementName().getLocalPart()))
{
elem = globalElems[i];
break;
}
}
if (elem == null)
{
System.out.println("Could not find a global element with name \"" + rootName + "\"");
return;
}
// Now generate it
String result = SampleXmlUtil.createSampleForType(elem);
*/
System.out.println(result);
return;
}
public static String xsd2inst(String[] xsds, String rootName, Xsd2InstOptions options)
throws XmlException, IOException
{
Reader[] instReaders = new Reader[xsds.length];
for (int i=0; i< xsds.length; i++)
{
instReaders[i] = new StringReader(xsds[i]);
}
String res = xsd2inst(instReaders, rootName, options);
return res;
}
public static String xsd2inst(Reader[] schemaReaders, String rootName, Xsd2InstOptions options)
{
// Process Schema files
List sdocs = new ArrayList();
for (int i = 0; i < schemaReaders.length; i++)
{
try
{
sdocs.add(XmlObject.Factory.parse(schemaReaders[i],
(new XmlOptions()).setLoadLineNumbers().setLoadMessageDigest()));
}
catch (Exception e)
{
System.err.println("Can not load schema reader: " + i + " " + schemaReaders[i] + ": ");
e.printStackTrace();
}
}
XmlObject[] schemas = (XmlObject[]) sdocs.toArray(new XmlObject[sdocs.size()]);
return xsd2inst(schemas, rootName, options);
}
public static String xsd2inst(XmlObject[] schemas, String rootName, Xsd2InstOptions options)
{
SchemaTypeSystem sts = null;
if (schemas.length > 0)
{
Collection errors = new ArrayList();
XmlOptions compileOptions = new XmlOptions();
if (options.isNetworkDownloads())
compileOptions.setCompileDownloadUrls();
if (options.isNopvr())
compileOptions.setCompileNoPvrRule();
if (options.isNoupa())
compileOptions.setCompileNoUpaRule();
try
{
sts = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), compileOptions);
}
catch (Exception e)
{
if (errors.isEmpty() || !(e instanceof XmlException))
e.printStackTrace();
System.out.println("Schema compilation errors: ");
for (Iterator i = errors.iterator(); i.hasNext(); )
System.out.println(i.next());
}
}
if (sts == null)
{
throw new RuntimeException("No Schemas to process.");
}
SchemaType[] globalElems = sts.documentTypes();
SchemaType elem = null;
for (int i = 0; i < globalElems.length; i++)
{
if (rootName.equals(globalElems[i].getDocumentElementName().getLocalPart()))
{
elem = globalElems[i];
break;
}
}
if (elem == null)
{
throw new RuntimeException("Could not find a global element with name \"" + rootName + "\"");
}
// Now generate it
String result = SampleXmlUtil.createSampleForType(elem);
return result;
}
}