blob: 866b8431f50262b885b1224c5f20fec9da21b07b [file] [log] [blame]
/**
* Copyright (c) 2006 IBM Corporation.
* 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:
* IBM Corporation - Initial Implementation
*
*/
package org.eclipse.ptp.remotetools.environment.control;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.ptp.remotetools.environment.control.ITargetControlEventListener;
import org.eclipse.ptp.remotetools.environment.control.ITargetControlEventProvider;
import org.eclipse.ptp.remotetools.environment.core.messages.Messages;
/**
* Default implementation of the ITargetControlEventProvider interface, based
* on a simple pooling algorithm.
*
* @author Ricardo M. Matinata
* @since 1.2
*
*/
public class PoolingTargetControlEventProvider implements
ITargetControlEventProvider {
public Thread monitorThread = null;
private int monitorInterval = 4000; // milliseconds
private Map controls = new HashMap();
class MonitorThread extends Thread {
public MonitorThread() {
super(Messages.PoolingTargetControlEventProvider_0);
}
public void run() {
while (monitorThread == this)
{
synchronized (PoolingTargetControlEventProvider.this) {
Iterator ctrls = controls.keySet().iterator();
while(ctrls.hasNext()) {
ITargetControl control = (ITargetControl) ctrls.next();
int entryStatus = control.query();
TargetInfo info = (TargetInfo) controls.get(control);
if (entryStatus != info.getStatus() ) {
info.setStatus(entryStatus);
controls.put(control,info);
fireEvent(entryStatus, control);
}
}
}
try {
sleep (monitorInterval);
} catch (InterruptedException e) {}
}
}
}
public void fireEvent(int status, ITargetControl control) {
if (control != null && controls.containsKey (control))
{
TargetInfo info = (TargetInfo) controls.get(control);
ITargetControlEventListener listener = info.getListener();
listener.handleStateChangeEvent(status, control);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.environment.control.ITargetControlEventProviderw#registerControlAndListener()
*/
public void registerControlAndListener(ITargetControl control, ITargetControlEventListener listener) {
if (control != null && !controls.containsKey (control))
{
synchronized(this) {
controls.put (control, new TargetInfo(listener,ITargetStatus.STOPPED));
}
if (monitorThread == null) {
(monitorThread = new MonitorThread()).start();
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.environment.control.ITargetControlEventProviderw#unregisterControlAndListener()
*/
public void unregisterControlAndListener(ITargetControl control, ITargetControlEventListener listener) {
if (control != null && controls.containsKey (control))
{
synchronized(this) {
controls.remove (control);
}
if (controls.size() == 0)
monitorThread = null;
}
}
class TargetInfo {
private int status;
private ITargetControlEventListener listener;
public TargetInfo(ITargetControlEventListener listener, int status) {
this.listener = listener;
this.status = status;
}
public ITargetControlEventListener getListener() {
return listener;
}
public void setListener(ITargetControlEventListener listener) {
this.listener = listener;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
}