package de.persosim.simulator.ui; import static org.globaltester.logging.BasicLogger.ERROR; import static org.globaltester.logging.BasicLogger.log; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; import org.globaltester.logging.filter.LevelFilter; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.service.log.LogReaderService; import org.osgi.util.tracker.ServiceTracker; import de.persosim.driver.connector.DriverConnectorFactory; import de.persosim.driver.connector.features.DefaultListener; import de.persosim.driver.connector.service.NativeDriverConnector; import de.persosim.simulator.CommandParser; import de.persosim.simulator.ui.parts.PersoSimPart; import de.persosim.simulator.ui.utils.LinkedListLogListener; /** * The activator for this bundle. It tracks the {@link Simulator} service and * provides accessor methods. * * @author mboonk * */ public class Activator implements BundleActivator { private static BundleContext context; private LinkedList<LogReaderService> readers = new LinkedList<>(); private static LinkedListLogListener linkedListLogger = new LinkedListLogListener(PersoSimPart.MAXIMUM_CACHED_CONSOLE_LINES); private ServiceTracker<LogReaderService, LogReaderService> logReaderTracker; private static ServiceTracker<DriverConnectorFactory, DriverConnectorFactory> serviceTrackerDriverConnectorFactory; public static final int DEFAULT_PORT = 5678; public static final String DEFAULT_HOST = "localhost"; public static NativeDriverConnector connector = null; private static LogReaderService readerService = null; static BundleContext getContext() { return context; } public static LinkedListLogListener getListLogListener(){ return linkedListLogger; } public static void executeUserCommands(String command){ String[] commands = CommandParser.parseCommand(command); CommandParser.executeUserCommands(commands); if(commands.length == 0) return; //just do nothing. if (commands[0].equals(CommandParser.CMD_LOAD_PERSONALIZATION)) { disconnectFromNativeDriver(); connectToNativeDriver(); } if (commands[0].equals(CommandParser.CMD_STOP)) { disconnectFromNativeDriver(); } } // This will be used to keep track of listeners as they are un/registering private ServiceListener logServiceListener = new ServiceListener() { @Override public void serviceChanged(ServiceEvent event) { BundleContext bundleContext = event.getServiceReference().getBundle().getBundleContext(); LogReaderService readerService = (LogReaderService) bundleContext.getService(event.getServiceReference()); if (readerService != null){ if (event.getType() == ServiceEvent.REGISTERED){ readers.add(readerService); readerService.addLogListener(linkedListLogger); } else if (event.getType() == ServiceEvent.UNREGISTERING){ readerService.removeLogListener(linkedListLogger); readers.remove(readerService); } } } }; /** * The constructor */ public Activator() { } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ public void start(final BundleContext context) throws Exception { Activator.context = context; logReaderTracker = new ServiceTracker<>(context, LogReaderService.class.getName(), null); logReaderTracker.open(); Object[] readers = logReaderTracker.getServices(); if (readers != null){ for (int i=0; i<readers.length; i++){ readerService = (LogReaderService) readers [i]; this.readers.add(readerService); } } serviceTrackerDriverConnectorFactory = new ServiceTracker<DriverConnectorFactory, DriverConnectorFactory>(context, DriverConnectorFactory.class.getName(), null); serviceTrackerDriverConnectorFactory.open(); String filter = "(objectclass=" + LogReaderService.class.getName() + ")"; try { context.addServiceListener(logServiceListener, filter); } catch (InvalidSyntaxException e) { e.printStackTrace(); } } public static void removeLogListener() { readerService.removeLogListener(linkedListLogger); } public static void addLogListener() { readerService.addLogListener(linkedListLogger); } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { Iterator<LogReaderService> iterator = readers.iterator(); while (iterator.hasNext()) { LogReaderService readerService = iterator.next(); readerService.removeLogListener(linkedListLogger); iterator.remove(); } logReaderTracker.close(); Activator.context = null; serviceTrackerDriverConnectorFactory.close(); } private static LevelFilter logLevelFilter; public static LevelFilter getLogLevelFilter() { return logLevelFilter; } public static void setLogLevelFilter(LevelFilter levelFilter) { Activator.logLevelFilter = levelFilter; } public static void connectToNativeDriver() { try { connector = serviceTrackerDriverConnectorFactory.getService().getConnector(de.persosim.driver.connector.Activator.PERSOSIM_CONNECTOR_CONTEXT_ID); connector.addListener(new DefaultListener()); if (!connector.isRunning()) { connector.connect(DEFAULT_HOST, DEFAULT_PORT); } } catch (IOException e) { log(Activator.class, "Exception: " + e.getMessage(), ERROR); } } public static void disconnectFromNativeDriver() { try { connector = serviceTrackerDriverConnectorFactory.getService().getConnector(de.persosim.driver.connector.Activator.PERSOSIM_CONNECTOR_CONTEXT_ID); if (connector != null) { serviceTrackerDriverConnectorFactory.getService().returnConnector(connector); } } catch (IOException e) { log(Activator.class, "Exception: " + e.getMessage(), ERROR); } } public static NativeDriverConnector getConnector(){ return connector; } }