org.codehaus.mojo.freeform.analyser.Analyser.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.freeform.analyser.Analyser.java

Source

package org.codehaus.mojo.freeform.analyser;

/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* 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.
*/

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.codehaus.mojo.freeform.FreeformPluginException;
import org.codehaus.mojo.freeform.project.AntTarget;
import org.codehaus.mojo.freeform.project.CustomisedContextMenuItem;
import org.codehaus.mojo.freeform.project.FileViewItem;
import org.codehaus.mojo.freeform.project.FolderViewItem;
import org.codehaus.mojo.freeform.project.FreeformProject;

/**
 * This abstract class is the parent class of all the <packaging>Analysers.
 * <p/>
 * The Analyser purpose is to analyse the projects and repository for
 * creating a FreeformProject object and a List of AntTarget.
 *
 * @author <a href="mailto:raphaelpieroni@gmail.com">Raphal Pironi</a>
 */
public abstract class Analyser {
    /**
     * The local repository of the Maven2 execution.
     */
    protected ArtifactRepository localRepository;

    /**
     * The freeform project that will be created.
     */
    protected FreeformProject freeformProject;

    /**
     * The list of ant targets that will be created.
     */
    protected List antTargets;

    /**
     * The logging system.
     */
    protected Log log;

    /**
     * The maven project resulting of the phase prerequisite.
     */
    protected MavenProject mavenExecutedProject;

    /**
     * The maven project.
     */
    protected MavenProject mavenProject;

    /**
     * The path to the Maven executable.
     */
    protected String mavenpath;

    /**
     * This method role is to create the FreeformProject using
     * the mavenProject, the mavenExecutedProject and the localRepository.
     * <p/>
     * This method must be overrided by each specific <packaging>Analyser.
     *
     * @throws org.codehaus.mojo.freeform.FreeformPluginException
     *          if something goes wrong.
     */
    public final void analyseProject() throws FreeformPluginException {
        analyseProject(false);
    }

    /**
     * This method role is to create the List of AntTarget using
     * the mavenProject, the mavenExecutedProject and the localRepository.
     * <p/>
     * This method must be overrided by each specific <packaging>Analyser.
     *
     * @throws org.codehaus.mojo.freeform.FreeformPluginException
     *          if something goes wrong.
     */
    public final void analyseTargets() throws FreeformPluginException {
        analyseTargets(false);
    }

    /**
     * This method role is to create the FreeformProject using
     * the mavenProject, the mavenExecutedProject and the localRepository.
     * <p/>
     * This method must be overrided by each specific <packaging>Analyser.
     * @param useOutputDirectory whether the project elements contains reference to the project directory or not.
     * @throws org.codehaus.mojo.freeform.FreeformPluginException if something goes wrong.
     */
    public abstract void analyseProject(boolean useOutputDirectory) throws FreeformPluginException;

    /**
     * This method role is to create the List of AntTarget using
     * the mavenProject, the mavenExecutedProject and the localRepository.
     * <p/>
     * This method must be overrided by each specific <packaging>Analyser.
     * @param useOutputDirectory whether the project elements contains reference to the project directory or not.
     * @throws org.codehaus.mojo.freeform.FreeformPluginException if something goes wrong.
     */
    public abstract void analyseTargets(boolean useOutputDirectory) throws FreeformPluginException;

