blob: c43042fa26bf956d52574be63bdb51da36092a4e [file] [log] [blame]
/*
* 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.
*/
package com.adobe.ac.cpd.commandline;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sourceforge.pmd.PMDException;
import net.sourceforge.pmd.cpd.CPD;
import net.sourceforge.pmd.cpd.FileReporter;
import net.sourceforge.pmd.cpd.Renderer;
import net.sourceforge.pmd.cpd.ReportException;
import net.sourceforge.pmd.cpd.XMLRenderer;
import com.adobe.ac.cpd.FlexLanguage;
import com.adobe.ac.cpd.FlexTokenizer;
import com.adobe.ac.pmd.CommandLineOptions;
import com.adobe.ac.pmd.CommandLineUtils;
import com.adobe.ac.pmd.ICommandLineOptions;
import com.adobe.ac.pmd.LoggerUtils;
import com.adobe.ac.pmd.files.IFlexFile;
import com.adobe.ac.pmd.files.impl.FileUtils;
import com.martiansoftware.jsap.JSAP;
import com.martiansoftware.jsap.JSAPException;
import com.martiansoftware.jsap.JSAPResult;
public final class FlexCPD
{
private static JSAPResult config;
private static final String ENCODING = System.getProperty( "file.encoding" );
private static final Logger LOGGER = Logger.getLogger( FlexCPD.class.getName() );
private static FlexCpdParameters parameters;
public static void main( final String[] args ) throws JSAPException,
URISyntaxException,
IOException,
ReportException,
PMDException
{
new LoggerUtils().loadConfiguration();
startFlexCPD( args );
LOGGER.info( "FlexCPD terminated" );
System.exit( 0 ); // NOPMD
}
static boolean areCommandLineOptionsCorrect( final String[] args ) throws JSAPException
{
final JSAP jsap = new JSAP();
config = parseCommandLineArguments( args,
jsap );
if ( !config.success() )
{
LOGGER.log( Level.SEVERE,
"Usage: java "
+ FlexCPD.class.getName() + " " + jsap.getUsage() );
}
return config.success();
}
static String getParameterValue( final ICommandLineOptions option )
{
return config.getString( option.toString() );
}
static boolean startFlexCPD( final String[] args ) throws JSAPException,
URISyntaxException,
IOException,
ReportException,
PMDException
{
if ( areCommandLineOptionsCorrect( args ) )
{
final String minimumTokens = getParameterValue( CpdCommandLineOptions.MINIMUM_TOKENS );
final String source = getParameterValue( CommandLineOptions.SOURCE_DIRECTORY );
final File sourceDirectory = source.contains( "," ) ? null
: new File( source );
final List< File > sourceList = CommandLineUtils.computeSourceList( source );
final File outputDirectory = new File( getParameterValue( CpdCommandLineOptions.OUTPUT_FILE ) );
parameters = new FlexCpdParameters( outputDirectory,
minimumTokens == null ? FlexTokenizer.DEFAULT_MINIMUM_TOKENS
: Integer.valueOf( minimumTokens ),
sourceDirectory,
sourceList );
LOGGER.info( "Starting run, minimumTokenCount is "
+ parameters.getMinimumTokenCount() );
LOGGER.info( "Tokenizing files" );
final CPD cpd = new CPD( parameters.getMinimumTokenCount(), new FlexLanguage() );
cpd.setEncoding( ENCODING );
tokenizeFiles( cpd );
LOGGER.info( "Starting to analyze code" );
final long timeTaken = analyzeCode( cpd );
LOGGER.info( "Done analyzing code; that took "
+ timeTaken + " milliseconds" );
LOGGER.info( "Generating report" );
report( cpd );
}
return config.success();
}
private static long analyzeCode( final CPD cpd )
{
final long start = System.currentTimeMillis();
cpd.go();
final long stop = System.currentTimeMillis();
return stop
- start;
}
private static JSAPResult parseCommandLineArguments( final String[] args,
final JSAP jsap ) throws JSAPException
{
CommandLineUtils.registerParameter( jsap,
CommandLineOptions.SOURCE_DIRECTORY,
true );
CommandLineUtils.registerParameter( jsap,
CpdCommandLineOptions.OUTPUT_FILE,
true );
CommandLineUtils.registerParameter( jsap,
CpdCommandLineOptions.MINIMUM_TOKENS,
false );
CommandLineUtils.registerParameter( jsap,
CommandLineOptions.EXLUDE_PACKAGE,
false );
return jsap.parse( args );
}
private static void report( final CPD cpd ) throws ReportException,
IOException
{
if ( !cpd.getMatches().hasNext() )
{
LOGGER.info( "No duplicates over "
+ parameters.getMinimumTokenCount() + " tokens found" );
}
final Renderer renderer = new XMLRenderer( ENCODING );
if ( !parameters.getOutputFile().exists() )
{
if ( parameters.getOutputFile().createNewFile() == false )
{
LOGGER.warning( "Could not create a new output file" );
}
}
final FileReporter reporter = new FileReporter( parameters.getOutputFile(), ENCODING );
reporter.report( renderer.render( cpd.getMatches() ) );
}
private static void tokenizeFiles( final CPD cpd ) throws IOException,
PMDException
{
final Map< String, IFlexFile > files = FileUtils.computeFilesList( parameters.getSourceDirectory(),
parameters.getSourceList(),
"",
null );
for ( final Entry< String, IFlexFile > fileEntry : files.entrySet() )
{
cpd.add( new File( fileEntry.getValue().getFilePath() ) ); // NOPMD
}
}
private FlexCPD()
{
}
}