/*******************************************************************************
* Copyright (c) 2011 Wind River Systems, Inc. and others. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.te.tcf.locator.listener;
import org.eclipse.core.runtime.Assert;
import org.eclipse.tm.tcf.protocol.IPeer;
import org.eclipse.tm.tcf.protocol.Protocol;
import org.eclipse.tm.tcf.services.ILocator;
import org.eclipse.tm.te.tcf.locator.ScannerRunnable;
import org.eclipse.tm.te.tcf.locator.activator.CoreBundleActivator;
import org.eclipse.tm.te.tcf.locator.interfaces.ITracing;
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.locator.interfaces.services.ILocatorModelUpdateService;
import org.eclipse.tm.te.tcf.locator.nodes.PeerModel;
/**
* Locator listener implementation.
*/
public class LocatorListener implements ILocator.LocatorListener {
// Reference to the parent model
private final ILocatorModel model;
/**
* Constructor.
*
* @param model The parent locator model. Must not be <code>null</code>.
*/
public LocatorListener(ILocatorModel model) {
super();
Assert.isNotNull(model);
this.model = model;
}
/* (non-Javadoc)
* @see org.eclipse.tm.tcf.services.ILocator.LocatorListener#peerAdded(org.eclipse.tm.tcf.protocol.IPeer)
*/
@Override
public void peerAdded(IPeer peer) {
if (CoreBundleActivator.getTraceHandler().isSlotEnabled(0, ITracing.ID_TRACE_LOCATOR_LISTENER)) {
CoreBundleActivator.getTraceHandler().trace("LocatorListener.peerAdded( " + (peer != null ? peer.getID() : null) + " )", ITracing.ID_TRACE_LOCATOR_LISTENER, this); //$NON-NLS-1$ //$NON-NLS-2$
}
if (model != null && peer != null) {
// find the corresponding model node to remove (expected to be null)
IPeerModel peerNode = model.getService(ILocatorModelLookupService.class).lkupPeerModelById(peer.getID());
// If not found, create a new peer node instance
if (peerNode == null) {
peerNode = new PeerModel(model, peer);
// Validate the peer node before adding
peerNode = model.validatePeerNodeForAdd(peerNode);
// Add the peer node to the model
if (peerNode != null) {
model.getService(ILocatorModelUpdateService.class).add(peerNode);
// And schedule for immediate status update
Runnable runnable = new ScannerRunnable(model.getScanner(), peerNode);
Protocol.invokeLater(runnable);
}
} else {
// Peer node found, update the peer instance
peerNode.setProperty(IPeerModelProperties.PROP_INSTANCE, peer);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.tm.tcf.services.ILocator.LocatorListener#peerChanged(org.eclipse.tm.tcf.protocol.IPeer)
*/
@Override
public void peerChanged(IPeer peer) {
if (CoreBundleActivator.getTraceHandler().isSlotEnabled(0, ITracing.ID_TRACE_LOCATOR_LISTENER)) {
CoreBundleActivator.getTraceHandler().trace("LocatorListener.peerChanged( " + (peer != null ? peer.getID() : null) + " )", ITracing.ID_TRACE_LOCATOR_LISTENER, this); //$NON-NLS-1$ //$NON-NLS-2$
}
if (model != null && peer != null) {
// find the corresponding model node to remove
IPeerModel peerNode = model.getService(ILocatorModelLookupService.class).lkupPeerModelById(peer.getID());
// Update the peer instance
if (peerNode != null) peerNode.setProperty(IPeerModelProperties.PROP_INSTANCE, peer);
}
}
/* (non-Javadoc)
* @see org.eclipse.tm.tcf.services.ILocator.LocatorListener#peerRemoved(java.lang.String)
*/
@Override
public void peerRemoved(String id) {
if (CoreBundleActivator.getTraceHandler().isSlotEnabled(0, ITracing.ID_TRACE_LOCATOR_LISTENER)) {
CoreBundleActivator.getTraceHandler().trace("LocatorListener.peerRemoved( " + id + " )", ITracing.ID_TRACE_LOCATOR_LISTENER, this); //$NON-NLS-1$ //$NON-NLS-2$
}
if (model != null && id != null) {
// find the corresponding model node to remove
IPeerModel peerNode = model.getService(ILocatorModelLookupService.class).lkupPeerModelById(id);
if (peerNode != null) {
// Remove from the model
model.getService(ILocatorModelUpdateService.class).remove(peerNode);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.tm.tcf.services.ILocator.LocatorListener#peerHeartBeat(java.lang.String)
*/
@Override
public void peerHeartBeat(String id) {
if (CoreBundleActivator.getTraceHandler().isSlotEnabled(0, ITracing.ID_TRACE_LOCATOR_LISTENER)) {
CoreBundleActivator.getTraceHandler().trace("LocatorListener.peerHeartBeat( " + id + " )", ITracing.ID_TRACE_LOCATOR_LISTENER, this); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}