package be.xhibit.teletask.parser; import be.xhibit.teletask.parser.handler.CentralUnitLineHandler; import be.xhibit.teletask.parser.handler.ConditionLineHandler; import be.xhibit.teletask.parser.handler.DimmerLineHandler; import be.xhibit.teletask.parser.handler.GeneralMoodLineHandler; import be.xhibit.teletask.parser.handler.InputInterfaceLineHandler; import be.xhibit.teletask.parser.handler.InputLineHandler; import be.xhibit.teletask.parser.handler.LineHandler; import be.xhibit.teletask.parser.handler.LocalMoodLineHandler; import be.xhibit.teletask.parser.handler.MotorLineHandler; import be.xhibit.teletask.parser.handler.OutputInterfaceLineHandler; import be.xhibit.teletask.parser.handler.RelayLineHandler; import be.xhibit.teletask.parser.handler.RoomLineHandler; import be.xhibit.teletask.parser.handler.SensorLineHandler; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.io.CharSource; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Iterator; import java.util.ListIterator; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PrintedFileVisitor { private static final PrintedFileVisitor INSTANCE = new PrintedFileVisitor(); private static final Map<Pattern, LineHandler> LINE_HANDLER_MAP = ImmutableMap.<Pattern, LineHandler>builder() .put(RoomLineHandler.getInstance().getStartPattern(), RoomLineHandler.getInstance()) .put(OutputInterfaceLineHandler.getInstance().getStartPattern(), OutputInterfaceLineHandler.getInstance()) .put(InputInterfaceLineHandler.getInstance().getStartPattern(), InputInterfaceLineHandler.getInstance()) .put(CentralUnitLineHandler.getInstance().getStartPattern(), CentralUnitLineHandler.getInstance()) .put(InputLineHandler.getInstance().getStartPattern(), InputLineHandler.getInstance()) .put(RelayLineHandler.getInstance().getStartPattern(), RelayLineHandler.getInstance()) .put(LocalMoodLineHandler.getInstance().getStartPattern(), LocalMoodLineHandler.getInstance()) .put(MotorLineHandler.getInstance().getStartPattern(), MotorLineHandler.getInstance()) .put(GeneralMoodLineHandler.getInstance().getStartPattern(), GeneralMoodLineHandler.getInstance()) .put(DimmerLineHandler.getInstance().getStartPattern(), DimmerLineHandler.getInstance()) .put(ConditionLineHandler.getInstance().getStartPattern(), ConditionLineHandler.getInstance()) .put(SensorLineHandler.getInstance().getStartPattern(), SensorLineHandler.getInstance()) .build(); private PrintedFileVisitor() { } public void visit(Consumer consumer, final InputStream stream) throws IOException { CharSource source = new CharSource() { @Override public Reader openStream() throws IOException { return new BufferedReader(new InputStreamReader(stream)); } }; ImmutableList<String> lines = source.readLines(); for (ListIterator<String> iterator = lines.listIterator(); iterator.hasNext(); ) { String line = iterator.next(); LineHandler handler = this.getLineHandler(line); if (handler != null) { handler.handle(line, consumer, iterator); } } } private LineHandler getLineHandler(String line) { LineHandler handler = null; for (Iterator<Map.Entry<Pattern, LineHandler>> iterator = LINE_HANDLER_MAP.entrySet().iterator(); iterator.hasNext() && handler == null; ) { Map.Entry<Pattern, LineHandler> entry = iterator.next(); Matcher matcher = entry.getKey().matcher(line); if (matcher.matches()) { handler = entry.getValue(); } } return handler; } public static PrintedFileVisitor getInstance() { return INSTANCE; } public static void main(String[] args) throws IOException { // FullProprietaryModelConsumerImpl consumer = new FullProprietaryModelConsumerImpl(); InterestingNbtModelConsumerImpl consumer = new InterestingNbtModelConsumerImpl(); getInstance().visit(consumer, new FileInputStream("/home/ridiekel/Projects/git/Teletask-api/backend/config-nbt-export/src/main/resources/centrale.ttt")); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writerWithDefaultPrettyPrinter().writeValue(System.out, consumer.getCentralUnit()); } }