/******************************************************************************
* Copyright (c) 2009-2013, Linagora
*
* 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:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.services.explorer;
import java.io.File;
import java.net.URI;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import com.ebmwebsourcing.petals.services.PetalsServicesPlugin;
import com.ebmwebsourcing.petals.services.explorer.model.EndpointBean;
import com.ebmwebsourcing.petals.services.explorer.sources.CurrentWorkspaceSource;
import com.ebmwebsourcing.petals.services.explorer.sources.EndpointSource;
import com.ebmwebsourcing.petals.services.explorer.sources.ExternalWorkspaceSource;
import com.ebmwebsourcing.petals.services.explorer.sources.SaDirectorySource;
/**
* Adds actions on elements from the End-point explorer.
* @author Vincent Zurczak - EBM WebSourcing
*/
public class ServiceExplorerActionProvider extends CommonActionProvider {
private Action refreshAction;
private Action deleteAction;
private Action addWorkspaceFolderSourceAction;
private Action addSaFolderAction;
private Action propertiesAction;
private Action openWsdlAction;
// private Action addServerSourceAction;
/*
* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonActionProvider
* #init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
*/
@Override
public void init( final ICommonActionExtensionSite aSite ) {
ICommonViewerSite site = aSite.getViewSite();
if( !( site instanceof ICommonViewerWorkbenchSite ))
return;
final ISelectionProvider provider = ((ICommonViewerWorkbenchSite) site).getSelectionProvider();
//
// Workspace Folder Source
this.addWorkspaceFolderSourceAction = new Action() {
@Override
public void run() {
DirectoryDialog dlg = new DirectoryDialog( aSite.getViewSite().getShell());
dlg.setText( "External workspace" );
dlg.setMessage( "Find Petals services in an external workspace." );
String result = dlg.open();
if( result != null ) {
EndpointSource source = new ExternalWorkspaceSource( new File( result ));
SourceManager.getInstance().addSource( source );
}
}
};
this.addWorkspaceFolderSourceAction.setText( "Workspace Folder" );
this.addWorkspaceFolderSourceAction.setToolTipText( "New workspace folder source" );
this.addWorkspaceFolderSourceAction.setDescription( "Find the Petals services in contained in another workspace folder." );
ImageDescriptor desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/EndpointProjectClosed.gif" );
this.addWorkspaceFolderSourceAction.setImageDescriptor( desc );
//
// SA Folder Source
this.addSaFolderAction = new Action() {
@Override
public void run() {
DirectoryDialog dlg = new DirectoryDialog( aSite.getViewSite().getShell());
dlg.setText( "Service Assembly folder" );
dlg.setMessage( "Find Petals services in a directory of service assemblies." );
String result = dlg.open();
if( result != null ) {
EndpointSource source = new SaDirectorySource( new File( result ), false, false );
SourceManager.getInstance().addSource( source );
}
}
};
this.addSaFolderAction.setText( "SA Folder" );
this.addSaFolderAction.setToolTipText( "New SA folder source" );
this.addSaFolderAction.setDescription( "Find the Petals services in contained in a folder of service assemblies." );
desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/EndpointFolderClosed.gif" );
this.addSaFolderAction.setImageDescriptor( desc );
// //
// // Workspace Folder Source
// this.addServerSourceAction = new Action() {
// @Override
// public void run() {
// // TODO
// }
// };
//
// this.addServerSourceAction.setText( "Petals Server" );
// this.addServerSourceAction.setToolTipText( "New server source" );
// this.addServerSourceAction.setDescription( "Browse the end-points contained in a Petals server." );
// desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/EndpointServer.gif" );
// this.addServerSourceAction.setImageDescriptor( desc );
//
// Refresh action
this.refreshAction = new Action() {
@Override
public void run() {
final EndpointSource source = getEndpointSource( provider );
if( source != null )
SourceManager.getInstance().updateSource( source );
}
@Override
public boolean isEnabled() {
return getEndpointSource( provider ) != null;
}
};
this.refreshAction.setText( "Refresh" );
this.refreshAction.setAccelerator( SWT.F5 );
this.refreshAction.setToolTipText( "Refresh the list of Petals services" );
this.refreshAction.setDescription( "Refresh the list of Petals services." );
desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/refresh.gif" );
this.refreshAction.setImageDescriptor( desc );
//
// Remove action
this.deleteAction = new Action() {
@Override
public void run() {
EndpointSource source = getEndpointSource( provider );
if( source != null )
SourceManager.getInstance().removeSource( source );
}
@Override
public boolean isEnabled() {
EndpointSource edptSource = getEndpointSource( provider );
return edptSource != null && ! ( edptSource instanceof CurrentWorkspaceSource );
}
};
this.deleteAction.setText( "Delete" );
this.deleteAction.setToolTipText( "Delete this source of Petals services" );
this.deleteAction.setDescription( "Delete this source of Petals services." );
desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/delete.gif" );
this.deleteAction.setImageDescriptor( desc );
//
// Properties action
this.propertiesAction = new Action() {
@Override
public boolean isEnabled() {
return getEndpointSource( provider ) != null
|| getEndpointBean( provider ) != null;
}
@Override
public void run() {
Object object = getEndpointSource( provider );
if( object == null )
object = getEndpointBean( provider );
try {
// Show properties view
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.showView( "org.eclipse.ui.views.PropertySheet" ); //$NON-NLS-1$
// Show the Petals service explorer
page.showView( "com.ebmwebsourcing.petals.services.explorer" ); //$NON-NLS-1$
// Select the previous selection in the outline.
provider.setSelection( new StructuredSelection( object ));
}
catch( Exception e ) {
PetalsServicesPlugin.log( e, IStatus.ERROR );
}
}
};
this.propertiesAction.setText( "Properties" );
this.propertiesAction.setToolTipText( "Show properties" );
this.propertiesAction.setDescription( "Show the properties of the selected element." );
desc = PetalsServicesPlugin.getImageDescriptor( "icons/obj16/properties.gif" );
this.propertiesAction.setImageDescriptor( desc );
//
// Open WSDL action
this.openWsdlAction = new Action() {
@Override
public boolean isEnabled() {
EndpointBean edptBean = getEndpointBean( provider );
if( edptBean != null ) {
if( edptBean.getServiceUnit().isWsdlContainerLocationComputed()) {
URI uri = edptBean.getWsdlUri();
return uri != null && new File( uri ).exists();
}
return edptBean.getWsdlLocation() != null;
}
return false;
}
@Override
public boolean isHandled() {
EndpointBean edptBean = getEndpointBean( provider );
return edptBean != null;
}
@Override
public void run() {
final EndpointBean edptBean = getEndpointBean( provider );
try {
URI wsdlUri = edptBean.getWsdlUri();
// WSDL not null: open it
File f = null;
if( wsdlUri != null && (f = new File( wsdlUri )).exists()) {
IFileStore fileStore = EFS.getLocalFileSystem().getStore( new Path( f.getAbsolutePath()));
if( ! fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
IWorkbenchPage page =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IDE.openEditorOnFileStore( page, fileStore );
}
}
// WSDL URI is null or points to a nonexistent file
/*
* Can only happen when this URI is computed for the first time.
* Then, isEnabled() prevents this from happening.
*
* Refreshing the source of the end-point will have for consequence
* a new computation of the WSDL URI.
*/
else if( f != null ) {
MessageDialog.openInformation(
aSite.getViewSite().getShell(),
"Nonexistent WSDL", "The WSDL file " + f.getAbsolutePath() + " does not exist." );
}
else {
MessageDialog.openInformation(
aSite.getViewSite().getShell(),
"No WSDL to open", "No WSDL could be found for this service." );
}
} catch( Exception e ) {
MessageDialog.openError(
aSite.getViewSite().getShell(),
"Failure in opening the WSDL",
"The service WSDL could not be opened. See the log for more details." );
PetalsServicesPlugin.log( e, IStatus.ERROR );
}
}
};
this.openWsdlAction.setText( "Open WSDL" );
this.openWsdlAction.setToolTipText( "Show the service interface in the WSDL editor" );
this.openWsdlAction.setDescription( "Show the service interface in the WSDL editor." );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.actions.ActionGroup
* #fillContextMenu(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void fillContextMenu( IMenuManager menu ) {
MenuManager newManager = new MenuManager( "&New", "New" );
newManager.add( this.addSaFolderAction );
newManager.add( this.addWorkspaceFolderSourceAction );
// newManager.add( this.addServerSourceAction );
menu.add( newManager );
if( this.refreshAction.isEnabled())
menu.add( this.refreshAction );
if( this.deleteAction.isEnabled()) {
menu.add( new Separator());
menu.add( this.deleteAction );
}
boolean propertiesEnabled = this.propertiesAction.isEnabled();
boolean openWsdlHandled = this.openWsdlAction.isHandled();
if( propertiesEnabled || openWsdlHandled ) {
menu.add( new Separator());
// The WSDL action must appear on every end-point...
// but can be activated only if there is a WSDL
if( openWsdlHandled ) {
menu.add( this.openWsdlAction );
this.openWsdlAction.setEnabled( this.openWsdlAction.isEnabled());
}
if( propertiesEnabled )
menu.add( this.propertiesAction );
}
}
/**
* @param provider
* @return a EndpointSource, or null if the the selection is empty or is not an EndpointSource
*/
private EndpointSource getEndpointSource( ISelectionProvider provider ) {
if( provider.getSelection() != null && provider.getSelection() instanceof IStructuredSelection ) {
Object o = ((IStructuredSelection) provider.getSelection()).getFirstElement();
if( o instanceof EndpointSource )
return (EndpointSource) o;
}
return null;
}
/**
* @param provider
* @return a EndpointBean, or null if the the selection is empty or is not an EndpointBean
*/
private EndpointBean getEndpointBean( ISelectionProvider provider ) {
if( provider.getSelection() != null && provider.getSelection() instanceof IStructuredSelection ) {
Object o = ((IStructuredSelection) provider.getSelection()).getFirstElement();
if( o instanceof EndpointBean )
return (EndpointBean) o;
}
return null;
}
}