package org.jabref.logic.remote.server; import java.io.IOException; import java.net.BindException; import org.jabref.JabRefExecutorService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Manages the RemoteListenerServerThread through typical life cycle methods. * <p/> * open -> start -> stop * openAndStart -> stop * <p/> * Observer: isOpen, isNotStartedBefore */ public class RemoteListenerServerLifecycle implements AutoCloseable { private static final Log LOGGER = LogFactory.getLog(RemoteListenerServerLifecycle.class); private RemoteListenerServerThread remoteListenerServerThread; public void stop() { if (isOpen()) { remoteListenerServerThread.interrupt(); remoteListenerServerThread = null; JabRefExecutorService.INSTANCE.stopRemoteThread(); } } /** * Acquire any resources needed for the server. */ public void open(MessageHandler messageHandler, int port) { if (isOpen()) { return; } RemoteListenerServerThread result; try { result = new RemoteListenerServerThread(messageHandler, port); } catch (BindException e) { LOGGER.warn("Port is blocked", e); result = null; } catch (IOException e) { result = null; } remoteListenerServerThread = result; } public boolean isOpen() { return remoteListenerServerThread != null; } public void start() { if (isOpen() && isNotStartedBefore()) { // threads can only be started when in state NEW JabRefExecutorService.INSTANCE.manageRemoteThread(remoteListenerServerThread); } } public boolean isNotStartedBefore() { // threads can only be started when in state NEW return (remoteListenerServerThread == null) || (remoteListenerServerThread.getState() == Thread.State.NEW); } public void openAndStart(MessageHandler messageHandler, int port) { open(messageHandler, port); start(); } @Override public void close() { stop(); } }