[hibernate-commits] Hibernate SVN: r17816 - in core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr: metadata and 1 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Wed Oct 21 20:59:55 EDT 2009
Author: steve.ebersole at jboss.com
Date: 2009-10-21 20:59:53 -0400 (Wed, 21 Oct 2009)
New Revision: 17816
Added:
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarDelegate.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFileMetadata.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarMetadata.java
Removed:
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/Grammar.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFile.java
Modified:
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrPlugin.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectory.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectoryImpl.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrTask.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/MetadataExtracter.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/XRef.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlan.java
core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlanBuilder.java
Log:
cleaned up javadocs, reorganized code a bit
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrPlugin.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrPlugin.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrPlugin.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -50,7 +50,9 @@
public class AntlrPlugin implements Plugin {
public static final String ANTLR_CONFIGURATION_NAME = "antlr";
-
+ /**
+ * {@inheritDoc}
+ */
public void use(final Project project, ProjectPluginsContainer projectPluginsHandler) {
projectPluginsHandler.usePlugin( JavaPlugin.class, project );
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectory.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectory.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectory.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -28,7 +28,10 @@
import groovy.lang.Closure;
/**
- * Virtual directory mapping handler for 'antlr'.
+ * Contract for a Gradle "convention object" that acts as a handler for what I call a virtual directory mapping,
+ * injecting a virtual directory named 'antlr' into the project's various
+ * {@link org.gradle.api.tasks.SourceSet source sets}. Its implementation gets pushed onto the
+ * {@link org.gradle.api.internal.DynamicObjectAware} portion of the source set under the name 'antlr'.
*
* @author Steve Ebersole
*/
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectoryImpl.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectoryImpl.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrSourceVirtualDirectoryImpl.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -33,9 +33,7 @@
import groovy.lang.Closure;
/**
- * Acts as a delegate to the {@link org.gradle.api.internal.DynamicObjectAware} portion of
- * Gradle's {@link org.gradle.api.tasks.SourceSet} in order to add Antlr-relate directory
- * mapping to the source sets.
+ * The implementation of the {@link AntlrSourceVirtualDirectory} contract.
*
* @author Steve Ebersole
*/
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrTask.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrTask.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/AntlrTask.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -39,6 +39,13 @@
/**
* Gradle task for executing Antlr generations. Wrapper around the Ant {@link ANTLR} task.
+ * <p/>
+ * Most properties here are self-evident, but I wanted to highlight one in particular:
+ * {@link #setAntlrClasspath} is used to define the classpath that should be passed along to the
+ * Ant {@link ANTLR} task as its classpath. That is the classpath it uses to perform generation
+ * execution. This <b>should<b> really only require the antlr jar. In {@link AntlrPlugin}
+ * usage, this would happen simply by adding your antlr jar into the 'antlr' dependency configuration
+ * created and exposed by the {@link AntlrPlugin} itself.
*
* @author Steve Ebersole
*/
Deleted: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/Grammar.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/Grammar.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/Grammar.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -1,100 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
- * third-party contributors as indicated by either @author tags or express
- * copyright attribution statements applied by the authors. All
- * third-party contributions are distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA\
- */
-package org.gradle.plugin.antlr.metadata;
-
-import java.io.File;
-
-/**
- * Models a grammar defined within an Antlr grammar file.
- *
- * @author Steve Ebersole
- */
-public class Grammar {
- private final GrammarFile grammarFile;
- private String className;
- private String superGrammarName;
- private String importVocab;
- private String exportVocab;
-
- public Grammar(GrammarFile grammarFile) {
- this.grammarFile = grammarFile;
- grammarFile.addGrammar( this );
- }
-
- public GrammarFile getGrammarFile() {
- return grammarFile;
- }
-
- public String getClassName() {
- return className;
- }
-
- public void setClassName(String className) {
- this.className = className;
- }
-
- public String getSuperGrammarName() {
- return superGrammarName;
- }
-
- public void setSuperGrammarName(String superGrammarName) {
- this.superGrammarName = superGrammarName;
- }
-
- public String getImportVocab() {
- return importVocab;
- }
-
- public void setImportVocab(String importVocab) {
- this.importVocab = importVocab;
- }
-
- public String getExportVocab() {
- return exportVocab;
- }
-
- public void setExportVocab(String exportVocab) {
- this.exportVocab = exportVocab;
- }
-
- public String getPackageName() {
- return getGrammarFile().getPackageName();
- }
-
- public String determineGeneratedParserPath() {
- if ( isEmpty( getPackageName() ) ) {
- return getClassName() + ".java";
- }
- else {
- return getPackageName().replace( '.', File.separatorChar )
- + File.separatorChar
- + getClassName()
- + ".java";
- }
- }
-
- private boolean isEmpty(String packageName) {
- return packageName == null || packageName.trim().length() == 0;
- }
-}
Added: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarDelegate.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarDelegate.java (rev 0)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarDelegate.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -0,0 +1,172 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA\
+ */
+package org.gradle.plugin.antlr.metadata;
+
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.ArrayList;
+import java.util.List;
+
+import antlr.collections.impl.IndexedVector;
+import antlr.preprocessor.GrammarFile;
+
+/**
+ * Antlr defines its {@link antlr.preprocessor.Grammar} class as package-protected for some unfortunate reason.
+ * So this class acts as a delegate to the Antlr {@link antlr.preprocessor.Grammar} class, hiding all the
+ * ugly necessary reflection code.
+ *
+ * @author Steve Ebersole
+ */
+public class GrammarDelegate {
+ public static List<GrammarDelegate> extractGrammarDelegates(GrammarFile antlrGrammarFile) {
+ List<GrammarDelegate> grammarDelegates = new ArrayList<GrammarDelegate>();
+ Enumeration grammarFileGramars = antlrGrammarFile.getGrammars().elements();
+ while ( grammarFileGramars.hasMoreElements() ) {
+ grammarDelegates.add( new GrammarDelegate( grammarFileGramars.nextElement() ) );
+ }
+ return grammarDelegates;
+ }
+
+ private final String className;
+ private final String importVocab;
+ private final String exportVocab;
+ private final GrammarDelegate superGrammarDelegate;
+
+ public GrammarDelegate(Object antlrGrammarMetadata) {
+ try {
+ final Method getNameMethod = antlrGrammarClass.getDeclaredMethod( "getName", NO_ARG_SIGNATURE );
+ getNameMethod.setAccessible( true );
+ this.className = ( String ) getNameMethod.invoke( antlrGrammarMetadata, NO_ARGS );
+
+ final Method getSuperGrammarMethod = antlrGrammarClass.getMethod( "getSuperGrammar", NO_ARG_SIGNATURE );
+ getSuperGrammarMethod.setAccessible( true );
+ final Object antlrSuperGrammarGrammarMetadata = getSuperGrammarMethod.invoke( antlrGrammarMetadata, NO_ARGS );
+ this.superGrammarDelegate = antlrSuperGrammarGrammarMetadata == null
+ ? null
+ : new GrammarDelegate( antlrSuperGrammarGrammarMetadata );
+
+ Method getOptionsMethod = antlrGrammarClass.getMethod( "getOptions", NO_ARG_SIGNATURE );
+ getOptionsMethod.setAccessible( true );
+ IndexedVector options = ( IndexedVector ) getOptionsMethod.invoke( antlrGrammarMetadata, NO_ARGS );
+
+ Method getRHSMethod = antlrOptionClass.getMethod( "getRHS", NO_ARG_SIGNATURE );
+ getRHSMethod.setAccessible( true );
+
+ final Object importVocabOption = options == null
+ ? null
+ : options.getElement( "importVocab" );
+ this.importVocab = importVocabOption == null
+ ? null
+ : vocabName( (String) getRHSMethod.invoke( importVocabOption, NO_ARGS ) );
+
+ final Object exportVocabOption = options == null
+ ? null
+ : options.getElement( "exportVocab" );
+ this.exportVocab = exportVocabOption == null
+ ? null
+ : vocabName( (String) getRHSMethod.invoke( exportVocabOption, NO_ARGS ) );
+ }
+ catch ( Throwable t ) {
+ throw new IllegalStateException( "Error accessing Antlr grammar metadata", t );
+ }
+ }
+
+ /**
+ * Retrieves the unqualified name of the lexer/parser class.
+ *
+ * @return The unqualified lexer/parser class name.
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /**
+ * Retrieves the name of this vocabulary imported by this grammar.
+ *
+ * @return The gammar's imported vocabulary name.
+ */
+ public String getImportVocab() {
+ return importVocab;
+ }
+
+ /**
+ * Retrieves the name of this vocabulary exported by this grammar.
+ *
+ * @return The gammar's exported vocabulary name.
+ */
+ public String getExportVocab() {
+ return exportVocab;
+ }
+
+ /**
+ * Retrieves the grammar delegate associated with this grammars super grammar deduced during preprocessing
+ * from its extends clause.
+ *
+ * @return The super-grammar grammar delegate
+ */
+ public GrammarDelegate getSuperGrammarDelegate() {
+ return superGrammarDelegate;
+ }
+
+ private GrammarMetadata associatedGrammarMetadata;
+
+ public void associateWith(GrammarMetadata associatedGrammarMetadata) {
+ this.associatedGrammarMetadata = associatedGrammarMetadata;
+ }
+
+ public GrammarMetadata getAssociatedGrammarMetadata() {
+ return associatedGrammarMetadata;
+ }
+
+ private String vocabName(String vocabName) {
+ if ( vocabName == null ) {
+ return null;
+ }
+ vocabName = vocabName.trim();
+ if ( vocabName.endsWith( ";" ) ) {
+ vocabName = vocabName.substring( 0, vocabName.length() - 1 );
+ }
+ return vocabName;
+ }
+
+ private static final Class antlrGrammarClass;
+ private static final Class antlrOptionClass;
+
+ static {
+ antlrGrammarClass = loadAntlrClass( "antlr.preprocessor.Grammar" );
+ antlrOptionClass = loadAntlrClass( "antlr.preprocessor.Option" );
+ }
+
+ public static final Class[] NO_ARG_SIGNATURE = new Class[0];
+ public static final Object[] NO_ARGS = new Object[0];
+
+ private static Class loadAntlrClass(String className) {
+ try {
+ return Class.forName( className, true, GrammarDelegate.class.getClassLoader() );
+ }
+ catch ( ClassNotFoundException e ) {
+ throw new IllegalStateException( "Unable to locate Antlr class [" + className + "]", e );
+ }
+ }
+}
Deleted: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFile.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFile.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFile.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -1,68 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
- * third-party contributors as indicated by either @author tags or express
- * copyright attribution statements applied by the authors. All
- * third-party contributions are distributed under license by Red Hat Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA\
- */
-package org.gradle.plugin.antlr.metadata;
-
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * TODO : javadoc
- *
- * @author Steve Ebersole
- */
-public class GrammarFile {
- private final String fileName;
- private final String[] glibs;
- private String packageName;
- private List<Grammar> grammars = new ArrayList<Grammar>();
-
- public GrammarFile(String fileName, String[] glibs) {
- this.fileName = fileName;
- this.glibs = glibs != null ? glibs : new String[0];
- }
-
- public String getFileName() {
- return fileName;
- }
-
- public String[] getGlibs() {
- return glibs;
- }
-
- public String getPackageName() {
- return packageName;
- }
-
- void setPackageName(String packageName) {
- this.packageName = packageName;
- }
-
- void addGrammar(Grammar grammar) {
- grammars.add( grammar );
- }
-
- public List<Grammar> getGrammars() {
- return grammars;
- }
-}
Copied: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFileMetadata.java (from rev 17800, core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFile.java)
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFileMetadata.java (rev 0)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarFileMetadata.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -0,0 +1,69 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA\
+ */
+package org.gradle.plugin.antlr.metadata;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.File;
+
+/**
+ * Models information about an Antlr grammar file, including the inidividual {@link #getGrammars grammars}
+ * (lexers, parsers, etc) contained within it.
+ *
+ * @author Steve Ebersole
+ */
+public class GrammarFileMetadata {
+ private final File filePath;
+ private final antlr.preprocessor.GrammarFile antlrGrammarFile;
+ private final String packageName;
+ private List<GrammarMetadata> grammarMetadatas = new ArrayList<GrammarMetadata>();
+
+ public GrammarFileMetadata(File filePath, antlr.preprocessor.GrammarFile antlrGrammarFile, String packageName) {
+ this.filePath = filePath;
+ this.antlrGrammarFile = antlrGrammarFile;
+ this.packageName = packageName;
+
+ List<GrammarDelegate> antlrGrammarDelegates = GrammarDelegate.extractGrammarDelegates( antlrGrammarFile );
+ for ( GrammarDelegate antlrGrammarDelegate : antlrGrammarDelegates ) {
+ GrammarMetadata grammarMetadata = new GrammarMetadata( this, antlrGrammarDelegate );
+ grammarMetadatas.add( grammarMetadata );
+ }
+ }
+
+ public File getFilePath() {
+ return filePath;
+ }
+
+ public antlr.preprocessor.GrammarFile getAntlrGrammarFile() {
+ return antlrGrammarFile;
+ }
+
+ public String getPackageName() {
+ return packageName;
+ }
+
+ public List<GrammarMetadata> getGrammars() {
+ return grammarMetadatas;
+ }
+}
Copied: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarMetadata.java (from rev 17800, core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/Grammar.java)
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarMetadata.java (rev 0)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/GrammarMetadata.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -0,0 +1,108 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA\
+ */
+package org.gradle.plugin.antlr.metadata;
+
+import java.io.File;
+
+import antlr.TreeParser;
+import antlr.Parser;
+
+/**
+ * Models a grammar defined within an Antlr grammar file.
+ *
+ * @author Steve Ebersole
+ */
+public class GrammarMetadata {
+ private final GrammarFileMetadata grammarFileMetadata;
+ private final GrammarDelegate grammarDelegate;
+
+ public GrammarMetadata(GrammarFileMetadata grammarFileMetadata, GrammarDelegate grammarDelegate) {
+ this.grammarFileMetadata = grammarFileMetadata;
+ this.grammarDelegate = grammarDelegate;
+ grammarDelegate.associateWith( this );
+ }
+
+ public GrammarFileMetadata getGrammarFile() {
+ return grammarFileMetadata;
+ }
+
+ public String getClassName() {
+ return grammarDelegate.getClassName();
+ }
+
+ public String getQualifiedClassName() {
+ if ( isEmpty( getPackageName() ) ) {
+ return getClassName();
+ }
+ else {
+ return getPackageName() + '.' + getClassName();
+ }
+ }
+
+ public GrammarDelegate getSuperGrammarDelegate() {
+ return grammarDelegate.getSuperGrammarDelegate();
+ }
+
+ public boolean extendsStandardGrammar() {
+ final String superGrammarClassName = getSuperGrammarDelegate().getClassName();
+ return Parser.class.getName().equals( superGrammarClassName )
+ || Parser.class.getSimpleName().equals( superGrammarClassName )
+ || TreeParser.class.getName().equals( superGrammarClassName )
+ || TreeParser.class.getSimpleName().equals( superGrammarClassName )
+ || "Lexer".equals( superGrammarClassName );
+ }
+
+ public String getImportVocab() {
+ return grammarDelegate.getImportVocab();
+ }
+
+ public String getExportVocab() {
+ return grammarDelegate.getExportVocab();
+ }
+
+ public String getPackageName() {
+ return getGrammarFile().getPackageName();
+ }
+
+ /**
+ * Determine the relative path of the generated parser java file.
+ *
+ * @return The relative generated parser file path.
+ */
+ public String determineGeneratedParserPath() {
+ if ( isEmpty( getPackageName() ) ) {
+ return getClassName() + ".java";
+ }
+ else {
+ return getPackageName().replace( '.', File.separatorChar )
+ + File.separatorChar
+ + getClassName()
+ + ".java";
+ }
+ }
+
+ private boolean isEmpty(String packageName) {
+ return packageName == null || packageName.trim().length() == 0;
+ }
+}
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/MetadataExtracter.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/MetadataExtracter.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/MetadataExtracter.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -28,17 +28,13 @@
import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.lang.reflect.Method;
import org.gradle.api.file.FileTree;
-import antlr.collections.impl.IndexedVector;
/**
- * Preprocess an Antlr grammar file to that dependencies between grammars
- * can be properly determined so that they can be passed to the Antlr {@link antlr.Tool}
- * in proper order.
+ * Preprocess an Antlr grammar file so that dependencies between grammars
+ * can be properly determined such that they can be processed for generation
+ * in proper order later.
*
* @author Steve Ebersole
*/
@@ -48,23 +44,33 @@
antlr.Tool tool = new antlr.Tool();
antlr.preprocessor.Hierarchy hierarchy = new antlr.preprocessor.Hierarchy( tool );
- final ArrayList<GrammarFile> grammarFiles = new ArrayList<GrammarFile>();
+ // first let antlr preprocess the grammars...
for ( File grammarFileFile : source.getFiles() ) {
final String grammarFilePath = grammarFileFile.getPath();
- GrammarFile grammarFile = new GrammarFile(
- grammarFilePath,
- null // todo : account for glibs
- );
- // :( antlr.preprocessor.GrammarFile's only access to package is through a protected field :(
try {
+ hierarchy.readGrammarFile( grammarFilePath );
+ }
+ catch ( FileNotFoundException e ) {
+ // should never happen here
+ throw new IllegalStateException( "Received FileNotFoundException on already read file", e );
+ }
+ }
+
+ // now, do our processing using the antlr preprocessor results whenever possible.
+ XRef xref = new XRef( hierarchy );
+ for ( File grammarFileFile : source.getFiles() ) {
+
+ // determine the package name :(
+ String grammarPackageName = null;
+ try {
BufferedReader in = new BufferedReader( new FileReader( grammarFileFile ) );
try {
String line;
while ( ( line = in.readLine() ) != null ) {
line = line.trim();
if ( line.startsWith( "package" ) && line.endsWith( ";" ) ) {
- grammarFile.setPackageName( line.substring( 8, line.length() -1 ) );
+ grammarPackageName = line.substring( 8, line.length() -1 );
break;
}
}
@@ -81,114 +87,18 @@
e.printStackTrace();
}
- grammarFiles.add( grammarFile );
+ final String grammarFilePath = grammarFileFile.getPath();
+ antlr.preprocessor.GrammarFile antlrGrammarFile = hierarchy.getFile( grammarFilePath );
- try {
- hierarchy.readGrammarFile( grammarFilePath );
- }
- catch ( FileNotFoundException e ) {
- // should never happen here
- throw new IllegalStateException( "Received FileNotFoundException on already read file", e );
- }
- }
+ GrammarFileMetadata grammarFileMetadata = new GrammarFileMetadata(
+ grammarFileFile,
+ antlrGrammarFile,
+ grammarPackageName
+ );
- XRef xref = new XRef( hierarchy );
- for ( GrammarFile grammarFile : grammarFiles ) {
- final String grammarFilePath = grammarFile.getFileName();
- try {
- antlr.preprocessor.GrammarFile antlrToolGrammarFile = hierarchy.getFile( grammarFilePath );
- intrepretMetadata( grammarFile, antlrToolGrammarFile );
- xref.addGrammarFile( grammarFile );
- }
- catch ( Throwable t ) {
- throw new IllegalStateException( "Unable to build grammar metadata", t );
- }
+ xref.addGrammarFile( grammarFileMetadata );
}
return xref;
}
-
- private void intrepretMetadata(GrammarFile grammarFile, antlr.preprocessor.GrammarFile antlrToolGrammarFile) {
- final Enumeration antlrGrammars = antlrToolGrammarFile.getGrammars().elements();
- while ( antlrGrammars.hasMoreElements() ) {
- Grammar grammar = new Grammar( grammarFile );
- intrepret( grammar, antlrGrammars.nextElement() );
- }
- }
-
-
-
- private void intrepret(Grammar grammar, Object antlrGrammarDef) {
- // antlr.preprocessor.Grammar is defined as package-protected, ugh...
- final Class antlrGrammarClass = loadAntlrClass( "antlr.preprocessor.Grammar" );
- final Class antlrOptionClass = loadAntlrClass( "antlr.preprocessor.Option" );
-
- try {
- final Method getNameMethod = antlrGrammarClass.getDeclaredMethod( "getName", NO_ARG_SIGNATURE );
- getNameMethod.setAccessible( true );
- final String name = ( String ) getNameMethod.invoke( antlrGrammarDef, NO_ARGS );
- grammar.setClassName( name );
-
- final Method getSuperGrammarNameMethod = antlrGrammarClass.getMethod( "getSuperGrammarName", NO_ARG_SIGNATURE );
- getSuperGrammarNameMethod.setAccessible( true );
- final String superGrammarName = ( String ) getSuperGrammarNameMethod.invoke( antlrGrammarDef, NO_ARGS );
- grammar.setSuperGrammarName( superGrammarName );
-
- Method getOptionsMethod = antlrGrammarClass.getMethod( "getOptions", NO_ARG_SIGNATURE );
- getOptionsMethod.setAccessible( true );
- IndexedVector options = ( IndexedVector ) getOptionsMethod.invoke( antlrGrammarDef, NO_ARGS );
-
- Method getRHSMethod = antlrOptionClass.getMethod( "getRHS", NO_ARG_SIGNATURE );
- getRHSMethod.setAccessible( true );
-
- Object importVocabOption = options.getElement( "importVocab" );
- if ( importVocabOption != null ) {
- String importVocab = ( String ) getRHSMethod.invoke( importVocabOption, NO_ARGS );
- if ( importVocab != null ) {
- importVocab = importVocab.trim();
- if ( importVocab.endsWith( ";" ) ) {
- importVocab = importVocab.substring( 0, importVocab.length() - 1 );
- }
- grammar.setImportVocab( importVocab );
- }
- }
-
- Object exportVocabOption = options.getElement( "exportVocab" );
- if ( exportVocabOption != null ) {
- String exportVocab = ( String ) getRHSMethod.invoke( exportVocabOption, NO_ARGS );
- if ( exportVocab != null ) {
- exportVocab = exportVocab.trim();
- if ( exportVocab.endsWith( ";" ) ) {
- exportVocab = exportVocab.substring( 0, exportVocab.length() -1 );
- }
- }
- grammar.setExportVocab( exportVocab );
- }
- }
- catch ( Throwable t ) {
- throw new IllegalStateException( "Error accessing Antlr grammar metadata", t );
- }
- }
-
- public static final Class[] NO_ARG_SIGNATURE = new Class[0];
- public static final Object[] NO_ARGS = new Object[0];
-
- private Class loadAntlrClass(String className) {
- try {
- return Class.forName( className, true, ANTLR_CLASSLOADER );
- }
- catch ( ClassNotFoundException e ) {
- throw new IllegalStateException( "Unable to locate Antlr class [" + className + "]", e );
- }
- }
-
- private static ClassLoader ANTLR_CLASSLOADER = determineAntlrClassLoader();
-
- private static ClassLoader determineAntlrClassLoader() {
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- if ( cl == null ) {
- cl = MetadataExtracter.class.getClassLoader();
- }
- return cl;
- }
}
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/XRef.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/XRef.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/metadata/XRef.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -30,17 +30,17 @@
import antlr.preprocessor.Hierarchy;
/**
- * TODO : javadoc
+ * Models cross-reference (x-ref) info about {@link GrammarFileMetadata grammar files} such as {@link #filesByPath},
+ * {@link #filesByExportVocab} and {@link #filesByClassName}.
*
* @author Steve Ebersole
*/
public class XRef {
private final Hierarchy antlrHierarchy;
-// private LinkedHashMap<String, GrammarFile> filesById = new LinkedHashMap<String, GrammarFile>();
- private LinkedHashMap<String, GrammarFile> filesByPath = new LinkedHashMap<String, GrammarFile>();
- private HashMap<String, GrammarFile> filesByExportVocab = new HashMap<String, GrammarFile>();
- private HashMap<String, GrammarFile> filesByClassName = new HashMap<String, GrammarFile>();
+ private LinkedHashMap<String, GrammarFileMetadata> filesByPath = new LinkedHashMap<String, GrammarFileMetadata>();
+ private HashMap<String, GrammarFileMetadata> filesByExportVocab = new HashMap<String, GrammarFileMetadata>();
+ private HashMap<String, GrammarFileMetadata> filesByClassName = new HashMap<String, GrammarFileMetadata>();
public XRef(Hierarchy antlrHierarchy) {
this.antlrHierarchy = antlrHierarchy;
@@ -50,40 +50,56 @@
return antlrHierarchy;
}
- void addGrammarFile(GrammarFile grammarFile) {
-// filesById.put( grammarFile.getId(), grammarFile );
- filesByPath.put( grammarFile.getFileName(), grammarFile );
- for ( Grammar grammar : grammarFile.getGrammars() ) {
- filesByClassName.put( grammar.getClassName(), grammarFile );
- if ( grammar.getExportVocab() != null ) {
- GrammarFile old = filesByExportVocab.put( grammar.getExportVocab(), grammarFile );
- if ( old != null && old != grammarFile ) {
- System.out.println( "[WARNING] : multiple grammars defined the same exportVocab : " + grammar.getExportVocab() );
+ /**
+ * Adds a grammar file to this cross-reference.
+ *
+ * @param grammarFileMetadata The grammar file to add (and to be cross referenced).
+ */
+ void addGrammarFile(GrammarFileMetadata grammarFileMetadata) {
+ filesByPath.put( grammarFileMetadata.getFilePath().getPath(), grammarFileMetadata );
+ for ( GrammarMetadata grammarMetadata : grammarFileMetadata.getGrammars() ) {
+ filesByClassName.put( grammarMetadata.getClassName(), grammarFileMetadata );
+ if ( grammarMetadata.getExportVocab() != null ) {
+ GrammarFileMetadata old = filesByExportVocab.put( grammarMetadata.getExportVocab(), grammarFileMetadata );
+ if ( old != null && old != grammarFileMetadata ) {
+ System.out.println( "[WARNING] : multiple grammars defined the same exportVocab : " + grammarMetadata
+ .getExportVocab() );
}
}
}
}
-// public Iterator iterateGrammarFiles() {
-// return filesById.values().iterator();
-// }
-//
-// public GrammarFile getGrammarFileById(String id) {
-// return filesById.get( id );
-// }
- public Iterator<GrammarFile> iterateGrammarFiles() {
+ public Iterator<GrammarFileMetadata> iterateGrammarFiles() {
return filesByPath.values().iterator();
}
- public GrammarFile getGrammarFileByPath(String path) {
+ /**
+ * Locate the grammar file metadata by grammar file path.
+ *
+ * @param path The grammar file path.
+ * @return The grammar file metadata. May be null if none found.
+ */
+ public GrammarFileMetadata getGrammarFileByPath(String path) {
return filesByPath.get( path );
}
- public GrammarFile getGrammarFileByClassName(String className) {
+ /**
+ * Locate the grammar file metadata by the name of a class generated from one of its included grammars.
+ *
+ * @param className The generated class name.
+ * @return The grammar file metadata. May be null if none found.
+ */
+ public GrammarFileMetadata getGrammarFileByClassName(String className) {
return filesByClassName.get( className );
}
- public GrammarFile getGrammarFileByExportVocab(String exportVocab) {
- return filesByExportVocab.get( exportVocab );
+ /**
+ * Locate the grammar file metadata by the name of a vocabulary exported from one of its included grammars.
+ *
+ * @param vocabName The vocabulary name
+ * @return The grammar file metadata. May be null if none found.
+ */
+ public GrammarFileMetadata getGrammarFileByExportVocab(String vocabName) {
+ return filesByExportVocab.get( vocabName );
}
}
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlan.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlan.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlan.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -24,36 +24,33 @@
package org.gradle.plugin.antlr.plan;
import java.io.File;
-import java.util.LinkedHashSet;
/**
- * TODO : javadoc
+ * Models information relevant to generation of a particular Antlr grammar file.
*
* @author Steve Ebersole
*/
public class GenerationPlan {
- private final String id;
private final File source;
private final File generationDirectory;
private File importVocabTokenTypesDirectory;
private boolean outOfDate;
- private LinkedHashSet<String> collectedSuperGrammarIds = new LinkedHashSet<String>();
-
- GenerationPlan(String id, File source, File generationDirectory, String[] glibIds) {
- this.id = id;
+ /**
+ * Instantiates a generation plan.
+ *
+ * @param source The grammar file.
+ * @param generationDirectory The directory into which generated lexers and parsers should be written, accounting
+ * for delared package.
+ */
+ GenerationPlan(File source, File generationDirectory) {
this.source = source;
this.generationDirectory = generationDirectory;
- if ( glibIds != null ) {
- for ( String glibId : glibIds ) {
- addSuperGrammarId( glibId );
- }
- }
}
public String getId() {
- return id;
+ return getSource().getPath();
}
public File getSource() {
@@ -64,14 +61,6 @@
return generationDirectory;
}
- void addSuperGrammarId(String id) {
- collectedSuperGrammarIds.add( id );
- }
-
- public LinkedHashSet<String> getCollectedSuperGrammarIds() {
- return collectedSuperGrammarIds;
- }
-
public File getImportVocabTokenTypesDirectory() {
return importVocabTokenTypesDirectory;
}
@@ -80,10 +69,18 @@
this.importVocabTokenTypesDirectory = importVocabTokenTypesDirectory;
}
+ /**
+ * Is the grammar file modeled by this plan out of considered out of date?
+ *
+ * @return True if the grammar generation is out of date (needs regen); false otherwise.
+ */
public boolean isOutOfDate() {
return outOfDate;
}
+ /**
+ * Marks the plan as out of date.
+ */
void markOutOfDate() {
this.outOfDate = true;
}
Modified: core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlanBuilder.java
===================================================================
--- core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlanBuilder.java 2009-10-21 22:01:02 UTC (rev 17815)
+++ core/branches/gradle/buildSrc/src/main/java/org/gradle/plugin/antlr/plan/GenerationPlanBuilder.java 2009-10-22 00:59:53 UTC (rev 17816)
@@ -30,13 +30,15 @@
import java.util.ArrayList;
import org.gradle.plugin.antlr.metadata.XRef;
-import org.gradle.plugin.antlr.metadata.GrammarFile;
-import org.gradle.plugin.antlr.metadata.Grammar;
+import org.gradle.plugin.antlr.metadata.GrammarFileMetadata;
+import org.gradle.plugin.antlr.metadata.GrammarMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * TODO : javadoc
+ * Builder for the properly order list of {@link GenerationPlan generation plans}.
+ * <p/>
+ * IMPL NOTE : Uses recursive calls to achieve ordering.
*
* @author Steve Ebersole
*/
@@ -55,54 +57,38 @@
public synchronized List<GenerationPlan> buildGenerationPlans(XRef metadataXRef) {
this.metadataXRef = metadataXRef;
- Iterator<GrammarFile> grammarFiles = metadataXRef.iterateGrammarFiles();
+ Iterator<GrammarFileMetadata> grammarFiles = metadataXRef.iterateGrammarFiles();
while ( grammarFiles.hasNext() ) {
- final GrammarFile grammarFile = grammarFiles.next();
+ final GrammarFileMetadata grammarFileMetadata = grammarFiles.next();
// NOTE : loacteOrBuildGenerationPlan populates the generationPlans map
- loacteOrBuildGenerationPlan( grammarFile );
+ loacteOrBuildGenerationPlan( grammarFileMetadata );
}
return new ArrayList<GenerationPlan>( generationPlans.values() );
}
- private GenerationPlan loacteOrBuildGenerationPlan(GrammarFile grammarFile) {
- GenerationPlan generationPlan = generationPlans.get( grammarFile.getFileName() );
+ private GenerationPlan loacteOrBuildGenerationPlan(GrammarFileMetadata grammarFileMetadata) {
+ GenerationPlan generationPlan = generationPlans.get( grammarFileMetadata.getFilePath().getPath() );
if ( generationPlan == null ) {
- generationPlan = buildGenerationPlan( grammarFile );
+ generationPlan = buildGenerationPlan( grammarFileMetadata );
}
return generationPlan;
}
- private GenerationPlan buildGenerationPlan(GrammarFile grammarFile) {
- File generationDirectory = isEmpty( grammarFile.getPackageName() )
+ private GenerationPlan buildGenerationPlan(GrammarFileMetadata grammarFileMetadata) {
+ File generationDirectory = isEmpty( grammarFileMetadata.getPackageName() )
? outputDirectory
- : new File( outputDirectory, grammarFile.getPackageName().replace( '.', File.separatorChar ) );
+ : new File( outputDirectory, grammarFileMetadata.getPackageName().replace( '.', File.separatorChar ) );
GenerationPlan generationPlan = new GenerationPlan(
- grammarFile.getFileName(),
- new File( grammarFile.getFileName() ),
- generationDirectory,
- grammarFile.getGlibs()
+ grammarFileMetadata.getFilePath(),
+ generationDirectory
);
- File leastRecentGrammarOutput = locateLeastRecentlyModifiedOutputFile( generationDirectory );
-
- // see if the grammar is out-of-date by way super-grammars from user defined glib options
- for ( int i = 0; i < grammarFile.getGlibs().length; i++ ) {
- final GrammarFile superGrammarGrammarFile = metadataXRef.getGrammarFileByPath( grammarFile.getGlibs()[i] );
- final GenerationPlan superGrammarGenerationPlan = loacteOrBuildGenerationPlan( superGrammarGrammarFile );
- if ( superGrammarGenerationPlan.isOutOfDate() ) {
- generationPlan.markOutOfDate();
- }
- else if ( superGrammarGenerationPlan.getSource().lastModified() > leastRecentGrammarOutput.lastModified() ) {
- generationPlan.markOutOfDate();
- }
- }
-
- for ( Grammar grammar : grammarFile.getGrammars() ) {
+ for ( GrammarMetadata grammarMetadata : grammarFileMetadata.getGrammars() ) {
final File generatedParserFile = new File(
outputDirectory,
- grammar.determineGeneratedParserPath()
+ grammarMetadata.determineGeneratedParserPath()
);
if ( !generatedParserFile.exists() ) {
@@ -113,35 +99,36 @@
}
// see if the grammar if out-of-date by way of its super-grammar(s) as gleaned from parsing the grammar file
- if ( isNotEmpty( grammar.getSuperGrammarName() ) ) {
- final GrammarFile superGrammarGrammarFile = metadataXRef.getGrammarFileByClassName( grammar.getSuperGrammarName() );
- if ( superGrammarGrammarFile != null ) {
+ if ( !grammarMetadata.extendsStandardGrammar() ) {
+ final GrammarFileMetadata superGrammarGrammarFileMetadata = grammarMetadata.getSuperGrammarDelegate()
+ .getAssociatedGrammarMetadata()
+ .getGrammarFile();
+ if ( superGrammarGrammarFileMetadata != null ) {
final GenerationPlan superGrammarGenerationPlan = loacteOrBuildGenerationPlan(
- superGrammarGrammarFile
+ superGrammarGrammarFileMetadata
);
- generationPlan.addSuperGrammarId( superGrammarGenerationPlan.getId() );
if ( superGrammarGenerationPlan.isOutOfDate() ) {
generationPlan.markOutOfDate();
}
- else if ( superGrammarGenerationPlan.getSource()
- .lastModified() > generatedParserFile.lastModified() ) {
+ else if ( superGrammarGenerationPlan.getSource().lastModified()
+ > generatedParserFile.lastModified() ) {
generationPlan.markOutOfDate();
}
}
}
// see if the grammar if out-of-date by way of its importVocab
- if ( isNotEmpty( grammar.getImportVocab() ) ) {
- final GrammarFile importVocabGrammarFile = metadataXRef.getGrammarFileByExportVocab( grammar.getImportVocab() );
- if ( importVocabGrammarFile == null ) {
- log.warn( "unable to locate grammar exporting specifcied import vocab [" + grammar.getImportVocab() + "]" );
+ if ( isNotEmpty( grammarMetadata.getImportVocab() ) ) {
+ final GrammarFileMetadata importVocabGrammarFileMetadata = metadataXRef.getGrammarFileByExportVocab( grammarMetadata.getImportVocab() );
+ if ( importVocabGrammarFileMetadata == null ) {
+ log.warn( "unable to locate grammar exporting specifcied import vocab [" + grammarMetadata.getImportVocab() + "]" );
}
- else if ( importVocabGrammarFile.getFileName().equals( grammarFile.getFileName() ) ) {
+ else if ( importVocabGrammarFileMetadata.getFilePath().equals( grammarFileMetadata.getFilePath() ) ) {
}
else {
final GenerationPlan importVocabGrammarGenerationPlan = loacteOrBuildGenerationPlan(
- importVocabGrammarFile
+ importVocabGrammarFileMetadata
);
generationPlan.setImportVocabTokenTypesDirectory(
importVocabGrammarGenerationPlan.getGenerationDirectory()
@@ -169,25 +156,4 @@
return ! isEmpty( string );
}
- private static File locateLeastRecentlyModifiedOutputFile(File directory) {
- if ( !directory.exists() ) {
- return null;
- }
-
- File[] contents = directory.listFiles();
- if ( contents.length == 0 ) {
- return null;
- }
-
- File oldest = contents[0];
- for ( int i = 1; i < contents.length; i++ ) {
- if ( contents[i].lastModified() < oldest.lastModified() ) {
- oldest = contents[i];
- }
- }
-
- return oldest;
- }
-
-
}
More information about the hibernate-commits
mailing list