1 /*
2 *
3 * ====================================================================
4 *
5 * The Apache Software License, Version 1.1
6 *
7 * Copyright (c) 1999 The Apache Software Foundation. All rights
8 * reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 *
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in
19 * the documentation and/or other materials provided with the
20 * distribution.
21 *
22 * 3. The end-user documentation included with the redistribution, if
23 * any, must include the following acknowlegement:
24 * "This product includes software developed by the
25 * Apache Software Foundation (http://www.apache.org/)."
26 * Alternately, this acknowlegement may appear in the software itself,
27 * if and wherever such third-party acknowlegements normally appear.
28 *
29 * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
30 * Foundation" must not be used to endorse or promote products derived
31 * from this software without prior written permission. For written
32 * permission, please contact apache@apache.org.
33 *
34 * 5. Products derived from this software may not be called "Apache"
35 * nor may "Apache" appear in their names without prior written
36 * permission of the Apache Group.
37 *
38 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
39 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
40 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
42 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
44 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
45 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
46 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
47 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
48 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
49 * SUCH DAMAGE.
50 * ====================================================================
51 *
52 * This software consists of voluntary contributions made by many
53 * individuals on behalf of the Apache Software Foundation. For more
54 * information on the Apache Software Foundation, please see
55 * <http://www.apache.org/>.
56 *
57 */
58
59 package org.apache.commons.jelly.tags.antlr;
60
61 import org.apache.commons.jelly.XMLOutput;
62 import org.apache.commons.jelly.TagSupport;
63 import org.apache.commons.jelly.MissingAttributeException;
64 import org.apache.commons.jelly.JellyException;
65
66 import antlr.Tool;
67
68 import java.io.File;
69 import java.io.FileReader;
70 import java.io.BufferedReader;
71 import java.security.Permission;
72 import java.util.List;
73 import java.util.ArrayList;
74 import java.util.Iterator;
75
76 public class AntlrTag extends TagSupport
77 {
78 private List grammars;
79 private File outputDir;
80
81 public AntlrTag()
82 {
83 this.grammars = new ArrayList( 1 );
84 }
85
86
87 // Tag interface
88 //-------------------------------------------------------------------------
89
90 /***
91 * Evaluate the body to register all the various goals and pre/post conditions
92 * then run all the current targets
93 */
94 public void doTag(final XMLOutput output) throws Exception
95 {
96 if ( this.outputDir == null )
97 {
98 throw new MissingAttributeException( "outputDir" );
99 }
100
101 invokeBody( output );
102
103 Iterator grammarIter = this.grammars.iterator();
104 String eachGrammar = null;
105
106 String sourceDir = (String) getContext().getVariable( "maven.antlr.src.dir" );
107 File grammar = null;
108
109 while ( grammarIter.hasNext() )
110 {
111 eachGrammar = ((String) grammarIter.next()).trim();
112
113 grammar = new File( sourceDir,
114 eachGrammar );
115
116 File generated = getGeneratedFile( grammar.getPath() );
117
118 if ( generated.exists() )
119 {
120 if ( generated.lastModified() > grammar.lastModified() )
121 {
122 // it's more recent, skip.
123 return;
124 }
125 }
126
127 if ( ! generated.getParentFile().exists() )
128 {
129 generated.getParentFile().mkdirs();
130 }
131
132 String[] args = new String[]
133 {
134 "-o",
135 generated.getParentFile().getPath(),
136 grammar.getPath(),
137 };
138
139 SecurityManager oldSm = System.getSecurityManager();
140
141 System.setSecurityManager( NoExitSecurityManager.INSTANCE );
142
143 try
144 {
145 Tool.main( args );
146 }
147 catch (SecurityException e)
148 {
149 if ( ! e.getMessage().equals( "exitVM-0" ) )
150 {
151 throw new JellyException( e );
152 }
153 }
154 finally
155 {
156 System.setSecurityManager( oldSm );
157 }
158 }
159 }
160
161 protected File getGeneratedFile(String grammar) throws JellyException
162 {
163 File grammarFile = new File( grammar );
164
165 String generatedFileName = null;
166
167 String className = null;
168 String packageName = "";
169
170 try {
171
172 BufferedReader in = new BufferedReader(new FileReader(grammar));
173
174 String line;
175 while ((line = in.readLine()) != null) {
176 line = line.trim();
177 int extendsIndex = line.indexOf(" extends ");
178 if (line.startsWith("class ") && extendsIndex > -1) {
179 generatedFileName = line.substring(6, extendsIndex).trim();
180 break;
181 }
182 else if ( line.startsWith( "package" ) ) {
183 packageName = line.substring( 8 ).trim();
184 }
185 }
186 in.close();
187 } catch (Exception e) {
188 throw new JellyException("Unable to determine generated class",
189 e);
190 }
191 if (generatedFileName == null) {
192 return null;
193 }
194
195 File genFile = null;
196
197 if ( "".equals( packageName ) )
198 {
199 genFile = new File( getOutputDir(),
200 generatedFileName + ".java" );
201 }
202 else
203 {
204 String packagePath = packageName.replace( '.',
205 File.separatorChar );
206
207 packagePath = packagePath.replace( ';',
208 File.separatorChar );
209
210 genFile = new File( new File( getOutputDir(), packagePath),
211 generatedFileName + ".java" );
212 }
213
214 return genFile;
215 }
216
217 void addGrammar(String grammar)
218 {
219 this.grammars.add( grammar );
220 }
221
222 public void setOutputDir(File outputDir)
223 {
224 this.outputDir = outputDir;
225 }
226
227 public File getOutputDir()
228 {
229 return this.outputDir;
230 }
231 }
232
233 class NoExitSecurityManager extends SecurityManager
234 {
235 static final NoExitSecurityManager INSTANCE = new NoExitSecurityManager();
236
237 private NoExitSecurityManager()
238 {
239 }
240
241 public void checkPermission(Permission permission)
242 {
243 }
244
245 public void checkExit(int status)
246 {
247 throw new SecurityException( "exitVM-" + status );
248 }
249 }
This page was automatically generated by Maven