diff options
9 files changed, 118 insertions, 81 deletions
diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/interfaces/services/ILocatorModelLookupService.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/interfaces/services/ILocatorModelLookupService.java index 4c772c5cc..f292f37c8 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/interfaces/services/ILocatorModelLookupService.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/interfaces/services/ILocatorModelLookupService.java @@ -31,4 +31,14 @@ public interface ILocatorModelLookupService extends ILocatorModelService { * @return The peer model instances, or an empty list if the given agent id could not be matched. */ public IPeerModel[] lkupPeerModelByAgentId(String agentId); + + /** + * Lookup matching peer model instances which supports the listed local and remote services. + * + * @param expectedLocalServices The list of local service names to be supported, or <code>null</code>. + * @param expectedRemoteServices The list of remote service names to be supported, or <code>null</code>. + * + * @return The peer model instances, or an empty list if the listed services are not supported by any of the peers. + */ + public IPeerModel[] lkupPeerModelBySupportedServices(String[] expectedLocalServices, String[] expectedRemoteServices); } diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/services/LocatorModelLookupService.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/services/LocatorModelLookupService.java index 1226f7f57..9a77ec38f 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/services/LocatorModelLookupService.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/services/LocatorModelLookupService.java @@ -17,6 +17,7 @@ import org.eclipse.tm.tcf.protocol.IPeer; import org.eclipse.tm.tcf.protocol.Protocol; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel; +import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModelProperties; import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelLookupService; @@ -40,7 +41,7 @@ public class LocatorModelLookupService extends AbstractLocatorModelService imple @Override public IPeerModel lkupPeerModelById(String id) { Assert.isNotNull(id); - Assert.isTrue(Protocol.isDispatchThread()); + Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ IPeerModel node = null; for (IPeerModel candidate : getLocatorModel().getPeers()) { @@ -60,7 +61,7 @@ public class LocatorModelLookupService extends AbstractLocatorModelService imple @Override public IPeerModel[] lkupPeerModelByAgentId(String agentId) { Assert.isNotNull(agentId); - Assert.isTrue(Protocol.isDispatchThread()); + Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ List<IPeerModel> nodes = new ArrayList<IPeerModel>(); for (IPeerModel candidate : getLocatorModel().getPeers()) { @@ -72,4 +73,54 @@ public class LocatorModelLookupService extends AbstractLocatorModelService imple return nodes.toArray(new IPeerModel[nodes.size()]); } + + /* (non-Javadoc) + * @see org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelLookupService#lkupPeerModelBySupportedServices(java.lang.String[], java.lang.String[]) + */ + @Override + public IPeerModel[] lkupPeerModelBySupportedServices(String[] expectedLocalServices, String[] expectedRemoteServices) { + Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ + + List<IPeerModel> nodes = new ArrayList<IPeerModel>(); + for (IPeerModel candidate : getLocatorModel().getPeers()) { + String localServices = candidate.getStringProperty(IPeerModelProperties.PROP_LOCAL_SERVICES); + String remoteServices = candidate.getStringProperty(IPeerModelProperties.PROP_REMOTE_SERVICES); + + boolean matchesExpectations = true; + + // Ignore the local services if not expectations are set + if (expectedLocalServices != null && expectedLocalServices.length > 0) { + if (localServices != null) { + for (String service : expectedLocalServices) { + if (!localServices.contains(service)) { + matchesExpectations = false; + break; + } + } + } else { + matchesExpectations = false; + } + } + + if (!matchesExpectations) continue; + + // Ignore the remote services if not expectations are set + if (expectedRemoteServices != null && expectedRemoteServices.length > 0) { + if (remoteServices != null) { + for (String service : expectedRemoteServices) { + if (!remoteServices.contains(service)) { + matchesExpectations = false; + break; + } + } + } else { + matchesExpectations = false; + } + } + + if (matchesExpectations) nodes.add(candidate); + } + + return nodes.toArray(new IPeerModel[nodes.size()]); + } } diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/META-INF/MANIFEST.MF index ddf80729d..80d40eb63 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/META-INF/MANIFEST.MF @@ -31,9 +31,9 @@ Export-Package: org.eclipse.tm.te.tcf.ui.activator;x-internal:=true, org.eclipse.tm.te.tcf.ui.internal.filter;x-internal:=true, org.eclipse.tm.te.tcf.ui.internal.handler;x-internal:=true, org.eclipse.tm.te.tcf.ui.internal.help;x-internal:=true, - org.eclipse.tm.te.tcf.ui.internal.model;x-internal:=true, org.eclipse.tm.te.tcf.ui.internal.navigator;x-internal:=true, org.eclipse.tm.te.tcf.ui.internal.navigator.images;x-internal:=true, + org.eclipse.tm.te.tcf.ui.model, org.eclipse.tm.te.tcf.ui.nls;x-internal:=true, org.eclipse.tm.te.tcf.ui.tables, org.eclipse.tm.te.tcf.ui.wizards;x-internal:=true, diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/dialogs/AgentSelectionDialog.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/dialogs/AgentSelectionDialog.java index 57dc9c3d7..ab3b559c2 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/dialogs/AgentSelectionDialog.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/dialogs/AgentSelectionDialog.java @@ -11,11 +11,8 @@ package org.eclipse.tm.te.tcf.ui.dialogs; import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Iterator;
import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ArrayContentProvider;
@@ -34,11 +31,12 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.tm.tcf.protocol.Protocol;
+import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel;
import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel;
-import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModelProperties;
+import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelLookupService;
import org.eclipse.tm.te.tcf.ui.internal.help.IContextHelpIds;
-import org.eclipse.tm.te.tcf.ui.internal.model.Model;
import org.eclipse.tm.te.tcf.ui.internal.navigator.LabelProviderDelegate;
+import org.eclipse.tm.te.tcf.ui.model.Model;
import org.eclipse.tm.te.tcf.ui.nls.Messages;
import org.eclipse.tm.te.ui.jface.dialogs.CustomTitleAreaDialog;
import org.eclipse.tm.te.ui.swt.SWTControlUtil;
@@ -126,15 +124,17 @@ public class AgentSelectionDialog extends CustomTitleAreaDialog { // The content to show is static. Do the filtering manually so that
// we can disable the OK Button if the dialog would not show any content.
- List<IPeerModel> nodes = new ArrayList<IPeerModel>(Arrays.asList(Model.getModel().getPeers()));
- Iterator<IPeerModel> iterator = nodes.iterator();
- while (iterator.hasNext()) {
- IPeerModel peerModel = iterator.next();
- if (isFiltered(peerModel)) iterator.remove();
+ final ILocatorModelLookupService service = getModel().getService(ILocatorModelLookupService.class);
+ final List<IPeerModel> nodes = new ArrayList<IPeerModel>();
+ if (service != null) {
+ Protocol.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ nodes.addAll(Arrays.asList(service.lkupPeerModelBySupportedServices(null, services)));
+ }
+ });
}
-
- // Set the remaining nodes as input
- viewer.setInput(nodes.toArray(new IPeerModel[nodes.size()]));
+ viewer.setInput(nodes.size() > 0 ? nodes.toArray(new IPeerModel[nodes.size()]) : null);
return top;
}
@@ -148,7 +148,7 @@ public class AgentSelectionDialog extends CustomTitleAreaDialog { // Adjust the OK button enablement
Button okButton = getButton(IDialogConstants.OK_ID);
- SWTControlUtil.setEnabled(okButton, ((IPeerModel[])viewer.getInput()).length > 0);
+ SWTControlUtil.setEnabled(okButton, viewer.getInput() != null && ((IPeerModel[])viewer.getInput()).length > 0);
return buttonBar;
}
@@ -180,33 +180,13 @@ public class AgentSelectionDialog extends CustomTitleAreaDialog { }
/**
- * Returns if the given peer model node is filtered or not.
+ * Returns the locator model instance to use for determining
+ * the dialogs input.
*
- * @param peerModel The peer model node. Must not be <code>null</code>.
- * @return
+ * @return The locator model instance.
*/
- protected boolean isFiltered(final IPeerModel peerModel) {
- Assert.isNotNull(peerModel);
-
- final AtomicReference<String> remoteServices = new AtomicReference<String>();
- Protocol.invokeAndWait(new Runnable() {
- @Override
- public void run() {
- remoteServices.set(peerModel.getStringProperty(IPeerModelProperties.PROP_REMOTE_SERVICES));
- }
- });
-
- boolean matchedService = false;
- if (remoteServices.get() != null) {
- for (String service : services) {
- if (remoteServices.get().contains(service)) {
- matchedService = true;
- break;
- }
- }
- }
-
- return !matchedService;
+ protected ILocatorModel getModel() {
+ return Model.getModel();
}
/**
diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/handler/DeleteCommandHandler.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/handler/DeleteCommandHandler.java index 7a712596b..1c6df6b5a 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/handler/DeleteCommandHandler.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/handler/DeleteCommandHandler.java @@ -32,7 +32,7 @@ import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel; import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelRefreshService;
import org.eclipse.tm.te.tcf.ui.activator.UIPlugin;
import org.eclipse.tm.te.tcf.ui.internal.help.IContextHelpIds;
-import org.eclipse.tm.te.tcf.ui.internal.model.Model;
+import org.eclipse.tm.te.tcf.ui.model.Model;
import org.eclipse.tm.te.tcf.ui.nls.Messages;
import org.eclipse.ui.handlers.HandlerUtil;
diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ContentProviderDelegate.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ContentProviderDelegate.java index aa383eedc..bb7f0ad5e 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ContentProviderDelegate.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ContentProviderDelegate.java @@ -13,11 +13,13 @@ import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.tm.tcf.protocol.Protocol; import org.eclipse.tm.te.tcf.core.Tcf; +import org.eclipse.tm.te.tcf.locator.interfaces.IModelListener; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel; import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelRefreshService; -import org.eclipse.tm.te.tcf.ui.internal.model.Model; +import org.eclipse.tm.te.tcf.ui.model.Model; import org.eclipse.tm.te.ui.views.interfaces.IRoot; +import org.eclipse.ui.navigator.CommonViewer; /** @@ -26,6 +28,9 @@ import org.eclipse.tm.te.ui.views.interfaces.IRoot; public class ContentProviderDelegate implements ITreeContentProvider { private final static Object[] NO_ELEMENTS = new Object[0]; + // The locator model listener instance + private IModelListener modelListener = null; + /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ @@ -93,8 +98,16 @@ public class ContentProviderDelegate implements ITreeContentProvider { */ @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - if (newInput instanceof IRoot) { - final ILocatorModel model = Model.getModel(); + final ILocatorModel model = Model.getModel(); + + // Create and attach the model listener if not yet done + if (modelListener == null && model != null && viewer instanceof CommonViewer) { + modelListener = new ModelListener(model, (CommonViewer)viewer); + model.addListener(modelListener); + } + + // Refresh the model + if (model != null && newInput instanceof IRoot) { // If the TCF framework is not running yet, run the refresh asynchronous if (Tcf.isRunning() && Protocol.isDispatchThread()) { model.getService(ILocatorModelRefreshService.class).refresh(); diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ModelListener.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ModelListener.java index b74cc4aeb..b42cf2c5a 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ModelListener.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/navigator/ModelListener.java @@ -13,11 +13,7 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel; import org.eclipse.tm.te.tcf.locator.listener.ModelAdapter; -import org.eclipse.tm.te.ui.views.interfaces.IUIConstants; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; @@ -26,14 +22,20 @@ import org.eclipse.ui.navigator.CommonViewer; */ public class ModelListener extends ModelAdapter { private final ILocatorModel parentModel; + /* default */ final CommonViewer viewer; /** * Constructor. * + * @param parent The parent locator model. Must not be <code>null</code>. + * @param viewer The common viewer instance. Must not be <code>null</code>. */ - public ModelListener(ILocatorModel parent) { + public ModelListener(ILocatorModel parent, CommonViewer viewer) { Assert.isNotNull(parent); - parentModel = parent; + Assert.isNotNull(viewer); + + this.parentModel = parent; + this.viewer = viewer; } /* (non-Javadoc) @@ -45,8 +47,7 @@ public class ModelListener extends ModelAdapter { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { - CommonViewer viewer = getViewer(); - if (viewer != null) viewer.refresh(); + viewer.refresh(); } }); } @@ -61,28 +62,9 @@ public class ModelListener extends ModelAdapter { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { - CommonViewer viewer = getViewer(); - if (viewer != null) viewer.refresh(peer); + viewer.refresh(peer); } }); } } - - /** - * Get the common viewer used by the Target Explorer view instance. - * - * @return The common viewer or <code>null</code> - */ - protected CommonViewer getViewer() { - if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null - && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) { - IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - IViewPart part = page.findView(IUIConstants.ID_EXPLORER); - if (part instanceof CommonNavigator) { - return ((CommonNavigator)part).getCommonViewer(); - } - } - - return null; - } } diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/model/Model.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/model/Model.java index 79eb42ddb..a43c3f440 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/internal/model/Model.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/model/Model.java @@ -7,13 +7,12 @@ * Contributors: * Wind River Systems - initial API and implementation *******************************************************************************/ -package org.eclipse.tm.te.tcf.ui.internal.model; +package org.eclipse.tm.te.tcf.ui.model; import org.eclipse.core.runtime.Assert; import org.eclipse.tm.tcf.protocol.Protocol; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel; import org.eclipse.tm.te.tcf.locator.nodes.LocatorModel; -import org.eclipse.tm.te.tcf.ui.internal.navigator.ModelListener; /** @@ -24,10 +23,12 @@ public final class Model { /* default */ static ILocatorModel locatorModel; /** - * Returns the locator model. If not yet initialized, - * initialize the locator model. + * Returns the shared locator model instance. + * <p> + * If the shared locator model instance has not been yet initialized, + * the method does initialize the shared locator model instance. * - * @return The locator model. + * @return The shared locator model. */ public static ILocatorModel getModel() { // Access to the locator model must happen in the TCF dispatch thread @@ -54,7 +55,7 @@ public final class Model { locatorModel = new LocatorModel(); // Register the model listener - locatorModel.addListener(new ModelListener(locatorModel)); +// locatorModel.addListener(new ModelListener(locatorModel)); // Start the scanner locatorModel.startScanner(5000, 120000); } diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/wizards/NewTargetWizard.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/wizards/NewTargetWizard.java index f6b32daca..08ed8cefe 100644 --- a/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/wizards/NewTargetWizard.java +++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.ui/src/org/eclipse/tm/te/tcf/ui/wizards/NewTargetWizard.java @@ -25,7 +25,7 @@ import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel; import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelLookupService;
import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelRefreshService;
-import org.eclipse.tm.te.tcf.ui.internal.model.Model;
+import org.eclipse.tm.te.tcf.ui.model.Model;
import org.eclipse.tm.te.tcf.ui.nls.Messages;
import org.eclipse.tm.te.tcf.ui.wizards.pages.NewTargetWizardPage;
import org.eclipse.tm.te.ui.views.ViewsUtil;
|