@Override public void onTextAvailable(ProcessEvent event, Key outputType) { String text = event.getText(); if (outputType == ProcessOutputTypes.STDERR) { output.append(text); // We loop until the state stabilizes State lastState; do { lastState = state; switch (state) { case WAITING: { Matcher matcher = matcher(DIAGNOSTIC_PATTERN); if (find(matcher)) { currentCompilerMessage = new CompilerMessage(); currentCompilerMessage.setMessageCategoryFromString(matcher.group(1)); state = State.ATTRIBUTES; } break; } case ATTRIBUTES: { Matcher matcher = matcher(ATTRIBUTE_PATTERN); int indexDelta = 0; while (matcher.find()) { handleSkippedOutput( output.subSequence( firstUnprocessedIndex + indexDelta, firstUnprocessedIndex + matcher.start())); currentCompilerMessage.setAttributeFromStrings( matcher.group(1), matcher.group(2)); indexDelta = matcher.end(); } firstUnprocessedIndex += indexDelta; Matcher endMatcher = matcher(OPEN_TAG_END_PATTERN); if (find(endMatcher)) { state = State.MESSAGE; } break; } case MESSAGE: { Matcher matcher = matcher(MESSAGE_PATTERN); if (find(matcher)) { currentCompilerMessage.setMessage(matcher.group(1)); currentCompilerMessage.reportTo(compileContext); state = State.WAITING; } break; } } } while (state != lastState); } else { compileContext.addMessage(INFORMATION, text, "", -1, -1); } }
/** * Run the process and notify all listeners. * * @param pArgs arguments for ProcessBuilder * @param pProcessEvent store state in this ProcessEvent */ @SuppressWarnings("deprecation") void runAndNotify(LinkedList<String> pArgs, ProcessEvent pProcessEvent) { int rc; try { Process pr = startProcess(pArgs); pProcessEvent.setProcess(pr); for (ProcessEventListener pel : iProcessEventListener) { pel.processStarted(pProcessEvent); } // TODO: remove in future version for (ProcessListener pl : iProcessListener) { pl.processStarted(pr); } rc = waitForProcess(pr); pProcessEvent.setReturnCode(rc); finished(rc); } catch (Exception e) { pProcessEvent.setException(e); try { finished(e); } catch (Exception e2) { pProcessEvent.setException(e2); } } for (ProcessEventListener pel : iProcessEventListener) { pel.processTerminated(pProcessEvent); } // TODO: remove in future version for (ProcessListener pl : iProcessListener) { pl.processTerminated(pProcessEvent); } }
/** * Return a ProcessTask for future execution. * * @param pArgs arguments for ProcessBuilder */ protected ProcessTask getProcessTask(LinkedList<String> pArgs) { // prepare ProcessEvent and call processInitiated final ProcessEvent pe = new ProcessEvent(iPID, this); pe.setReturnCode(-1); for (ProcessEventListener pel : iProcessEventListener) { pel.processInitiated(pe); } // create ProcessTask for future execution return new ProcessTask(this, pArgs, pe); }
@Override public void processTerminated(ProcessEvent event) { if (firstUnprocessedIndex < output.length()) { handleSkippedOutput(output.substring(firstUnprocessedIndex).trim()); } int exitCode = event.getExitCode(); // 0 is normal, 1 is "errors found" — handled by the messages above if (exitCode != 0 && exitCode != 1) { compileContext.addMessage( ERROR, "Compiler terminated with exit code: " + exitCode, "", -1, -1); } }