org.javacc.mojo.JJTree Maven / Gradle / Ivy
package org.javacc.mojo;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
/**
* Provides a facade for the mojos to invoke JJTree.
*
* @author Benjamin Bentmann
* @version $Id$
* @see JJTree Reference
*/
class JJTree
extends ToolFacade
{
/**
* The input grammar.
*/
private File inputFile;
/**
* The option OUTPUT_DIRECTORY.
*/
private File outputDirectory;
/**
* The option GRAMMAR_ENCODING.
*/
private String grammarEncoding;
/**
* The option JDK_VERSION.
*/
private String jdkVersion;
/**
* The option STATIC.
*/
private Boolean isStatic;
/**
* The option BUILD_NODE_FILES.
*/
private Boolean buildNodeFiles;
/**
* The option MULTI.
*/
private Boolean multi;
/**
* The option NODE_DIRECTOY.
*/
private File nodeDirectory;
/**
* The option NODE_DEFAULT_VOID.
*/
private Boolean nodeDefaultVoid;
/**
* The option NODE_CLASS.
*/
private String nodeClass;
/**
* The option NODE_FACTORY.
*/
private String nodeFactory;
/**
* The option NODE_PACKAGE.
*/
private String nodePackage;
/**
* The option NODE_PREFIX.
*/
private String nodePrefix;
/**
* The option NODE_SCOPE_HOOK.
*/
private Boolean nodeScopeHook;
/**
* The option NODE_USES_PARSER.
*/
private Boolean nodeUsesParser;
/**
* The option TRACK_TOKENS.
*/
private Boolean trackTokens;
/**
* The option VISITOR.
*/
private Boolean visitor;
/**
* The option VISITOR_DATA_TYPE.
*/
private String visitorDataType;
/**
* The option VISITOR_RETURN_TYPE.
*/
private String visitorReturnType;
/**
* The option VISITOR_EXCEPTION.
*/
private String visitorException;
/**
* The option CODE_GENERATOR.
*/
private String codeGenerator;
/**
* The option OUTPUT_LANGUAGE.
*/
private String ouputLanguage;
/**
* Sets the absolute path to the grammar file to pass into JJTree for preprocessing.
*
* @param value The absolute path to the grammar file to pass into JJTree for preprocessing.
*/
public void setInputFile( File value )
{
if ( value != null && !value.isAbsolute() )
{
throw new IllegalArgumentException( "path is not absolute: " + value );
}
this.inputFile = value;
}
/**
* Sets the absolute path to the output directory.
*
* @param value The absolute path to the output directory for the generated grammar file. If this directory does not
* exist yet, it is created. Note that this path should already include the desired package hierarchy
* because JJTree will not append the required sub directories automatically.
*/
public void setOutputDirectory( File value )
{
if ( value != null && !value.isAbsolute() )
{
throw new IllegalArgumentException( "path is not absolute: " + value );
}
this.outputDirectory = value;
}
/**
* Gets the absolute path to the enhanced grammar file generated by JJTree.
*
* @return The absolute path to the enhanced grammar file generated by JJTree or null
if either the
* input file or the output directory have not been set.
*/
public File getOutputFile()
{
File outputFile = null;
if ( this.outputDirectory != null && this.inputFile != null )
{
String fileName = FileUtils.removeExtension( this.inputFile.getName() ) + ".jj";
outputFile = new File( this.outputDirectory, fileName );
}
return outputFile;
}
/**
* Sets the option GRAMMAR_ENCODING.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setGrammarEncoding( String value )
{
this.grammarEncoding = value;
}
/**
* Sets the option JDK_VERSION.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setJdkVersion( String value )
{
this.jdkVersion = value;
}
/**
* Sets the option STATIC.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setStatic( Boolean value )
{
this.isStatic = value;
}
/**
* Sets the option value BUILD_NODE_FILES.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setBuildNodeFiles( Boolean value )
{
this.buildNodeFiles = value;
}
/**
* Sets the option value NODE_DIRECTORY.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeDirectory( File value )
{
this.nodeDirectory = value;
}
/**
* Sets the option value MULTI.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setMulti( Boolean value )
{
this.multi = value;
}
/**
* Sets the option value NODE_DEFAULT_VOID.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeDefaultVoid( Boolean value )
{
this.nodeDefaultVoid = value;
}
/**
* Sets the option value NODE_CLASS.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeClass( String value )
{
this.nodeClass = value;
}
/**
* Sets the option value NODE_FACTORY.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeFactory( String value )
{
this.nodeFactory = value;
}
/**
* Sets the option value NODE_PACKAGE.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodePackage( String value )
{
this.nodePackage = value;
}
/**
* Sets the option value NODE_PREFIX.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodePrefix( String value )
{
this.nodePrefix = value;
}
/**
* Sets the option value NODE_SCOPE_HOOK.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeScopeHook( Boolean value )
{
this.nodeScopeHook = value;
}
/**
* Sets the option value NODE_USES_PARSER.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setNodeUsesParser( Boolean value )
{
this.nodeUsesParser = value;
}
/**
* Sets the option value TRACK_TOKENS.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setTrackTokens( Boolean value )
{
this.trackTokens = value;
}
/**
* Sets the option value VISITOR.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setVisitor( Boolean value )
{
this.visitor = value;
}
/**
* Sets the option value VISITOR_DATA_TYPE.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setVisitorDataType( String value )
{
this.visitorDataType = value;
}
/**
* Sets the option value VISITOR_RETURN_TYPE.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setVisitorReturnType( String value )
{
this.visitorReturnType = value;
}
/**
* Sets the option value VISITOR_EXCEPTION.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setVisitorException( String value )
{
this.visitorException = value;
}
/**
* Sets the option CODE_GENERATOR.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setCodeGenerator( String value )
{
this.codeGenerator = value;
}
/**
* Sets the option OUTPUT_LANGUAGE.
*
* @param value The option value, may be null
to use the value provided in the grammar or the default.
*/
public void setOutputLanguage( String value )
{
this.ouputLanguage = value;
}
/**
* {@inheritDoc}
*/
protected int execute()
throws Exception
{
String[] args = generateArguments();
if ( this.outputDirectory != null && !this.outputDirectory.exists() )
{
this.outputDirectory.mkdirs();
}
org.javacc.jjtree.JJTree jjtree = new org.javacc.jjtree.JJTree();
return jjtree.main( args );
}
/**
* Assembles the command line arguments for the invocation of JJTree according to the configuration.
* Note: To prevent conflicts with JavaCC options that might be set directly in the grammar file,
* only those parameters that have been explicitly set are passed on the command line.
*
* @return A string array that represents the arguments to use for JJTree.
*/
private String[] generateArguments()
{
List argsList = new ArrayList();
if ( StringUtils.isNotEmpty( this.grammarEncoding ) )
{
argsList.add( "-GRAMMAR_ENCODING=" + this.grammarEncoding );
}
if ( StringUtils.isNotEmpty( jdkVersion ) )
{
argsList.add( "-JDK_VERSION=" + this.jdkVersion );
}
if ( this.buildNodeFiles != null )
{
argsList.add( "-BUILD_NODE_FILES=" + this.buildNodeFiles );
}
if ( this.nodeDirectory != null )
{
argsList.add( "-NODE_DIRECTORY=" + this.nodeDirectory.getPath());
}
if ( this.multi != null )
{
argsList.add( "-MULTI=" + this.multi );
}
if ( this.nodeDefaultVoid != null )
{
argsList.add( "-NODE_DEFAULT_VOID=" + this.nodeDefaultVoid );
}
if ( StringUtils.isNotEmpty( this.nodeClass ) )
{
argsList.add( "-NODE_CLASS=" + this.nodeClass );
}
if ( StringUtils.isNotEmpty( this.nodeFactory ) )
{
argsList.add( "-NODE_FACTORY=" + this.nodeFactory );
}
if ( StringUtils.isNotEmpty( this.nodePackage ) )
{
argsList.add( "-NODE_PACKAGE=" + this.nodePackage );
}
if ( StringUtils.isNotEmpty( this.nodePrefix ) )
{
argsList.add( "-NODE_PREFIX=" + this.nodePrefix );
}
if ( this.nodeScopeHook != null )
{
argsList.add( "-NODE_SCOPE_HOOK=" + this.nodeScopeHook );
}
if ( this.nodeUsesParser != null )
{
argsList.add( "-NODE_USES_PARSER=" + this.nodeUsesParser );
}
if ( this.isStatic != null )
{
argsList.add( "-STATIC=" + this.isStatic );
}
if ( this.trackTokens != null )
{
argsList.add( "-TRACK_TOKENS=" + this.trackTokens );
}
if ( this.visitor != null )
{
argsList.add( "-VISITOR=" + this.visitor );
}
if ( StringUtils.isNotEmpty( this.visitorDataType ) )
{
argsList.add( "-VISITOR_DATA_TYPE=" + this.visitorDataType );
}
if ( StringUtils.isNotEmpty( this.visitorReturnType ) )
{
argsList.add( "-VISITOR_RETURN_TYPE=" + this.visitorReturnType );
}
if ( StringUtils.isNotEmpty( this.visitorException ) )
{
argsList.add( "-VISITOR_EXCEPTION=" + this.visitorException );
}
if ( StringUtils.isNotEmpty( this.codeGenerator ) )
{
argsList.add( "-CODE_GENERATOR=" + this.codeGenerator );
}
if ( StringUtils.isNotEmpty( this.ouputLanguage ) )
{
argsList.add( "-OUTPUT_LANGUAGE=" + this.ouputLanguage );
}
if ( this.outputDirectory != null )
{
argsList.add( "-OUTPUT_DIRECTORY=" + this.outputDirectory.getAbsolutePath() );
}
if ( this.inputFile != null )
{
argsList.add( this.inputFile.getAbsolutePath() );
}
return (String[]) argsList.toArray( new String[argsList.size()] );
}
/**
* Gets a string representation of the command line arguments.
*
* @return A string representation of the command line arguments.
*/
public String toString()
{
return Arrays.asList( generateArguments() ).toString();
}
}