package krasa.grepconsole.tail.remotecall; import java.io.IOException; import java.net.*; import krasa.grepconsole.model.TailSettings; import krasa.grepconsole.plugin.GrepConsoleApplicationComponent; import krasa.grepconsole.tail.remotecall.handler.OpenFileInConsoleMessageHandler; import krasa.grepconsole.tail.remotecall.notifier.*; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.Messages; public class GrepConsoleRemoteCallComponent implements ApplicationComponent { private static final Logger log = Logger.getInstance(GrepConsoleRemoteCallComponent.class); private ServerSocket serverSocket; private Thread listenerThread; @Override public void initComponent() { final TailSettings tailSettings = GrepConsoleApplicationComponent.getInstance().getState().getTailSettings(); rebind(tailSettings); } public boolean rebind(final TailSettings tailSettings) { disposeComponent(); if (!tailSettings.isEnabled()) { return false; } try { int port = Integer.parseInt(tailSettings.getPort()); serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress("localhost", port)); log.info("Listening " + port); } catch (final Exception e) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { Messages.showMessageDialog( "Can't bind port " + tailSettings.getPort() + ". GrepConsole plugin external integration for Tail File won't work. error: " + e.toString(), "GrepConsole Plugin Error", Messages.getErrorIcon()); } }); log.info("GrepConsole Plugin Error", e); return false; } MessageNotifier messageNotifier = new SocketMessageNotifier(serverSocket); messageNotifier.addMessageHandler(new OpenFileInConsoleMessageHandler()); listenerThread = new Thread(messageNotifier); listenerThread.start(); return true; } @Override public void disposeComponent() { try { if (listenerThread != null) { listenerThread.interrupt(); listenerThread = null; } if (serverSocket != null) { serverSocket.close(); serverSocket = null; } } catch (IOException e) { throw new RuntimeException(e); } } @Override @NotNull public String getComponentName() { return "GrepConsoleRemoteCallComponent"; } public static GrepConsoleRemoteCallComponent getInstance() { return ApplicationManager.getApplication().getComponent(GrepConsoleRemoteCallComponent.class); } }