/**
* Copyright (c) 2014 Takari, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package io.takari.maven.plugins.resources;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import io.takari.incrementalbuild.BuildContext;
import io.takari.incrementalbuild.Incremental;
import io.takari.incrementalbuild.Incremental.Configuration;
import io.takari.maven.plugins.TakariLifecycleMojo;
import io.takari.resources.filtering.ResourcesProcessor;
public abstract class AbstractProcessResourcesMojo extends TakariLifecycleMojo {
@Parameter(defaultValue = "${project.properties}")
@Incremental(configuration = Configuration.ignore)
private Properties properties;
@Parameter(defaultValue = "${session.executionProperties}")
@Incremental(configuration = Configuration.ignore)
private Properties sessionProperties;
//
// use explicit reflective properties instead of wider objects like MavenSession or Settings
// this way resources will be properly reprocessed whenever the properties change
//
// oddly, ${localRepository} did not work
@Parameter(defaultValue = "${settings.localRepository}")
@Incremental(configuration = Configuration.ignore)
private File localRepository;
@Parameter(defaultValue = "${session.request.userSettingsFile}")
@Incremental(configuration = Configuration.ignore)
private File userSettingsFile;
@Parameter(property = "encoding", defaultValue = "${project.build.sourceEncoding}")
private String encoding;
@Component
private ResourcesProcessor processor;
@Component
private BuildContext context;
protected void process(List<Resource> resources, File outputDirectory) throws MojoExecutionException {
for (Resource resource : resources) {
boolean filter = Boolean.parseBoolean(resource.getFiltering());
try {
File sourceDirectory = new File(resource.getDirectory());
// Ensure the sourceDirectory is actually present before attempting to process any resources
if (!sourceDirectory.exists()) {
continue;
}
sourceDirectory = sourceDirectory.getCanonicalFile();
File targetDirectory;
if (resource.getTargetPath() != null) {
targetDirectory = new File(outputDirectory, resource.getTargetPath());
} else {
targetDirectory = outputDirectory;
}
if (filter) {
Map<Object, Object> properties = new HashMap<Object, Object>(this.properties);
properties.putAll(sessionProperties); // command line parameters win over project properties
properties.put("project", project);
properties.put("localRepository", localRepository);
properties.put("userSettingsFile", userSettingsFile);
List<File> filters = project.getFilters().stream().map(File::new).collect(Collectors.toList());
processor.process(sourceDirectory, targetDirectory, resource.getIncludes(), resource.getExcludes(), properties, filters, encoding);
} else {
processor.process(sourceDirectory, targetDirectory, resource.getIncludes(), resource.getExcludes(), encoding);
}
} catch (IOException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
}
@Override
protected void skipMojo() throws MojoExecutionException {
context.markSkipExecution();
}
}