/*******************************************************************************
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
*******************************************************************************/
package com.liferay.ide.project.core.util;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.project.core.ProjectCore;
import com.liferay.ide.project.core.ProjectRecord;
import com.liferay.ide.project.core.facet.IPluginFacetConstants;
import com.liferay.ide.sdk.core.ISDKConstants;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Set;
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.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
import org.eclipse.jst.common.project.facet.core.JavaFacet;
import org.eclipse.jst.common.project.facet.core.JavaFacetInstallConfig;
import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
import org.eclipse.wst.common.project.facet.core.IPreset;
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.eclipse.wst.common.project.facet.core.runtime.IRuntime;
import org.osgi.framework.Version;
/**
* @author Greg Amerson
* @author Terry Jia
* @author Simon Jiang
*/
public class SDKPluginFacetUtil
{
public static final IProjectFacet[] LIFERAY_FACETS = new IProjectFacet[]
{
IPluginFacetConstants.LIFERAY_PORTLET_PROJECT_FACET,
IPluginFacetConstants.LIFERAY_HOOK_PROJECT_FACET,
IPluginFacetConstants.LIFERAY_EXT_PROJECT_FACET,
IPluginFacetConstants.LIFERAY_LAYOUTTPL_PROJECT_FACET,
IPluginFacetConstants.LIFERAY_THEME_PROJECT_FACET,
IPluginFacetConstants.LIFERAY_WEB_PROJECT_FACET
};
private static void addDefaultWebXml( IFacetedProjectWorkingCopy fpjwc, IDataModel dm ) throws CoreException
{
// check for existing web.xml file, if not there, add a default one
// IDE-110 IDE-648
IPath webinfPath = fpjwc.getProjectLocation().append( ISDKConstants.DEFAULT_DOCROOT_FOLDER + "/WEB-INF" ); //$NON-NLS-1$
if( ProjectUtil.isExtProject( fpjwc.getProject() ) ||
fpjwc.getProjectLocation().lastSegment().endsWith( "-ext" ) ) //$NON-NLS-1$
{
fpjwc.getProjectLocation().append( IPluginFacetConstants.EXT_PLUGIN_SDK_CONFIG_FOLDER );
}
if( webinfPath.toFile().exists() )
{
File webXml = webinfPath.append( "web.xml" ).toFile(); //$NON-NLS-1$
if( !webXml.exists() )
{
ProjectUtil.setGenerateDD( dm, false );
ProjectUtil.createDefaultWebXml( webXml, fpjwc.getProjectName() );
IProject project = fpjwc.getProject();
if( project != null )
{
try
{
project.refreshLocal( IResource.DEPTH_INFINITE, null );
}
catch( Exception e )
{
ProjectCore.logError( e );
}
}
}
}
}
public static void configureJavaFacet( final IFacetedProjectWorkingCopy fpjwc,
final IProjectFacet requiredFacet,
final IPreset preset,
final ProjectRecord projectRecord )
{
Action action = fpjwc.getProjectFacetAction( requiredFacet );
if( action == null )
{
return;
}
Object config = action.getConfig();
if( !( config instanceof JavaFacetInstallConfig ) )
{
return;
}
JavaFacetInstallConfig javaConfig = (JavaFacetInstallConfig) config;
IDataModel dm = (IDataModel) Platform.getAdapterManager().getAdapter( config, IDataModel.class );
String presetId = preset.getId();
if( presetId.contains( "portlet" ) ) //$NON-NLS-1$
{
javaConfig.setSourceFolder( new Path( IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER ) );
javaConfig.setDefaultOutputFolder( new Path( IPluginFacetConstants.PORTLET_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER ) );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER );
}
else if( presetId.contains( "hook" ) ) //$NON-NLS-1$
{
javaConfig.setSourceFolder( new Path( IPluginFacetConstants.HOOK_PLUGIN_SDK_SOURCE_FOLDER ) );
javaConfig.setDefaultOutputFolder( new Path( IPluginFacetConstants.HOOK_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER ) );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME,
IPluginFacetConstants.HOOK_PLUGIN_SDK_SOURCE_FOLDER );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
IPluginFacetConstants.HOOK_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER );
}
else if( presetId.contains( "layouttpl" ) ) //$NON-NLS-1$
{
removeSrcFolders( dm, javaConfig );
}
else if( presetId.contains( "theme" ) ) //$NON-NLS-1$
{
final IPath projectPath = projectRecord.getProjectLocation();
final IPath existingSrcFolder = projectPath.append( IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
if( existingSrcFolder.toFile().exists() )
{
javaConfig.setSourceFolder( new Path( IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER ) );
javaConfig.setDefaultOutputFolder( new Path( IPluginFacetConstants.PORTLET_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER ) );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER );
}
else
{
removeSrcFolders( dm, javaConfig );
}
}
else if( presetId.contains( "web" ) ) //$NON-NLS-1$
{
javaConfig.setSourceFolder( new Path( IPluginFacetConstants.WEB_PLUGIN_SDK_SOURCE_FOLDER ) );
javaConfig.setDefaultOutputFolder( new Path( IPluginFacetConstants.WEB_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER ) );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME,
IPluginFacetConstants.WEB_PLUGIN_SDK_SOURCE_FOLDER );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
IPluginFacetConstants.WEB_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER );
}
}
public static void configureProjectAsSDKProject(
final IFacetedProjectWorkingCopy fpjwc, final String pluginType,
final String sdkLocation, final ProjectRecord projectRecord ) throws CoreException
{
IFacetedProjectTemplate template = getLiferayTemplateForProject( pluginType );
IPreset preset = getLiferayPresetForProject( pluginType );
if( preset == null )
{
throw new CoreException( ProjectCore.createErrorStatus( NLS.bind(
Msgs.noFacetPreset, fpjwc.getProjectName() ) ) );
}
IRuntime primaryRuntime = fpjwc.getPrimaryRuntime();
if (primaryRuntime!=null)
{
fpjwc.removeTargetedRuntime( primaryRuntime );
}
Set<IProjectFacetVersion> currentProjectFacetVersions = fpjwc.getProjectFacets();
Set<IProjectFacet> requiredFacets = template.getFixedProjectFacets();
for( IProjectFacet requiredFacet : requiredFacets )
{
boolean hasRequiredFacet = false;
for( IProjectFacetVersion currentFacetVersion : currentProjectFacetVersions )
{
if( currentFacetVersion.getProjectFacet().equals( requiredFacet ) )
{
// TODO how to check the bundle support status?
boolean requiredVersion = isRequiredVersion( currentFacetVersion );
if( requiredVersion )
{
hasRequiredFacet = true;
}
else
{
fpjwc.removeProjectFacet( currentFacetVersion );
}
break;
}
}
if( !hasRequiredFacet )
{
IProjectFacetVersion requiredFacetVersion = getRequiredFacetVersionFromPreset( requiredFacet, preset );
if( requiredFacetVersion != null )
{
fpjwc.addProjectFacet( requiredFacetVersion );
if( ProjectUtil.isJavaFacet( requiredFacetVersion ) )
{
configureJavaFacet( fpjwc, requiredFacetVersion.getProjectFacet(), preset, projectRecord );
}
else if( ProjectUtil.isDynamicWebFacet( requiredFacetVersion ) )
{
configureWebFacet( fpjwc, requiredFacetVersion.getProjectFacet(), preset );
}
}
}
else
{
if( ProjectUtil.isJavaFacet( requiredFacet ) )
{
configureJavaFacet( fpjwc, requiredFacet, preset, projectRecord );
}
else if( ProjectUtil.isDynamicWebFacet( requiredFacet ) )
{
configureWebFacet( fpjwc, requiredFacet, preset );
}
}
}
}
public static void configureProjectAsRuntimeProject( final IFacetedProjectWorkingCopy fpjwc,
final IRuntime runtime,
final String pluginType,
final String sdkLocation,
final ProjectRecord projectRecord ) throws CoreException
{
fpjwc.setTargetedRuntimes( Collections.<IRuntime> emptySet() );
if( runtime != null )
{
fpjwc.setTargetedRuntimes( Collections.singleton( runtime ) );
}
fpjwc.setPrimaryRuntime( runtime );
// fpjwc.setSelectedPreset(
// FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID );
IFacetedProjectTemplate template = getLiferayTemplateForProject( pluginType );
IPreset preset = getLiferayPresetForProject( pluginType );
if( preset == null )
{
throw new CoreException( ProjectCore.createErrorStatus( NLS.bind( Msgs.noFacetPreset, fpjwc.getProjectName() ) ) );
}
Set<IProjectFacetVersion> currentProjectFacetVersions = fpjwc.getProjectFacets();
Set<IProjectFacet> requiredFacets = template.getFixedProjectFacets();
for( IProjectFacet requiredFacet : requiredFacets )
{
boolean hasRequiredFacet = false;
for( IProjectFacetVersion currentFacetVersion : currentProjectFacetVersions )
{
if( currentFacetVersion.getProjectFacet().equals( requiredFacet ) )
{
boolean supports = runtime.supports( currentFacetVersion );
boolean requiredVersion = isRequiredVersion( currentFacetVersion );
if( supports && requiredVersion )
{
hasRequiredFacet = true;
}
else
{
fpjwc.removeProjectFacet( currentFacetVersion );
}
break;
}
}
if( !hasRequiredFacet )
{
IProjectFacetVersion requiredFacetVersion = getRequiredFacetVersionFromPreset( requiredFacet, preset );
if( requiredFacetVersion != null )
{
fpjwc.addProjectFacet( requiredFacetVersion );
if( ProjectUtil.isJavaFacet( requiredFacetVersion ) )
{
configureJavaFacet( fpjwc, requiredFacetVersion.getProjectFacet(), preset, projectRecord );
}
else if( ProjectUtil.isDynamicWebFacet( requiredFacetVersion ) )
{
configureWebFacet( fpjwc, requiredFacetVersion.getProjectFacet(), preset );
}
}
}
else
{
if( ProjectUtil.isJavaFacet( requiredFacet ) )
{
configureJavaFacet( fpjwc, requiredFacet, preset, projectRecord );
}
else if( ProjectUtil.isDynamicWebFacet( requiredFacet ) )
{
configureWebFacet( fpjwc, requiredFacet, preset );
}
}
}
}
public static void configureWebFacet( IFacetedProjectWorkingCopy fpjwc, IProjectFacet requiredFacet, IPreset preset )
throws CoreException
{
Action action = fpjwc.getProjectFacetAction( requiredFacet );
if( action != null )
{
IDataModel dm = (IDataModel) action.getConfig();
if( preset.getId().contains( "portlet" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_CONFIG_FOLDER );
dm.setStringProperty(
IWebFacetInstallDataModelProperties.SOURCE_FOLDER,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
addDefaultWebXml( fpjwc, dm );
}
else if( preset.getId().contains( "hook" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.HOOK_PLUGIN_SDK_CONFIG_FOLDER );
dm.setStringProperty(
IWebFacetInstallDataModelProperties.SOURCE_FOLDER,
IPluginFacetConstants.HOOK_PLUGIN_SDK_SOURCE_FOLDER );
addDefaultWebXml( fpjwc, dm );
}
else if( preset.getId().contains( "ext" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.EXT_PLUGIN_SDK_CONFIG_FOLDER );
dm.setStringProperty(
IWebFacetInstallDataModelProperties.SOURCE_FOLDER,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
addDefaultWebXml( fpjwc, dm );
}
else if( preset.getId().contains( "layouttpl" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.LAYOUTTPL_PLUGIN_SDK_CONFIG_FOLDER );
dm.setStringProperty(
IWebFacetInstallDataModelProperties.SOURCE_FOLDER,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_SOURCE_FOLDER );
ProjectUtil.setGenerateDD( dm, false );
}
else if( preset.getId().contains( "theme" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.THEME_PLUGIN_SDK_CONFIG_FOLDER );
ProjectUtil.setGenerateDD( dm, false );
}
else if( preset.getId().contains( "web" ) ) //$NON-NLS-1$
{
dm.setStringProperty(
IWebFacetInstallDataModelProperties.CONFIG_FOLDER,
IPluginFacetConstants.WEB_PLUGIN_SDK_CONFIG_FOLDER );
dm.setStringProperty(
IWebFacetInstallDataModelProperties.SOURCE_FOLDER,
IPluginFacetConstants.WEB_PLUGIN_SDK_SOURCE_FOLDER );
}
}
}
public static IPreset getLiferayPresetForProject( String pluginType )
{
IPreset preset = null;
if( "portlet".equals( pluginType ) || "servicebuilder".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_PORTLET_PRESET );
}
else if( "hook".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_HOOK_PRESET );
}
else if( "ext".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_EXT_PRESET );
}
else if( "layouttpl".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_LAYOUTTPL_PRESET );
}
else if( "theme".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_THEME_PRESET );
}
else if( "web".equals( pluginType ) )
{
preset = ProjectFacetsManager.getPreset( IPluginFacetConstants.LIFERAY_WEB_PRESET );
}
return preset;
}
public static IFacetedProjectTemplate getLiferayTemplateForProject( String pluginType )
{
IFacetedProjectTemplate template = null;
if( "portlet".equals( pluginType ) || "servicebuilder".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_PORTLET_FACET_TEMPLATE_ID );
}
else if( "hook".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_HOOK_FACET_TEMPLATE_ID );
}
else if( "ext".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_EXT_FACET_TEMPLATE_ID );
}
else if( "layouttpl".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_LAYOUTTPL_FACET_TEMPLATE_ID );
}
else if( "theme".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_THEME_FACET_TEMPLATE_ID );
}
else if( "web".equals( pluginType ) )
{
template = ProjectFacetsManager.getTemplate( IPluginFacetConstants.LIFERAY_WEB_FACET_TEMPLATE_ID );
}
return template;
}
private static IProjectFacetVersion getRequiredFacetVersionFromPreset( IProjectFacet requiredFacet, IPreset preset )
{
Set<IProjectFacetVersion> facets = preset.getProjectFacets();
for( IProjectFacetVersion facet : facets )
{
if( facet.getProjectFacet().equals( requiredFacet ) )
{
return facet;
}
}
return null;
}
private static boolean isRequiredVersion( IProjectFacetVersion facetVersion )
{
// java facet must be at least 1.6
if( JavaFacet.FACET.equals( facetVersion.getProjectFacet() ) )
{
try
{
if( CoreUtil.compareVersions( new Version( facetVersion.getVersionString() ), new Version( 1, 6, 0 ) ) < 0 )
{
return false;
}
}
catch( Throwable t )
{
// ignore
}
}
return true;
}
private static void removeSrcFolders( final IDataModel dm, final JavaFacetInstallConfig javaConfig )
{
dm.setStringProperty( IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, null );
dm.setStringProperty(
IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
IPluginFacetConstants.PORTLET_PLUGIN_SDK_DEFAULT_OUTPUT_FOLDER );
List<IPath> srcFolders = javaConfig.getSourceFolders();
if( !CoreUtil.isNullOrEmpty( srcFolders ) )
{
for( IPath srcFolder : srcFolders )
{
javaConfig.removeSourceFolder( srcFolder );
}
}
}
private static class Msgs extends NLS
{
public static String noFacetPreset;
static
{
initializeMessages( SDKPluginFacetUtil.class.getName(), Msgs.class );
}
}
}