Package fr.imag.adele.apam.maven.plugin

Source Code of fr.imag.adele.apam.maven.plugin.ACRInstallMojo

/**
* 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);
    }


}
TOP

Related Classes of fr.imag.adele.apam.maven.plugin.ACRInstallMojo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.