All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.mojo.sablecc.SableCCMojo Maven / Gradle / Ivy

package org.codehaus.mojo.sablecc;

/*
 * Copyright 2005 The Codehaus.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
import org.codehaus.plexus.util.FileUtils;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;

import java.io.File;
import java.util.Set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;

/**
 * A plugin for processing grammar files in SableCC.
 *
 * @goal generate
 * @phase generate-sources
 * @description SableCC plugin
 * @author jesse 
 * @version $Id$
 */
public class SableCCMojo extends AbstractMojo {

	/**
	 * the source directory containing *.grammar files
	 *
	 * @parameter expression="${basedir}/src/main/sablecc"
	 */
	private String sourceDirectory;
	/**
	 * the directory to output the generated sources to
	 *
	 * @parameter expression="${project.build.directory}/generated-sources/sablecc"
	 */
	private String outputDirectory;
	/**
	 * the directory to store the processed grammars
	 *
	 * @parameter expression="${basedir}/target"
	 */
	private String timestampDirectory;
	/**
	 * The granularity in milliseconds of the last modification date for testing whether a source needs recompilation
	 *
	 * @parameter expression="${lastModGranularityMs}" default-value="0"
	 */
	private int staleMillis;
	/**
	 * the maven project helper class for adding resources
	 *
	 * @parameter expression="${component.org.apache.maven.project.MavenProjectHelper}"
	 */
	private MavenProjectHelper projectHelper;
	/**
	 * @parameter expression="${project}"
	 * @required
	 */
	private MavenProject project;

	@Override
	public void execute() throws MojoExecutionException {

		if (!FileUtils.fileExists(outputDirectory)) {
			FileUtils.mkdir(outputDirectory);
		}

		Set staleGrammars = computeStaleGrammars();

		if (staleGrammars.isEmpty()) {
			getLog().info("Nothing to process - all grammars are up to date");
			projectHelper.addResource(project, outputDirectory, Collections.singletonList("**/**.dat"), new ArrayList());
			project.addCompileSourceRoot(outputDirectory);
			return;
		}

		for (Iterator i = staleGrammars.iterator(); i.hasNext();) {
			File grammar = (File) i.next();

			try {
				org.sablecc.sablecc.SableCC.processGrammar(grammar, new File(outputDirectory));
				// make sure this is after the actual processing,
				//otherwise it if fails the computeStaleGrammars will think it completed.
				FileUtils.copyFileToDirectory(grammar, new File(timestampDirectory));
			} catch (Exception e) {
				throw new MojoExecutionException("SableCC execution failed", e);
			} catch (Throwable t) {
				throw new MojoExecutionException("SableCC execution failed", t);
			}
		}

		if (project != null) {
			getLog().debug("adding .dat resource");
			projectHelper.addResource(project, outputDirectory, Collections.singletonList("**/**.dat"), new ArrayList());
			project.addCompileSourceRoot(outputDirectory);
		}
	}

	private Set computeStaleGrammars() throws MojoExecutionException {
		SuffixMapping mapping = new SuffixMapping(".grammar", ".grammar");

		SourceInclusionScanner scanner = new StaleSourceScanner(staleMillis);

		scanner.addSourceMapping(mapping);

		File outDir = new File(timestampDirectory);

		Set staleSources = new HashSet();

		File sourceDir = new File(sourceDirectory);

		try {
			staleSources.addAll(scanner.getIncludedSources(sourceDir, outDir));
		} catch (InclusionScanException e) {
			throw new MojoExecutionException("Error scanning source root: \'" + sourceDir + "\' for stale grammars to reprocess.", e);
		}

		return staleSources;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy