blob: cf5599d5da7aef3837ef533b7b6105ff99a5d34d [file] [log] [blame]
package org.apache.maven.doxia.parser;
/*
* 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.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Properties;
import org.apache.maven.doxia.logging.Log;
import org.apache.maven.doxia.logging.SystemStreamLog;
import org.apache.maven.doxia.macro.Macro;
import org.apache.maven.doxia.macro.MacroExecutionException;
import org.apache.maven.doxia.macro.MacroRequest;
import org.apache.maven.doxia.macro.manager.MacroManager;
import org.apache.maven.doxia.macro.manager.MacroNotFoundException;
import org.apache.maven.doxia.sink.Sink;
import org.codehaus.plexus.component.annotations.Requirement;
/**
* An abstract base class that defines some convenience methods for parsers.
* Provides a macro mechanism to give dynamic functionalities for the parsing.
*
* @author Jason van Zyl
* @version $Id$
* @since 1.0
*/
public abstract class AbstractParser
implements Parser
{
/** Indicates that a second parsing is required. */
private boolean secondParsing = false;
@Requirement
private MacroManager macroManager;
/** Log instance. */
private Log logger;
/**
* Emit Doxia comment events when parsing comments?
*/
private boolean emitComments = true;
private static final String DOXIA_VERSION;
static
{
final Properties props = new Properties();
final InputStream is = AbstractParser.class.getResourceAsStream( "/build-info.properties" );
if ( is == null )
{
props.setProperty( "version", "unknown" ); // should not happen
}
else
{
try
{
props.load( is );
}
catch ( IOException ex )
{
props.setProperty( "version", "unknown" ); // should not happen
}
finally
{
try
{
is.close();
}
catch ( IOException ex )
{
// oh well...
}
}
}
DOXIA_VERSION = props.getProperty( "version" );
}
/** {@inheritDoc} */
public int getType()
{
return UNKNOWN_TYPE;
}
public void setEmitComments( boolean emitComments )
{
this.emitComments = emitComments;
}
public boolean isEmitComments()
{
return emitComments;
}
/**
* Execute a macro on the given sink.
*
* @param macroId An id to lookup the macro.
* @param request The corresponding MacroRequest.
* @param sink The sink to receive the events.
* @throws org.apache.maven.doxia.macro.MacroExecutionException if an error occurred during execution.
* @throws org.apache.maven.doxia.macro.manager.MacroNotFoundException if the macro could not be found.
*/
// Made public right now because of the structure of the APT parser and
// all its inner classes.
public void executeMacro( String macroId, MacroRequest request, Sink sink )
throws MacroExecutionException, MacroNotFoundException
{
Macro macro = getMacroManager().getMacro( macroId );
macro.enableLogging( getLog() );
macro.execute( sink, request );
}
/**
* Returns the current base directory.
*
* @return The base directory.
*
* @deprecated this does not work in multi-module builds, see DOXIA-373
*/
protected File getBasedir()
{
// TODO: This is baaad, it should come in with the request.
// (this is only used for macro requests, see AptParser)
String basedir = System.getProperty( "basedir" );
if ( basedir != null )
{
return new File( basedir );
}
return new File( new File( "" ).getAbsolutePath() );
}
/**
* Convenience method to parse an arbitrary string and emit events into the given sink.
*
* @param string A string that provides the source input.
* @param sink A sink that consumes the Doxia events.
* @throws org.apache.maven.doxia.parser.ParseException if the string could not be parsed.
* @since 1.1
*/
public void parse( String string, Sink sink )
throws ParseException
{
parse( new StringReader( string ), sink );
}
@Override
public void parse( Reader source, Sink sink, String reference )
throws ParseException
{
parse( source, sink );
}
/**
* Set <code>secondParsing</code> to true, if we need a second parsing.
*
* @param second True for second parsing.
*/
public void setSecondParsing( boolean second )
{
this.secondParsing = second;
}
/**
* Indicates if we are currently parsing a second time.
*
* @return true if we are currently parsing a second time.
* @since 1.1
*/
protected boolean isSecondParsing()
{
return secondParsing;
}
/** {@inheritDoc} */
public void enableLogging( Log log )
{
this.logger = log;
}
/**
* Returns the current logger for this parser.
* If no logger has been configured yet, a new SystemStreamLog is returned.
*
* @return Log
* @since 1.1
*/
protected Log getLog()
{
if ( logger == null )
{
logger = new SystemStreamLog();
}
return logger;
}
/**
* Gets the current {@link MacroManager}.
*
* @return The current {@link MacroManager}.
* @since 1.1
*/
protected MacroManager getMacroManager()
{
return macroManager;
}
/**
* Initialize the parser. This is called first by
* {@link #parse(java.io.Reader, org.apache.maven.doxia.sink.Sink)} and can be used
* to set the parser into a clear state so it can be re-used.
*
* @since 1.1.2
*/
protected void init()
{
// nop
}
/**
* The current Doxia version.
*
* @return the current Doxia version as a String.
*
* @since 1.2
*/
protected static String doxiaVersion()
{
return DOXIA_VERSION;
}
}