001: package org.andromda.maven.plugins.sablecc;
002:
003: import java.io.File;
004: import java.net.URL;
005: import java.util.ArrayList;
006: import java.util.Collections;
007: import java.util.Iterator;
008: import java.util.List;
009:
010: import org.andromda.core.common.ResourceUtils;
011: import org.apache.maven.plugin.AbstractMojo;
012: import org.apache.maven.plugin.MojoExecutionException;
013: import org.apache.maven.project.MavenProject;
014: import org.apache.maven.project.MavenProjectHelper;
015: import org.sablecc.sablecc.SableCC;
016:
017: /**
018: * A Maven2 plugin for processing in SableCC files.
019: *
020: * @phase generate-sources
021: * @goal generate
022: * @description SableCC plugin
023: * @author Chad Brandon
024: */
025: public class SableCCMojo extends AbstractMojo {
026: /**
027: * The directory that will contain the *.grammer files.
028: *
029: * @parameter expression="${basedir}/src/main/sablecc"
030: */
031: private String sourceDirectory;
032:
033: /**
034: * Directory to which the build source is generated.
035: *
036: * @parameter expression="${project.build.directory}/src/main/java"
037: */
038: private String buildSourceDirectory;
039:
040: /**
041: * Maven project helper class for adding resources
042: *
043: * @parameter expression="${component.org.apache.maven.project.MavenProjectHelper}"
044: */
045: private MavenProjectHelper projectHelper;
046:
047: /**
048: * The current project.
049: *
050: * @parameter expression="${project}"
051: * @required
052: */
053: private MavenProject project;
054:
055: /**
056: * The pattern to use to include all .dat files
057: */
058: private static final String DAT_FILE_PATTERN = "**/*.dat";
059:
060: /**
061: * The pattern for the grammar files.
062: */
063: private static final String GRAMMAR_FILE_PATTERN = "**/*.grammar";
064:
065: /**
066: * @see org.apache.maven.plugin.Mojo#execute()
067: */
068: public void execute() throws MojoExecutionException {
069: try {
070: final File buildSourceDirectory = new File(
071: this .buildSourceDirectory);
072: buildSourceDirectory.mkdirs();
073:
074: final List grammarPaths = ResourceUtils
075: .getDirectoryContents(ResourceUtils
076: .toURL(this .sourceDirectory), true,
077: new String[] { GRAMMAR_FILE_PATTERN });
078: boolean execute = false;
079: for (final Iterator iterator = grammarPaths.iterator(); iterator
080: .hasNext();) {
081: final URL grammar = ResourceUtils
082: .toURL((String) iterator.next());
083: if (grammar != null) {
084: execute = ResourceUtils.modifiedAfter(ResourceUtils
085: .getLastModifiedTime(grammar),
086: buildSourceDirectory);
087: if (execute) {
088: break;
089: }
090: }
091: }
092:
093: if (execute) {
094: for (Iterator iterator = grammarPaths.iterator(); iterator
095: .hasNext();) {
096: final URL resource = ResourceUtils
097: .toURL(((String) iterator.next()));
098: SableCC.processGrammar(
099: new File(resource.getFile()),
100: buildSourceDirectory);
101: }
102: } else {
103: this
104: .getLog()
105: .info(
106: "Nothing to generate - all grammars are up to date");
107: }
108:
109: projectHelper.addResource(project,
110: this .buildSourceDirectory, Collections
111: .singletonList(DAT_FILE_PATTERN),
112: new ArrayList());
113: project.addCompileSourceRoot(this .buildSourceDirectory);
114: } catch (Throwable throwable) {
115: throw new MojoExecutionException(
116: "An error occurred while attempting to process SableCC grammar(s)",
117: throwable);
118: }
119: }
120: }
|