org.eclipse.m2e.wtp.jaxrs.internal.configurators.JaxRsProjectConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.m2e.wtp.jaxrs.internal.configurators.JaxRsProjectConfigurator.java

Source

/*************************************************************************************
 * Copyright (c) 2011-2012 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:
 *     Fred Bricon (Red Hat, Inc.) - initial API and implementation
 ************************************************************************************/
package org.eclipse.m2e.wtp.jaxrs.internal.configurators;

import static org.eclipse.m2e.wtp.WTPProjectsUtil.isWTPProject;
import static org.eclipse.m2e.wtp.jaxrs.internal.MavenJaxRsConstants.JAX_RS_FACET;
import static org.eclipse.m2e.wtp.jaxrs.internal.MavenJaxRsConstants.JAX_RS_FACET_1_0;
import static org.eclipse.m2e.wtp.jaxrs.internal.MavenJaxRsConstants.JAX_RS_FACET_1_1;

import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderFramework;
import org.eclipse.jst.ws.jaxrs.core.internal.IJAXRSCoreConstants;
import org.eclipse.jst.ws.jaxrs.core.internal.project.facet.IJAXRSFacetInstallDataModelProperties;
import org.eclipse.jst.ws.jaxrs.core.internal.project.facet.JAXRSFacetInstallDataModelProvider;
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.m2e.wtp.MavenWtpPlugin;
import org.eclipse.m2e.wtp.ProjectUtils;
import org.eclipse.m2e.wtp.WTPProjectsUtil;
import org.eclipse.m2e.wtp.WarPluginConfiguration;
import org.eclipse.m2e.wtp.jaxrs.internal.MavenJaxRsConstants;
import org.eclipse.m2e.wtp.jaxrs.internal.Messages;
import org.eclipse.osgi.util.NLS;
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.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * JAX-RS maven project configurator.
 * <p>
 * This configurator adds the JAX-RS facet to a project if it has a dependency on the JAX-RS API.
 * </p>
 * 
 * @author Fred Bricon
 *
 */
public class JaxRsProjectConfigurator extends AbstractProjectConfigurator {

    private static final String WAR_PACKAGING = "war";

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

    @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 {

        if (!WAR_PACKAGING.equals(mavenProject.getPackaging())) { //$NON-NLS-1$
            return;
        }

        boolean enabled = MavenWtpPlugin.getDefault().getMavenWtpPreferencesManager().isEnabled(getId());
        if (!enabled) {
            return;
        }

        final IFacetedProject fproj = ProjectFacetsManager.create(project);
        if (fproj == null) {
            return;
        }

        if ((!fproj.hasProjectFacet(WTPProjectsUtil.DYNAMIC_WEB_FACET)) || fproj.hasProjectFacet(JAX_RS_FACET)) {
            //everything already installed. Since there's no support for version update -yet- we bail
            return;
        }

        IProjectFacetVersion jaxRsVersion = getJaxRsVersion(project);
        if (jaxRsVersion != null) {
            installJaxRsFacet(fproj, jaxRsVersion, mavenProject, monitor);
        }

    }

    @SuppressWarnings("restriction")
    private void installJaxRsFacet(IFacetedProject fproj, IProjectFacetVersion facetVersion,
            MavenProject mavenProject, IProgressMonitor monitor) throws CoreException {

        markerManager.deleteMarkers(fproj.getProject(), MavenJaxRsConstants.JAXRS_CONFIGURATION_ERROR_MARKER_ID);

        IStatus status = facetVersion.getConstraint().check(fproj.getProjectFacets());
        if (status.isOK()) {
            // refreshing the project hierarchy to make sure that Eclipse "sees" the .settings folder and file, 
            // to be able to add the JAX-RS Facet. see https://issues.jboss.org/browse/JBIDE-10037
            ProjectUtils.refreshHierarchy(mavenProject.getBasedir(), IResource.DEPTH_INFINITE,
                    new SubProgressMonitor(monitor, 1));
            IDataModel model = createJaxRsDataModel(fproj, facetVersion);
            WarPluginConfiguration warConfig = new WarPluginConfiguration(mavenProject, fproj.getProject());
            String warSourceDirectory = warConfig.getWarSourceDirectory();
            model.setProperty(IJAXRSFacetInstallDataModelProperties.WEBCONTENT_DIR, warSourceDirectory);
            model.setProperty(IJAXRSFacetInstallDataModelProperties.UPDATEDD, false);
            fproj.installProjectFacet(facetVersion, model, monitor);
        } else {
            String errorMessage = status.getMessage() == null ? "<unknown error>" : status.getMessage();
            String markerMessage = NLS.bind(Messages.JaxrsProjectConfigurator_facet_cannot_be_installed,
                    facetVersion, errorMessage);
            addErrorMarker(fproj.getProject(), markerMessage);
            for (IStatus st : status.getChildren()) {
                addErrorMarker(fproj.getProject(), st.getMessage());
            }
        }
    }

    @SuppressWarnings("restriction")
    private IDataModel createJaxRsDataModel(IFacetedProject fproj, IProjectFacetVersion facetVersion) {
        IDataModel config = (IDataModel) new JAXRSFacetInstallDataModelProvider().create();
        LibraryInstallDelegate libraryDelegate = new LibraryInstallDelegate(fproj, facetVersion);
        ILibraryProvider provider = LibraryProviderFramework.getProvider(IJAXRSCoreConstants.NO_OP_LIBRARY_ID);
        libraryDelegate.setLibraryProvider(provider);
        config.setProperty(IJAXRSFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE, libraryDelegate);
        return config;
    }

    private IProjectFacetVersion getJaxRsVersion(IProject project) {
        IJavaProject javaProject = JavaCore.create(project);
        if (javaProject != null) {
            IType type = null;
            try {
                type = javaProject.findType("javax.ws.rs.ApplicationPath");//$NON-NLS-1$ 
                if (type != null) {
                    return JAX_RS_FACET_1_1;
                }

                type = javaProject.findType("javax.ws.rs.Path");//$NON-NLS-1$ 
                if (type != null) {
                    return JAX_RS_FACET_1_0;
                }
            } catch (JavaModelException e) {
                LOG.error("Unable to determine JAX-RS version", e);
            }
        }
        return null;
    }

    @SuppressWarnings("restriction")
    private void addErrorMarker(IProject project, String message) {
        markerManager.addMarker(project, MavenJaxRsConstants.JAXRS_CONFIGURATION_ERROR_MARKER_ID, message, -1,
                IMarker.SEVERITY_ERROR);
    }

    @Override
    public void mavenProjectChanged(MavenProjectChangedEvent event, IProgressMonitor monitor) throws CoreException {
        IMavenProjectFacade facade = event.getMavenProject();
        if (facade != null) {
            IProject project = facade.getProject();
            MavenProject mavenProject = facade.getMavenProject(monitor);
            if (isWTPProject(project) && WAR_PACKAGING.equals(mavenProject.getPackaging())) {
                IMavenProjectFacade oldFacade = event.getOldMavenProject();
                if (oldFacade != null) {
                    MavenProject oldProject = oldFacade.getMavenProject(monitor);
                    if (oldProject != null && oldProject.getArtifacts().equals(mavenProject.getArtifacts())) {
                        //Nothing changed since last build, no need to lookup for new Facets
                        return;
                    }
                }
                configureInternal(mavenProject, project, monitor);
            }
        }
    }

}