package org.signalml.app.worker.monitor; import static org.signalml.app.util.i18n.SvarogI18n._R; import java.util.concurrent.ExecutionException; import javax.swing.SwingWorker; import multiplexer.jmx.client.JmxClient; import org.apache.log4j.Logger; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.app.worker.monitor.exceptions.OpenbciCommunicationException; import org.signalml.app.worker.monitor.messages.KillExperimentRequest; import org.signalml.app.worker.monitor.messages.LeaveExperimentRequest; import org.signalml.app.worker.monitor.messages.MessageType; import org.signalml.app.worker.monitor.messages.RequestErrorResponse; import org.signalml.app.worker.monitor.messages.parsing.MessageParser; public class DisconnectFromExperimentWorker extends SwingWorker<Void, Void> { private static Logger logger = Logger.getLogger(DisconnectFromExperimentWorker.class); private ExperimentDescriptor experimentDescriptor; public DisconnectFromExperimentWorker(ExperimentDescriptor experimentDescriptor) { this.experimentDescriptor = experimentDescriptor; } @Override protected Void doInBackground() throws Exception { logger.debug("Disconnecting from experiment"); if (!experimentDescriptor.isConnected()) { logger.debug("Experiment already disconnected - cancelling disconnection."); return null; } disconnectFromMultiplexer(); sendLeaveExperimentRequest(); if (experimentDescriptor.getRecommendedScenario() != null) sendKillExperimentRequest(); experimentDescriptor.setConnected(false); return null; } private void disconnectFromMultiplexer() { JmxClient jmxClient = experimentDescriptor.getJmxClient(); logger.debug("Shutting down multiplexer"); if (jmxClient != null) try { jmxClient.shutdown(); logger.debug("Multiplexer has been successfully shutdown"); } catch (InterruptedException e) { logger.error("", e); } experimentDescriptor.setJmxClient(null); } private void sendLeaveExperimentRequest() throws OpenbciCommunicationException { LeaveExperimentRequest request = new LeaveExperimentRequest(experimentDescriptor); String response = Helper.sendRequest(request, experimentDescriptor.getExperimentIPAddress(), experimentDescriptor.getExperimentPort(), Helper.DEFAULT_RECEIVE_TIMEOUT); MessageParser.checkIfResponseIsOK(response, MessageType.REQUEST_OK_RESPONSE); } private void sendKillExperimentRequest() throws OpenbciCommunicationException { KillExperimentRequest request = new KillExperimentRequest(experimentDescriptor); String response = Helper.sendRequest(request, Helper.getOpenBCIIpAddress(), Helper.getOpenbciPort(), Helper.DEFAULT_RECEIVE_TIMEOUT); MessageType type = MessageType.parseMessageTypeFromResponse(response); if (type == MessageType.REQUEST_ERROR_RESPONSE) { RequestErrorResponse msg = (RequestErrorResponse) MessageParser.parseMessageFromJSON(response, type); Dialogs.showError("Could not kill this experiment in openBCI (error code: " + msg.getErrorCode() + ")"); } } @Override protected void done() { super.done(); try { get(); } catch (InterruptedException e) { logger.error("", e); } catch (ExecutionException e) { if (e.getCause() instanceof OpenbciCommunicationException) { OpenbciCommunicationException openbciException = (OpenbciCommunicationException) e.getCause(); logger.debug(_R("There was an error while disconnecting from the experiment ({0})", openbciException.getMessage())); //no dialog is shown. } else { logger.error("", e); } } } }