Package org.eclipse.m2e.wtp.jsf.internal.configurators

Source Code of org.eclipse.m2e.wtp.jsf.internal.configurators.JSFProjectConfigurator

/*******************************************************************************
* Copyright (c) 2011-2014 Red Hat, 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
*
* Contributors:
*     Snjezana Peco (Red Hat, Inc.) - initial API and implementation
*     Fred Bricon (Red Hat, Inc.)   - read infos from faces-config.xml
******************************************************************************/

package org.eclipse.m2e.wtp.jsf.internal.configurators;

import static org.eclipse.m2e.wtp.jsf.internal.MavenJSFConstants.JSF_FACET;

import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
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.j2ee.project.facet.IJ2EEFacetConstants;
import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
import org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
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.ResourceCleaner;
import org.eclipse.m2e.wtp.WTPProjectsUtil;
import org.eclipse.m2e.wtp.WarPluginConfiguration;
import org.eclipse.m2e.wtp.facets.FacetDetectorManager;
import org.eclipse.m2e.wtp.jsf.internal.MavenJSFConstants;
import org.eclipse.m2e.wtp.jsf.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;

/**
* JSF maven project configurator.
* <p>
* This configurator adds the JSF facet to a project if it has or declares a faces-config.xml.
* </p>
* @author snjeza
* @author Fred Bricon
*
*/
public class JSFProjectConfigurator extends AbstractProjectConfigurator {
 
  private static final String M2E_JSF_ACTIVATION_PROPERTY = "m2e.jsf.activation"; //$NON-NLS-1$
 
  @Override
  public void configure(ProjectConfigurationRequest request,
      IProgressMonitor monitor) throws CoreException {
    configureInternal(request.getMavenProjectFacade(), monitor);
  }
 
  private void configureInternal(IMavenProjectFacade mavenProjectFacade,
      IProgressMonitor monitor) throws CoreException {
    MavenProject mavenProject = mavenProjectFacade.getMavenProject();
    IProject project = mavenProjectFacade.getProject();
   
    if (!"war".equals(mavenProject.getPackaging()))  {//$NON-NLS-1$
      return;
    }
   
    if (!isConfigurationEnabled(mavenProjectFacade, monitor)) {
      return;
    }
   
      final IFacetedProject fproj = ProjectFacetsManager.create(project);
    if (fproj != null) {
      if (fproj.hasProjectFacet(JSF_FACET)) {
        //everything already installed.
        //Since there's no support for version update -yet- we stop here
        return;
      }
     
      FacetDetectorManager facetDetectorManager = FacetDetectorManager.getInstance();
      IProjectFacetVersion jsfVersion = facetDetectorManager.findFacetVersion(mavenProjectFacade, JSF_FACET.getId(), monitor);
      if (fproj != null && jsfVersion != null) {
        installJSFFacet(fproj, mavenProject, jsfVersion, monitor);
      }
    }
   
  }

  private boolean isConfigurationEnabled(IMavenProjectFacade facade, IProgressMonitor monitor) throws CoreException {
    if (WTPProjectsUtil.isM2eWtpDisabled(facade, monitor)) {
      return false;
    }
   
    Object pomActivationValue = facade.getMavenProject(monitor).getProperties().get(M2E_JSF_ACTIVATION_PROPERTY);
    boolean enabled;
    if (pomActivationValue == null) {
      enabled = MavenWtpPlugin.getDefault().getMavenWtpPreferencesManager().isEnabled(getId());
    } else {
      enabled = Boolean.parseBoolean(pomActivationValue.toString());
   
    return enabled;
  }
 
  private void installJSFFacet(IFacetedProject fproj, MavenProject mavenProject,
      IProjectFacetVersion facetVersion, IProgressMonitor monitor)
      throws CoreException {

    markerManager.deleteMarkers(fproj.getProject(), MavenJSFConstants.JSF_CONFIGURATION_ERROR_MARKER_ID);
       
    if (fproj.hasProjectFacet(IJ2EEFacetConstants.DYNAMIC_WEB_FACET) && !fproj.hasProjectFacet(JSF_FACET)) {
      IProject project = fproj.getProject();
      //JBIDE-10785 : refresh parent to prevent
      // org.osgi.service.prefs.BackingStoreException: Resource '/parent/web/.settings' does not exist.
      ProjectUtils.refreshHierarchy(mavenProject.getBasedir(),
                      IResource.DEPTH_INFINITE,
                      new SubProgressMonitor(monitor, 1));
 
      WarPluginConfiguration warConfig = new WarPluginConfiguration(mavenProject, project);
      IFolder warSourceDir  = project.getFolder(warConfig.getWarSourceDirectory());

      //We don't want to generate any files automatically
      IPath facesConfigPath = new Path("WEB-INF/faces-config.xml"); //$NON-NLS-1$
      IFile defaultFacesConfig = warSourceDir.getFile(facesConfigPath);
      IFolder generatedWebResourcesFolder = ProjectUtils.getGeneratedWebResourcesFolder(mavenProject, project);
      IFile generatedFacesConfig = generatedWebResourcesFolder.getFile(facesConfigPath);
     
      ResourceCleaner cleaner = new ResourceCleaner(project);
      cleaner.addFolder(warSourceDir.getFolder("WEB-INF/lib")); //$NON-NLS-1$
      cleaner.addFiles(defaultFacesConfig, generatedFacesConfig);
     
      IStatus status = facetVersion.getConstraint().check(fproj.getProjectFacets());
      try {
        if (status.isOK()) {
          IDataModel model = createJSFDataModel(fproj,facetVersion);
          model.setBooleanProperty(IJSFFacetInstallDataModelProperties.CONFIGURE_SERVLET, false);
          fproj.installProjectFacet(facetVersion, model, monitor);
        } else {
          addErrorMarker(fproj.getProject(), NLS.bind(Messages.JSFProjectConfigurator_Marker_Facet_Version_Cant_Be_Installed, facetVersion, status.getMessage()));
          for (IStatus st : status.getChildren()) {
            addErrorMarker(fproj.getProject(), st.getMessage());
          }
        }
      } finally {
        cleaner.cleanUp();
      }
    }
  }
 
  private void addErrorMarker(IProject project, String message) {
      markerManager.addMarker(project,
          MavenJSFConstants.JSF_CONFIGURATION_ERROR_MARKER_ID,
          message
          ,-1,  IMarker.SEVERITY_ERROR);
   
  }

  @SuppressWarnings("restriction")
  private IDataModel createJSFDataModel(IFacetedProject fproj, IProjectFacetVersion facetVersion) {
    IDataModel config = (IDataModel) new JSFFacetInstallDataModelProvider().create();
    LibraryInstallDelegate libraryDelegate = new LibraryInstallDelegate(fproj, facetVersion);
    ILibraryProvider provider = LibraryProviderFramework.getProvider("jsf-no-op-library-provider"); //$NON-NLS-1$
    libraryDelegate.setLibraryProvider(provider);
    config.setProperty(IJSFFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE, libraryDelegate);
    config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME, ""); //$NON-NLS-1$
    config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS, new String[0]);
   
    return config;
  }
 
}
TOP

Related Classes of org.eclipse.m2e.wtp.jsf.internal.configurators.JSFProjectConfigurator

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.