Java tutorial
/****************************************************************************** * 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; } }