blob: 60de328c1eab24f65dc286c61559fbe3415ae272 [file] [log] [blame]
/* Copyright 2003-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.samples.vxsdb;
import java.io.File;
import java.io.FileWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.xmlbeans.SchemaGlobalElement;
import org.apache.xmlbeans.SchemaProperty;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
/**
* @author Philip Mark Donaghy
*/
public class VelocityXmlBeansDB extends Task {
private static final Log log = LogFactory.getLog(VelocityXmlBeansDB.class);
private String template;
private String output;
private String schema;
/**
* @param output
* The output to set.
*/
public void setOutput(String output) {
this.output = output;
}
/**
* @param schema
* The schema to set.
*/
public void setSchema(String schema) {
this.schema = schema;
}
/**
* @param template
* The template to set.
*/
public void setTemplate(String template) {
this.template = template;
}
/**
* Default Constructor
*/
public VelocityXmlBeansDB() {
}
/**
* Puts the XmlBeans SchemaTypeSystem into the Velocity Context
*/
public void execute() throws BuildException {
// Create a Velocity Context and a Velocity Template
VelocityContext ctx = new VelocityContext();
Template template = null;
// Output to a file
FileWriter writer = null;
// XmlBeans
SchemaTypeSystem schemaTypeSystem = null;
try {
// Initialize Velocity
Velocity.init();
log.info("Using the Velocity template, " + this.template);
template = Velocity.getTemplate(this.template);
// Create Schema Type System
log.info("Using the xml schema, " + this.schema);
schemaTypeSystem = XmlBeans.compileXsd(
new XmlObject[] { XmlBeans.typeLoaderForClassLoader(this.getClass().getClassLoader()).
parse(new File(this.schema), null, null) },
XmlBeans.getBuiltinTypeSystem(),
null);
// Place SchemaTypeSystem in the Velocity Context
ctx.put("xsd", schemaTypeSystem);
// Place a exported key Map in the Velocity Context
ctx.put("exportedKeyMap", createExportedKeyMap(schemaTypeSystem));
// Write to the file
log.info("Using the output file, " + this.output);
writer = new FileWriter(new File(this.output));
template.merge(ctx, writer);
writer.close();
} catch (Exception e) {
throw new BuildException(e);
}
}
/**
*
* @param sts
* @return
*/
private Map createExportedKeyMap(SchemaTypeSystem sts) {
// Map of exported keys (foreign keys)
// The key is the name of the element exporting key(s)
// The value is a List of tables importing this key
Map exportedKeyMap = new HashMap();
// For all global elements and all global types
// Create a map of exported key lists
SchemaGlobalElement[] globals = sts.globalElements();
for (int i = 0; i < globals.length; i++) {
processProperties(globals[i].getName().getLocalPart().toUpperCase(), globals[i].getType().getProperties(), exportedKeyMap);
}
return exportedKeyMap;
}
private void processProperties(String tableName, SchemaProperty[] properties, Map exportedKeyMap) {
// For all properties
for (int i = 0; i < properties.length; i++) {
processProperty(tableName, properties[i], exportedKeyMap);
}
}
private void processProperty(String tableName, SchemaProperty property, Map exportedKeyMap) {
// If property maxOccurs is greater than one or unbounded (null)
if (property.getMaxOccurs() == null || property.getMaxOccurs().compareTo(BigInteger.ONE) > 0) {
// Tables that import this properties type (ex. line-item type exports a foreign key to purchase-order,
// PURCHASE_ORDER is in the list of importers)
List importers = (List) exportedKeyMap.get(property.getType().getName().toString());
if (importers == null) {
importers = new ArrayList();
exportedKeyMap.put(property.getType().getName().toString(), importers);
}
importers.add(tableName);
}
}
/**
* @param args
*/
public static void main(String[] args) {
VelocityXmlBeansDB beans = new VelocityXmlBeansDB();
// Verify arguments
if (args.length < 3) {
log
.error("Usage : java org.apache.xmlbeans.samples.vxsdb.VelocityXmlBeansDB TEMPLATE OUTPUT SCHEMA1 [SCHEMA2] [...]");
System.exit(1);
}
beans.setTemplate(args[0]);
beans.setOutput(args[1]);
beans.setSchema(args[2]);
try {
beans.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}