diff options
Diffstat (limited to 'target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java')
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java | 149 |
1 files changed, 98 insertions, 51 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java index f7392bc71..54e2ded09 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java @@ -14,9 +14,15 @@ import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.tcf.protocol.IPeer; import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.tcf.core.interfaces.IPeerProperties; +import org.eclipse.tcf.te.tcf.core.util.persistence.PeerDataHelper; import org.eclipse.tcf.te.tcf.locator.interfaces.ILocatorModelListener; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorNode; +import org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelLookupService; import org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelUpdateService; +import org.eclipse.tcf.te.tcf.locator.model.ModelManager; +import org.eclipse.tcf.te.tcf.locator.nodes.LocatorNode; /** @@ -37,83 +43,124 @@ public class LocatorModelUpdateService extends AbstractLocatorModelService imple * @see org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelUpdateService#add(org.eclipse.tcf.protocol.IPeer) */ @Override - public void add(final IPeer peer) { + public ILocatorNode add(IPeer peer) { + return add(peer, false); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelUpdateService#add(org.eclipse.tcf.protocol.IPeer, boolean) + */ + @Override + public ILocatorNode add(final IPeer peer, boolean isStatic) { Assert.isNotNull(peer); Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ - Map<String, IPeer> peers = (Map<String, IPeer>)getLocatorModel().getAdapter(Map.class); - Assert.isNotNull(peers); - peers.put(peer.getID(), peer); - - final ILocatorModelListener[] listeners = getLocatorModel().getListener(); - if (listeners.length > 0) { - Protocol.invokeLater(new Runnable() { - @Override - public void run() { - for (ILocatorModelListener listener : listeners) { - listener.modelChanged(getLocatorModel(), peer, true); + String encProxies = peer.getAttributes().get(IPeerProperties.PROP_PROXIES); + ILocatorNode locatorNode = null; + + if (encProxies == null || encProxies.trim().length() == 0) { + Map<String, ILocatorNode> locatorNodes = (Map<String, ILocatorNode>)getLocatorModel().getAdapter(Map.class); + Assert.isNotNull(locatorNodes); + locatorNode = new LocatorNode(peer, isStatic); + locatorNodes.put(peer.getID(), locatorNode); + } + else { + IPeer[] proxies = PeerDataHelper.decodePeerList(encProxies); + ILocatorNode parent = null; + for (IPeer proxy : proxies) { + ILocatorModelLookupService lkup = ModelManager.getLocatorModel().getService(ILocatorModelLookupService.class); + ILocatorNode proxyNode = lkup.lkupLocatorNode(proxy); + if (proxyNode == null) { + proxyNode = new LocatorNode(proxy, true); + if (parent == null) { + Map<String, ILocatorNode> locatorNodes = (Map<String, ILocatorNode>)getLocatorModel().getAdapter(Map.class); + Assert.isNotNull(locatorNodes); + locatorNodes.put(proxy.getID(), proxyNode); + + } + else { + parent.add(proxyNode); } + parent = proxyNode; } - }); + else { + parent = proxyNode; + } + } + ILocatorModelLookupService lkup = ModelManager.getLocatorModel().getService(ILocatorModelLookupService.class); + locatorNode = lkup.lkupLocatorNode(peer); + if (locatorNode == null) { + locatorNode = new LocatorNode(peer, true); + parent.add(locatorNode); + } + } + + ILocatorModelListener[] listeners = getLocatorModel().getListener(); + for (ILocatorModelListener listener : listeners) { + listener.modelChanged(getLocatorModel(), locatorNode, true); } + + return locatorNode; } /* (non-Javadoc) * @see org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelUpdateService#remove(org.eclipse.tcf.protocol.IPeer) */ @Override - public void remove(final IPeer peer) { + public ILocatorNode remove(final IPeer peer) { Assert.isNotNull(peer); Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ - Map<String, IPeer> peers = (Map<String, IPeer>)getLocatorModel().getAdapter(Map.class); - Assert.isNotNull(peers); - peers.remove(peer.getID()); - - final ILocatorModelListener[] listeners = getLocatorModel().getListener(); - if (listeners.length > 0) { - Protocol.invokeLater(new Runnable() { - @Override - public void run() { - for (ILocatorModelListener listener : listeners) { - listener.modelChanged(getLocatorModel(), peer, false); - } - } - }); + ILocatorModelLookupService lkup = ModelManager.getLocatorModel().getService(ILocatorModelLookupService.class); + ILocatorNode locatorNode = lkup.lkupLocatorNode(peer); + + if (locatorNode != null) { + ILocatorNode parent = locatorNode.getParent(ILocatorNode.class); + + if (parent == null) { + Map<String, ILocatorNode> locatorNodes = (Map<String, ILocatorNode>)getLocatorModel().getAdapter(Map.class); + Assert.isNotNull(locatorNodes); + locatorNode = locatorNodes.remove(peer.getID()); + } + else { + parent.remove(locatorNode, true); + } + } + + ILocatorModelListener[] listeners = getLocatorModel().getListener(); + for (ILocatorModelListener listener : listeners) { + listener.modelChanged(getLocatorModel(), locatorNode, false); } + + return locatorNode; } /* (non-Javadoc) * @see org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelUpdateService#update(org.eclipse.tcf.protocol.IPeer, org.eclipse.tcf.protocol.IPeer) */ @Override - public void update(final IPeer oldPeer, final IPeer newPeer) { + public ILocatorNode update(final IPeer oldPeer, final IPeer newPeer) { Assert.isNotNull(oldPeer); Assert.isNotNull(newPeer); Assert.isTrue(Protocol.isDispatchThread(), "Illegal Thread Access"); //$NON-NLS-1$ - Map<String, IPeer> peers = (Map<String, IPeer>)getLocatorModel().getAdapter(Map.class); - Assert.isNotNull(peers); - peers.remove(oldPeer.getID()); - peers.put(newPeer.getID(), newPeer); - - - final ILocatorModelListener[] listeners = getLocatorModel().getListener(); - if (listeners.length > 0) { - Protocol.invokeLater(new Runnable() { - @Override - public void run() { - for (ILocatorModelListener listener : listeners) { - if (!oldPeer.getID().equals(newPeer.getID())) { - listener.modelChanged(getLocatorModel(), oldPeer, false); - listener.modelChanged(getLocatorModel(), newPeer, true); - } - else { - listener.modelChanged(getLocatorModel(), newPeer, false); - } - } - } - }); + Map<String, ILocatorNode> locatorNodes = (Map<String, ILocatorNode>)getLocatorModel().getAdapter(Map.class); + Assert.isNotNull(locatorNodes); + final ILocatorNode oldLocatorNode = locatorNodes.remove(oldPeer.getID()); + final ILocatorNode newLocatorNode = new LocatorNode(newPeer); + locatorNodes.put(newPeer.getID(), newLocatorNode); + + ILocatorModelListener[] listeners = getLocatorModel().getListener(); + for (ILocatorModelListener listener : listeners) { + if (!oldPeer.getID().equals(newPeer.getID())) { + listener.modelChanged(getLocatorModel(), oldLocatorNode, false); + listener.modelChanged(getLocatorModel(), newLocatorNode, true); + } + else { + listener.modelChanged(getLocatorModel(), newLocatorNode, false); + } } + + return newLocatorNode; } } |