/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.monitor;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.transaction.RunnableWithResult;
import gov.redhawk.model.sca.ScaPort;
import gov.redhawk.model.sca.ScaPortContainer;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.model.sca.commands.ScaModelCommandWithResult;
import gov.redhawk.monitor.model.ports.Monitor;
import gov.redhawk.monitor.model.ports.MonitorRegistry;
import gov.redhawk.monitor.model.ports.PortMonitor;
import gov.redhawk.monitor.model.ports.PortSupplierMonitor;
import gov.redhawk.monitor.model.ports.PortsFactory;
public final class MonitorUtils {
private MonitorUtils() {
}
/**
* Begins monitoring a port. No effect if already being monitored.
*
* @param port The port to monitor
* @return The monitor object
* @since 1.0
*/
public static PortMonitor addMonitor(final ScaPort< ? , ? > port) {
final MonitorRegistry registry = MonitorPlugin.getDefault().getMonitorRegistry();
PortMonitor monitor = ScaModelCommandWithResult.execute(registry, new ScaModelCommandWithResult<PortMonitor>() {
@Override
public void execute() {
PortMonitor monitor = findMonitor(port);
if (monitor == null) {
monitor = PortsFactory.eINSTANCE.createPortMonitor();
monitor.setPort(port);
registry.getMonitors().add(monitor);
}
setResult(monitor);
}
});
monitor.fetchStats();
return monitor;
}
/**
* Finds an existing monitor for a port, if it exists.
*
* @param port The port whose monitor it to be searched for
* @return The monitor for the port, or null if none
* @since 1.0
*/
private static PortMonitor findMonitor(final ScaPort< ? , ? > port) {
try {
final MonitorRegistry registry = MonitorPlugin.getDefault().getMonitorRegistry();
PortMonitor portMonitor = ScaModelCommand.runExclusive(registry, new RunnableWithResult.Impl<PortMonitor>() {
@Override
public void run() {
for (final Monitor monitor : registry.getMonitors()) {
if (monitor instanceof PortMonitor) {
final PortMonitor portMonitor = (PortMonitor) monitor;
if (portMonitor.getPort() == port) {
setResult(portMonitor);
}
}
}
};
});
return portMonitor;
} catch (InterruptedException e) {
return null;
}
}
/**
* Removes monitoring for a port, if any.
*
* @param port The port to stop monitoring.
* @since 1.0
*/
public static void removeMonitor(ScaPort< ? , ? > port) {
Monitor monitor = findMonitor(port);
if (monitor != null) {
removeMonitor(monitor);
}
}
/**
* Begins monitoring a port container (and thus all ports in the container). No effect if already being monitored.
*
* @param portContainer The port container to monitor
* @return The monitor object
* @since 1.0
*/
public static PortSupplierMonitor addMonitor(final ScaPortContainer portContainer) {
final MonitorRegistry registry = MonitorPlugin.getDefault().getMonitorRegistry();
PortSupplierMonitor monitor = ScaModelCommandWithResult.execute(registry, new ScaModelCommandWithResult<PortSupplierMonitor>() {
@Override
public void execute() {
PortSupplierMonitor monitor = findMonitor(portContainer);
if (monitor == null) {
monitor = PortsFactory.eINSTANCE.createPortSupplierMonitor();
monitor.setPortContainer(portContainer);
registry.getMonitors().add(monitor);
}
setResult(monitor);
}
});
monitor.fetchStats();
return monitor;
}
/**
* Finds an existing monitor for a port container, if it exists.
*
* @param portContainer The port container whose monitor it to be searched for
* @return The monitor for the port container, or null if none
* @since 1.0
*/
private static PortSupplierMonitor findMonitor(final ScaPortContainer portContainer) {
try {
final MonitorRegistry registry = MonitorPlugin.getDefault().getMonitorRegistry();
PortSupplierMonitor portSupplierMonitor = ScaModelCommand.runExclusive(registry, new RunnableWithResult.Impl<PortSupplierMonitor>() {
@Override
public void run() {
for (final Monitor monitor : MonitorPlugin.getDefault().getMonitorRegistry().getMonitors()) {
if (monitor instanceof PortSupplierMonitor) {
final PortSupplierMonitor portSupplierMonitor = (PortSupplierMonitor) monitor;
if (portSupplierMonitor.getPortContainer() == portContainer) {
setResult(portSupplierMonitor);
}
}
}
}
});
return portSupplierMonitor;
} catch (InterruptedException ex) {
return null;
}
}
/**
* Removes monitoring for a port container, if any.
*
* @param portContainer The port container to stop monitoring.
* @since 1.0
*/
public static void removeMonitor(ScaPortContainer portContainer) {
Monitor monitor = findMonitor(portContainer);
if (monitor != null) {
removeMonitor(monitor);
}
}
/**
* Removes a monitor.
*
* @param monitor The monitor to remove
* @since 1.0
*/
public static void removeMonitor(final Monitor monitor) {
ScaModelCommand.execute(monitor, new ScaModelCommand() {
@Override
public void execute() {
EcoreUtil.remove(monitor);
}
});
}
}