org.maven.ide.eclipse.wtp.ConnectorProjectConfiguratorDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.maven.ide.eclipse.wtp.ConnectorProjectConfiguratorDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Sonatype, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package org.maven.ide.eclipse.wtp;

import static org.maven.ide.eclipse.wtp.WTPProjectsUtil.removeConflictingFacets;

import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.j2ee.jca.project.facet.ConnectorFacetInstallDataModelProvider;
import org.eclipse.jst.j2ee.jca.project.facet.IConnectorFacetInstallDataModelProperties;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectUtils;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.maven.ide.eclipse.wtp.namemapping.FileNameMappingFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ConnectorProjectConfiguratorDelegate
 *
 * @author Fred Bricon
 */
public class ConnectorProjectConfiguratorDelegate extends AbstractProjectConfiguratorDelegate {

    private static final Logger LOG = LoggerFactory.getLogger(ConnectorProjectConfiguratorDelegate.class);

    public static final ArtifactFilter SCOPE_FILTER_RUNTIME = new ScopeArtifactFilter(Artifact.SCOPE_RUNTIME);

    /* (non-Javadoc)
     * @see org.maven.ide.eclipse.wtp.AbstractProjectConfiguratorDelegate#configure(org.eclipse.core.resources.IProject, org.apache.maven.project.MavenProject, org.eclipse.core.runtime.IProgressMonitor)
     */
    protected void configure(IProject project, MavenProject mavenProject, IProgressMonitor monitor)
            throws CoreException {
        IFacetedProject facetedProject = ProjectFacetsManager.create(project, true, monitor);

        if (facetedProject.hasProjectFacet(WTPProjectsUtil.JCA_FACET)) {
            try {
                facetedProject.modify(
                        Collections.singleton(new IFacetedProject.Action(IFacetedProject.Action.Type.UNINSTALL,
                                facetedProject.getInstalledVersion(WTPProjectsUtil.JCA_FACET), null)),
                        monitor);
            } catch (Exception ex) {
                LOG.error("Error removing JCA facet", ex);
            }
        }

        Set<Action> actions = new LinkedHashSet<Action>();
        installJavaFacet(actions, project, facetedProject);

        RarPluginConfiguration config = new RarPluginConfiguration(mavenProject);

        IFile manifest = null;
        IFolder firstInexistentfolder = null;
        boolean manifestAlreadyExists = false;
        String contentDir = config.getRarContentDirectory(project);

        if (!facetedProject.hasProjectFacet(WTPProjectsUtil.JCA_FACET)) {
            // Configuring content directory, used by WTP to create META-INF/manifest.mf, ra.xml
            IFolder contentFolder = project.getFolder(contentDir);
            manifest = contentFolder.getFile("META-INF/MANIFEST.MF");
            manifestAlreadyExists = manifest.exists();
            if (!manifestAlreadyExists) {
                firstInexistentfolder = findFirstInexistentFolder(project, contentFolder, manifest);
            }

            IDataModel rarModelCfg = DataModelFactory.createDataModel(new ConnectorFacetInstallDataModelProvider());
            rarModelCfg.setProperty(IConnectorFacetInstallDataModelProperties.CONFIG_FOLDER, contentDir);
            //Don't generate ra.xml by default - Setting will be ignored for JCA 1.6
            rarModelCfg.setProperty(IConnectorFacetInstallDataModelProperties.GENERATE_DD, false);

            IProjectFacetVersion connectorFv = config.getConnectorFacetVersion(project);
            removeConflictingFacets(facetedProject, connectorFv, actions);
            actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.INSTALL, connectorFv, rarModelCfg));
        }

        if (!actions.isEmpty()) {
            facetedProject.modify(actions, monitor);
        }

        //MECLIPSEWTP-41 Fix the missing moduleCoreNature
        fixMissingModuleCoreNature(project, monitor);

        if (!config.isJarIncluded()) {
            //project classes won't be jar'ed in the resulting rar.
            removeSourceLinks(project, mavenProject, monitor, "/");
        }
        removeTestFolderLinks(project, mavenProject, monitor, "/");

        String customRaXml = config.getCustomRaXml(project);
        linkFileFirst(project, customRaXml, "META-INF/ra.xml", monitor);

        //Remove "library unavailable at runtime" warning. TODO is it relevant for connector projects?
        setNonDependencyAttributeToContainer(project, monitor);

        if (!manifestAlreadyExists && manifest != null && manifest.exists()) {
            manifest.delete(true, monitor);
        }
        if (firstInexistentfolder != null && firstInexistentfolder.exists()
                && firstInexistentfolder.members().length == 0) {
            firstInexistentfolder.delete(true, monitor);
        }

        IVirtualComponent component = ComponentCore.createComponent(project);
        if (component != null) {
            IPath contentDirPath = new Path("/").append(contentDir);
            WTPProjectsUtil.setDefaultDeploymentDescriptorFolder(component.getRootFolder(), contentDirPath,
                    monitor);
        }

        WTPProjectsUtil.removeWTPClasspathContainer(project);

    }

    private void removeSourceLinks(IProject project, MavenProject mavenProject, IProgressMonitor monitor,
            String folder) throws CoreException {
        IVirtualComponent component = ComponentCore.createComponent(project);
        if (component != null) {
            IVirtualFolder jsrc = component.getRootFolder().getFolder(folder);
            for (IPath location : MavenProjectUtils.getSourceLocations(project,
                    mavenProject.getCompileSourceRoots())) {
                jsrc.removeLink(location, 0, monitor);
            }
            for (IPath location : MavenProjectUtils.getResourceLocations(project, mavenProject.getResources())) {
                jsrc.removeLink(location, 0, monitor);
            }
        }
    }

    /**
     * @see org.maven.ide.eclipse.wtp.IProjectConfiguratorDelegate#setModuleDependencies(org.eclipse.core.resources.IProject, org.apache.maven.project.MavenProject, org.eclipse.core.runtime.IProgressMonitor)
     */
    public void setModuleDependencies(IProject project, MavenProject mavenProject, IProgressMonitor monitor)
            throws CoreException {

        IVirtualComponent rarComponent = ComponentCore.createComponent(project);

        Set<IVirtualReference> newRefs = new LinkedHashSet<IVirtualReference>();

        Set<Artifact> artifacts = mavenProject.getArtifacts();

        //Adding artifact references in .component. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=297777#c1
        for (Artifact artifact : artifacts) {
            ArtifactHelper.fixArtifactHandler(artifact.getArtifactHandler());
            //Don't deploy pom, non runtime or optional dependencies
            if ("pom".equals(artifact.getType()) || !SCOPE_FILTER_RUNTIME.include(artifact)
                    || artifact.isOptional()) {
                continue;
            }

            IMavenProjectFacade workspaceDependency = projectManager.getMavenProject(artifact.getGroupId(),
                    artifact.getArtifactId(), artifact.getVersion());

            if (workspaceDependency != null && !workspaceDependency.getProject().equals(project)
                    && workspaceDependency.getFullPath(artifact.getFile()) != null) {
                //artifact dependency is a workspace project
                IProject depProject = preConfigureDependencyProject(workspaceDependency, monitor);
                if (ModuleCoreNature.isFlexibleProject(depProject)) {
                    newRefs.add(createReference(rarComponent, depProject, artifact));
                }
            } else {
                //artifact dependency should be added as a JEE module, referenced with M2_REPO variable 
                newRefs.add(createReference(rarComponent, artifact));
            }
        }

        IVirtualReference[] newRefsArray = new IVirtualReference[newRefs.size()];
        newRefs.toArray(newRefsArray);

        //Only change the project references if they've changed
        if (hasChanged(rarComponent.getReferences(), newRefsArray)) {
            rarComponent.setReferences(newRefsArray);
        }
    }

    private IVirtualReference createReference(IVirtualComponent rarComponent, IProject project, Artifact artifact) {
        IVirtualComponent depComponent = ComponentCore.createComponent(project);
        IVirtualReference depRef = ComponentCore.createReference(rarComponent, depComponent);
        String deployedFileName = FileNameMappingFactory.getDefaultFileNameMapping().mapFileName(artifact);
        depRef.setArchiveName(deployedFileName);
        return depRef;
    }

    private IVirtualReference createReference(IVirtualComponent rarComponent, Artifact artifact) {
        //Create dependency component, referenced from the local Repo.
        String artifactPath = ArtifactHelper.getM2REPOVarPath(artifact);
        IVirtualComponent depComponent = ComponentCore.createArchiveComponent(rarComponent.getProject(),
                artifactPath);
        return ComponentCore.createReference(rarComponent, depComponent);
    }

}