blob: 83c2e1734c9fb3e696d5f11f0f1a6567ecbd84f4 [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 npanday.packaging;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import npanday.PlatformUnsupportedException;
import npanday.msbuild.xdt.XmlDocumentTransformException;
import npanday.msbuild.xdt.XmlDocumentTransformer;
import npanday.vendor.VendorRequirement;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Common configuration file handling for the various packaging formats/mojos.
*
* @author <a href="mailto:lcorneliussen@apache.org">Lars Corneliussen</a>
* @plexus.component role="npanday.packaging.ConfigFileHandler"
*/
public class ConfigFileHandler
extends AbstractLogEnabled
{
public static final String[] DEFAULT_EXCLUDES = new String[]{ "pom.xml" };
/**
* @plexus.requirement
*/
private XmlDocumentTransformer xdt;
private File workingFolder;
public void setWorkingFolder( File workingFolder )
{
this.workingFolder = workingFolder;
}
/**
* Will either transform or copy the selected config file.
*/
public void handleConfigFile(
VendorRequirement vendorRequirement, File sourceConfigFile, String transformationHint, File targetConfigFile ) throws MojoFailureException
{
xdt.setWorkingFolder(workingFolder);
if ( !sourceConfigFile.exists() )
{
getLogger().warn( "NPANDAY-133-001: The configuration file '" + sourceConfigFile + "' couldn't be found" );
return;
}
File transformationFile = null;
final String sourceConfigFileName = sourceConfigFile.getName();
if ( transformationHint != null )
{
int extensionStart = sourceConfigFileName.lastIndexOf( "." );
String transformationFileName =
sourceConfigFileName.substring( 0, extensionStart ) + "." + transformationHint
+ sourceConfigFileName.substring( extensionStart );
final File probingFile = new File( sourceConfigFile.getParentFile(), transformationFileName );
if ( probingFile.exists() )
{
getLogger().debug(
"NPANDAY-133-006: Found transformation file for " + sourceConfigFileName + ": "
+ probingFile.getAbsolutePath()
);
transformationFile = probingFile;
}
else
{
getLogger().warn(
"NPANDAY-133-007: Could not find transformation file for " + sourceConfigFileName + "; tried: "
+ probingFile.getAbsolutePath()
);
}
}
if ( transformationFile != null )
{
getLogger().info(
"NPANDAY-133-004: Transforming " + sourceConfigFileName + " with " + transformationFile
+ " for packaging"
);
try
{
getLogger().debug(
"NPANDAY-133-002: Copying config file '" + sourceConfigFile + "' to '" + targetConfigFile + "'"
);
xdt.transform( vendorRequirement, sourceConfigFile, transformationFile, targetConfigFile );
}
catch ( PlatformUnsupportedException e )
{
throw new MojoFailureException(
"NPANDAY-133-008: Unable to transform config file '" + sourceConfigFile + "'", e
);
}
catch ( XmlDocumentTransformException e )
{
throw new MojoFailureException(
"NPANDAY-133-009: Unable to transform config file '" + sourceConfigFile + "'", e
);
}
}
else
{
getLogger().info( "NPANDAY-133-005: Copying " + sourceConfigFileName + " for packaging" );
try
{
getLogger().debug(
"NPANDAY-133-010: Copying config file '" + sourceConfigFile + "' to '" + targetConfigFile + "'"
);
FileUtils.copyFile( sourceConfigFile, targetConfigFile );
}
catch ( IOException e )
{
throw new MojoFailureException(
"NPANDAY-133-011: Unable to copy config file '" + sourceConfigFile + "' to '" + targetConfigFile
+ "'"
);
}
}
}
public void handleConfigFiles(
VendorRequirement vendorRequirement, File baseDir, String[] includes, String[] excludes, String transformationHint, File targetFolder ) throws
MojoFailureException
{
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( baseDir );
scanner.setIncludes( includes );
scanner.setCaseSensitive( false );
List<String> excludesList = Lists.newArrayList(excludes);
excludesList.addAll( Lists.newArrayList( DEFAULT_EXCLUDES ) );
scanner.setExcludes( excludesList.toArray( new String[0] ) );
getLogger().debug(
"NPANDAY-133-012: Config file includes: " + Lists.newArrayList( includes )
);
getLogger().debug(
"NPANDAY-133-013: Config file excludes: " + excludes
);
scanner.scan();
for ( String configFilePath : scanner.getIncludedFiles() )
{
File configFile = new File( baseDir, configFilePath );
if ( isTransformationFile( configFile ) )
{
getLogger().debug(
"NPANDAY-133-014: Skipped file, because it seems to be a transformation: "
+ configFile.getName()
);
continue;
}
final File targetConfigFile = new File( targetFolder, configFilePath );
// clone vendorRequirement as it gets mutated, which isn't good for loop
VendorRequirement vr = new VendorRequirement(vendorRequirement.getVendor(),
vendorRequirement.getVendorVersion(), vendorRequirement.getFrameworkVersion());
// TODO: should pass in the wohle list and amend the file to minimise the number of msbuild invocations
handleConfigFile(
vr, configFile, transformationHint, targetConfigFile
);
}
}
private Splitter SPLIT_ON_DOTS = Splitter.on( '.' );
private Joiner JOIN_WITH_DOTS = Joiner.on( '.' );
public boolean isTransformationFile( File filePath )
{
String fileName = filePath.getName();
List<String> parts = Lists.newArrayList( SPLIT_ON_DOTS.split( fileName ) );
if (parts.size() < 3)
return false;
// remove the transformation hint between name and extension
parts.remove( parts.size()-2 );
// and check if a target file exists
if (new File( filePath.getParent(), JOIN_WITH_DOTS.join( parts ) ).exists())
return true;
return false;
}
}