    /**
     * This method gives the <packaging>Analyser associated to the mavenProject
     * packaging. The returned Analyser is injected withe the given parameters.
     *
     * @param mavenProject    The maven project which defines the packaging.
     * @param executedProject The maven prokect resulting of the phases
     *                        prerequisites.
     * @param localRepository The local repository of the Maven2 execution.
     * @param log             The logging system.
     * @param mavenpath       The path to the maven executable.
     * @return the <packaging>Analyser which is the one defined for the
     *         packaging of the given mavenProject.
     */
    public static Analyser getAnalyser(final MavenProject mavenProject, final MavenProject executedProject,
            final ArtifactRepository localRepository, final Log log, final String mavenpath) {
        Analyser analyser = null;

        // choose the <packaging>Analyser for the given project.
        if ((mavenProject.getPackaging() != null) && mavenProject.getPackaging().equalsIgnoreCase("jar")) {
            analyser = new JarAnalyser();
        } else if ((mavenProject.getPackaging() != null)
                && mavenProject.getPackaging().equalsIgnoreCase("maven-plugin")) {
            analyser = new MavenPluginAnalyser();
        } else {
            analyser = new JarAnalyser();
        }

        // inject the mavenProject, the executedProject, the localRepository,
        // the log, and the maven path to the choosen analyser.
        analyser.setMavenProject(mavenProject);
        analyser.setMavenExecutedProject(executedProject);
        analyser.setLocalRepository(localRepository);
        analyser.setLog(log);
        analyser.setMavenPath(mavenpath);

        log.info(analyser + " found");

        return analyser;
    }

    /**
     * The localRepository setter.
     *
     * @param localRepository The ArtifactRepository to be set.
     */
    public void setLocalRepository(final ArtifactRepository localRepository) {
        this.localRepository = localRepository;
    }

    /**
     * The log setter.
     *
     * @param log The Log to be set.
     */
    public void setLog(final Log log) {
        this.log = log;
    }

    /**
     * The mavenExecutedProject setter.
     *
     * @param executedProject The MavenProject to be set.
     */
    public void setMavenExecutedProject(final MavenProject executedProject) {
        this.mavenExecutedProject = executedProject;
    }

    /**
     * The mavenProject setter.
     *
     * @param mavenProject The MavenProject to be set.
     */
    public void setMavenProject(final MavenProject mavenProject) {
        this.mavenProject = mavenProject;
    }

    /**
     * The maven path setter.
     *
     * @param mavenpath The MavenPath to be set.
     */
    public void setMavenPath(final String mavenpath) {
        this.mavenpath = mavenpath;
    }

    /**
     * This method returns the created FreeformProject.
     *
     * @return the created FreeformProject.
     */
    public FreeformProject getProject() {
        return this.freeformProject;
    }

    /**
     * this method returns the created List of AntTargets.
     *
     * @return the created List.
     */
    public List getTargets() {
        return this.antTargets;
    }

    /**
     * This method permits to add some additional actions to the Netbeans
     * context menu.
     *
     * @param actions a list of actions to add. (String encoded)
     * @throws org.codehaus.mojo.freeform.FreeformPluginException
     *          if something goes wrong.
     */
    public void addAdditionalActions(final List actions) throws FreeformPluginException {
        if (this.freeformProject == null) {
            log.error("The project is not analysed");

            throw new FreeformPluginException("The project is not analysed");
        } else {
            Iterator iterator = actions.iterator();

            while (iterator.hasNext()) {
                String action = (String) iterator.next();

                CustomisedContextMenuItem contextMenuItem = new CustomisedContextMenuItem();
                contextMenuItem.setName(action);
                contextMenuItem.setScript("${ant.script}");
                contextMenuItem.addTarget(action);

                this.freeformProject.addContextMenuItem(contextMenuItem);

                log.debug("action" + action + " added");
            }
        }

        log.info("actions added");
    }

    /**
     * This method permits to add some additional files to the Netbeans
     * project view.
     * @param useOutputDirectory whether the project elements contains reference to the project directory or not.
     * @param files a list of files to add. (String encoded)
     * @throws org.codehaus.mojo.freeform.FreeformPluginException if something goes wrong.
     */
    public void addAdditionalFiles(final List files, final boolean useOutputDirectory)
            throws FreeformPluginException {
        if (this.freeformProject == null) {
            log.error("The project is not analysed");

            throw new FreeformPluginException("The project is not analysed");
        } else {
            Iterator iterator = files.iterator();

            while (iterator.hasNext()) {
                String file = (String) iterator.next();

                FileViewItem viewItem = new FileViewItem();
                viewItem.setLabel(file.substring(file.lastIndexOf('/') + 1));
                viewItem.setLocation((useOutputDirectory ? "${project.directory}/" : "") + file);

                this.freeformProject.addViewItem(viewItem);

                log.debug("viewItem" + file + " added");
            }
        }

        log.info("files added");
    }

