package org.signalml.app.worker.monitor; import static org.signalml.app.util.i18n.SvarogI18n._; import static org.signalml.app.util.i18n.SvarogI18n._R; import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import javax.swing.SwingWorker; import org.apache.log4j.Logger; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.worker.monitor.exceptions.OpenbciCommunicationException; import org.signalml.app.worker.monitor.messages.AmplifierType; import org.signalml.app.worker.monitor.messages.FindEEGAmplifiersRequest; import org.signalml.app.worker.monitor.messages.FindEEGExperimentsRequest; import org.signalml.app.worker.monitor.messages.Message; import org.signalml.app.worker.monitor.messages.MessageType; import org.signalml.app.worker.monitor.messages.parsing.AbstractResponseJSonReader; import org.signalml.app.worker.monitor.messages.parsing.FindEEGAmplifiersResponseJSonReader; import org.signalml.app.worker.monitor.messages.parsing.FindEEGExperimentsResponseJSonReader; import org.signalml.app.worker.monitor.messages.parsing.MessageParser; public class FindEEGExperimentsWorker extends SwingWorker<Void, List<ExperimentDescriptor>> { protected static final Logger logger = Logger.getLogger(FindEEGExperimentsWorker.class); public static String WORKER_LOG_APPENDED_PROPERTY = "workerLoggerProperty"; public static String NEW_EXPERIMENTS_RECEIVED = "newExperimentsReceived"; private String openbciIpAddress; private int openbciPort; public FindEEGExperimentsWorker() { } @Override protected Void doInBackground() throws OpenbciCommunicationException { openbciIpAddress = Helper.getOpenBCIIpAddress(); openbciPort = Helper.getOpenbciPort(); getRunningExperiments(); for (AmplifierType amplifierType: AmplifierType.values()) { if (isCancelled()) break; getNewExperiments(amplifierType); } if (!isCancelled()) log(_("Refreshing successfully accomplished!")); return null; } protected void getRunningExperiments() throws OpenbciCommunicationException { FindEEGExperimentsRequest findEEGExperimentsRequest = new FindEEGExperimentsRequest(); FindEEGExperimentsResponseJSonReader reader = new FindEEGExperimentsResponseJSonReader(); log(_("Requesting the list of running experiments...")); getExperiments(findEEGExperimentsRequest, MessageType.EEG_EXPERIMENTS_RESPONSE, reader, null); } protected void getNewExperiments(AmplifierType amplifierType) throws OpenbciCommunicationException { FindEEGAmplifiersRequest findEEGAmplifiersRequest = new FindEEGAmplifiersRequest(amplifierType); FindEEGAmplifiersResponseJSonReader reader = new FindEEGAmplifiersResponseJSonReader(); log(_R("Requesting the list of available {0} amplifiers...", amplifierType)); getExperiments(findEEGAmplifiersRequest, MessageType.EEG_AMPLIFIERS_RESPONSE, reader, amplifierType); } protected void getExperiments(Message request, MessageType messageType, AbstractResponseJSonReader responseReader, AmplifierType amplifierType) throws OpenbciCommunicationException { String response = Helper.sendRequest(request, openbciIpAddress, openbciPort, Helper.INFINITE_TIMEOUT); MessageParser.checkIfResponseIsOK(response, messageType); List<ExperimentDescriptor> result = responseReader.parseExperiments(response); for (ExperimentDescriptor experimentDescriptor: result) { experimentDescriptor.getAmplifier().setAmplifierType(amplifierType); } publish(result); String readerLog = responseReader.getLog(); if (isCancelled()) logln(_("CANCELLED")); else if (readerLog.isEmpty()) logln(_("OK")); else log(readerLog); } protected void log(String message) { this.firePropertyChange(WORKER_LOG_APPENDED_PROPERTY, null, message); } protected void logln(String message) { log(message + "\n"); } @Override protected void process(List<List<ExperimentDescriptor>> chunks) { for (List<ExperimentDescriptor> experiments: chunks) { firePropertyChange(NEW_EXPERIMENTS_RECEIVED, null, experiments); } } @Override protected void done() { if (isCancelled()) { Helper.cancelReceiving(); } super.done(); try { get(); } catch (InterruptedException e) { logger.error("", e); } catch (ExecutionException e) { if (e.getCause() instanceof OpenbciCommunicationException) { OpenbciCommunicationException exception = (OpenbciCommunicationException) e.getCause(); exception.showErrorDialog(_("An error occurred while refreshing experiments")); } else { logger.error("", e); } log(_("ERROR")); } catch (CancellationException e) { //it's OK, this is thrown when user cancels the execution of this worker. } } }