# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# 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);
+	}
+
 }