/*
* Copyright 2005 The Apache Software Foundation.
*
* 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.
*/
package org.apache.maven.plugin.verifier;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.maven.plugin.AbstractPlugin;
import org.apache.maven.plugin.PluginExecutionException;
import org.apache.maven.plugin.verifier.model.Verifications;
import org.apache.maven.plugin.verifier.model.io.xpp3.VerificationsXpp3Reader;
/**
* TODO: Bind to an itest phase when it exists
* @goal verify
* @phase test
* @description verifies existence or non-existence of files/directories an optionally checks
* file content against a regexp
* @parameter name="verificationFile" type="java.io.File" required="true" validator=""
* expression="${basedir}/src/test/verifier/verifications.xml" description=""
* @parameter name="basedir" type="String" required="true" validator=""
* expression="${basedir}" description=""
* @parameter name="failOnError" type="boolean" required="true" validator=""
* expression="true" description=""
*
* @author Vincent Massol
* @version $Id: $
*/
public class VerifierMojo
extends AbstractPlugin
{
private String basedir;
private File verificationFile;
private boolean failOnError;
private VerificationResultPrinter resultPrinter = new ConsoleVerificationResultPrinter( getLog() );
public void execute()
throws PluginExecutionException
{
VerificationResult results = verify();
this.resultPrinter.print( results );
// Fail the build if there are errors
if ( this.failOnError && results.hasFailures() )
{
throw new PluginExecutionException( "There are test failures" );
}
}
/**
* @param file the file path of the file to check (can be relative or absolute). If relative
* the project's basedir will be prefixed.
* @return the absolute file path of the file to check
*/
protected File getAbsoluteFileToCheck( File file )
{
File result = file;
if ( !file.isAbsolute() )
{
result = new File( new File( this.basedir ), file.getPath() );
}
return result;
}
private VerificationResult verify()
throws PluginExecutionException
{
VerificationResult results = new VerificationResult();
try
{
Reader reader = new FileReader( this.verificationFile );
try
{
VerificationsXpp3Reader xppReader = new VerificationsXpp3Reader();
Verifications verifications = xppReader.read( reader );
for ( Iterator i = verifications.getFiles().iterator(); i.hasNext(); )
{
org.apache.maven.plugin.verifier.model.File file = (org.apache.maven.plugin.verifier.model.File) i
.next();
// Transform the file to check into an absolute path prefixing the basedir if
// the location is relative
if ( file.getLocation() != null )
{
file.setLocation( getAbsoluteFileToCheck( new File( file.getLocation() ) ).getPath() );
verifyFile( file, results );
}
else
{
throw new PluginExecutionException( "Missing element" );
}
}
}
finally
{
reader.close();
}
}
catch ( Exception e )
{
throw new PluginExecutionException( "Error while verifying files", e );
}
return results;
}
private boolean verifyFile( org.apache.maven.plugin.verifier.model.File fileCheck, VerificationResult results )
throws Exception
{
boolean result;
result = verifyFileExistence( fileCheck, results );
if ( result && fileCheck.getContains() != null )
{
result = result && verifyFileContent( fileCheck, results );
}
return result;
}
private String readFileInMemory( File file )
throws Exception
{
StringBuffer memoryFile = new StringBuffer();
Reader reader = new FileReader( file );
char[] buffer = new char[16384];
int count;
while ( -1 != reader.read( buffer ) )
{
memoryFile.append( buffer );
}
reader.close();
return memoryFile.toString();
}
private boolean verifyFileContent( org.apache.maven.plugin.verifier.model.File fileCheck, VerificationResult results )
throws Exception
{
boolean result = false;
Pattern pattern = Pattern.compile( fileCheck.getContains() );
// Note: Very inefficient way as we load the whole file in memory. If you have a better
// idea, please submit it!
Matcher matcher = pattern.matcher( readFileInMemory( new File( fileCheck.getLocation() ) ) );
if ( matcher.find() )
{
result = true;
}
else
{
results.addContentFailure( fileCheck );
}
return result;
}
private boolean verifyFileExistence( org.apache.maven.plugin.verifier.model.File fileCheck,
VerificationResult results )
{
boolean result = false;
File physicalFile = new File( fileCheck.getLocation() );
if ( fileCheck.isExists() )
{
result = physicalFile.exists();
if ( !result )
{
results.addExistenceFailure( fileCheck );
}
}
else
{
result = !physicalFile.exists();
if ( !result )
{
results.addNonExistenceFailure( fileCheck );
}
}
return result;
}
public void setBaseDir( String basedir )
{
this.basedir = basedir;
}
public void setVerificationFile( File file )
{
this.verificationFile = file;
}
public void setVerificationResultPrinter( VerificationResultPrinter printer )
{
this.resultPrinter = printer;
}
public void setFailOnError( boolean failOnError )
{
this.failOnError = failOnError;
}
}