org.jboss.tools.maven.cdi.configurators.CDIProjectConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.maven.cdi.configurators.CDIProjectConfigurator.java

Source

/*************************************************************************************
 * Copyright (c) 2008-2011 Red Hat, Inc. and others.
 * 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
 * 
 * Contributors:
 *     JBoss by Red Hat - Initial implementation.
 ************************************************************************************/
package org.jboss.tools.maven.cdi.configurators;

import java.util.List;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectChangedEvent;
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
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.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDIUtil;
import org.jboss.tools.maven.cdi.MavenCDIActivator;
import org.jboss.tools.maven.core.IJBossMavenConstants;
import org.jboss.tools.maven.core.internal.project.facet.MavenFacetInstallDataModelProvider;
import org.jboss.tools.maven.ui.Activator;

/**
 * 
 * @author snjeza
 *
 */
public class CDIProjectConfigurator extends AbstractProjectConfigurator {

    private static final String CDI_API_GROUP_ID = "javax.enterprise"; //$NON-NLS-1$
    private static final String CDI_API_ARTIFACT_ID = "cdi-api"; //$NON-NLS-1$

    protected static final IProjectFacet dynamicWebFacet;
    protected static final IProjectFacet ejbFacet;
    protected static final IProjectFacetVersion dynamicWebVersion;
    protected static final IProjectFacetVersion ejbVersion;

    protected static final IProjectFacet cdiFacet;

    protected static final IProjectFacet m2Facet;
    protected static final IProjectFacetVersion m2Version;
    private static final String DEFAULT_CDI_VERSION;

    static {
        dynamicWebFacet = ProjectFacetsManager.getProjectFacet("jst.web"); //$NON-NLS-1$
        dynamicWebVersion = dynamicWebFacet.getVersion("2.5"); //$NON-NLS-1$
        ejbFacet = ProjectFacetsManager.getProjectFacet("jst.ejb"); //$NON-NLS-1$
        ejbVersion = ejbFacet.getVersion("3.0"); //$NON-NLS-1$
        cdiFacet = ProjectFacetsManager.getProjectFacet("jst.cdi"); //$NON-NLS-1$
        DEFAULT_CDI_VERSION = cdiFacet.getDefaultVersion().getVersionString();
        m2Facet = ProjectFacetsManager.getProjectFacet("jboss.m2"); //$NON-NLS-1$
        m2Version = m2Facet.getVersion("1.0"); //$NON-NLS-1$
    }

