/*******************************************************************************
* Copyright (c) 2012 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Zend Technologies
* Martin Eisengardt <martin.eisengardt@fiducia.de>
*******************************************************************************/
package org.eclipse.php.internal.core.facet;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.*;
import org.eclipse.php.internal.core.PHPCorePlugin;
import org.eclipse.php.core.PHPVersion;
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;
public class PHPFacets {
/**
* Synchronizes the php version for facets
*
* @param project
* @return the status of setting the version
*/
public static IStatus setFacetedVersion(IProject project, PHPVersion version) {
if (isFacetedProject(project)) {
try {
final IProjectFacetVersion facetedVersion = convertToFacetVersion(version);
final IProjectFacet phpFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_COMPONENT);
final IFacetedProject faceted = ProjectFacetsManager.create(project);
if (!facetedVersion.equals(faceted.getInstalledVersion(phpFacet))) {
final Set<IFacetedProject.Action> actions = new HashSet<IFacetedProject.Action>();
actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.VERSION_CHANGE, facetedVersion,
null));
faceted.modify(actions, new NullProgressMonitor());
}
} catch (CoreException ex) {
return new Status(IStatus.ERROR, PHPCorePlugin.ID, Messages.PHPFacets_SettingVersionFailed, ex);
} catch (IllegalArgumentException ex) {
return new Status(IStatus.ERROR, PHPCorePlugin.ID, Messages.PHPFacets_SettingVersionFailed, ex);
}
}
return Status.OK_STATUS;
}
/**
* Returns true if the given project is a faceted project and the php core
* facet is installed
*
* @param project
* the project
* @return true if the php core facet is installed.
*/
public static boolean isFacetedProject(IProject project) {
try {
final IFacetedProject faceted = ProjectFacetsManager.create(project);
if (faceted != null) {
IProjectFacet coreFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_CORE_COMPONENT);
IProjectFacet phpFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_COMPONENT);
if (faceted.hasProjectFacet(coreFacet) && faceted.hasProjectFacet(phpFacet)) {
return true;
}
}
} catch (CoreException ex) {
// silently ignore
}
return false;
}
/**
* Returns the php version from given faceted project; before invoking this
* method ensure that {@link #isFacetedProject(IProject)} return true.
*
* @param project
* the php faceted project
* @return the php version
*/
public static PHPVersion getPHPVersionFromFacets(IProject project) {
try {
final IFacetedProject faceted = ProjectFacetsManager.create(project);
if (faceted != null) {
IProjectFacet phpFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_COMPONENT);
final IProjectFacetVersion version = faceted.getInstalledVersion(phpFacet);
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_5.equals(version.getVersionString())) {
return PHPVersion.PHP5;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_5_3.equals(version.getVersionString())) {
return PHPVersion.PHP5_3;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_5_4.equals(version.getVersionString())) {
return PHPVersion.PHP5_4;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_5_5.equals(version.getVersionString())) {
return PHPVersion.PHP5_5;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_5_6.equals(version.getVersionString())) {
return PHPVersion.PHP5_6;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_7.equals(version.getVersionString())) {
return PHPVersion.PHP7_0;
}
if (PHPFacetsConstants.PHP_COMPONENT_VERSION_7_1.equals(version.getVersionString())) {
return PHPVersion.PHP7_1;
}
}
} catch (CoreException ex) {
// silently ignore
}
// defaults to php 5.4
return PHPVersion.PHP5_4;
}
/**
* Returns the php facet version from given php version
*
* @param version
* php version
* @return the php facets version
*/
public static IProjectFacetVersion convertToFacetVersion(PHPVersion version) {
IProjectFacet phpFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_COMPONENT);
switch (version) {
case PHP5:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_5);
case PHP5_3:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_5_3);
case PHP5_4:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_5_4);
case PHP5_5:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_5_5);
case PHP5_6:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_5_6);
case PHP7_0:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_7);
case PHP7_1:
default:
return phpFacet.getVersion(PHPFacetsConstants.PHP_COMPONENT_VERSION_7_1);
}
}
/**
* Adds PHP facet for project
*
* @param project
* Project to add facet for
* @param phpVersion
* PHP version to properly set facet
* @param monitor
* @throws CoreException
*/
public static void createFacetedProject(IProject project, PHPVersion phpVersion, IProgressMonitor monitor)
throws CoreException {
final IFacetedProject facetedProject = ProjectFacetsManager.create(project, true, monitor);
// set the fixed facets (they will not be removable by the user)
// the php.component facet will be set to the correct version
// programmatically
final Set<IProjectFacet> fixedFacets = new HashSet<IProjectFacet>();
IProjectFacet coreFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_CORE_COMPONENT);
fixedFacets.add(coreFacet);
IProjectFacet phpFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_COMPONENT);
fixedFacets.add(phpFacet);
facetedProject.setFixedProjectFacets(fixedFacets);
// install the fixed facets
facetedProject.installProjectFacet(coreFacet.getDefaultVersion(), null, monitor);
facetedProject.installProjectFacet(convertToFacetVersion(phpVersion), null, monitor);
}
/**
* Returns the faceted version of the core facet
*
* @return core facet
*/
public static IProjectFacetVersion getCoreVersion() {
IProjectFacet coreFacet = ProjectFacetsManager.getProjectFacet(PHPFacetsConstants.PHP_CORE_COMPONENT);
return coreFacet.getDefaultVersion();
}
}