# HG changeset patch # User František Kučera # Date 1410019935 -7200 # Node ID 36ee0aefea273de7875c05824e4d528e5b26a9bd # Parent 56b731d14aec6012bae69649b6dada93d79a3119 in-ini: recognize comment, section and entry + log them diff -r 56b731d14aec -r 36ee0aefea27 java/alt2xml-in-ini/src/cz/frantovo/alt2xml/in/ini/Reader.java --- a/java/alt2xml-in-ini/src/cz/frantovo/alt2xml/in/ini/Reader.java Sat Sep 06 17:19:21 2014 +0200 +++ b/java/alt2xml-in-ini/src/cz/frantovo/alt2xml/in/ini/Reader.java Sat Sep 06 18:12:15 2014 +0200 @@ -18,7 +18,14 @@ package cz.frantovo.alt2xml.in.ini; import cz.frantovo.alt2xml.AbstractAlt2XmlReader; +import cz.frantovo.alt2xml.in.Alt2ContentHandler; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -28,17 +35,32 @@ */ public class Reader extends AbstractAlt2XmlReader { + public static final String ROOT_ELEMENT = "ini"; + private static final Logger log = Logger.getLogger(Reader.class.getName()); + @Override public void parse(InputSource input) throws IOException, SAXException { outputStart(); - // TODO: INI → SAX + + try (BufferedReader br = new BufferedReader(new InputStreamReader(input.getByteStream()))) { + FileContext c = new FileContext(contentHandler); + for (String currentLine = br.readLine(); currentLine != null; currentLine = br.readLine()) { + for (LINE_TYPE lineType : LINE_TYPE.values()) { + boolean lineProcessed = lineType.processLine(currentLine, c); + if (lineProcessed) { + break; + } + } + } + } + outputEnd(); } private void outputStart() throws SAXException { contentHandler.startDocument(); contentHandler.lineBreak(); - contentHandler.startElement(null, null, "ini", null); + contentHandler.startElement(null, null, ROOT_ELEMENT, null); contentHandler.lineBreak(); } @@ -48,4 +70,70 @@ contentHandler.endDocument(); } + private static class FileContext { + + private final Alt2ContentHandler contentHandler; + + public FileContext(Alt2ContentHandler contentHandler) { + this.contentHandler = contentHandler; + } + } + + private static class LineContext { + + private final String line; + private final Matcher matcher; + + public LineContext(String line, Matcher matcher) { + this.line = line; + this.matcher = matcher; + } + } + + private enum LINE_TYPE { + + COMMENT("(;|#)\\s*(.*)") { + + @Override + public void processLine(LineContext lineContext, FileContext fileContext) { + log.log(Level.FINER, "Comment: {0}", lineContext.matcher.group(2)); + } + + }, + SECTION("\\[(.+)\\]") { + + @Override + public void processLine(LineContext lineContext, FileContext fileContext) { + log.log(Level.WARNING, "Section: {0}", lineContext.matcher.group(1)); + } + + }, + ENTRY("\\s*([^=]+)\\s*=\\s*(.+)") { + + @Override + public void processLine(LineContext lineContext, FileContext fileContext) { + log.log(Level.WARNING, "Entry: {0} = {1}", new Object[]{lineContext.matcher.group(1), lineContext.matcher.group(2)}); + } + + },; + + private LINE_TYPE(String pattern) { + this.pattern = Pattern.compile(pattern); + } + + private final Pattern pattern; + + protected boolean processLine(String currentLine, FileContext fileContext) { + Matcher m = pattern.matcher(currentLine); + if (m.matches()) { + processLine(new LineContext(currentLine, m), fileContext); + return true; + } else { + return false; + } + } + + public abstract void processLine(LineContext lineContext, FileContext fileContext); + } + }