All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.mojo.nbm.CreateClusterMojo Maven / Gradle / Ivy

Go to download

Maven plugin for creating NetBeans modules. It defines a custom lifecycle called "nbm". During packaging, the module JAR is enhanced with NetBeans-specific manifest entries and, along with other required files, packed into a *.nbm file, ready for distribution. Additionally the plugin provides aggregator goals to create an update site or cluster for your module projects.

There is a newer version: 4.1
Show newest version
/* ==========================================================================
 * 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.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
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.mojo.nbm.utils.ExamineManifest;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.io.InputStreamFacade;

/**
 * Create the NetBeans module clusters from reactor.
 * Semi-deprecated; used only for standalone modules and "suites".
 * @author Milos Kleint
 */
@Mojo(name="cluster",aggregator=true, requiresDependencyResolution= ResolutionScope.RUNTIME )
public class CreateClusterMojo
        extends AbstractNbmMojo
{

    /**
     * directory where the the NetBeans cluster will be created.
     */
    @Parameter(defaultValue="${project.build.directory}/netbeans_clusters", required=true)
    protected File nbmBuildDir;

    /**
     * default cluster value for reactor projects without cluster information,
     * typically OSGi bundles
     * @since 3.2
     */
    @Parameter(defaultValue="extra")
    private String defaultCluster;
    /**
     * If the executed project is a reactor project, this will contains the full list of projects in the reactor.
     */
    @Parameter(required=true, readonly=true, property="reactorProjects")
    private List 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();
                        final 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, mnf.isBundleAutoload() ), "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." );
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy