001 /* 002 // $Id: //open/util/resgen/src/org/eigenbase/xom/XOMGenTask.java#4 $ 003 // Package org.eigenbase.xom is an XML Object Mapper. 004 // Copyright (C) 2005-2007 The Eigenbase Project 005 // Copyright (C) 2005-2007 Disruptive Tech 006 // Copyright (C) 2005-2007 LucidEra, Inc. 007 // Portions Copyright (C) 2002-2007 Kana Software, Inc. and others. 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 the 011 // Free Software Foundation; either version 2 of the License, or (at your 012 // option) any later version approved by The Eigenbase Project. 013 // 014 // This library is distributed in the hope that it will be useful, 015 // but WITHOUT ANY WARRANTY; without even the implied warranty of 016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 017 // GNU Lesser General Public License for more details. 018 // 019 // You should have received a copy of the GNU Lesser General Public License 020 // along with this library; if not, write to the Free Software 021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 022 // 023 // jhyde, 1 April, 2002 024 */ 025 package org.eigenbase.xom; 026 027 import org.apache.tools.ant.BuildException; 028 import org.apache.tools.ant.Task; 029 030 import java.io.File; 031 import java.io.IOException; 032 033 /** 034 * <code>XOMGenTask</code> is an ANT task with which to invoke {@link 035 * MetaGenerator}. 036 * 037 * @author jhyde 038 * @since 1 April, 2002 039 * @version $Id: //open/util/resgen/src/org/eigenbase/xom/XOMGenTask.java#4 $ 040 * 041 * <hr/> 042 * 043 * <h2><a name="XOMGen">XOMGen</a></h2> 044 * <h3>Description</h3> 045 * <p> 046 * Invokes the {@link MetaGenerator}. 047 * </p> 048 * <p> 049 * This task only invokes XOMGen if the grammar file is newer than the 050 * generated Java files. 051 * </p> 052 * 053 * <h3>Parameters</h3> 054 * <table border="1" cellpadding="2" cellspacing="0"> 055 * <tr> 056 * <td valign="top"><b>Attribute</b></td> 057 * <td valign="top"><b>Description</b></td> 058 * <td align="center" valign="top"><b>Required</b></td> 059 * </tr> 060 * <tr> 061 * <td valign="top"><a name="model">model</a></td> 062 * <td valign="top">The name of the XML file which holds the XOM 063 * model.</td> 064 * <td valign="top" align="center">Yes</td> 065 * </tr> 066 * <tr> 067 * <td valign="top"><a name="destdir">destdir</a></td> 068 * <td valign="top">The name of the output directory. Default is the 069 * current directory.</td> 070 * <td valign="top" align="center">No</td> 071 * </tr> 072 * <tr> 073 * <td valign="top"><a name="classname">classname</a></td> 074 * <td valign="top">The full name of the class to generate.</td> 075 * <td valign="top" align="center">Yes</td> 076 * </tr> 077 * <tr> 078 * <td valign="top"><a name="dtdname">dtdname</a></td> 079 * <td valign="top">The name of the DTD file to generate. The path may be 080 * either absolute, or relative to <code>destdir</code>.</td> 081 * <td valign="top" align="center">Yes</td> 082 * </tr> 083 * </table> 084 * 085 * <h3>Example</h3> 086 * <blockquote><pre><xomgen 087 * model="src/org/eigenbase/xom/Meta.xml" 088 * destdir="src" 089 * classname="org.eigenbase.xom.MetaDef"/></pre></blockquote> 090 * <p> 091 * This invokes XOMGen on the model file 092 * <code>src/org/eigenbase/xom/Meta.xml</code>, and generates 093 * <code>src/org/eigenbase/xom/MetaDef.java</code> and 094 * <code>src/org/eigenbase/xom/meta.dtd</code>. 095 * </p> 096 * 097 * <hr/> 098 **/ 099 public class XOMGenTask extends Task { 100 String modelFileName; 101 String destDir; 102 String dtdFileName; 103 String className; 104 105 public XOMGenTask() 106 {} 107 108 public void execute() throws BuildException { 109 try { 110 if (modelFileName == null) { 111 throw new BuildException("You must specify model."); 112 } 113 if (className == null) { 114 throw new BuildException("You must specify className."); 115 } 116 117 File projectBase = getProject().getBaseDir(); 118 File destinationDirectory; 119 if (destDir == null) { 120 destinationDirectory = projectBase; 121 } else { 122 destinationDirectory = new File(projectBase, destDir); 123 } 124 if (!destinationDirectory.exists()) { 125 throw new BuildException( 126 "Destination directory doesn't exist: " + 127 destinationDirectory.toString()); 128 } 129 130 File modelFile = new File(projectBase, modelFileName); 131 File classFile = classNameToFile(destinationDirectory, className); 132 File outputDir = classFile.getParentFile(); 133 File dtdFile = new File(outputDir, dtdFileName); 134 135 if (modelFile.exists() && 136 classFile.exists() && 137 dtdFile.exists()) { 138 long modelStamp = modelFile.lastModified(), 139 classStamp = classFile.lastModified(), 140 dtdStamp = dtdFile.lastModified(); 141 if (classStamp > modelStamp && 142 dtdStamp > modelStamp) { 143 // files are up to date 144 return; 145 } 146 } 147 148 final boolean testMode = false; 149 MetaGenerator generator = new MetaGenerator( 150 modelFile.toString(), testMode, className); 151 generator.writeFiles(destinationDirectory.toString(), dtdFileName); 152 generator.writeOutputs(); 153 } catch (XOMException e) { 154 throw new BuildException("Generation of model failed: " + e); 155 } catch (IOException e) { 156 throw new BuildException("Generation of model failed: " + e); 157 } 158 } 159 160 // ------------------------------------------------------------------------ 161 // ANT attribute methods 162 163 /** See parameter <code><a href="#model">model</a></code>. **/ 164 public void setModel(String model) { 165 this.modelFileName = model; 166 } 167 168 /** See parameter <code><a href="#destdir">destdir</a></code>. **/ 169 public void setDestdir(String destdir) { 170 this.destDir = destdir; 171 } 172 173 /** See parameter <code><a href="#classname">classname</a></code>. **/ 174 public void setClassname(String classname) { 175 this.className = classname; 176 } 177 178 /** See parameter <code><a href="#dtdname">dtdname</a></code>. **/ 179 public void setDtdname(String dtdname) { 180 this.dtdFileName = dtdname; 181 } 182 183 // ------------------------------------------------------------------------ 184 185 /** 186 * Creates the File that a java class will live in. For example, 187 * <code>makeJavaFileName("com.myproj", "MyClass")</code> returns 188 * "com/myproj/MyClass.java". 189 **/ 190 static File classNameToFile(File dir, String className) { 191 char fileSep = System.getProperty("file.separator").charAt(0); // e.g. '/' 192 193 String relativePath = className.replace('.', fileSep) + ".java"; 194 195 if (dir == null) { 196 return new File(relativePath); 197 } else { 198 return new File(dir, relativePath); 199 } 200 } 201 202 } 203 204 205 // End XOMGenTask.java