    /**
     * This method permits to add some additional folders to the Netbeans
     * project view.
     * @param useOutputDirectory whether the project elements contains reference to the project directory or not.
     * @param folders a list of folders to add. (String encoded)
     * @throws org.codehaus.mojo.freeform.FreeformPluginException if something goes wrong.
     */
    public void addAdditionalFolders(final List folders, final boolean useOutputDirectory)
            throws FreeformPluginException {
        if (this.freeformProject == null) {
            log.error("The project is not analysed");

            throw new FreeformPluginException("The project is not analysed");
        } else {
            Iterator iterator = folders.iterator();

            while (iterator.hasNext()) {
                String folder = (String) iterator.next();

                FolderViewItem viewItem = new FolderViewItem();
                viewItem.setLabel(folder);
                viewItem.setLocation((useOutputDirectory ? "${project.directory}/" : "") + folder);
                viewItem.setStyle("tree");

                this.freeformProject.addViewItem(viewItem);

                log.debug("viewItem" + folder + " added");
            }
        }

        log.info("folders added");
    }

    /**
     * This method permits to add some additionnal ant targets to the list
     * of AntTargets.
     *
     * @param targets a list of ant target to add. (String encoded)
     * @throws org.codehaus.mojo.freeform.FreeformPluginException
     *          if something goes wrong.
     */
    public void addAdditionalTargets(final List targets) throws FreeformPluginException {
        if (this.antTargets == null) {
            log.error("The targets are not analysed");

            throw new FreeformPluginException("The targets are not analysed");
        } else {
            Iterator iterator = targets.iterator();

            while (iterator.hasNext()) {
                String target = (String) iterator.next();

                AntTarget antTarget = new AntTarget();
                antTarget.setName(target);
                antTarget.addGoal(target);

                this.antTargets.add(antTarget);

                log.debug("target" + target + " added");
            }
        }

        log.info("targets added");
    }

    /**
     * This method returns the classname of the <packaging>Analyser.
     * This is not the full classname.
     *
     * @return The computed classname.
     */
    public String toString() {
        String fullName = this.getClass().getName();

        return fullName.substring(fullName.lastIndexOf('.') + 1);
    }

    /**
     * The default constructor is set to protected to force the
     * creation of an Analyser object only for use in the getAnalyser method.
     */
    protected void Analyser() {
    }

    /**
     * This method creates an empty FreeformProject.
     * @param useOutputDirectory whether the project elements contains reference to the project directory or not.
     */
    protected void createProject(boolean useOutputDirectory) {
        this.freeformProject = new FreeformProject();
        this.freeformProject.setUseOutputDirectory(useOutputDirectory);
    }

    /**
     * This method creates an empty AntTarget List.
     */
    protected void createTargets() {
        this.antTargets = new ArrayList();
    }

    /**
     * This method computes a relative path given a base directory and
     * an absolute path located in the tree of the basedir.
     *
     * @param basedir      The base directory to compute relative path from.
     * @param absolutePath The absolute path to make relative to the base
     *                     directory.
     * @return The computed relative path.
     */
    protected static String toRelative(final File basedir, final String absolutePath) {
        String relative;

        String path = absolutePath.replace('\\', '/');
        String basedirPath = basedir.getAbsolutePath().replace('\\', '/');

        if (path.startsWith(basedirPath)) {
            relative = path.substring(basedirPath.length() + 1);
        } else {
            relative = path;
        }

        return relative;
    }
}