1 /*
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Intalio, Inc. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Intalio, Inc. Exolab is a registered
23 * trademark of Intalio, Inc.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42 *
43 * $Id: XSDCompiler.java 6543 2006-12-18 23:07:56Z wguttmn $
44 */
45 package org.exolab.castor.tools;
46
47 import java.io.File;
48 import java.io.IOException;
49
50 import org.apache.tools.ant.BuildException;
51 import org.apache.tools.ant.Project;
52 import org.apache.tools.ant.Task;
53 import org.exolab.castor.builder.SourceGenerator;
54 import org.exolab.castor.builder.factory.FieldInfoFactory;
55
56 /**
57 * Ant task that enables code generation from an XML _schema from within Ant.
58 *
59 * @author <a href="mailto:keith AT kvisco DOT com">Keith Visco</a>
60 * @version $Revision: 6543 $ $Date: 2005-03-05 06:42:06 -0700 (Sat, 05 Mar 2005) $
61 * @deprecated Please use {@link org.castor.anttask.CastorCodeGenTask} instead.
62 */
63 public final class XSDCompiler extends Task {
64 //--------------------------------------------------------------------------
65
66 /** Schema to use to generate code. */
67 private File _schema;
68
69 /** Package to generate code into. */
70 private String _pkgName;
71
72 /** Line seperator to use. */
73 private String _lineSep;
74
75 /** If true, suppress non-fatal warnings. */
76 private boolean _force;
77
78 /** Custom type factory to supply to the code generator. */
79 private String _typeFactory;
80
81 /** Directory into which to generate code. */
82 private File _destDir;
83
84 //--------------------------------------------------------------------------
85
86 /**
87 * Creates a new XSDCompiler Task.
88 */
89 public XSDCompiler() {
90 // No action needed
91 }
92
93 //--------------------------------------------------------------------------
94
95 /**
96 * Executes the task. If anything goes wrong during execution of the Ant task a
97 * BuildException will be thrown.
98 */
99 public void execute() {
100 if (_schema == null || !_schema.exists()) {
101 throw new BuildException("Schema file is required");
102 }
103
104 if (_lineSep != null) {
105 if ("win".equals(_lineSep) || "\r\n".equals(_lineSep)) {
106 project.log("Using Windows style line separation.", Project.MSG_VERBOSE);
107 _lineSep = "\r\n";
108 } else if ("unix".equals(_lineSep) || "\n".equals(_lineSep)) {
109 project.log("Using UNIX style line separation.", Project.MSG_VERBOSE);
110 _lineSep = "\n";
111 } else if ("mac".equals(_lineSep) || "\r".equals(_lineSep)) {
112 project.log("Using Macintosh style line separation.", Project.MSG_VERBOSE);
113 _lineSep = "\r";
114 } else {
115 throw new BuildException("Invalid line-separator style.");
116 }
117 } else {
118 _lineSep = "\n"; // default
119 }
120
121 SourceGenerator sgen = null;
122 if (_typeFactory != null) {
123 try {
124 Object factory = Class.forName(_typeFactory).newInstance();
125 sgen = new SourceGenerator((FieldInfoFactory) factory);
126 } catch (Exception ex) {
127 project.log("Type factory " + _typeFactory + " is invalid.", Project.MSG_INFO);
128 throw new BuildException(ex);
129 }
130 } else {
131 // default
132 sgen = new SourceGenerator();
133 }
134
135 sgen.setLineSeparator(_lineSep);
136 sgen.setSuppressNonFatalWarnings(_force);
137 sgen.setDestDir(_destDir.toString());
138 if (_force) { project.log("Suppressing non fatal warnings.", Project.MSG_VERBOSE); }
139
140 try {
141 sgen.generateSource(_schema.getAbsolutePath(), _pkgName);
142 } catch (IOException ex) {
143 project.log("Failed to compile " + _schema, Project.MSG_INFO);
144 throw new BuildException(ex);
145 }
146 }
147
148 //--------------------------------------------------------------------------
149
150 /**
151 * Set the schema file name.
152 *
153 * @param schema The schema to be used for code generation.
154 */
155 public void setSchema(final String schema) {
156 _schema = project.resolveFile(schema);
157 }
158
159 /**
160 * Set the target package name.
161 *
162 * @param pkgName The target package name.
163 */
164 public void setPackage(final String pkgName) {
165 _pkgName = pkgName;
166 }
167
168 /**
169 * Set the line separator.
170 *
171 * @param lineSep The line seperator to use for this platform.
172 */
173 public void setLineseperator(final String lineSep) {
174 _lineSep = lineSep;
175 }
176
177 /**
178 * Set overwriting existing files.
179 *
180 * @param force If true, existing files will be silently overwritten and non-fatal
181 * warnings will be ignored
182 */
183 public void setForce(final boolean force) {
184 _force = force;
185 }
186
187 /**
188 * Set the type factory.
189 *
190 * @param typeFactory Name of the custom type factory class for collections.
191 */
192 public void setTypefactory(final String typeFactory) {
193 _typeFactory = typeFactory;
194 }
195
196 /**
197 * Set the destination directory into which the Java sources should be copied to.
198 *
199 * @param dirName The name of the destination directory
200 */
201 public void setDestdir(final String dirName) {
202 _destDir = project.resolveFile(dirName);
203 }
204
205 //--------------------------------------------------------------------------
206 }