java/alt2xml/src/cz/frantovo/alt2xml/vstup/JsonSimpleContentHandler.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 03 Jan 2012 12:55:38 +0100
changeset 3 6c608fd8c019
parent 2 java/alt2xml/src/cz/frantovo/alt2xml/JsonSimpleContentHandler.java@be5bfbe1f0cd
child 4 e2b2f34cdb50
permissions -rw-r--r--
Přehlednější struktura tříd/balíčků.
     1 package cz.frantovo.alt2xml.vstup;
     2 
     3 import java.io.IOException;
     4 import java.util.Stack;
     5 import org.json.simple.parser.ParseException;
     6 import org.xml.sax.ContentHandler;
     7 import org.xml.sax.SAXException;
     8 
     9 /**
    10 ) *
    11  * @author fiki
    12  */
    13 public class JsonSimpleContentHandler implements org.json.simple.parser.ContentHandler {
    14 
    15 	/** Sem vypisujeme XML události */
    16 	private ContentHandler saxVýstup;
    17 	/** Musíme si pamatovat polohu v XML stromu, abychom věděli, kterou značku kdy uzavřít */
    18 	private Stack<String> poloha = new Stack<>();
    19 	/**
    20 	 * Po textových uzlech vkládáme konce elementů rovnou,
    21 	 * ale pokud jeden element končí hned po jiném, 
    22 	 * vložíme mezi ně ještě konec řádku a odsazení.
    23 	 */
    24 	private boolean zalomitŘádek = false;
    25 
    26 	public JsonSimpleContentHandler(ContentHandler saxVýstup) {
    27 		this.saxVýstup = saxVýstup;
    28 	}
    29 
    30 	private void začniElement(String název) throws IOException {
    31 		try {
    32 			vložOdsazení();
    33 			saxVýstup.startElement(null, null, název, null);
    34 			poloha.push(název);
    35 		} catch (SAXException e) {
    36 			throw new IOException("Chyba při začátku elementu.", e);
    37 		}
    38 	}
    39 
    40 	private void ukončiElement() throws IOException {
    41 		try {
    42 			String značka = poloha.pop();
    43 			if (zalomitŘádek) {
    44 				vložOdsazení();
    45 			}
    46 			zalomitŘádek = true;
    47 			saxVýstup.endElement(null, null, značka);
    48 		} catch (SAXException e) {
    49 			throw new IOException("Chyba při ukončování elementu.", e);
    50 		}
    51 	}
    52 
    53 	private void vložOdsazení() throws IOException {
    54 		/**
    55 		 * TODO: ignorableWhitespace() ?
    56 		 */
    57 		vložText("\n");
    58 		for (int i = 0; i < poloha.size(); i++) {
    59 			vložText("\t");
    60 		}
    61 	}
    62 
    63 	private void vložText(String text) throws IOException {
    64 		try {
    65 			saxVýstup.characters(text.toCharArray(), 0, text.length());
    66 		} catch (SAXException e) {
    67 			throw new IOException("Chyba při vkládání textu.", e);
    68 		}
    69 	}
    70 
    71 	@Override
    72 	public void startJSON() throws ParseException, IOException {
    73 		try {
    74 			saxVýstup.startDocument();
    75 			začniElement("objekt");
    76 		} catch (SAXException e) {
    77 			throw new IOException("Chyba při začátku dokumentu.", e);
    78 		}
    79 	}
    80 
    81 	@Override
    82 	public void endJSON() throws ParseException, IOException {
    83 		try {
    84 			ukončiElement();
    85 			vložText("\n");
    86 			saxVýstup.endDocument();
    87 		} catch (SAXException e) {
    88 			throw new IOException(e);
    89 		}
    90 	}
    91 
    92 	@Override
    93 	public boolean startObject() throws ParseException, IOException {
    94 		// System.err.println("startObject");
    95 		return true;
    96 	}
    97 
    98 	@Override
    99 	public boolean endObject() throws ParseException, IOException {
   100 		// System.err.println("endObject");
   101 		return true;
   102 	}
   103 
   104 	@Override
   105 	public boolean startObjectEntry(String key) throws ParseException, IOException {
   106 		začniElement(key);
   107 		return true;
   108 	}
   109 
   110 	@Override
   111 	public boolean endObjectEntry() throws ParseException, IOException {
   112 		ukončiElement();
   113 		// System.err.println("endObjectEntry");
   114 		return true;
   115 	}
   116 
   117 	@Override
   118 	public boolean startArray() throws ParseException, IOException {
   119 		// System.err.println("startArray");
   120 		return true;
   121 	}
   122 
   123 	@Override
   124 	public boolean endArray() throws ParseException, IOException {
   125 		// System.err.println("endArray");
   126 		return true;
   127 	}
   128 
   129 	@Override
   130 	public boolean primitive(Object value) throws ParseException, IOException {
   131 		vložText(String.valueOf(value));
   132 		zalomitŘádek = false;
   133 		return true;
   134 	}
   135 }