Index: src/main/java/org/castor/anttask/CastorDDLGenTask.java
===================================================================
--- src/main/java/org/castor/anttask/CastorDDLGenTask.java (Revision 0)
+++ src/main/java/org/castor/anttask/CastorDDLGenTask.java (Revision 0)
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2007 Werner Guttmann
+ *
+ * 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.castor.anttask;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+import org.castor.ddlgen.Generator;
+import org.castor.ddlgen.GeneratorException;
+import org.castor.ddlgen.GeneratorFactory;
+import org.castor.mapping.MappingUnmarshaller;
+import org.exolab.castor.mapping.Mapping;
+import org.exolab.castor.mapping.MappingException;
+
+/**
+ * An Ant task to call the Castor
+ * DDL Generator. It can be passed a file, a directory, a Fileset or all
+ * three.
+ *
+ * @author Werner Guttmann
+ * @version $Revision: 6543 $ $Date: 2005-03-05 06:42:06 -0700 (Sat, 05 Mar 2005) $
+ */
+public final class CastorDDLGenTask extends MatchingTask {
+ //--------------------------------------------------------------------------
+
+ /** Error message -- no mapping to run ddl generator on. */
+ private static final String NO_MAPPING_MSG =
+ "A mapping file must be provided for DDL generation.";
+
+ //--------------------------------------------------------------------------
+
+ /** If processing one schema file, this lists the file. */
+ private File _mappingFile = null;
+
+ /** If processing all mapping files in a directory, this lists the directory. */
+ private File _mappingDir = null;
+
+ /** If processing a fileset, this lists the fileset. */
+ private Vector _mappingFilesets = new Vector();
+
+ // Begin DDL Generator parameters
+
+ /** The package that generated code will belong to. */
+ private String _ddlFileName;
+
+ /** Name of database engine to generate DDL for. */
+ private String _databaseEngine;
+
+ /** Global properties file to be used during DDL generation. */
+ private String _globalProperties;
+
+ /** Database specific properties file to be used during DDL generatrion. */
+ private String _databaseEngineProperties;
+
+ /** SourceGenerator instance. */
+ private Generator _sgen;
+
+ //--------------------------------------------------------------------------
+
+ /**
+ * No-arg constructor.
+ */
+ public CastorDDLGenTask() {
+ // Nothing needed
+ }
+
+ //--------------------------------------------------------------------------
+
+ /**
+ * Sets the individual schema that will have code generated for it.
+ *
+ * @param file One schema file.
+ */
+ public void setFile(final File file) {
+ _mappingFile = file;
+ }
+
+ /**
+ * Sets the directory such that all schemas in this directory will have code
+ * generated for them.
+ *
+ * @param dir The directory containing schemas to process.
+ */
+ public void setDir(final File dir) {
+ _mappingDir = dir;
+ }
+
+ /**
+ * Adds a fileset to process that contains schemas to process.
+ *
+ * @param set An individual file set containing schemas.
+ */
+ public void addFileset(final FileSet set) {
+ _mappingFilesets.addElement(set);
+ }
+
+ /**
+ * Specifies the name of database engine to generate DDL for.
+ * @param databaseEngine Name of the database engine
+ */
+ public void setDatabaseEngine(final String databaseEngine) {
+ _databaseEngine = databaseEngine;
+ }
+
+ /**
+ * Specifies the name of a database specific properties file to be used
+ * during DDL generation.
+ * @param databaseEngineProperties Database specific properties
+ */
+ public void setDatabaseEngineProperties(final String databaseEngineProperties) {
+ _databaseEngineProperties = databaseEngineProperties;
+ }
+
+ /**
+ * Specifies the name of the DDL file to be generated.
+ * @param ddlFileName Name of the DDL file to be generated
+ */
+ public void setDdlFileName(final String ddlFileName) {
+ _ddlFileName = ddlFileName;
+ }
+
+ /**
+ * Specifies the name of a global properties file to be used during
+ * DDL generation.
+ * @param globalProperties Custom global properties for DDL generation.
+ */
+ public void setGlobalProperties(final String globalProperties) {
+ _globalProperties = globalProperties;
+ }
+
+ //--------------------------------------------------------------------------
+
+ /**
+ * Configured the code generator. If anything goes wrong during configuration of the
+ * Ant task a BuildException will be thrown.
+ */
+ private void config() {
+
+
+ try {
+ _sgen = GeneratorFactory.createDDLGenerator(
+ _databaseEngine, _globalProperties, _databaseEngineProperties);
+ Mapping mapping = new Mapping();
+ mapping.loadMapping(_mappingFile.getAbsolutePath());
+ new MappingUnmarshaller().loadMappingOnly(mapping);
+ _sgen.setMapping(mapping);
+ _sgen.setPrinter(new PrintStream(new FileOutputStream(_ddlFileName)));
+ } catch (IOException e) {
+ throw new BuildException ("Problem finding the Castor JDO mapping file "
+ + _mappingFile.getAbsolutePath(), e);
+ } catch (MappingException e) {
+ throw new BuildException ("Problem loading the Castor JDO mapping file "
+ + _mappingFile.getAbsolutePath(), e);
+ } catch (GeneratorException e) {
+ throw new BuildException ("Problem instantiating the DDL generator", e);
+ }
+
+ }
+
+ /**
+ * Runs source generation. If anything goes wrong during source generation a
+ * BuildException will be thrown.
+ *
+ * @param filePath an individual Schema to generate code for.
+ */
+ private void processFile(final String filePath) {
+ log("Processing " + filePath);
+ try {
+ _sgen.generateDDL();
+ } catch (GeneratorException e) {
+ throw new BuildException ("Problem generating DDL script for "
+ + _mappingFile.getAbsolutePath(), e);
+ }
+ }
+
+ /**
+ * Public execute method -- entry point for the Ant task. Loops over all
+ * schema that need code generated and creates needed code generators, then
+ * executes them. If anything goes wrong during execution of the Ant task a
+ * BuildException will be thrown.
+ *
+ * @see org.apache.tools.ant.Task#execute()
+ */
+ public void execute() {
+ // Must have something to run the source generator on
+ if (_mappingFile == null && _mappingDir == null && _mappingFilesets.size() == 0) {
+ throw new BuildException(NO_MAPPING_MSG);
+ }
+
+ try {
+ config();
+
+ // Run DDL generator on file
+ if (_mappingFile != null) {
+ processFile(_mappingFile.getAbsolutePath());
+ }
+
+ // Run source generator on all files in directory
+ if (_mappingDir != null && _mappingDir.exists() && _mappingDir.isDirectory()) {
+ DirectoryScanner ds = this.getDirectoryScanner(_mappingDir);
+
+ String[] files = ds.getIncludedFiles();
+ for (int i = 0; i < files.length; i++) {
+ String filePath = _mappingDir.getAbsolutePath() + File.separator + files[i];
+ processFile(filePath);
+ }
+ }
+
+ // Run source generator on all files in FileSet
+ for (int i = 0; i < _mappingFilesets.size(); i++) {
+ FileSet fs = (FileSet) _mappingFilesets.elementAt(i);
+ DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+ File subdir = fs.getDir(getProject());
+
+ String[] files = ds.getIncludedFiles();
+ for (int j = 0; j < files.length; j++) {
+ String filePath = subdir.getAbsolutePath() + File.separator + files[j];
+ processFile(filePath);
+ }
+ }
+ } finally {
+ _sgen = null;
+ }
+ }
+}