/******************************************************************************* * 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.facet; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.project.core.IPortletFramework; import com.liferay.ide.project.core.ProjectCore; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.sdk.core.ISDKConstants; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKManager; import com.liferay.ide.server.util.ServerUtil; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IPath; import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy; 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.runtime.internal.BridgedRuntime; /** * @author Greg Amerson * @author Cindy Li * @author Terry Jia */ @SuppressWarnings( { "unchecked", "restriction", "rawtypes" } ) public class PluginFacetProjectCreationDataModelProvider extends WebFacetProjectCreationDataModelProvider implements IPluginProjectDataModelProperties { @Override public Object getDefaultProperty( String propertyName ) { if( LIFERAY_SDK_NAME.equals( propertyName ) ) { SDK sdk = SDKManager.getInstance().getDefaultSDK(); if( sdk != null ) { return sdk.getName(); } else { return IPluginFacetConstants.LIFERAY_SDK_NAME_DEFAULT_VALUE; } } else if( LIFERAY_USE_SDK_LOCATION.equals( propertyName ) ) { return true; } else if( USE_DEFAULT_LOCATION.equals( propertyName ) ) { return false; } else if( LIFERAY_USE_CUSTOM_LOCATION.equals( propertyName ) ) { return false; } else if( LIFERAY_USE_WORKSPACE_LOCATION.equals( propertyName ) ) { return false; } else if( PLUGIN_TYPE_PORTLET.equals( propertyName ) ) { return true; } else if( PORTLET_NAME.equals( propertyName ) ) { return getProperty( PROJECT_NAME ); } else if( DISPLAY_NAME.equals( propertyName ) ) { return ProjectUtil.convertToDisplayName( getStringProperty( PROJECT_NAME ) ); } else if( HOOK_NAME.equals( propertyName ) ) { return getProperty( PROJECT_NAME ); } else if( EXT_NAME.equals( propertyName ) ) { return getProperty( PROJECT_NAME ); } else if( THEME_NAME.equals( propertyName ) ) { return getProperty( PROJECT_NAME ); } else if( LAYOUTTPL_NAME.equals( propertyName ) ) { return getProperty( PROJECT_NAME ); } else if( CREATE_PROJECT_OPERATION.equals( propertyName ) ) { return true; } else if( PORTLET_FRAMEWORK_ID.equals( propertyName ) ) { return ProjectCore.getPortletFrameworks()[0].getId(); } else if( THEME_PARENT.equals( propertyName ) ) { return "_styled"; //$NON-NLS-1$ } else if( THEME_TEMPLATE_FRAMEWORK.equals( propertyName ) ) { return "Velocity"; //$NON-NLS-1$ } return super.getDefaultProperty( propertyName ); } protected IFacetedProjectWorkingCopy getFacetedProjectWorkingCopy() { return (IFacetedProjectWorkingCopy) this.model.getProperty( FACETED_PROJECT_WORKING_COPY ); } protected IDataModel getModel() { return this.model; } protected IDataModel getNestedModel() { return getDataModel().getNestedModel( NESTED_PROJECT_DM ); } protected String getDefaultSDKProjectBaseLocation() { IPath sdkLoc = getSDKLocation(); if( sdkLoc == null ) { return null; } if( getBooleanProperty( PLUGIN_TYPE_PORTLET ) ) { return sdkLoc.append( ISDKConstants.PORTLET_PLUGIN_PROJECT_FOLDER ).toOSString(); } else if( getBooleanProperty( PLUGIN_TYPE_HOOK ) ) { return sdkLoc.append( ISDKConstants.HOOK_PLUGIN_PROJECT_FOLDER ).toOSString(); } else if( getBooleanProperty( PLUGIN_TYPE_EXT ) ) { return sdkLoc.append( ISDKConstants.EXT_PLUGIN_PROJECT_FOLDER ).toOSString(); } else if( getBooleanProperty( PLUGIN_TYPE_THEME ) ) { return sdkLoc.append( ISDKConstants.THEME_PLUGIN_PROJECT_FOLDER ).toOSString(); } else if( getBooleanProperty( PLUGIN_TYPE_LAYOUTTPL ) ) { return sdkLoc.append( ISDKConstants.LAYOUTTPL_PLUGIN_PROJECT_FOLDER ).toOSString(); } else if( getBooleanProperty( PLUGIN_TYPE_WEB ) ) { return sdkLoc.append( ISDKConstants.WEB_PLUGIN_PROJECT_FOLDER ).toOSString(); } return null; } protected String getProjectSuffix() { if( getBooleanProperty( PLUGIN_TYPE_PORTLET ) ) { return ISDKConstants.PORTLET_PLUGIN_PROJECT_SUFFIX; } else if( getBooleanProperty( PLUGIN_TYPE_HOOK ) ) { return ISDKConstants.HOOK_PLUGIN_PROJECT_SUFFIX; } else if( getBooleanProperty( PLUGIN_TYPE_EXT ) ) { return ISDKConstants.EXT_PLUGIN_PROJECT_SUFFIX; } else if( getBooleanProperty( PLUGIN_TYPE_THEME ) ) { return ISDKConstants.THEME_PLUGIN_PROJECT_SUFFIX; } else if( getBooleanProperty( PLUGIN_TYPE_LAYOUTTPL ) ) { return ISDKConstants.LAYOUTTPL_PLUGIN_PROJECT_SUFFIX; } else if( getBooleanProperty( PLUGIN_TYPE_WEB ) ) { return ISDKConstants.WEB_PLUGIN_PROJECT_SUFFIX; } return null; } @Override public DataModelPropertyDescriptor getPropertyDescriptor( String propertyName ) { if( LIFERAY_SDK_NAME.equals( propertyName ) ) { Object val = getProperty( propertyName ); if( IPluginFacetConstants.LIFERAY_SDK_NAME_DEFAULT_VALUE.equals( val ) || StringPool.EMPTY.equals( val ) ) { return new DataModelPropertyDescriptor( getProperty( propertyName ), IPluginFacetConstants.LIFERAY_SDK_NAME_DEFAULT_VALUE_DESCRIPTION ); } else { return new DataModelPropertyDescriptor( val, val.toString() ); } } return super.getPropertyDescriptor( propertyName ); } @Override public Set getPropertyNames() { Set propNames = super.getPropertyNames(); propNames.add( LIFERAY_SDK_NAME ); propNames.add( LIFERAY_USE_SDK_LOCATION ); propNames.add( LIFERAY_USE_CUSTOM_LOCATION ); propNames.add( PLUGIN_TYPE_PORTLET ); propNames.add( PLUGIN_TYPE_HOOK ); propNames.add( PLUGIN_TYPE_EXT ); propNames.add( PLUGIN_TYPE_THEME ); propNames.add( PLUGIN_TYPE_LAYOUTTPL ); propNames.add( PLUGIN_TYPE_WEB ); propNames.add( DISPLAY_NAME ); propNames.add( PORTLET_NAME ); propNames.add( HOOK_NAME ); propNames.add( EXT_NAME ); propNames.add( THEME_NAME ); propNames.add( LAYOUTTPL_NAME ); propNames.add( CREATE_PROJECT_OPERATION ); propNames.add( PLUGIN_FRAGMENT_ENABLED ); propNames.add( PLUGIN_FRAGMENT_DM ); propNames.add( PORTLET_FRAMEWORK_ID ); propNames.add( THEME_PARENT ); propNames.add( THEME_TEMPLATE_FRAMEWORK ); propNames.add( PROJECT_TEMP_PATH ); propNames.add( LIFERAY_USE_WORKSPACE_LOCATION ); return propNames; } protected IPath getSDKLocation() { SDK sdk = SDKManager.getInstance().getSDK( (String) getProperty( LIFERAY_SDK_NAME ) ); return sdk != null ? sdk.getLocation() : null; } @Override public void init() { super.init(); getDataModel().setProperty( LIFERAY_USE_SDK_LOCATION, true ); DataModelPropertyDescriptor[] validDescriptors = getDataModel().getValidPropertyDescriptors( FACET_RUNTIME ); for( DataModelPropertyDescriptor desc : validDescriptors ) { Object runtime = desc.getPropertyValue(); if( runtime instanceof BridgedRuntime && ServerUtil.isLiferayRuntime( (BridgedRuntime) runtime ) ) { getDataModel().setProperty( FACET_RUNTIME, runtime ); break; } } ProjectCore.getPortletFrameworks(); } @Override public boolean propertySet( final String propertyName, final Object propertyValue ) { String portletFrameworkId = getStringProperty( PORTLET_FRAMEWORK_ID ); IPortletFramework portletFramework = ProjectCore.getPortletFramework( portletFrameworkId ); if( FACET_PROJECT_NAME.equals( propertyName ) || LIFERAY_SDK_NAME.equals( propertyName ) || LIFERAY_USE_WORKSPACE_LOCATION.equals( propertyName ) || LIFERAY_USE_CUSTOM_LOCATION.equals( propertyName ) ) { updateProjectLocation(); } else if( DISPLAY_NAME.equals( propertyName ) ) { String displayName = ProjectUtil.removePluginSuffix( propertyValue.toString() ); return super.propertySet( DISPLAY_NAME, displayName ); } else if( PORTLET_FRAMEWORK_ID.equals( propertyName ) && portletFramework != null ) { setupPortletFramework( portletFramework ); } return super.propertySet( propertyName, propertyValue ); } protected void removeFacet( IFacetedProjectWorkingCopy facetedProject, IProjectFacet facet ) { if( facetedProject == null || facet == null ) { return; } Set<IProjectFacetVersion> newFacetSet = new HashSet<IProjectFacetVersion>(); Set<IProjectFacetVersion> facets = facetedProject.getProjectFacets(); for( IProjectFacetVersion fv : facets ) { if( !( fv.getProjectFacet().equals( facet ) ) ) { newFacetSet.add( fv ); } } facetedProject.setProjectFacets( newFacetSet ); } protected void setupPortletFramework( IPortletFramework portletFramework ) { IPortletFramework[] portletFrameworks = ProjectCore.getPortletFrameworks(); for( IPortletFramework framework : portletFrameworks ) { if( !framework.equals( portletFramework ) ) { IProjectFacet[] facets = framework.getFacets(); for( IProjectFacet facet : facets ) { removeFacet( getFacetedProjectWorkingCopy(), facet ); } } } portletFramework.configureNewProject( getDataModel(), getFacetedProjectWorkingCopy() ); } protected void updateProjectLocation() { boolean useSdkLocation = getBooleanProperty( LIFERAY_USE_SDK_LOCATION ); boolean useCustomLocation = getBooleanProperty( LIFERAY_USE_CUSTOM_LOCATION ); final String projectBaseLocation = getDefaultSDKProjectBaseLocation(); if( useSdkLocation ) { getNestedModel().setProperty( USE_DEFAULT_LOCATION, false ); getNestedModel().setProperty( USER_DEFINED_BASE_LOCATION, projectBaseLocation ); } else if( useCustomLocation ) { getNestedModel().setProperty( USE_DEFAULT_LOCATION, false ); getNestedModel().setProperty( USER_DEFINED_BASE_LOCATION, projectBaseLocation ); } else { getNestedModel().setProperty( USE_DEFAULT_LOCATION, true ); } } }