    @Override
    public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
        MavenProject mavenProject = request.getMavenProject();
        IProject project = request.getProject();
        configureInternal(mavenProject, project, monitor);
    }

    private void configureInternal(MavenProject mavenProject, IProject project, IProgressMonitor monitor)
            throws CoreException {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        boolean configureCDI = store.getBoolean(Activator.CONFIGURE_CDI);
        if (!configureCDI) {
            return;
        }
        final IFacetedProject fproj = ProjectFacetsManager.create(project);
        if (project.hasNature(CDICoreNature.NATURE_ID)
                && (fproj == null || (fproj.hasProjectFacet(cdiFacet) && fproj.hasProjectFacet(m2Facet)))) {
            //everything already installed. Since there's no support for version update -yet- we stop here
            return;
        }
        String packaging = mavenProject.getPackaging();
        String cdiVersion = getCDIVersion(mavenProject);
        if (cdiVersion != null) {
            if ((fproj != null) && ("war".equals(packaging) || "ejb".equals(packaging))) { //$NON-NLS-1$
                installDefaultFacets(fproj, cdiVersion, monitor);
            }
            CDIUtil.enableCDI(project, false, new NullProgressMonitor());
        }
    }

    @Override
    public void mavenProjectChanged(MavenProjectChangedEvent event, IProgressMonitor monitor) throws CoreException {
        IMavenProjectFacade facade = event.getMavenProject();
        if (facade != null) {
            IProject project = facade.getProject();
            if (isWTPProject(project)) {
                MavenProject mavenProject = facade.getMavenProject(monitor);
                configureInternal(mavenProject, project, monitor);
            }
        }
        super.mavenProjectChanged(event, monitor);
    }

    private boolean isWTPProject(IProject project) {
        return ModuleCoreNature.getModuleCoreNature(project) != null;
    }

    private void installM2Facet(IFacetedProject fproj, IProgressMonitor monitor) throws CoreException {
        if (!fproj.hasProjectFacet(m2Facet)) {
            IDataModel config = (IDataModel) new MavenFacetInstallDataModelProvider().create();
            config.setBooleanProperty(IJBossMavenConstants.MAVEN_PROJECT_EXISTS, true);
            fproj.installProjectFacet(m2Version, config, monitor);
        }
    }

    @SuppressWarnings("unchecked")
    private void installDefaultFacets(IFacetedProject fproj, String cdiVersion, IProgressMonitor monitor)
            throws CoreException {
        IProjectFacetVersion currentWebVersion = fproj.getProjectFacetVersion(dynamicWebFacet);
        IProjectFacetVersion currentEjbVersion = fproj.getProjectFacetVersion(ejbFacet);

        if ((currentWebVersion != null && currentWebVersion.compareTo(dynamicWebVersion) > -1)
                || (currentEjbVersion != null && currentEjbVersion.compareTo(ejbVersion) > -1)) {
            installCDIFacet(fproj, cdiVersion, monitor);
        }
        installM2Facet(fproj, monitor);
    }

    private void installCDIFacet(IFacetedProject fproj, String cdiVersionString, IProgressMonitor monitor)
            throws CoreException {
        if (!fproj.hasProjectFacet(cdiFacet)) {
            IProjectFacetVersion facetVersion = getCdiFacetVersion(cdiVersionString);
            if (facetVersion != null) { //$NON-NLS-1$
                IDataModel model = MavenCDIActivator.getDefault().createCDIDataModel(fproj, facetVersion);
                fproj.installProjectFacet(facetVersion, model, monitor);
            }
        }
    }

    private IProjectFacetVersion getCdiFacetVersion(String cdiVersionString) {
        String majorMinor = getMajorMinorVersion(cdiVersionString);
        IProjectFacetVersion facetVersion;
        try {
            facetVersion = cdiFacet.getVersion(majorMinor);
        } catch (IllegalArgumentException iae) {
            //ignore missing version
            facetVersion = cdiFacet.getDefaultVersion();
            MavenCDIActivator.log("CDI version " + majorMinor + " has no corresponding Facet, falling back to "
                    + facetVersion.getVersionString());
        }
        return facetVersion;
    }

    private String getMajorMinorVersion(String versionString) {
        String[] pointVersions = versionString.split("\\.");
        if (pointVersions.length > 1) {
            return pointVersions[0] + "." + pointVersions[1];
        }
        return versionString;
    }

    private String getCDIVersion(MavenProject mavenProject) {
        String version = Activator.getDefault().getDependencyVersion(mavenProject, CDI_API_GROUP_ID,
                CDI_API_ARTIFACT_ID);
        if (version == null) {
            version = inferCdiVersionFromDependencies(mavenProject);
        }
        return version;
    }

    private String inferCdiVersionFromDependencies(MavenProject mavenProject) {
        boolean hasCandidates = false;
        String cdiVersion = null;
        List<ArtifactRepository> repos = mavenProject.getRemoteArtifactRepositories();
        for (Artifact artifact : mavenProject.getArtifacts()) {
            if (isKnownCdiExtension(artifact)) {
                hasCandidates = true;
                cdiVersion = Activator.getDefault().getDependencyVersion(artifact, repos, CDI_API_GROUP_ID,
                        CDI_API_ARTIFACT_ID);
                if (cdiVersion != null) {
                    //TODO should probably not break and take the highest version returned from all dependencies
                    break;
                }
            }
        }
        //Fallback to default CDI version
        if (hasCandidates && cdiVersion == null) {
            return DEFAULT_CDI_VERSION;
        }
        return cdiVersion;
    }

    private boolean isKnownCdiExtension(Artifact artifact) {
        return (artifact.getGroupId().startsWith("org.jboss.seam.") && artifact.getVersion().startsWith("3."))
                || artifact.getGroupId().startsWith("org.apache.deltaspike.");

    }

}