You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by vs...@apache.org on 2007/05/18 13:50:39 UTC

svn commit: r539400 - in /maven/plugins/trunk/maven-antlr-plugin/src: main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java site/apt/usage.apt

Author: vsiveton
Date: Fri May 18 04:50:37 2007
New Revision: 539400

URL: http://svn.apache.org/viewvc?view=rev&rev=539400
Log:
MANTLR-14: Allowing patterns in filename
Submitted by: Emmanuel Lécharny
Reviewed by: Vincent Siveton

o applied with minor changes
o updated documentation

Modified:
    maven/plugins/trunk/maven-antlr-plugin/src/main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java
    maven/plugins/trunk/maven-antlr-plugin/src/site/apt/usage.apt

Modified: maven/plugins/trunk/maven-antlr-plugin/src/main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-antlr-plugin/src/main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java?view=diff&rev=539400&r1=539399&r2=539400
==============================================================================
--- maven/plugins/trunk/maven-antlr-plugin/src/main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java (original)
+++ maven/plugins/trunk/maven-antlr-plugin/src/main/java/org/apache/maven/plugin/antlr/AbstractAntlrMojo.java Fri May 18 04:50:37 2007
@@ -22,15 +22,19 @@
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.regex.Pattern;
 
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -96,7 +100,8 @@
     protected File outputDirectory;
 
     /**
-     * Comma separated grammar file names present in the <code>sourceDirectory</code> directory.
+     * Comma separated grammar file names or grammar pattern file names present in the <code>sourceDirectory</code>
+     * directory.
      * <br/>
      * See <a href="http://www.antlr.org/doc/options.html#Command%20Line%20Options">Command Line Options</a>
      *
@@ -279,23 +284,24 @@
             // ----------------------------------------------------------------------
             boolean failedSetManager = false;
             SecurityManager oldSm = null;
-            try 
+            try
             {
                 oldSm = System.getSecurityManager();
                 System.setSecurityManager( NoExitSecurityManager.INSTANCE );
-            } 
-            catch (SecurityException ex) 
+            }
+            catch ( SecurityException ex )
             {
                 //ANTLR-12
                 oldSm = null;
                 failedSetManager = true;
                 //ignore, in embedded environment the security manager can already be set.
                 // in such a case assume the exit call is handled properly..
-                getLog().warn("Cannot set custom SecurityManager. " +
-                        "Antlr's call to System.exit() can cause application shutdown " +
-                        "if not handled by the current SecurityManager.");
+                getLog().warn(
+                               "Cannot set custom SecurityManager. "
+                                   + "Antlr's call to System.exit() can cause application shutdown "
+                                   + "if not handled by the current SecurityManager." );
             }
-            
+
             PrintStream oldErr = System.err;
 
             OutputStream errOS = new StringOutputStream();
@@ -308,24 +314,25 @@
             }
             catch ( SecurityException e )
             {
-                if ( e.getMessage().equals( "exitVM-0" ) ||
-                     e.getClass().getName().equals("org.netbeans.core.execution.ExitSecurityException" ) )  //netbeans IDE Sec Manager.
+                if ( e.getMessage().equals( "exitVM-0" )
+                    || e.getClass().getName().equals( "org.netbeans.core.execution.ExitSecurityException" ) ) //netbeans IDE Sec Manager.
                 {
                     //ANTLR-12
                     //now basically every secutiry manager could set different message, how to handle in generic way?
                     //probably only by external execution
                     /// in case of NetBeans SecurityManager, it's not possible to distinguish exit codes, rather swallow than fail.
-                    getLog().debug(e);
-                } 
-                else 
+                    getLog().debug( e );
+                }
+                else
                 {
-                    throw new MojoExecutionException( "Antlr execution failed: " + e.getMessage() + 
-                                                      "\n Error output:\n" + errOS, e );
+                    throw new MojoExecutionException( "Antlr execution failed: " + e.getMessage()
+                        + "\n Error output:\n" + errOS, e );
                 }
             }
             finally
             {
-                if ( ! failedSetManager ) {
+                if ( !failedSetManager )
+                {
                     System.setSecurityManager( oldSm );
                 }
                 System.setErr( oldErr );
@@ -449,23 +456,77 @@
     }
 
     /**
+     * Get the list of all grammars to be compiled. The grammars variable
+     * can be a list of file or patterns. For instance, one can use *.g instead of
+     * a full list of grammar names.
+     *
+     * Be aware that sometime the grammar order is important, and that patterns won't
+     * keep this order, but we can still combine both elements( ordered names first, then
+     * the patterns).
+     *
+     * File name won't be added twice in the list of files.
+     *
      * @return an array of grammar from <code>grammars</code> and <code>grammarDefs</code> variables
      */
     private Grammar[] getGrammars()
     {
-        List grammarList = new LinkedList();
+        List grammarList = new ArrayList();
+        Set grammarSet = new HashSet();
 
         if ( StringUtils.isNotEmpty( grammars ) )
         {
             StringTokenizer st = new StringTokenizer( grammars, ", " );
+
             while ( st.hasMoreTokens() )
             {
                 String currentGrammar = st.nextToken().trim();
 
-                Grammar grammar = new Grammar();
-                grammar.setName( currentGrammar );
+                if ( StringUtils.isNotEmpty( currentGrammar ) )
+                {
+                    // Check if some pattern has been used
+                    if ( ( currentGrammar.indexOf( '*' ) != -1 ) || ( currentGrammar.indexOf( '?' ) != -1 ) )
+                    {
+                        // We first have to 'protect' the '.', and transform patterns
+                        // to regexp, substituting '*' to '.*' and '?' to '.'
+                        final String transformedGrammar = currentGrammar.replaceAll( "\\.", "\\\\." )
+                            .replaceAll( "\\*", ".*" ).replaceAll( "\\?", "." );
+
+                        // Filter the source directory
+                        String[] dir = sourceDirectory.list( new FilenameFilter()
+                        {
+                            public boolean accept( File dir, String s )
+                            {
+                                return Pattern.matches( transformedGrammar, s );
+                            }
+                        } );
+
+                        if ( ( dir != null ) && ( dir.length != 0 ) )
+                        {
+                            for ( int i = 0; i < dir.length; i++ )
+                            {
+                                // Just add fles which are not in the set
+                                // of files already seen.
+                                if ( !grammarSet.contains( dir[i] ) )
+                                {
+                                    Grammar grammar = new Grammar();
+                                    grammar.setName( dir[i] );
+
+                                    grammarList.add( grammar );
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if ( !grammarSet.contains( currentGrammar ) )
+                        {
+                            Grammar grammar = new Grammar();
+                            grammar.setName( currentGrammar );
 
-                grammarList.add( grammar );
+                            grammarList.add( grammar );
+                        }
+                    }
+                }
             }
         }
 

Modified: maven/plugins/trunk/maven-antlr-plugin/src/site/apt/usage.apt
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-antlr-plugin/src/site/apt/usage.apt?view=diff&rev=539400&r1=539399&r2=539400
==============================================================================
--- maven/plugins/trunk/maven-antlr-plugin/src/site/apt/usage.apt (original)
+++ maven/plugins/trunk/maven-antlr-plugin/src/site/apt/usage.apt Fri May 18 04:50:37 2007
@@ -46,10 +46,11 @@
         <artifactId>maven-antlr-plugin</artifactId>
         <configuration>
           <!--
-            Comma separated list of grammar files.
+            Comma separated list of grammar files or pattern grammar files
             By default, grammar file(s) is in ${basedir}/src/main/antlr
           -->
           <grammars>java.g</grammars>
+          <!-- <grammars>*.g</grammars> -->
         </configuration>
       </plugin>
       ...
@@ -81,10 +82,11 @@
         <artifactId>maven-antlr-plugin</artifactId>
         <configuration>
           <!--
-            Comma separated list of grammar files.
-            By default, grammar file is in ${basedir}/src/main/antlr
+            Comma separated list of grammar files or pattern grammar files
+            By default, grammar file(s) is in ${basedir}/src/main/antlr
           -->
           <grammars>java.g</grammars>
+          <!-- <grammars>*.g</grammars> -->
         </configuration>
         <executions>
           <execution>
@@ -119,10 +121,11 @@
         <artifactId>maven-antlr-plugin</artifactId>
         <configuration>
           <!--
-            Comma separated list of grammar files.
-            By default, grammar file is in ${basedir}/src/main/antlr
+            Comma separated list of grammar files or pattern grammar files
+            By default, grammar file(s) is in ${basedir}/src/main/antlr
           -->
           <grammars>java15.g</grammars>
+          <!-- <grammars>*.g</grammars> -->
         </configuration>
       </plugin>
       ...