/*
* 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 org.apache.tuscany.sca.tools.ant.generator.plugin;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.model.FileSet;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.util.xml.Xpp3Dom;
/**
* A Maven plugin that generates an Ant build.xml file for Tuscany SCA samples.
*
* Build dependencies and additional build steps like WSDL2Java for example are
* automatically determined from the pom.xml file describing the module's Maven build.
*
* @version $Rev$ $Date$
* @goal generate
* @phase generate-sources
* @requiresDependencyResolution test
* @description Generate Ant build script for an SCA project
*/
public class AntGeneratorMojo extends AbstractMojo {
/**
* The project to generate an Ant build for.
*
* @parameter expression="${project}"
* @required
*/
private MavenProject project;
/**
* Used for resolving artifacts
*
* @component
*/
private ArtifactResolver resolver;
/**
* Factory for creating artifact objects
*
* @component
*/
private ArtifactFactory factory;
/**
* The local repository where the artifacts are located
*
* @parameter expression="${localRepository}"
* @required
*/
private ArtifactRepository localRepository;
/**
* The remote repositories where artifacts are located
*
* @parameter expression="${project.remoteArtifactRepositories}"
*/
private List remoteRepositories;
/**
* The current user system settings for use in Maven.
*
* @parameter expression="${settings}"
* @required
* @readonly
*/
private Settings settings;
/**
* The main class name.
* @parameter
*/
private String mainClass;
/**
* If set true then only the dependency file is created. The dependency
* file can then be included in a hand generated build.xml file
* @parameter
*/
private Boolean buildDependencyFileOnly;
/**
* The build.xml file to generate.
* @parameter expression="${basedir}/build.xml"
*/
private String buildFile;
/**
* The build-dependency.xml file to generate.
* @parameter expression="${basedir}/build-dependency.xml"
*/
private String buildDependencyFile;
public void execute() throws MojoExecutionException {
if ((buildDependencyFileOnly != null) &&
(buildDependencyFileOnly == true)){
generateBuildDependencyFile();
} else {
generateBuildFile();
}
}
/**
* Generate Ant build dependency XML file
*/
private void generateBuildDependencyFile() throws MojoExecutionException {
getLog().info("Generating " + buildDependencyFile);
// Open the target build-dependency.xml file
File targetFile = new File(buildDependencyFile);
PrintWriter pw;
try {
pw = new PrintWriter(new FileOutputStream(targetFile));
} catch (FileNotFoundException e) {
throw new MojoExecutionException(e.toString());
}
// Generate the Apache license header
generateLicenseHeader(pw);
// Generate Ant filesets representing the build dependencies
generateBuildDependencies(pw);
pw.close();
}
/**
* Generate Ant build XML file
*/
private void generateBuildFile() throws MojoExecutionException {
getLog().info("Generating " + buildFile);
// Open the target build.xml file
File targetFile = new File(buildFile);
PrintWriter pw;
try {
pw = new PrintWriter(new FileOutputStream(targetFile));
} catch (FileNotFoundException e) {
throw new MojoExecutionException(e.toString());
}
// Determine the project packaging
String packaging = project.getPackaging().toLowerCase();
// Generate the Apache license header
generateLicenseHeader(pw);
pw.println("");
pw.println();
// Generate the compile target
int base = project.getBasedir().toString().length() + 1;
pw.println(" ");
pw.println(" ");
// Generate any pre-compilation tasks
generatePreCompileTasks(pw);
// Generate the compile task
pw.println(" ");
for (String source: (List)project.getCompileSourceRoots()) {
if (source.length() > base) {
source = source.substring(base);
} else {
source = ".";
}
pw.println(" ");
}
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
for (FileSet resource: (List)project.getResources()) {
String source = resource.getDirectory();
if (source.length() > base) {
source = source.substring(base);
if (source.equals(".")){
pw.println(" ");
} else {
pw.println(" ");
}
} else {
if (project.getResources().size() > 1) {
break;
}
pw.println(" ");
source = ".";
}
}
pw.println(" ");
// Build a JAR
if (packaging.equals("jar")) {
pw.println(" ");
pw.println(" ");
if (mainClass != null) {
pw.println(" ");
}
pw.println(" ");
pw.println(" ");
} else if (packaging.equals("war")) {
// Build a WAR
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
}
pw.println(" ");
pw.println();
// Generate a package target alongside the compile target
// Tuscany SCA samples use "package" as the target for webapps
pw.println(" ");
pw.println();
// Generate the run target
if (mainClass != null) {
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println();
}
// Generate the clean target
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println(" ");
pw.println();
// Generate Ant filesets representing the build dependencies
generateBuildDependencies(pw);
pw.println("");
pw.close();
}
/**
* Generate Ant filesets representing the build dependencies.
* @param pw PrintWriter to write to
*/
private void generateBuildDependencies(PrintWriter pw) {
// Determine the module dependencies
List tuscanyModules = new ArrayList();
List otherModules = new ArrayList();
for (Artifact artifact: (List)project.getRuntimeArtifacts()) {
if (artifact.getGroupId().startsWith("org.apache.tuscany.sca")) {
tuscanyModules.add(artifact.getFile().getName());
} else {
otherModules.add(artifact.getFile().getName());
}
}
// Sort lists of modules, making output deterministic
Collections.sort(tuscanyModules);
Collections.sort(otherModules);
// Generate filesets for the tuscany and 3rd party dependencies
pw.println(" ");
for (String name: tuscanyModules) {
pw.println(" ");
}
pw.println(" ");
pw.println(" ");
for (String name: otherModules) {
pw.println(" ");
}
pw.println(" ");
pw.println();
}
/**
* Extract plugin execution configurations out of the Maven model. This handles
* nested configurations with a base configuration and a collection of nested
* configuration elements, for example:
*
*
*
* x.wsdl
*
*
* y.wsdl
*
*
* true
*
*
* @param execution Maven plugin execution model
* @return a list of maps containing the plugin configuration key value pairs
*/
private static List