/* ==========================================================================
* Copyright 2003-2004 Mevenide Team
*
* 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.codehaus.mojo.nbm;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.StringInputStream;
import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.types.FileSet;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.io.InputStreamFacade;
/**
* Create the Netbeans module clusters from reactor
* @author <a href="mailto:mkleint@codehaus.org">Milos Kleint</a>
* @goal cluster
* @aggregator
* @requiresDependencyResolution runtime
*
*/
public class CreateClusterMojo
extends AbstractNbmMojo
{
/**
* directory where the the netbeans cluster will be created.
* @parameter default-value="${project.build.directory}/netbeans_clusters"
* @required
*/
protected File nbmBuildDir;
/**
* default cluster value for reactor projects without cluster information,
* typically OSGi bundles
* @parameter default-value="extra"
* @since 3.2
*/
private String defaultCluster;
/**
* If the executed project is a reactor project, this will contains the full list of projects in the reactor.
*
* @parameter expression="${reactorProjects}"
* @required
* @readonly
*/
private List<MavenProject> reactorProjects;
public void execute() throws MojoExecutionException, MojoFailureException
{
Project antProject = registerNbmAntTasks();
if ( !nbmBuildDir.exists() )
{
nbmBuildDir.mkdirs();
}
if ( reactorProjects != null && reactorProjects.size() > 0 )
{
for ( MavenProject proj : reactorProjects )
{
//TODO how to figure where the the buildDir/nbm directory is
File nbmDir = new File( proj.getBasedir(),
"target" + File.separator + "nbm" + File.separator + "netbeans" );
if ( nbmDir.exists() )
{
Copy copyTask = (Copy) antProject.createTask( "copy" );
copyTask.setTodir( nbmBuildDir );
copyTask.setOverwrite( true );
FileSet set = new FileSet();
set.setDir( nbmDir );
set.createInclude().setName( "**" );
copyTask.addFileset( set );
try
{
copyTask.execute();
} catch ( BuildException ex )
{
getLog().error( "Cannot merge modules into cluster" );
throw new MojoExecutionException(
"Cannot merge modules into cluster", ex );
}
} else
{
if ( "nbm".equals( proj.getPackaging() ) )
{
String error = "The NetBeans binary directory structure for " + proj.getId() + " is not created yet." +
"\n Please execute 'mvn install nbm:cluster' to build all relevant projects in the reactor.";
throw new MojoFailureException( error );
}
if ("bundle".equals( proj.getPackaging() ))
{
Artifact art = proj.getArtifact();
ExamineManifest mnf = new ExamineManifest( getLog() );
File jar = new File(proj.getBuild().getDirectory(), proj.getBuild().getFinalName() + ".jar");
if ( !jar.exists() )
{
getLog().error( "Skipping " + proj.getId() + ". Cannot find the main artifact in output directory.");
continue;
}
mnf.setJarFile( jar );
mnf.checkFile();
File cluster = new File(nbmBuildDir, defaultCluster);
getLog().debug( "Copying " + art.getId() + " to cluster " + defaultCluster );
File modules = new File(cluster, "modules");
modules.mkdirs();
File config = new File(cluster, "config");
File confModules = new File(config, "Modules");
confModules.mkdirs();
File updateTracting = new File(cluster, "update_tracking");
updateTracting.mkdirs();
final String cnb = mnf.getModule();
final String cnbDashed = cnb.replace( ".", "-");
final File moduleArt = new File(modules, cnbDashed + ".jar" ); //do we need the file in some canotical name pattern?
final String specVer = mnf.getSpecVersion();
try
{
FileUtils.copyFile( jar, moduleArt );
final File moduleConf = new File(confModules, cnbDashed + ".xml");
FileUtils.copyStreamToFile( new InputStreamFacade() {
public InputStream getInputStream() throws IOException
{
return new StringInputStream( CreateClusterAppMojo.createBundleConfigFile(cnb), "UTF-8");
}
}, moduleConf);
FileUtils.copyStreamToFile( new InputStreamFacade() {
public InputStream getInputStream() throws IOException
{
return new StringInputStream( CreateClusterAppMojo.createBundleUpdateTracking(cnb, moduleArt, moduleConf, specVer), "UTF-8");
}
}, new File(updateTracting, cnbDashed + ".xml"));
}
catch ( IOException exc )
{
getLog().error( exc );
}
}
}
}
//in 6.1 the rebuilt modules will be cached if the timestamp is not touched.
File[] files = nbmBuildDir.listFiles();
for ( int i = 0; i < files.length; i++ )
{
if ( files[i].isDirectory() )
{
File stamp = new File( files[i], ".lastModified" );
if ( !stamp.exists() )
{
try
{
stamp.createNewFile();
} catch ( IOException ex )
{
ex.printStackTrace();
}
}
stamp.setLastModified( new Date().getTime() );
}
}
getLog().info(
"Created NetBeans module cluster(s) at " + nbmBuildDir );
} else
{
throw new MojoExecutionException(
"This goal only makes sense on reactor projects." );
}
}
}