blob: ad2f259887a5d4102a6c49e6b64c024a23b8b71d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Composent, Inc. 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: Scott Lewis - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.remoteserviceadmin.ui.endpoint;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.discovery.identity.IServiceID;
import org.eclipse.ecf.internal.remoteservices.ui.Activator;
import org.eclipse.ecf.internal.remoteservices.ui.DiscoveryComponent;
import org.eclipse.ecf.internal.remoteservices.ui.Messages;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescription;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescriptionReader;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.IEndpointDescriptionLocator;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteServiceAdmin;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteServiceAdmin.ImportReference;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteServiceAdmin.ImportRegistration;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.AbstractEndpointNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointAsyncInterfacesNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointConfigTypesNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointConnectTargetIDNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointContentProvider;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointDiscoveryGroupNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointFrameworkIDNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointGroupNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointHostGroupNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointIDNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointIntentsNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointInterfacesNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointNamespaceNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointPackageVersionNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointPropertyNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointRemoteServiceFilterNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointRemoteServiceIDNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointServiceIDNode;
import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointTimestampNode;
import org.eclipse.ecf.remoteservices.ui.RSAImageRegistry;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.pde.internal.runtime.registry.RegistryBrowser;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.ViewPart;
import org.osgi.service.remoteserviceadmin.EndpointEvent;
import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent;
/**
* @since 3.3
*/
public class EndpointDiscoveryView extends ViewPart {
public static final String ID_VIEW = "org.eclipse.ecf.remoteserviceadmin.ui.views.EndpointDiscoveryView"; //$NON-NLS-1$
protected TreeViewer viewer;
protected Action copyValueAction;
protected Action copyNameAction;
protected Action importAction;
protected Action undiscoverAction;
protected Action edefDiscoverAction;
protected Clipboard clipboard;
private DiscoveryComponent discovery;
protected EndpointContentProvider contentProvider;
public EndpointDiscoveryView() {
}
public void createPartControl(Composite parent) {
this.discovery = DiscoveryComponent.getDefault();
this.discovery.setView(this);
IViewSite viewSite = getViewSite();
this.contentProvider = createContentProvider(viewSite);
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(this.contentProvider);
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
viewer.setInput(viewSite);
makeActions();
hookContextMenu();
contributeToActionBars();
// setup clipboard
clipboard = new Clipboard(viewer.getControl().getDisplay());
getSite().setSelectionProvider(viewer);
// Add any previously discovered endpoints
viewer.getControl().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
IEndpointDescriptionLocator locator = discovery.getEndpointDescriptionLocator();
if (locator != null) {
EndpointDescription[] eds = locator.getDiscoveredEndpoints();
for (EndpointDescription ed : eds)
handleEndpointDescription(EndpointEvent.ADDED, ed);
}
}
});
showServicesInRegistryBrowser();
}
protected EndpointContentProvider createContentProvider(IViewSite viewSite) {
return new EndpointContentProvider(viewSite, Messages.EndpointDiscoveryView_ENDPOINT_ROOT_NAME);
}
private int previousRegistryBrowserGroupBy;
private IViewPart findView(String viewId) {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null)
return page.findView(viewId); // $NON-NLS-1$
}
return null;
}
@Deprecated
protected int showInRegistryBrowser(int groupBy) {
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=270684#c33
try {
IViewPart view = findView("org.eclipse.pde.runtime.RegistryBrowser"); //$NON-NLS-1$
if (view != null) {
RegistryBrowser registryBrowser = (RegistryBrowser) view;
return (int) registryBrowser.getClass().getDeclaredMethod("showGroupBy", int.class) //$NON-NLS-1$
.invoke(registryBrowser, RegistryBrowser.SERVICES);
}
} catch (Exception e) {
logWarning("Could not show services in PDE Plugin view", e); //$NON-NLS-1$
}
return RegistryBrowser.BUNDLES;
}
@Deprecated
protected void showServicesInRegistryBrowser() {
try {
this.previousRegistryBrowserGroupBy = showInRegistryBrowser(RegistryBrowser.SERVICES);
} catch (Exception e) {
logWarning("Could not find pde registry view", e); //$NON-NLS-1$
} catch (NoClassDefFoundError e) {
logWarning("Could not find pde registry view", e); //$NON-NLS-1$
}
}
@Override
public void dispose() {
showInRegistryBrowser(previousRegistryBrowserGroupBy);
super.dispose();
viewer = null;
contentProvider = null;
if (discovery != null) {
discovery.setView(null);
discovery = null;
}
discoveredEndpointIds.clear();
}
protected void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
EndpointDiscoveryView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
protected void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
bars.getMenuManager().add(edefDiscoverAction);
bars.getToolBarManager().add(edefDiscoverAction);
}
protected void fillContextMenu(IMenuManager manager) {
ITreeSelection selection = (ITreeSelection) viewer.getSelection();
if (selection != null) {
Object e = selection.getFirstElement();
if (e instanceof EndpointPropertyNode) {
manager.add(copyNameAction);
manager.add(copyValueAction);
} else if (e instanceof EndpointNode) {
EndpointNode edNode = (EndpointNode) e;
ImportReference ir = edNode.getImportReference();
if (ir == null) {
manager.add(importAction);
manager.add(undiscoverAction);
}
}
}
}
protected void log(int level, String message, Throwable e) {
Activator.getDefault().getLog().log(new Status(level, Activator.PLUGIN_ID, message, e));
}
protected void logWarning(String message, Throwable e) {
log(IStatus.WARNING, message, e);
}
protected void logError(String message, Throwable e) {
log(IStatus.ERROR, message, e);
}
protected void makeActions() {
copyValueAction = new Action() {
public void run() {
Object o = ((ITreeSelection) viewer.getSelection()).getFirstElement();
String data = ((EndpointPropertyNode) o).getPropertyValue().toString();
if (data != null && data.length() > 0) {
clipboard.setContents(new Object[] { data }, new Transfer[] { TextTransfer.getInstance() });
}
}
};
copyValueAction.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
copyValueAction.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
copyValueAction.setImageDescriptor(RSAImageRegistry.DESC_PROPERTY_OBJ);
copyNameAction = new Action() {
public void run() {
Object o = ((ITreeSelection) viewer.getSelection()).getFirstElement();
String data = ((EndpointPropertyNode) o).getPropertyName();
if (data != null && data.length() > 0) {
clipboard.setContents(new Object[] { data }, new Transfer[] { TextTransfer.getInstance() });
}
}
};
copyNameAction.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
copyNameAction.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
copyNameAction.setImageDescriptor(RSAImageRegistry.DESC_PROPERTY_OBJ);
importAction = new Action() {
public void run() {
EndpointNode edNode = getEDNodeSelected();
if (edNode != null) {
RemoteServiceAdmin rsa = discovery.getRSA();
if (rsa == null)
showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IS_NULL);
else {
// Do import
EndpointDescription ed = edNode.getEndpointDescription();
ImportRegistration reg = (ImportRegistration) rsa.importService(ed);
if (reg == null) {
logError(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED,
new Exception("Import Registration Is Null")); //$NON-NLS-1$
showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED_PREFIX
+ "Import Registration Is Null" //$NON-NLS-1$
+ Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
return;
}
// Check if import exception in returned registration
Throwable exception = reg.getException();
if (exception != null) {
logError(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED, exception);
showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED_PREFIX
+ exception.getMessage() + Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
} else {
// Success! Set registration
// and refresh
edNode.setImportReference((ImportReference) reg.getImportReference());
viewer.refresh();
}
}
}
}
};
importAction.setText(Messages.EndpointDiscoveryView_IMPORT_REMOTE_SERVICE);
importAction.setToolTipText(Messages.EndpointDiscoveryView_IMPORT_REMOTE_SERVICE_TT);
importAction.setImageDescriptor(RSAImageRegistry.DESC_RSPROXY_CO);
edefDiscoverAction = new Action() {
public void run() {
IEndpointDescriptionLocator locator = discovery.getEndpointDescriptionLocator();
if (locator != null) {
FileDialog dialog = new FileDialog(viewer.getControl().getShell(), SWT.OPEN);
dialog.setFilterExtensions(new String[] { "*.xml" }); //$NON-NLS-1$
dialog.setText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE);
dialog.setFilterPath(null);
String result = dialog.open();
if (result != null)
try {
EndpointDescription[] eds = (EndpointDescription[]) new EndpointDescriptionReader()
.readEndpointDescriptions(new FileInputStream(result));
if (eds != null) {
for (int i = 0; i < eds.length; i++)
locator.discoverEndpoint(eds[i]);
}
} catch (IOException e) {
logError(Messages.EndpointDiscoveryView_ERROR_MSG_ENDPOINT_PARSING_FAILED, e);
showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_ENDPOINT_PARSING_FAILED_PREFIX
+ e.getMessage() + Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
}
}
}
};
edefDiscoverAction.setText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG);
edefDiscoverAction.setToolTipText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG_TT);
edefDiscoverAction.setEnabled(discovery.getRSA() != null);
edefDiscoverAction.setImageDescriptor(
PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
undiscoverAction = new Action() {
public void run() {
EndpointNode endpoint = getEDNodeSelected();
if (endpoint != null && endpoint.getImportReference() == null) {
IEndpointDescriptionLocator l = discovery.getEndpointDescriptionLocator();
if (l != null && MessageDialog.openQuestion(viewer.getControl().getShell(),
Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION_TITLE,
Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION))
l.undiscoverEndpoint(endpoint.getEndpointDescription());
}
}
};
undiscoverAction.setText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT);
undiscoverAction.setToolTipText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_TT);
}
protected EndpointNode getEDNodeSelected() {
AbstractEndpointNode aen = getNodeSelected();
return (aen instanceof EndpointNode) ? (EndpointNode) aen : null;
}
boolean isRootSelected() {
return contentProvider.getRootNode().equals(getNodeSelected());
}
protected AbstractEndpointNode getNodeSelected() {
return ((AbstractEndpointNode) ((ITreeSelection) viewer.getSelection()).getFirstElement());
}
protected void showMessage(String message) {
MessageDialog.openInformation(viewer.getControl().getShell(),
Messages.EndpointDiscoveryView_ENDPOINT_MSGBOX_TITLE, message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
protected void handleEndpointDescription(final int type, final EndpointDescription ed) {
if (ed == null || viewer == null)
return;
viewer.getControl().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
switch (type) {
case EndpointEvent.ADDED:
addEndpoint(ed);
break;
case EndpointEvent.REMOVED:
removeEndpoint(ed);
break;
}
viewer.setExpandedState(contentProvider.getRootNode(), true);
viewer.refresh();
}
});
}
public void handleEndpointChanged(final EndpointEvent event) {
handleEndpointDescription(event.getType(), (EndpointDescription) event.getEndpoint());
}
private List<String> discoveredEndpointIds = new ArrayList<String>();
protected void addEndpoint(EndpointDescription ed) {
if (EndpointDiscoveryView.this.previousRegistryBrowserGroupBy != RegistryBrowser.SERVICES)
showServicesInRegistryBrowser();
String edId = ed.getId();
if (!discoveredEndpointIds.contains(edId)) {
discoveredEndpointIds.add(edId);
contentProvider.getRootNode().addChild(createEndpointDescriptionNode(ed));
}
}
protected void removeEndpoint(EndpointDescription ed) {
if (discoveredEndpointIds.remove(ed.getId()))
contentProvider.getRootNode().removeChild(new EndpointNode(ed));
}
protected ImportReference findImportReference(EndpointDescription ed) {
RemoteServiceAdmin rsa = discovery.getRSA();
if (rsa == null)
return null;
List<ImportRegistration> iRegs = rsa.getImportedRegistrations();
for (ImportRegistration ir : iRegs) {
ImportReference importRef = (ImportReference) ir.getImportReference();
if (importRef != null && ed.equals(importRef.getImportedEndpoint()))
return importRef;
}
return null;
}
protected EndpointNode createEndpointDescriptionNode(EndpointDescription ed) {
EndpointNode edo = new EndpointNode(ed,findImportReference(ed));
// Interfaces
EndpointInterfacesNode ein = new EndpointInterfacesNode();
for (String intf : ed.getInterfaces())
ein.addChild(new EndpointPackageVersionNode(EndpointNode.getPackageName(intf)));
edo.addChild(ein);
// Async Interfaces (if present)
List<String> aintfs = ed.getAsyncInterfaces();
if (aintfs.size() > 0) {
EndpointAsyncInterfacesNode ain = new EndpointAsyncInterfacesNode();
for (String intf : ed.getAsyncInterfaces())
ain.addChild(new EndpointPackageVersionNode(EndpointNode.getPackageName(intf)));
edo.addChild(ain);
}
// ID
edo.addChild(new EndpointIDNode());
// Remote Service Host
EndpointHostGroupNode idp = new EndpointHostGroupNode(Messages.EndpointDiscoveryView_REMOTE_HOST_NAME);
// Host children
idp.addChild(new EndpointNamespaceNode());
idp.addChild(new EndpointRemoteServiceIDNode());
org.eclipse.ecf.core.identity.ID connectTarget = ed.getConnectTargetID();
if (connectTarget != null)
idp.addChild(new EndpointConnectTargetIDNode());
idp.addChild(new EndpointServiceIDNode());
idp.addChild(new EndpointIntentsNode());
idp.addChild(new EndpointConfigTypesNode());
idp.addChild(new EndpointFrameworkIDNode());
idp.addChild(new EndpointTimestampNode());
String filter = ed.getRemoteServiceFilter();
if (filter != null)
idp.addChild(new EndpointRemoteServiceFilterNode());
edo.addChild(idp);
IEndpointDescriptionLocator locator = discovery.getEndpointDescriptionLocator();
IServiceID serviceID = (locator == null) ? null : locator.getNetworkDiscoveredServiceID(ed);
if (serviceID != null)
edo.addChild(
new EndpointDiscoveryGroupNode(Messages.EndpointDiscoveryView_DISCOVERY_GROUP_NAME, serviceID));
return edo;
}
EndpointNode findEndpointNode(final ImportReference ir) {
EndpointGroupNode egn = contentProvider.getRootNode();
for(AbstractEndpointNode aen: egn.getChildren()) {
if (aen instanceof EndpointNode) {
EndpointNode en = (EndpointNode) aen;
ImportReference iRef = en.getImportReference();
if (iRef != null && iRef.equals(ir))
return en;
}
}
return null;
}
public void handleRSAEent(RemoteServiceAdminEvent event) {
final int type = event.getType();
Throwable t = event.getException();
if (t == null) {
TreeViewer treeViewer = this.viewer;
if (treeViewer == null) return;
switch (type) {
case RemoteServiceAdminEvent.IMPORT_UNREGISTRATION:
final ImportReference ir = (ImportReference) event.getImportReference();
if (ir != null) {
treeViewer.getControl().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
EndpointGroupNode egn = contentProvider.getRootNode();
for(AbstractEndpointNode aen: egn.getChildren()) {
if (aen instanceof EndpointNode) {
EndpointNode en = (EndpointNode) aen;
ImportReference iRef = en.getImportReference();
if (iRef != null && iRef.equals(ir))
en.setImportReference(null);
}
}
viewer.refresh();
}});
}
break;
}
}
}
}