org.sourcepit.b2.internal.maven.MavenB2LifecycleParticipant.java Source code

Java tutorial

Introduction

Here is the source code for org.sourcepit.b2.internal.maven.MavenB2LifecycleParticipant.java

Source

/*
 * Copyright 2014 Bernd Vogt and others.
 * 
 * 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.sourcepit.b2.internal.maven;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;

import javax.inject.Inject;
import javax.inject.Named;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.io.DefaultModelReader;
import org.apache.maven.model.io.DefaultModelWriter;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.sourcepit.b2.execution.AbstractB2SessionLifecycleParticipant;
import org.sourcepit.b2.execution.B2Request;
import org.sourcepit.b2.execution.B2SessionLifecycleParticipant;
import org.sourcepit.b2.files.ModuleDirectory;
import org.sourcepit.b2.internal.generator.AbstractPomGenerator;
import org.sourcepit.b2.internal.generator.ModelTemplateMerger;
import org.sourcepit.b2.model.interpolation.layout.LayoutManager;
import org.sourcepit.b2.model.module.AbstractModule;
import org.sourcepit.common.utils.lang.ThrowablePipe;
import org.sourcepit.common.utils.props.LinkedPropertiesMap;
import org.sourcepit.common.utils.props.PropertiesMap;

@Named
public class MavenB2LifecycleParticipant extends AbstractB2SessionLifecycleParticipant
        implements B2SessionLifecycleParticipant {
    @Inject
    private MavenProjectHelper projectHelper;

    @Inject
    private LayoutManager layoutManager;

    @Inject
    private LegacySupport legacySupport;

    public void postPrepareProject(File project, B2Request request, AbstractModule module, ThrowablePipe errors) {
        final ModuleDirectory moduleDirectory = request.getModuleDirectory();
        ModuleDirectory.save(moduleDirectory, newFile(module, "moduleDirectory.properties"));

        final MavenProject bootProject = legacySupport.getSession().getCurrentProject();

        final ModelContext modelContext = ModelContextAdapterFactory.get(bootProject);
        final ResourceSet resourceSet = modelContext.getResourceSet();

        Resource moduleResource = resourceSet.createResource(modelContext.getModuleUri());
        moduleResource.getContents().add(module);
        try {
            moduleResource.save(null);
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }

        final File pomFile = new File(
                module.getAnnotationData(AbstractPomGenerator.SOURCE_MAVEN, AbstractPomGenerator.KEY_POM_FILE));

        bootProject.setContextValue("pom", pomFile);

        PropertiesMap uriMap = new LinkedPropertiesMap();
        for (Entry<URI, URI> entry : resourceSet.getURIConverter().getURIMap().entrySet()) {
            uriMap.put(entry.getKey().toString(), entry.getValue().toString());
        }
        uriMap.store(newFile(module, "uriMap.properties"));

        final URI fileURI = resourceSet.getURIConverter().normalize(modelContext.getModuleUri());
        projectHelper.attachArtifact(bootProject, "module", null, new File(fileURI.toFileString()));

        processAttachments(bootProject, pomFile);
    }

    private File newFile(AbstractModule module, String fileName) {
        final String layoutId = module.getLayoutId();
        File file = new File(layoutManager.getLayout(layoutId).pathOfMetaDataFile(module, fileName));
        return file;
    }

    private void processAttachments(MavenProject wrapperProject, File pomFile) {
        final List<Artifact> attachedArtifacts = wrapperProject.getAttachedArtifacts();
        if (attachedArtifacts == null) {
            return;
        }

        Xpp3Dom artifactsNode = new Xpp3Dom("artifacts");
        for (Artifact artifact : attachedArtifacts) {
            Xpp3Dom artifactNode = new Xpp3Dom("artifact");

            if (artifact.getClassifier() != null) {
                Xpp3Dom classifierNode = new Xpp3Dom("classifier");
                classifierNode.setValue(artifact.getClassifier());
                artifactNode.addChild(classifierNode);
            }

            Xpp3Dom typeNode = new Xpp3Dom("type");
            typeNode.setValue(artifact.getType());
            artifactNode.addChild(typeNode);

            Xpp3Dom fileNode = new Xpp3Dom("file");
            fileNode.setValue(artifact.getFile().getAbsolutePath());
            artifactNode.addChild(fileNode);

            artifactsNode.addChild(artifactNode);
        }

        Xpp3Dom configNode = new Xpp3Dom("configuration");
        configNode.addChild(artifactsNode);

        PluginExecution exec = new PluginExecution();
        exec.setId("b2-attach-artifatcs");
        exec.setPhase("initialize");
        exec.getGoals().add("attach-artifact");
        exec.setConfiguration(configNode);

        Plugin plugin = new Plugin();
        plugin.setGroupId("org.codehaus.mojo");
        plugin.setArtifactId("build-helper-maven-plugin");
        plugin.setVersion("1.7");
        plugin.getExecutions().add(exec);
        plugin.setInherited(false);

        Build build = new Build();
        build.getPlugins().add(plugin);

        Model model = new Model();
        model.setBuild(build);

        final Model moduleModel;
        try {
            moduleModel = new DefaultModelReader().read(pomFile, null);
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }

        new ModelTemplateMerger().merge(moduleModel, model, false, null);
        try {
            new DefaultModelWriter().write(pomFile, null, moduleModel);
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
    }
}