blob: 07d938e8e126ec951d5815f154dfbfb98570c5d7 [file] [log] [blame]
package org.apache.maven.doxia.util;
/*
* 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.
*/
/*
* Originally from org.apache.doxia.module.apt.AptReaderSource. It was modified
* to get unget support
*/
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
import org.apache.maven.doxia.parser.ParseException;
import org.codehaus.plexus.util.IOUtil;
/**
* {@link ByLineSource} default implementation
*
* @version $Id$
*/
public class ByLineReaderSource implements ByLineSource
{
/**
* reader
*/
private LineNumberReader reader;
/**
* current line number
*/
private int lineNumber;
/**
* holds the last line returned by getNextLine()
*/
private String lastLine;
/**
* <code>true</code> if ungetLine() was called and no getNextLine() was
* called
*/
private boolean ungetted = false;
private String name;
/**
* Creates the ByLineReaderSource.
*
* @param in real source :)
*/
public ByLineReaderSource( final Reader in )
{
this( in, "" );
}
public ByLineReaderSource( final Reader in, final String name )
{
this.reader = new LineNumberReader( in );
this.name = name;
this.lineNumber = -1;
}
/** {@inheritDoc} */
public final String getNextLine() throws ParseException
{
if ( reader == null )
{
return null;
}
if ( ungetted )
{
ungetted = false;
return lastLine;
}
String line;
try
{
line = reader.readLine();
if ( line == null )
{
reader.close();
reader = null;
}
else
{
lineNumber = reader.getLineNumber();
}
}
catch ( IOException e )
{
throw new ParseException( e, lineNumber, 0 );
}
lastLine = line;
return line;
}
/** {@inheritDoc} */
public final String getName()
{
return name;
}
/** {@inheritDoc} */
public final int getLineNumber()
{
return lineNumber;
}
/** {@inheritDoc} */
public final void close()
{
IOUtil.close( reader );
reader = null;
}
/** {@inheritDoc} */
public final void ungetLine()
{
if ( ungetted )
{
throw new IllegalStateException( "we support only one level of ungetLine()" );
}
ungetted = true;
}
/** {@inheritDoc} */
public final void unget( final String s )
{
if ( s == null )
{
throw new IllegalArgumentException( "argument can't be null" );
}
if ( s.length() != 0 )
{
ungetLine();
lastLine = s;
}
}
}