regex-parser/src/jetbrains.buildServer.cmakerunner/regexparser/ParserManager.java (111 lines of code) (raw):

package jetbrains.buildServer.cmakerunner.regexparser; import org.jetbrains.annotations.NotNull; import java.util.Stack; /** * @author Vladislav.Rassokhin */ public class ParserManager<T extends ParserManager.Block> extends LoggerAdapter { @NotNull protected final Logger myLogger; @NotNull protected final Stack<T> myBlocksStack = new Stack<T>(); public ParserManager(@NotNull final Logger myLogger) { this.myLogger = myLogger; } @NotNull public Logger getLogger() { return myLogger; } public final void log(@NotNull final String text, @NotNull final Severity severity) { switch (severity) { case INFO: myLogger.message(text); break; case WARN: myLogger.warning(text); break; case ERROR: myLogger.error(text); break; case BLOCK_START: this.blockStart(text); break; case BLOCK_FINISH: this.blockFinish(text); break; case BLOCK_CHANGE: this.blockChange(text); break; case COMPILATION_START: this.compilationBlockStart(text); break; case COMPILATION_FINISH: this.compilationBlockFinish(text); break; case COMPILATION_CHANGE: this.compilationBlockChange(text); break; case SPECIAL: if (!this.specialParse(text)) { myLogger.message(text); } } } protected T createBlock(@NotNull final String name) { //noinspection unchecked return (T) new Block(name); } protected T createCompilationBlock(@NotNull final String name) { //noinspection unchecked return (T) new Block(name); } @Override public void blockStart(@NotNull final String name) { final T block = createBlock(name); myBlocksStack.push(block); myLogger.blockStart(block.getName()); } @Override public void compilationBlockStart(@NotNull final String name) { final T block = createCompilationBlock(name); myBlocksStack.push(block); myLogger.compilationBlockStart(name); } @Override public void blockFinish(@NotNull final String name) { if (!myBlocksStack.isEmpty()) { if (!myBlocksStack.peek().getName().equals(name)) return; myLogger.blockFinish(myBlocksStack.pop().getName()); } } @Override public void compilationBlockFinish(@NotNull final String name) { if (!myBlocksStack.isEmpty()) { if (!myBlocksStack.peek().getName().equals(name)) return; myLogger.compilationBlockFinish(myBlocksStack.pop().getName()); } } protected void blockChange(@NotNull final String text) { if (!myBlocksStack.isEmpty()) { myLogger.blockFinish(myBlocksStack.pop().getName()); } blockStart(text); } protected void compilationBlockChange(@NotNull final String text) { if (!myBlocksStack.isEmpty()) { myLogger.compilationBlockFinish(myBlocksStack.pop().getName()); } compilationBlockStart(text); } protected boolean specialParse(@NotNull final String line) { return false; } public void parsingError(@NotNull final String message) { myLogger.warning("Parsing error: " + message); } public static class Block { private final String myName; public Block(@NotNull final String name) { myName = name; } @NotNull public String getName() { return myName; } } }