/*******************************************************************************
* 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.service.core.operation;
import static com.liferay.ide.core.util.CoreUtil.empty;
import com.liferay.ide.core.ILiferayConstants;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.service.core.AddServiceBuilderOperation;
import com.liferay.ide.service.core.ServiceCore;
import com.liferay.ide.service.core.util.ServiceUtil;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jem.workbench.utility.JemProjectUtilities;
import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditOperationDataModelProvider;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
/**
* @author Greg Amerson
* @author Cindy Li
*/
@SuppressWarnings( { "restriction", "unchecked" } )
public class NewServiceBuilderDataModelProvider extends ArtifactEditOperationDataModelProvider
implements INewServiceBuilderDataModelProperties
{
public NewServiceBuilderDataModelProvider()
{
super();
}
@Override
public IDataModelOperation getDefaultOperation()
{
return new AddServiceBuilderOperation( getDataModel() );
}
@Override
public Object getDefaultProperty( String propertyName )
{
if( SERVICE_FILE.equals( propertyName ) )
{
return ILiferayConstants.SERVICE_XML_FILE;
}
else if( AUTHOR.equals( propertyName ) )
{
return System.getProperty( "user.name" ); //$NON-NLS-1$
}
else if( JAVA_PACKAGE_FRAGMENT_ROOT.equals( propertyName ) )
{
return getJavaPackageFragmentRoot();
}
else if( propertyName.equals( JAVA_SOURCE_FOLDER ) )
{
return getJavaSourceFolder();
}
else if( propertyName.equals( SOURCE_FOLDER ) )
{
IFolder sourceFolder = getDefaultJavaSourceFolder();
if( sourceFolder != null && sourceFolder.exists() )
{
return sourceFolder.getFullPath().toOSString();
}
}
else if( INewJavaClassDataModelProperties.OPEN_IN_EDITOR.equals( propertyName ) )
{
return true;
}
else if( propertyName.equals( USE_SAMPLE_TEMPLATE ) )
{
return true;
}
// if (CREATE_CUSTOM_JSPS.equals(propertyName)) {
// return true;
// } else if (CUSTOM_JSPS_FOLDER.equals(propertyName)) {
// HookDescriptorHelper hookDescriptorHelper = new
// HookDescriptorHelper(getTargetProject());
// String customJspFolder =
// hookDescriptorHelper.getCustomJSPFolder(getDataModel());
// if (customJspFolder != null) {
// return
// CoreUtil.getDocroot(getTargetProject()).getFolder(customJspFolder).getFullPath().toPortableString();
// }
// return
// CoreUtil.getDocroot(getTargetProject()).getFullPath().append("custom_jsps").toPortableString();
// } else if (PORTAL_PROPERTIES_FILE.equals(propertyName)) {
// return
// PortletUtil.getFirstSrcFolder(getTargetProject()).getFullPath().append("portal.properties").toPortableString();
// } else if (CONTENT_FOLDER.equals(propertyName)) {
// return
// PortletUtil.getFirstSrcFolder(getTargetProject()).getFullPath().append("content").toPortableString();
// } else if (propertyName.equals(PROJECT)) {
// return getTargetProject();
// } else if (propertyName.equals(SOURCE_FOLDER)) {
// IFolder sourceFolder = getDefaultJavaSourceFolder();
// if (sourceFolder != null && sourceFolder.exists())
// return sourceFolder.getFullPath().toOSString();
// } else if (propertyName.equals(JAVA_SOURCE_FOLDER)) {
// return getJavaSourceFolder();
// } else if (propertyName.equals(JAVA_PACKAGE_FRAGMENT_ROOT)) {
// return getJavaPackageFragmentRoot();
// } else if (CUSTOM_JSPS_FILES_CREATED.equals(propertyName)) {
// return new HashSet<IFile>();
// } else if (LANGUAGE_PROPERTIES_FILES_CREATED.equals(propertyName)) {
// return new HashSet<IFile>();
// }
return super.getDefaultProperty( propertyName );
}
@SuppressWarnings( "rawtypes" )
@Override
public Set getPropertyNames()
{
Set propertyNames = super.getPropertyNames();
propertyNames.add( SERVICE_FILE );
propertyNames.add( JAVA_PACKAGE_FRAGMENT_ROOT );
propertyNames.add( JAVA_SOURCE_FOLDER );
propertyNames.add( SOURCE_FOLDER );
propertyNames.add( PACKAGE_PATH );
propertyNames.add( NAMESPACE );
propertyNames.add( AUTHOR );
propertyNames.add( CREATED_SERVICE_FILE );
propertyNames.add( INewJavaClassDataModelProperties.OPEN_IN_EDITOR );
propertyNames.add( USE_SAMPLE_TEMPLATE );
// propertyNames.add(CREATE_CUSTOM_JSPS);
// propertyNames.add(CREATE_PORTAL_PROPERTIES);
// propertyNames.add(CREATE_SERVICES);
// propertyNames.add(CREATE_LANGUAGE_PROPERTIES);
// propertyNames.add(CUSTOM_JSPS_FOLDER);
// propertyNames.add(CUSTOM_JSPS_ITEMS);
// propertyNames.add(CUSTOM_JSPS_FILES_CREATED);
// propertyNames.add(PORTAL_PROPERTIES_FILE);
// propertyNames.add(PORTAL_PROPERTIES_ACTION_ITEMS);
// propertyNames.add(PORTAL_PROPERTIES_OVERRIDE_ITEMS);
// propertyNames.add(SERVICES_ITEMS);
// propertyNames.add(CONTENT_FOLDER);
// propertyNames.add(LANGUAGE_PROPERTIES_ITEMS);
// propertyNames.add(LANGUAGE_PROPERTIES_FILES_CREATED);
// propertyNames.add(SOURCE_FOLDER);
// propertyNames.add(JAVA_SOURCE_FOLDER);
// propertyNames.add(JAVA_PACKAGE_FRAGMENT_ROOT);
return propertyNames;
}
@Override
public void init()
{
super.init();
}
@Override
public boolean isPropertyEnabled( String propertyName )
{
if( SERVICE_FILE.equals( propertyName ) )
{
return false;
}
return super.isPropertyEnabled( propertyName );
}
@Override
public IStatus validate( String propertyName )
{
if( SERVICE_FILE.equals( propertyName ) )
{
IFile serviceFile = getServiceFile();
if( serviceFile != null && serviceFile.exists() )
{
return ServiceCore.createErrorStatus( Msgs.projectContainsServiceXmlFile );
}
}
else if( PACKAGE_PATH.equals( propertyName ) )
{
String packagePath = getStringProperty( propertyName );
if( empty( packagePath ) )
{
return ServiceCore.createErrorStatus( Msgs.packagePathNotEmpty );
}
if( !empty( packagePath ) )
{
return validateJavaPackage( packagePath );
}
}
else if( NAMESPACE.equals( propertyName ) )
{
String namespace = getStringProperty( propertyName );
if( empty( namespace ) )
{
return ServiceCore.createErrorStatus( Msgs.namespaceNotEmpty );
}
if( ! ServiceUtil.isValidNamespace( namespace ) )
{
return ServiceCore.createErrorStatus( Msgs.namespaceInvalid );
}
}
// if (CUSTOM_JSPS_FOLDER.equals(propertyName) &&
// getBooleanProperty(CREATE_CUSTOM_JSPS)) {
// String jspFolder = getStringProperty(CUSTOM_JSPS_FOLDER);
// if (jspFolder == null || jspFolder.isEmpty()) {
// return
// ServiceCore.createErrorStatus("Custom JSPs folder not configured.");
// }
// } else if (CUSTOM_JSPS_ITEMS.equals(propertyName) &&
// getBooleanProperty(CREATE_CUSTOM_JSPS)) {
// Object jspItems = getProperty(CUSTOM_JSPS_ITEMS);
// if (jspItems instanceof List) {
// List jsps = (List)jspItems;
// if (jsps.size() > 0) {
// return Status.OK_STATUS;
// }
// }
// return
// ServiceCore.createErrorStatus("Need to specify at least one JSP to override.");
// } else if (PORTAL_PROPERTIES_FILE.equals(propertyName) &&
// getBooleanProperty(CREATE_PORTAL_PROPERTIES)) {
// String portalPropertiesFile =
// getStringProperty(PORTAL_PROPERTIES_FILE);
// if (CoreUtil.isNullOrEmpty(portalPropertiesFile)) {
// return
// ServiceCore.createErrorStatus("portal.properties file not configured.");
// }
// } else if (PORTAL_PROPERTIES_ACTION_ITEMS.equals(propertyName) &&
// getBooleanProperty(CREATE_PORTAL_PROPERTIES)) {
// IStatus actionItemsStatus =
// validateListItems(PORTAL_PROPERTIES_ACTION_ITEMS);
// IStatus propertyOverridesStatus =
// validateListItems(PORTAL_PROPERTIES_OVERRIDE_ITEMS);
// if (actionItemsStatus.isOK() || propertyOverridesStatus.isOK()) {
// return Status.OK_STATUS;
// } else {
// return
// ServiceCore.createErrorStatus("Need to specify at least one Event Action or Property to override.");
// }
// } else if (SERVICES_ITEMS.equals(propertyName) &&
// getBooleanProperty(CREATE_SERVICES)) {
// IStatus itemsStatus = validateListItems(SERVICES_ITEMS);
// if (itemsStatus.isOK()) {
// return Status.OK_STATUS;
// } else {
// return
// ServiceCore.createErrorStatus("Need to specify at least one Service to override.");
// }
// } else if (CONTENT_FOLDER.equals(propertyName) &&
// getBooleanProperty(CREATE_LANGUAGE_PROPERTIES)) {
// String contentFolder = getStringProperty(CONTENT_FOLDER);
// if (contentFolder == null || contentFolder.isEmpty()) {
// return
// ServiceCore.createErrorStatus("Content folder not configured.");
// }
// } else if (LANGUAGE_PROPERTIES_ITEMS.equals(propertyName) &&
// getBooleanProperty(CREATE_LANGUAGE_PROPERTIES)) {
// Object propertiesItems = getProperty(LANGUAGE_PROPERTIES_ITEMS);
// if (propertiesItems instanceof List) {
// List jsps = (List)propertiesItems;
// if (jsps.size() > 0) {
// return Status.OK_STATUS;
// }
// }
// return
// ServiceCore.createErrorStatus("Need to specify at least one language property file.");
// }
return super.validate( propertyName );
}
private IStatus validateJavaPackage( String packName )
{
if( packName != null && packName.trim().length() > 0 )
{
// Use standard java conventions to validate the package name
IStatus javaStatus =
JavaConventions.validatePackageName( packName, CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 );
if( javaStatus.getSeverity() == IStatus.ERROR )
{
String msg = J2EECommonMessages.ERR_JAVA_PACAKGE_NAME_INVALID + javaStatus.getMessage();
return WTPCommonPlugin.createErrorStatus( msg );
}
else if( javaStatus.getSeverity() == IStatus.WARNING )
{
String msg = J2EECommonMessages.ERR_JAVA_PACKAGE_NAME_WARNING + javaStatus.getMessage();
return WTPCommonPlugin.createWarningStatus( msg );
}
}
// java package name is valid
return Status.OK_STATUS;
}
/**
* Subclasses may extend this method to perform their own retrieval mechanism. This implementation simply returns
* the JDT package fragment root for the selected source folder. This method may return null.
*
* @see IJavaProject#getPackageFragmentRoot(org.eclipse.core.resources.IResource)
* @return IPackageFragmentRoot
*/
// protected IPackageFragmentRoot getJavaPackageFragmentRoot() {
// IProject project = getTargetProject();
// if (project != null) {
// IJavaProject aJavaProject = JemProjectUtilities.getJavaProject(project);
// // Return the source folder for the java project of the selected project
// if (aJavaProject != null) {
// IFolder sourcefolder = (IFolder) getProperty(JAVA_SOURCE_FOLDER);
// if (sourcefolder != null)
// return aJavaProject.getPackageFragmentRoot(sourcefolder);
// }
// }
// return null;
// }
@SuppressWarnings( "deprecation" )
protected IFolder getDefaultJavaSourceFolder()
{
IProject project = getTargetProject();
if( project == null )
{
return null;
}
IPackageFragmentRoot[] sources = J2EEProjectUtilities.getSourceContainers( project );
// Try and return the first source folder
if( sources.length > 0 )
{
try
{
return (IFolder) sources[0].getCorrespondingResource();
}
catch( Exception e )
{
return null;
}
}
return null;
}
protected IPackageFragmentRoot getJavaPackageFragmentRoot()
{
IProject project = getTargetProject();
if( project != null )
{
IJavaProject aJavaProject = JemProjectUtilities.getJavaProject( project );
// Return the source folder for the java project of the selected
// project
if( aJavaProject != null )
{
IFolder sourcefolder = (IFolder) getProperty( JAVA_SOURCE_FOLDER );
if( sourcefolder != null )
{
return aJavaProject.getPackageFragmentRoot( sourcefolder );
}
}
}
return null;
}
@SuppressWarnings( "deprecation" )
protected final IFolder getJavaSourceFolder()
{
IPackageFragmentRoot[] sources = J2EEProjectUtilities.getSourceContainers( getTargetProject() );
// Ensure there is valid source folder(s)
if( sources == null || sources.length == 0 )
{
return null;
}
String folderFullPath = getStringProperty( SOURCE_FOLDER );
// Get the source folder whose path matches the source folder name value
// in the data model
for( int i = 0; i < sources.length; i++ )
{
if( sources[i].getPath().equals( new Path( folderFullPath ) ) )
{
try
{
return (IFolder) sources[i].getCorrespondingResource();
}
catch( Exception e )
{
break;
}
}
}
return null;
}
protected IFile getServiceFile()
{
String serviceFileProperty = getStringProperty( SERVICE_FILE );
final IWebProject webproject = LiferayCore.create( IWebProject.class, getTargetProject() );
if( CoreUtil.isNullOrEmpty( serviceFileProperty ) || webproject == null )
{
return null;
}
// IDE-110 IDE-648
final IResource serviceXmlResource =
webproject.findDocrootResource( new Path( "WEB-INF/" + serviceFileProperty ) );
if( serviceXmlResource != null && serviceXmlResource.exists() && serviceXmlResource instanceof IFile )
{
return (IFile) serviceXmlResource;
}
return null;
}
protected IWorkspaceRoot getWorkspaceRoot()
{
return ResourcesPlugin.getWorkspace().getRoot();
}
@SuppressWarnings( "rawtypes" )
protected IStatus validateListItems( String propertyName )
{
Object items = getProperty( propertyName );
if( items instanceof List )
{
List itemsList = (List) items;
if( itemsList.size() > 0 )
{
return Status.OK_STATUS;
}
}
return ServiceCore.createErrorStatus( Msgs.specifyOneItem );
}
private static class Msgs extends NLS
{
public static String namespaceInvalid;
public static String namespaceNotEmpty;
public static String packagePathNotEmpty;
public static String projectContainsServiceXmlFile;
public static String specifyOneItem;
static
{
initializeMessages( NewServiceBuilderDataModelProvider.class.getName(), Msgs.class );
}
}
}