fr.imag.adele.apam.maven.plugin.ACRInstallMojo.java Source code

Java tutorial

Introduction

Here is the source code for fr.imag.adele.apam.maven.plugin.ACRInstallMojo.java

Source

/**
 * Copyright 2011-2012 Universite Joseph Fourier, LIG, ADELE 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 fr.imag.adele.apam.maven.plugin;

import org.apache.felix.obrplugin.Config;
import org.apache.felix.obrplugin.ObrUpdate;
import org.apache.felix.obrplugin.ObrUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * Install Component Description inside a particular ACR (ApAM Component Repository)
 * (life-cycle goal)
 * This is quite the same as for OBRInstall with maven-bundle repository
 * (which is a final class with private methods sadly, so there's a lot of cut'n paste)
 * ,but does not install in local repository (already done by the real OBRInstall)
 *
 * @goal install
 * @phase package
 */
public final class ACRInstallMojo extends AbstractMojo {

    /**
     * ACR Repository (ApAM Component Repository)
     * used as output (write the current component)
     * @parameter property="outputAcr"
     */
    private String outputAcr;

    /**
     * Project types which this plugin supports.
     *
     * @parameter
     */
    private List<String> supportedProjectTypes = Arrays.asList(new String[] { "jar", "bundle" });

    /**
     * The Maven project.
     *
     * @parameter default-value="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    /**
     * Local Repository.
     *
     * @parameter default-value="${localRepository}"
     * @required
     * @readonly
     */
    private ArtifactRepository localRepository;

    /**
     * Attached source artifact
     */
    private Artifact m_sourceArtifact;

    /**
     * Attached doc artifact
     */
    private Artifact m_docArtifact;

    private static final String DOT_XML = ".xml";
    public static final String REPO_XML = "acr_repository.xml";

    /**
     * @param repository path to specific acr_repository.xml
     * @return URI pointing to correct acr_repository.xml or null
     */
    public static URI getTargetACR(String repository) {
        String targetPath = repository;

        Pattern ignoredNames = Pattern.compile("^(true|false|none|null)?$", Pattern.CASE_INSENSITIVE);

        // Combine location settings into a single repository location
        if (null == targetPath || ignoredNames.matcher(targetPath).matches()) {
            return null;
        } else if (!targetPath.toLowerCase().endsWith(DOT_XML)) {
            targetPath = targetPath + '/' + REPO_XML;
        }

        URI uri;
        try {
            uri = new URI(targetPath);
            uri.toURL(); // check protocol
        } catch (Exception e) {
            uri = null;
        }

        // fall-back to file-system approach
        if (null == uri || !uri.isAbsolute()) {
            try {
                uri = new File(targetPath).getCanonicalFile().toURI();
            } catch (IOException exc) {
                uri = null;
            }
        }
        return uri;
    }

    public void execute() throws MojoExecutionException {
        getLog().info("execute(), outputAcr : " + outputAcr);
        URI repoXML = getTargetACR(outputAcr);

        if (repoXML != null) {
            String projectType = project.getPackaging();

            // ignore unsupported project types, useful when bundleplugin is configured in parent pom
            if (!supportedProjectTypes.contains(projectType)) {
                getLog().warn("Ignoring project type " + projectType + " - supportedProjectTypes = "
                        + supportedProjectTypes);
                return;
            }

            String repoPath = outputAcr;
            if (repoPath.toLowerCase().endsWith(DOT_XML)) {
                repoPath = repoPath.substring(0, repoPath.lastIndexOf('/'));
            }

            // check for any attached sources or docs
            Log log = getLog();
            ObrUpdate update;

            try {

                URI acrXmlFile = ObrUtils.findObrXml(project);

                Config userConfig = new Config();

                update = new ObrUpdate(repoXML, acrXmlFile, project, repoPath, userConfig, log);
                update.parseRepositoryXml();

                updateLocalBundleMetadata(project.getArtifact(), update);

                update.writeRepositoryXml();
            } catch (Exception e) {
                log.warn("Exception while updating ACR : " + e.getLocalizedMessage(), e);
            }

        } else {
            getLog().info(
                    "No output ACR specified and local ACR update disabled or incorrect (enable with -DoutputAcr),"
                            + " outputAcr = " + outputAcr);
            return;
        }

    }

    private void updateLocalBundleMetadata(Artifact artifact, ObrUpdate update) throws MojoExecutionException {
        if (!supportedProjectTypes.contains(artifact.getType())) {
            return;
        } else if (null == artifact.getFile() || artifact.getFile().isDirectory()) {
            getLog().error("No artifact found, try \"mvn install apam:install\"");
            return;
        }

        URI bundleJar = ObrUtils.getArtifactURI(localRepository, artifact);

        URI sourceJar = null;
        if (null != m_sourceArtifact) {
            sourceJar = ObrUtils.getArtifactURI(localRepository, m_sourceArtifact);
        }

        URI docJar = null;
        if (null != m_docArtifact) {
            docJar = ObrUtils.getArtifactURI(localRepository, m_docArtifact);
        }

        update.updateRepository(bundleJar, sourceJar, docJar);
    }

}