Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Stieber2011-11-06 13:49:06 +0000
committerUwe Stieber2011-11-06 13:49:06 +0000
commitfa44e30bcfc91f986691fb2a877339fed1c721ee (patch)
tree503e1f3ed3f77ea3b6a47a0221e11e9e2e7d1b4e
parent3f0ba90359e429776e2c3a81ec2ed1fc8826b69c (diff)
downloadorg.eclipse.tcf-fa44e30bcfc91f986691fb2a877339fed1c721ee.tar.gz
org.eclipse.tcf-fa44e30bcfc91f986691fb2a877339fed1c721ee.tar.xz
org.eclipse.tcf-fa44e30bcfc91f986691fb2a877339fed1c721ee.zip
Target Explorer: Improve getElementId(), equals() and hashCode() implementation of PeerModel
-rw-r--r--target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/nodes/PeerModel.java55
1 files changed, 38 insertions, 17 deletions
diff --git a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/nodes/PeerModel.java b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/nodes/PeerModel.java
index b6d247b87..57d67b54a 100644
--- a/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/nodes/PeerModel.java
+++ b/target_explorer/plugins/org.eclipse.tm.te.tcf.locator/src/org/eclipse/tm/te/tcf/locator/nodes/PeerModel.java
@@ -12,7 +12,6 @@ package org.eclipse.tm.te.tcf.locator.nodes;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.runtime.Assert;
import org.eclipse.tm.tcf.protocol.IPeer;
@@ -31,6 +30,8 @@ import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModelProperties;
public class PeerModel extends PropertiesContainer implements IPeerModel, IWorkingSetElement {
// Reference to the parent locator model
private final ILocatorModel parentModel;
+ // Reference to the element id (cached for performance optimization)
+ private String elementId;
/**
* Constructor.
@@ -58,6 +59,10 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
// constructor.
setProperty(IPeerModelProperties.PROP_INSTANCE, peer);
+ // Initialize the element id
+ elementId = peer.getID();
+ Assert.isNotNull(elementId);
+
// Enable change events
setChangeEventsEnabled(true);
}
@@ -91,22 +96,7 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
*/
@Override
public String getElementId() {
- // NOTE: The getElementId() method can be invoked from many place and
- // many threads where we cannot control the calls. Therefore, this
- // method is allowed be called from any thread.
- final AtomicReference<String> elementId = new AtomicReference<String>(null);
- if (Protocol.isDispatchThread()) {
- elementId.set(getPeer().getID());
- } else {
- Protocol.invokeAndWait(new Runnable() {
- @Override
- public void run() {
- elementId.set(getPeer().getID());
- }
- });
- }
-
- return elementId.get();
+ return elementId;
}
/* (non-Javadoc)
@@ -181,6 +171,25 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
}
/* (non-Javadoc)
+ * @see org.eclipse.tm.te.runtime.properties.PropertiesContainer#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof PeerModel) {
+ return getElementId().equals(((PeerModel)obj).getElementId());
+ }
+ return super.equals(obj);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tm.te.runtime.properties.PropertiesContainer#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return getElementId().hashCode();
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.tm.te.runtime.properties.PropertiesContainer#getProperties()
*/
@Override
@@ -209,6 +218,11 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
protected void postSetProperties(Map<String, Object> properties) {
Assert.isTrue(checkThreadAccess(), "Illegal Thread Access"); //$NON-NLS-1$
Assert.isNotNull(properties);
+ Assert.isNotNull(getPeer());
+
+ // New properties applied. Update the element id
+ elementId = getPeer().getID();
+ Assert.isNotNull(elementId);
if (changeEventsEnabled()) {
final IModelListener[] listeners = parentModel.getListener();
@@ -233,6 +247,13 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
public void postSetProperty(String key, Object value, Object oldValue) {
Assert.isTrue(checkThreadAccess(), "Illegal Thread Access"); //$NON-NLS-1$
Assert.isNotNull(key);
+ Assert.isNotNull(getPeer());
+
+ // If the peer instance changed, update the element id
+ if (IPeerModelProperties.PROP_INSTANCE.equals(key)) {
+ elementId = getPeer().getID();
+ Assert.isNotNull(elementId);
+ }
// Notify registered listeners that the peer changed. Property
// changes for property slots ending with ".silent" are suppressed.

Back to the top