/******************************************************************************* * 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.hook.ui.wizard; import com.liferay.ide.core.ILiferayProject; import com.liferay.ide.core.LiferayCore; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.hook.ui.HookUI; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.ui.wizard.StringArrayTableWizardSection; import com.liferay.ide.ui.dialog.FilteredTypesSelectionDialogEx; import java.io.File; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.core.search.BasicSearchEngine; import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; /** * @author Greg Amerson * @author Simon Jiang */ @SuppressWarnings( "restriction" ) public class ServicesTableWizardSection extends StringArrayTableWizardSection { public class AddServiceDialog extends AddStringArrayDialog { protected String[] buttonLabels; protected CLabel errorMessageLabel; public AddServiceDialog( Shell shell, String windowTitle, String[] labelsForTextField, String[] buttonLabels ) { super( shell, windowTitle, labelsForTextField ); setShellStyle( getShellStyle() | SWT.RESIZE ); this.buttonLabels = buttonLabels; setWidthHint( 450 ); } @Override protected Control createContents(Composite parent) { Composite composite = (Composite) super.createContents(parent); getButton(IDialogConstants.OK_ID).setEnabled(false); return composite; } @Override public Control createDialogArea(Composite parent) { super.createDialogArea( parent ); errorMessageLabel = new CLabel( parent, SWT.LEFT_TO_RIGHT ); errorMessageLabel.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false, 2, 1 ) ); errorMessageLabel.setImage( PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_ERROR_TSK ) ); errorMessageLabel.setVisible( false ); return parent; } @Override protected Text createField( Composite parent, final int index ) { Label label = new Label( parent, SWT.LEFT ); label.setText( labelsForTextField[index] ); label.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ) ); // Composite composite = new Composite(parent, SWT.NONE); // GridData data = new GridData(GridData.FILL_HORIZONTAL); // composite.setLayoutData(data); // composite.setLayout(new GridLayout(2, false)); final Text text = new Text( parent, SWT.SINGLE | SWT.BORDER ); GridData data = new GridData( GridData.FILL_HORIZONTAL ); // data.widthHint = 200; text.setLayoutData( data ); Composite buttonComposite = new Composite( parent, SWT.NONE ); String[] buttonLbls = buttonLabels[index].split( "," ); //$NON-NLS-1$ GridLayout gl = new GridLayout( buttonLbls.length, true ); gl.marginWidth = 0; gl.horizontalSpacing = 1; buttonComposite.setLayout( gl ); for( final String lbl : buttonLbls ) { Button button = new Button( buttonComposite, SWT.PUSH ); button.setText( lbl ); button.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { handleArrayDialogButtonSelected( index, lbl, text ); } } ); } return text; } protected void handleArrayDialogButtonSelected( int index, String label, Text text ) { if( index == 0 ) { // select event handleSelectServiceButton( text ); } else if( index == 1 && Msgs.select.equals( label ) ) { handleSelectImplClassButton( text ); } else if( index == 1 && Msgs.newLabel.equals( label ) ) { handleNewImplClassButton( text ); } } protected void handleNewImplClassButton( Text text ) { if( CoreUtil.isNullOrEmpty( texts[0].getText() ) ) { MessageDialog.openWarning( getParentShell(), Msgs.addService, Msgs.specifyServiceType ); return; } String serviceType = texts[0].getText(); String wrapperType = StringPool.EMPTY; if( serviceType.endsWith( "Service" ) ) //$NON-NLS-1$ { wrapperType = serviceType + "Wrapper"; //$NON-NLS-1$ } NewEventActionClassDialog dialog = new NewServiceWrapperClassDialog( getShell(), model, serviceType, wrapperType ); if( dialog.open() == Window.OK ) { String qualifiedClassname = dialog.getQualifiedClassname(); text.setText( qualifiedClassname ); } } protected void handleSelectImplClassButton( Text text ) { if( CoreUtil.isNullOrEmpty( texts[0].getText() ) ) { MessageDialog.openWarning( getParentShell(), Msgs.addService, Msgs.specifyServiceType ); return; } IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model.getProperty( INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT ); if( packRoot == null ) { return; } IJavaSearchScope scope = null; try { // get the Service type and replace Service with Wrapper and // make it the supertype String serviceType = texts[0].getText(); if( serviceType.endsWith( "Service" ) ) //$NON-NLS-1$ { String wrapperType = serviceType + "Wrapper"; //$NON-NLS-1$ scope = BasicSearchEngine.createHierarchyScope( packRoot.getJavaProject().findType( wrapperType ) ); } } catch( JavaModelException e ) { HookUI.logError( e ); return; } FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialogEx( getShell(), false, null, scope, IJavaSearchConstants.CLASS ); dialog.setTitle( J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_TITLE ); dialog.setMessage( J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_DESC ); if( dialog.open() == Window.OK ) { IType type = (IType) dialog.getFirstResult(); String classFullPath = J2EEUIMessages.EMPTY_STRING; if( type != null ) { classFullPath = type.getFullyQualifiedName(); } text.setText( classFullPath ); } } protected void handleSelectServiceButton( Text text ) { PortalServiceSearchScope scope = new PortalServiceSearchScope(); scope.setResourcePattern( new String[] { ".*Service.class$" } ); //$NON-NLS-1$ IProject project = ProjectUtil.getProject( model ); ILiferayProject liferayProject = LiferayCore.create( project ); IPath serviceJarPathService = liferayProject.getLibraryPath( "portal-service" ); IPath serviceJarPathKernel = liferayProject.getLibraryPath( "portal-kernel" ); scope.setEnclosingJarPaths( new IPath[] { serviceJarPathService != null ? serviceJarPathService : serviceJarPathKernel } ); FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialogEx( getShell(), false, null, scope, IJavaSearchConstants.INTERFACE ); dialog.setTitle( J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_TITLE ); dialog.setMessage( J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_DESC ); if( dialog.open() == Window.OK ) { IType type = (IType) dialog.getFirstResult(); String classFullPath = J2EEUIMessages.EMPTY_STRING; if( type != null ) { classFullPath = type.getFullyQualifiedName(); } text.setText( classFullPath ); } } @Override public void modifyText(ModifyEvent e) { boolean serviceTypeValid = false; boolean implClassValid = false; if ( texts[0].getText().trim().length() > 0 ) { int serviceTypeStatus = JavaConventions.validateJavaTypeName( texts[0].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity(); serviceTypeValid = ( serviceTypeStatus != IStatus.ERROR )?true:false; } if ( texts[1].getText().trim().length() > 0 ) { int implClasseStatus = JavaConventions.validateJavaTypeName( texts[1].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity(); implClassValid = ( implClasseStatus != IStatus.ERROR )?true:false; } if ( !( serviceTypeValid ^ implClassValid ) ) { errorMessageLabel.setText( "Invalid service name and class name" ); } else if ( !serviceTypeValid ) { errorMessageLabel.setText( "Invalid service type name" ); } else if ( !implClassValid ) { errorMessageLabel.setText( "Invalid class name" ); } this.errorMessageLabel.setVisible( !( serviceTypeValid && implClassValid ) ); getButton(IDialogConstants.OK_ID).setEnabled( serviceTypeValid && implClassValid ); } } public class EditServiceDialog extends EditStringArrayDialog { protected CLabel errorMessageLabel; public EditServiceDialog( Shell shell, String windowTitle, String[] labelsForTextField, String[] valuesForTextField ) { super( shell, windowTitle, labelsForTextField, valuesForTextField ); } @Override public Control createDialogArea(Composite parent) { super.createDialogArea( parent ); errorMessageLabel = new CLabel( parent, SWT.LEFT_TO_RIGHT ); errorMessageLabel.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false, 2, 1 ) ); errorMessageLabel.setImage( PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_ERROR_TSK ) ); errorMessageLabel.setVisible( false ); return parent; } @Override public void modifyText(ModifyEvent e) { boolean serviceTypeValid = false; boolean implClassValid = false; if ( texts[0].getText().trim().length() > 0 ) { int serviceTypeStatus = JavaConventions.validateJavaTypeName( texts[0].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity(); serviceTypeValid = ( serviceTypeStatus != IStatus.ERROR )?true:false; } if ( texts[1].getText().trim().length() > 0 ) { int implClasseStatus = JavaConventions.validateJavaTypeName( texts[1].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity(); implClassValid = ( implClasseStatus != IStatus.ERROR )?true:false; } if ( !( serviceTypeValid ^ implClassValid ) ) { errorMessageLabel.setText( "Invalid service name and class name" ); } else if ( !serviceTypeValid ) { errorMessageLabel.setText( "Invalid service type name" ); } else if ( !implClassValid ) { errorMessageLabel.setText( "Invalid class name" ); } this.errorMessageLabel.setVisible( !( serviceTypeValid && implClassValid ) ); getButton(IDialogConstants.OK_ID).setEnabled( serviceTypeValid && implClassValid ); } } protected String[] buttonLabels; protected IProject project; protected File servicesPropertiesFile; public ServicesTableWizardSection( Composite parent, String componentLabel, String dialogTitle, String addButtonLabel, String editButtonLabel, String removeButtonLabel, String[] columnTitles, String[] fieldLabels, Image labelProviderImage, IDataModel model, String propertyName ) { super( parent, componentLabel, dialogTitle, addButtonLabel, editButtonLabel, removeButtonLabel, columnTitles, fieldLabels, labelProviderImage, model, propertyName ); this.buttonLabels = new String[] { Msgs.select, Msgs.selectNew }; this.servicesPropertiesFile = null; } public void setProject( IProject project ) { this.project = project; } @Override protected void handleAddButtonSelected() { AddServiceDialog dialog = new AddServiceDialog( getShell(), dialogTitle, fieldLabels, buttonLabels ); if( dialog.open() == Window.OK ) { String[] stringArray = dialog.getStringArray(); addStringArray( stringArray ); } } @Override protected void handleEditButtonSelected() { ISelection s = viewer.getSelection(); if (!(s instanceof IStructuredSelection)) { return; } IStructuredSelection selection = (IStructuredSelection) s; if (selection.size() != 1) { return; } Object selectedObj = selection.getFirstElement(); String[] valuesForText = (String[]) selectedObj; EditServiceDialog dialog = new EditServiceDialog(getShell(), dialogTitle, fieldLabels, valuesForText); dialog.open(); String[] stringArray = dialog.getStringArray(); editStringArray(valuesForText, stringArray); } private static class Msgs extends NLS { public static String addService; public static String newLabel; public static String select; public static String selectNew; public static String specifyServiceType; static { initializeMessages( ServicesTableWizardSection.class.getName(), Msgs.class ); } } }