blob: 4a459be9597e62594c095d84bd09caf95eb1a73f [file] [log] [blame]
/**
* Copyright (c) 2002-2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.xsd.example;
import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.xsd.XSDDiagnostic;
import org.eclipse.xsd.XSDImport;
import org.eclipse.xsd.XSDInclude;
import org.eclipse.xsd.XSDPlugin;
import org.eclipse.xsd.XSDRedefine;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSchemaDirective;
import org.eclipse.xsd.util.XSDPrototypicalSchema;
import org.eclipse.xsd.util.XSDResourceFactoryImpl;
import org.eclipse.xsd.util.XSDResourceImpl;
/**
* Supports command line invocation to drive XML Schema model examples.
* It handles both {@link #run headless} invocation and {@link #main standalone} invocation.
* <p>
* You can execute one of these example by running
*<pre>
* xsd-example.bat
*</pre>
* or
*<pre>
* xsd-standalone-example.bat
*</pre>
* from the directory:
*<pre>
* plugins/org.eclipse.xsd.example/data/
*</pre>
* </p>
* @see #run
* @see #main
*/
public class XSDMainExample
{
{
// This is needed because we can't have the following in the plugin.xml
//
// <extension point = "org.eclipse.emf.extension_parser">
// <parser type="xsd" class="org.eclipse.xsd.util.XSDResourceFactoryImpl"/>
// </extension>
//
// The com.ibm.etools.xsdmodel plugin, shipped with WSAD, has a conflicting registration for this.
//
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", new XSDResourceFactoryImpl());
}
public static class Runnable implements IApplication
{
public Object start(IApplicationContext context) throws Exception
{
String [] args = (String[])context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
return new XSDMainExample().run(args == null ? new String [0] : args);
}
public void stop()
{
// Do nothing
}
}
/**
* Executes a stand-alone example.
* @param args an array of Strings from the command line.
* @see #run
*/
public static void main(String args[])
{
System.exit((Integer)new XSDMainExample().run(args));
}
/**
* Creates an instance.
*/
public XSDMainExample()
{
super();
}
/**
* Executes a headless workbench example.
* If no arguments are provided, the {@link XSDPrototypicalSchema} will be tested;
* otherwise each argument is taken to be the URI of a schema which will be loaded and printed.
* @param object an array of Strings from the command line, each representing the URI of a schema.
* @return <code>0</code> indicating success, or <code>1</code> indicating failure.
* @see #main
*/
public Object run(Object object)
{
try
{
// If there are no arguments...
//
String[] arguments = (String[])object;
// Filter out inappropriate arguments added by the PDE.
//
if (arguments.length > 0 && "-pdelaunch".equals(arguments[0]))
{
String [] oldArguments = arguments;
arguments = new String [arguments.length - 1];
System.arraycopy(oldArguments, 1, arguments, 0, arguments.length);
}
if (arguments.length == 0)
{
// Serialize the Purchase Order schema sample.
//
System.out.println("<!-- ** PurchaseOrderSchema ** -->");
XSDSchema xsdPurchaseOrderSchema = XSDPrototypicalSchema.getPurchaseOrderSchema();
if (xsdPurchaseOrderSchema.getElement() == null)
{
xsdPurchaseOrderSchema.updateElement();
}
XSDResourceImpl.serialize(System.out, xsdPurchaseOrderSchema.getElement());
// Serialize the prototypical schema sample.
//
System.out.println("<!-- ** PrototypicalSchema ** -->");
XSDSchema xsdSchema = XSDPrototypicalSchema.getPrototypicalSchema();
if (xsdSchema.getElement() == null)
{
xsdSchema.updateElement();
}
XSDResourceImpl.serialize(System.out, xsdSchema.getElement());
System.out.println("===== clone =====");
XSDSchema clonedSchema = (XSDSchema)xsdSchema.cloneConcreteComponent(true, true);
clonedSchema.setElement(null);
clonedSchema.updateElement();
XSDResourceImpl.serialize(System.out, clonedSchema.getElement());
System.out.println("===== clone schema for schema =====");
XSDSchema clonedSchemaForSchema = (XSDSchema)clonedSchema.getSchemaForSchema().cloneConcreteComponent(true, true);
clonedSchemaForSchema.setElement(null);
clonedSchemaForSchema.updateElement();
XSDResourceImpl.serialize(System.out, clonedSchemaForSchema.getElement());
}
else if (arguments[0].equals("-printExample"))
{
XSDPrototypicalSchema xsdPrototypicalSchema = XSDPrototypicalSchema.getInstance();
// Iterate over the schema arguments.
//
for (int i = 1; i < arguments.length; ++i)
{
xsdPrototypicalSchema.printSchema(arguments[i]);
}
}
else if (arguments[0].equals("-createExample"))
{
Document document = (Document)XSDPrototypicalSchema.getPurchaseOrderSchema().getDocument().cloneNode(true);
XSDSchema xsdSchema = XSDPrototypicalSchema.getInstance().createSchema(document.getDocumentElement());
if (xsdSchema != null)
{
if (xsdSchema.getElement() == null)
{
xsdSchema.updateElement();
}
XSDResourceImpl.serialize(System.out, xsdSchema.getElement());
}
}
else if (arguments[0].equals("-saveExample"))
{
XSDPrototypicalSchema.getInstance().savePurchaseOrderSchema(arguments[1]);
}
else if (arguments[0].equals("-traceLoad"))
{
for (int i = 1; i < arguments.length; ++i)
{
XSDPrototypicalSchema.getInstance().traceLoading(arguments[i]);
}
}
else if (arguments[0].equals("-clone"))
{
XSDPrototypicalSchema.getInstance().printComponent
(System.out,
XSDPrototypicalSchema.getInstance().cloneComponent
(XSDPrototypicalSchema.getPurchaseOrderSchema(), false));
XSDPrototypicalSchema.getInstance().printComponent
(System.out,
XSDPrototypicalSchema.getInstance().cloneComponent
(XSDPrototypicalSchema.getPurchaseOrderSchema(), true));
}
else if (arguments[0].equals("-crossReferenceExample"))
{
XSDPrototypicalSchema.getInstance().crossReferenceTest(System.out);
}
else if (arguments[0].equals("-validate"))
{
// Iterate over the schema arguments.
//
for (int i = 1; i < arguments.length; ++i)
{
validate(arguments[i]);
}
}
else
{
// Iterate over the schema arguments.
//
for (int i = 0; i < arguments.length; ++i)
{
System.out.println("<!-- << " + arguments[i] + " >> -->");
loadAndPrint(arguments[i]);
}
}
return 0;
}
catch (Exception exception)
{
exception.printStackTrace();
return 1;
}
}
/**
* Prints a header tag for the given schema.
* @param xsdSchema a schema.
*/
protected void printSchemaStart(XSDSchema xsdSchema)
{
System.out.print("<schema targetNamespace=\"");
if (xsdSchema.getTargetNamespace() != null)
{
System.out.print(xsdSchema.getTargetNamespace());
}
System.out.print("\" schemaLocation=\"");
if (xsdSchema.getSchemaLocation() != null)
{
System.out.print(xsdSchema.getSchemaLocation());
}
System.out.print("\">");
}
/**
* Prints directive tags for those directives that reference the given schema.
* @param indent the indentation string to print at the start of each line.
* @param xsdSchema a schema.
*/
protected void printDirectives(String indent, XSDSchema xsdSchema)
{
System.out.print(indent);
printSchemaStart(xsdSchema);
System.out.println();
if (!xsdSchema.getReferencingDirectives().isEmpty())
{
System.out.println(indent + " <referencingDirectives>");
for (XSDSchemaDirective xsdSchemaDirective : xsdSchema.getReferencingDirectives())
{
XSDSchema referencingSchema = xsdSchemaDirective.getSchema();
System.out.print(indent + " ");
printSchemaStart(referencingSchema);
System.out.println();
System.out.print(indent + " ");
if (xsdSchemaDirective instanceof XSDImport)
{
XSDImport xsdImport = (XSDImport)xsdSchemaDirective;
System.out.print("<import namespace=\"");
if (xsdImport.getNamespace() != null)
{
System.out.print(xsdImport.getNamespace());
}
System.out.print("\" schemaLocation=\"");
}
else if (xsdSchemaDirective instanceof XSDRedefine)
{
System.out.print("<redefine schemaLocation=\"");
}
else if (xsdSchemaDirective instanceof XSDInclude)
{
System.out.print("<include schemaLocation=\"");
}
if (xsdSchemaDirective.getSchemaLocation() != null)
{
System.out.print(xsdSchemaDirective.getSchemaLocation());
}
System.out.println("\"/>");
System.out.println(indent + " </schema>");
}
System.out.println(indent + " </referencingDirectives>");
}
if (!xsdSchema.getIncorporatedVersions().isEmpty())
{
System.out.println(indent + " <incorporatedVersions>");
for (XSDSchema incorporatedVersion : xsdSchema.getIncorporatedVersions())
{
printDirectives(indent + " ", incorporatedVersion);
}
System.out.println(indent + " </incorporatedVersions>");
}
System.out.println(indent + "</schema>");
}
/**
* Load the XML Schema file and print information about it.
* @param xsdFile the URI of an XML Schema file.
*/
public void loadAndPrint(String xsdFile) throws Exception
{
// This let's us test whether the string exists as a file.
// It not, we try as a URI.
//
URI uri;
File file = new File(xsdFile);
if (file.isFile())
{
uri = URI.createFileURI(file.getCanonicalFile().toString());
}
else
{
uri = URI.createURI(xsdFile);
}
// Create a resource set, create a schema resource, and load the main schema file into it.
//
ResourceSet resourceSet = new ResourceSetImpl();
XSDResourceImpl xsdMainResource = (XSDResourceImpl)resourceSet.createResource(URI.createURI("*.xsd"));
xsdMainResource.setURI(uri);
xsdMainResource.load(resourceSet.getLoadOptions());
// Iterate over all the resources, i.e., the main resource and those that have been included or imported.
//
for (Object resource : resourceSet.getResources())
{
if (resource instanceof XSDResourceImpl)
{
XSDResourceImpl xsdResource = (XSDResourceImpl)resource;
XSDSchema xsdSchema = xsdResource.getSchema();
System.out.println("<!-- ===== Schema Composition =====");
printDirectives(" ", xsdSchema);
System.out.println("-->");
Element element = xsdSchema.getElement();
if (element != null)
{
// Print the serialization of the model.
//
XSDResourceImpl.serialize(System.out, element);
}
}
}
// This removes the associated DOM element, creates a new associated DOM element, and then prints it.
// This is a good test for how well serialization works for a model created "bottom up".
//
XSDSchema xsdMainSchema = xsdMainResource.getSchema();
xsdMainSchema.setDocument(null);
xsdMainSchema.setElement(null);
xsdMainSchema.updateElement();
System.out.println("<!-- [ " + xsdMainSchema.getSchemaLocation() + " ] -->");
XSDResourceImpl.serialize(System.out, xsdMainSchema.getElement());
}
/**
* Load the XML Schema file and print any diagnostics information about it.
* @param xsdFile the URI of an XML Schema file.
*/
public void validate(String xsdFile) throws Exception
{
// This let's us test whether the string exists as a file.
// It not, we try as a URI.
//
URI uri;
File file = new File(xsdFile);
if (file.isFile())
{
uri = URI.createFileURI(file.getCanonicalFile().toString());
}
else
{
uri = URI.createURI(xsdFile);
}
// Create a resource set, create a schema resource, and load the main schema file into it.
//
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getLoadOptions().put(XSDResourceImpl.XSD_TRACK_LOCATION, Boolean.TRUE);
XSDResourceImpl xsdMainResource = (XSDResourceImpl)resourceSet.createResource(URI.createURI("*.xsd"));
xsdMainResource.setURI(uri);
xsdMainResource.load(resourceSet.getLoadOptions());
// Iterate over all the resources, i.e., the main resource and those that have been included or imported.
//
for (Object resource : resourceSet.getResources())
{
if (resource instanceof XSDResourceImpl)
{
XSDResourceImpl xsdResource = (XSDResourceImpl)resource;
System.err.println("--> " + xsdResource.getURI());
XSDSchema xsdSchema = xsdResource.getSchema();
xsdSchema.validate();
if (!xsdSchema.getAllDiagnostics().isEmpty())
{
for (XSDDiagnostic xsdDiagnostic : xsdSchema.getAllDiagnostics())
{
String localizedSeverity =
XSDPlugin.INSTANCE.getString("_UI_XSDDiagnosticSeverity_" + xsdDiagnostic.getSeverity());
System.err.println
(XSDPlugin.INSTANCE.getString
("_UI_DiagnosticFileLineColumn_message",
new Object []
{
localizedSeverity,
xsdDiagnostic.getLocationURI(),
xsdDiagnostic.getLine(),
xsdDiagnostic.getColumn()
}));
System.err.println(xsdDiagnostic.getMessage());
}
}
}
}
}
}