001: /* ========================================================================
002: * JCommon : a free general purpose class library for the Java(tm) platform
003: * ========================================================================
004: *
005: * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006: *
007: * Project Info: http://www.jfree.org/jcommon/index.html
008: *
009: * This library is free software; you can redistribute it and/or modify it
010: * under the terms of the GNU Lesser General Public License as published by
011: * the Free Software Foundation; either version 2.1 of the License, or
012: * (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but
015: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017: * License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022: * USA.
023: *
024: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025: * in the United States and other countries.]
026: *
027: * -------------------------
028: * DescriptionGenerator.java
029: * -------------------------
030: * (C)opyright 2003, 2004, by Thomas Morgner and Contributors.
031: *
032: * Original Author: Thomas Morgner;
033: * Contributor(s): David Gilbert (for Object Refinery Limited);
034: *
035: * $Id: DescriptionGenerator.java,v 1.4 2005/10/18 13:32:20 mungady Exp $
036: *
037: * Changes
038: * -------------------------
039: * 21.06.2003 : Initial version
040: *
041: */
042:
043: package org.jfree.xml.generator;
044:
045: import java.io.BufferedInputStream;
046: import java.io.BufferedWriter;
047: import java.io.File;
048: import java.io.FileWriter;
049: import java.io.IOException;
050: import java.io.InputStream;
051: import java.io.Writer;
052: import java.net.URL;
053: import java.util.Iterator;
054: import java.util.Properties;
055:
056: import org.jfree.util.Log;
057: import org.jfree.util.PrintStreamLogTarget;
058: import org.jfree.util.ObjectUtilities;
059: import org.jfree.xml.generator.model.DescriptionModel;
060:
061: /**
062: * A utility application for generating class descriptions.
063: */
064: public final class DescriptionGenerator {
065:
066: /**
067: * Loads a property set from the specified URL.
068: *
069: * @param propertyURL the URL.
070: *
071: * @return The properties.
072: */
073: private static Properties loadProperties(final URL propertyURL) {
074: final Properties p = new Properties();
075: try {
076: final InputStream in = new BufferedInputStream(propertyURL
077: .openStream());
078: p.load(in);
079: in.close();
080: } catch (Exception e) {
081: System.err.println("Unable to load properties from "
082: + propertyURL);
083: }
084: return p;
085: }
086:
087: /**
088: * Runs the generator, using the 'generator.properties' file for configuration info.
089: *
090: * @param args command line arguments.
091: *
092: * @throws Exception if something goes wrong!
093: */
094: public static void main(final String[] args) throws Exception {
095:
096: Log.getInstance().addTarget(new PrintStreamLogTarget());
097:
098: URL propertyURL = ObjectUtilities.getResourceRelative(
099: "generator.properties", DescriptionGenerator.class);
100: if (args.length > 0) {
101: final File f = new File(args[0]);
102: propertyURL = f.toURL();
103: }
104: final Properties p = loadProperties(propertyURL);
105:
106: final String handlerSource = p
107: .getProperty("attributedefinition");
108: if (handlerSource != null) {
109: final Properties handlers = loadProperties(new URL(
110: propertyURL, handlerSource));
111: ModelBuilder.getInstance().addAttributeHandlers(handlers);
112: }
113:
114: final String source = p.getProperty("sourcedirectory", ".");
115: final String target = p.getProperty("targetfile", "model.xml");
116: DescriptionModel model = null;
117: try {
118: model = new DefaultModelReader().load(target);
119: } catch (Exception e) {
120: Log.debug("Unable to load default model. Ignoring...");
121: }
122: // Log.debug (model.getModelComments());
123: model = generate(source, p, model);
124: model.prune();
125: writeMultiFile(target, model);
126: System.exit(0);
127: }
128:
129: /**
130: * Generates a {@link DescriptionModel} from the specified source.
131: *
132: * @param source the source directory.
133: * @param configuration the configuration properties.
134: * @param model the model (<code>null</code> permitted).
135: *
136: * @return A class description model.
137: */
138: public static DescriptionModel generate(final String source,
139: final Properties configuration, final DescriptionModel model) {
140:
141: final JavaSourceCollector jsc = new JavaSourceCollector(
142: new File(source));
143:
144: final Iterator it = configuration.keySet().iterator();
145: while (it.hasNext()) {
146: final String pName = (String) it.next();
147: if (pName.startsWith("ignore.baseclass.")) {
148: jsc.addIgnoredBaseClass(configuration
149: .getProperty(pName));
150: } else if (pName.startsWith("ignore.package.")) {
151: jsc.addIgnoredPackage(configuration.getProperty(pName));
152: }
153: }
154:
155: jsc.collectFiles();
156: return ModelBuilder.getInstance().buildModel(jsc, model);
157: }
158:
159: /**
160: * Writes the class description model to a single file.
161: *
162: * @param target the target file name.
163: * @param model the class description model.
164: *
165: * @throws IOException if there is an I/O problem.
166: */
167: public static void writeSingleFile(final String target,
168: final DescriptionModel model) throws IOException {
169: Log.debug("Writing ...");
170: final ModelWriter writer = new ModelWriter();
171: writer.setModel(model);
172: final Writer w = new BufferedWriter(new FileWriter(target));
173: writer.write(w);
174: w.close();
175: }
176:
177: /**
178: * Writes the class description model to multiple files.
179: *
180: * @param target the target file name.
181: * @param model the class description model.
182: *
183: * @throws IOException if there is an I/O problem.
184: */
185: public static void writeMultiFile(final String target,
186: final DescriptionModel model) throws IOException {
187: Log.debug("Writing multiple files ...");
188: final SplittingModelWriter writer = new SplittingModelWriter();
189: writer.setModel(model);
190: writer.write(target);
191: }
192:
193: }
|