private synchronized void setWatchRoots( List<String> recursive, List<String> flat, boolean restart) { if (myProcessHandler == null || myProcessHandler.isProcessTerminated()) return; if (ApplicationManager.getApplication().isDisposeInProgress()) { recursive = flat = Collections.emptyList(); } if (!restart && myRecursiveWatchRoots.equals(recursive) && myFlatWatchRoots.equals(flat)) { return; } mySettingRoots.incrementAndGet(); myMapping = emptyList(); myRecursiveWatchRoots = recursive; myFlatWatchRoots = flat; try { writeLine(ROOTS_COMMAND); for (String path : recursive) { writeLine(path); } for (String path : flat) { writeLine("|" + path); } writeLine("#"); } catch (IOException e) { LOG.warn(e); } }
private void startupProcess(boolean restart) throws IOException { if (myIsShuttingDown) { return; } if (ShutDownTracker.isShutdownHookRunning()) { myIsShuttingDown = true; return; } if (myStartAttemptCount++ > MAX_PROCESS_LAUNCH_ATTEMPT_COUNT) { notifyOnFailure(ApplicationBundle.message("watcher.failed.to.start"), null); return; } if (restart) { shutdownProcess(); } LOG.info("Starting file watcher: " + myExecutable); ProcessBuilder processBuilder = new ProcessBuilder(myExecutable.getAbsolutePath()); Process process = processBuilder.start(); myProcessHandler = new MyProcessHandler(process); myProcessHandler.addProcessListener(new MyProcessAdapter()); myProcessHandler.startNotify(); if (restart) { List<String> recursive = myRecursiveWatchRoots; List<String> flat = myFlatWatchRoots; if (recursive.size() + flat.size() > 0) { setWatchRoots(recursive, flat, true); } } }
private void writeLine(final String line) throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("<< " + line); } final MyProcessHandler processHandler = myProcessHandler; if (processHandler != null) { processHandler.writeLine(line); } }
@Override @TestOnly public void shutdown() throws InterruptedException { final Application app = ApplicationManager.getApplication(); assert app != null && app.isUnitTestMode() : app; final MyProcessHandler processHandler = myProcessHandler; if (processHandler != null) { myIsShuttingDown = true; shutdownProcess(); long t = System.currentTimeMillis(); while (!processHandler.isProcessTerminated()) { if ((System.currentTimeMillis() - t) > 5000) { throw new InterruptedException("Timed out waiting watcher process to terminate"); } TimeoutUtil.sleep(100); } } }