blob: 9cb60aca8b1160e77247c22869b54352338296b8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.openjpa.jdbc.ant;
import java.security.AccessController;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
import org.apache.openjpa.jdbc.meta.MappingTool;
import org.apache.openjpa.jdbc.schema.SchemaTool;
import org.apache.openjpa.lib.ant.AbstractTask;
import org.apache.openjpa.lib.conf.ConfigurationImpl;
import org.apache.openjpa.lib.util.Files;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.MultiLoaderClassResolver;
/**
* Executes the {@link MappingTool} on the specified files.
* This task can take the following arguments:
* <ul>
* <li><code>action</code></li>
* <li><code>meta</code></li>
* <li><code>schemaAction</code></li>
* <li><code>dropTables</code></li>
* <li><code>ignoreErrors</code></li>
* <li><code>readSchema</code></li>
* <li><code>primaryKeys</code></li>
* <li><code>foreignKeys</code></li>
* <li><code>indexes</code></li>
* <li><code>file</code></li>
* <li><code>schemaFile</code></li>
* <li><code>sqlFile</code></li>
* <li><code>tmpClassLoader</code></li>
* </ul> Of these arguments, only <code>action</code> is required.
*/
public class MappingToolTask
extends AbstractTask {
private static final Localizer _loc = Localizer.forPackage
(MappingToolTask.class);
protected MappingTool.Flags flags = new MappingTool.Flags();
protected String file = null;
protected String schemaFile = null;
protected String sqlFile = null;
protected boolean tmpClassLoader = true;
/**
* Set the enumerated MappingTool action type.
*/
public void setAction(Action act) {
flags.action = act.getValue();
}
/**
* Set the enumerated SchemaTool action type.
*/
public void setSchemaAction(SchemaAction act) {
flags.schemaAction = act.getValue();
}
/**
* Set whether the MappingTool should read the full schema.
*/
public void setReadSchema(boolean readSchema) {
flags.readSchema = readSchema;
}
/**
* Set whether we want the MappingTool to ignore SQL errors.
*/
public void setIgnoreErrors(boolean ignoreErrors) {
flags.ignoreErrors = ignoreErrors;
}
/**
* Set whether the MappingTool should drop tables.
*/
public void setDropTables(boolean dropTables) {
flags.dropTables = dropTables;
}
/**
* Set whether to drop OpenJPA tables.
*/
public void setOpenJPATables(boolean openjpaTables) {
flags.openjpaTables = openjpaTables;
}
/**
* Set whether the MappingTool should drop sequences.
*/
public void setDropSequences(boolean dropSequences) {
flags.dropSequences = dropSequences;
}
/**
* Set whether the MappingTool should manipulate sequences.
*/
public void setSequences(boolean sequences) {
flags.sequences = sequences;
}
/**
* Set whether to generate primary key information.
*/
public void setPrimaryKeys(boolean pks) {
flags.primaryKeys = pks;
}
/**
* Set whether to generate foreign key information.
*/
public void setForeignKeys(boolean fks) {
flags.foreignKeys = fks;
}
/**
* Set whether to generate index information.
*/
public void setIndexes(boolean idxs) {
flags.indexes = idxs;
}
/**
* Set the output file we want the MappingTool to write to.
*/
public void setFile(String file) {
this.file = file;
}
/**
* Set the output file for an XML representation of the planned schema.
*/
public void setSchemaFile(String schemaFile) {
this.schemaFile = schemaFile;
}
/**
* Set the output file we want the MappingTool to write a SQL script to.
*/
public void setSQLFile(String sqlFile) {
this.sqlFile = sqlFile;
}
/**
* Set whether this action applies to metadata as well as mappings.
*/
public void setMeta(boolean meta) {
flags.meta = meta;
}
protected ConfigurationImpl newConfiguration() {
return new JDBCConfigurationImpl();
}
protected void executeOn(String[] files)
throws Exception {
if (MappingTool.ACTION_IMPORT.equals(flags.action))
assertFiles(files);
ClassLoader toolLoader = (ClassLoader) AccessController
.doPrivileged(J2DoPrivHelper
.getClassLoaderAction(MappingTool.class));
ClassLoader loader = toolLoader;
MultiLoaderClassResolver resolver = new MultiLoaderClassResolver();
if (tmpClassLoader) {
loader = (ClassLoader) AccessController.doPrivileged(J2DoPrivHelper
.newTemporaryClassLoaderAction(getClassLoader()));
resolver.addClassLoader(loader);
}
resolver.addClassLoader(toolLoader);
if (flags.meta && MappingTool.ACTION_ADD.equals(flags.action))
flags.metaDataFile = Files.getFile(file, loader);
else
flags.mappingWriter = Files.getWriter(file, loader);
flags.schemaWriter = Files.getWriter(schemaFile, loader);
flags.sqlWriter = Files.getWriter(sqlFile, loader);
JDBCConfiguration conf = (JDBCConfiguration) getConfiguration();
conf.setClassResolver(resolver);
if (!MappingTool.run(conf, files, flags, loader))
throw new BuildException(_loc.get("bad-conf", "MappingToolTask")
.getMessage());
}
public static class Action
extends EnumeratedAttribute {
public String[] getValues() {
return MappingTool.ACTIONS;
}
}
public static class SchemaAction
extends EnumeratedAttribute {
public String[] getValues() {
String[] actions = new String[SchemaTool.ACTIONS.length + 1];
System.arraycopy(SchemaTool.ACTIONS, 0, actions, 0,
SchemaTool.ACTIONS.length);
actions[actions.length - 1] = "none";
return actions;
}
}
/**
* <P>
* Set whether a temporary ClassLoader should be used by the MappingTool.
* The default value is true
* </P>
*
* @param tmpClassLoader
* Whether the temporary ClassLoader should be used.
*/
public void setTmpClassLoader(boolean tmpClassLoader) {
this.tmpClassLoader = tmpClassLoader;
}
}