00001 package edu.stanford.hci.r3.pen.ink;
00002
00003 import java.io.File;
00004 import java.io.FileNotFoundException;
00005 import java.io.FileReader;
00006 import java.util.ArrayList;
00007
00008 import javax.xml.stream.XMLInputFactory;
00009 import javax.xml.stream.XMLStreamConstants;
00010 import javax.xml.stream.XMLStreamException;
00011 import javax.xml.stream.XMLStreamReader;
00012
00013 import edu.stanford.hci.r3.pattern.coordinates.PageAddress;
00014 import edu.stanford.hci.r3.pen.PenSample;
00015 import edu.stanford.hci.r3.util.xml.TagType;
00016
00028 public class InkXMLParser {
00029
00034 public enum Attributes {
00035 ADDRESS, BEGIN, END, F, T, X, Y
00036 }
00037
00042 public enum Nodes {
00043 INK, P, STROKE
00044 }
00045
00046 private Ink ink;
00047
00051 private String recentXMLText = "";
00052
00053 private ArrayList<PenSample> currentStroke;
00054
00055 private PenSample currentSample;
00056
00057 private long t;
00058
00059 private int f;
00060
00061 private double y;
00062
00063 private double x;
00064
00065 private long endTS;
00066
00067 private long beginTS;
00068
00069 public InkXMLParser(Ink theInk) {
00070 ink = theInk;
00071 }
00072
00077 public void parse(File xmlFileSource) {
00078
00079 final XMLInputFactory xmlif = XMLInputFactory.newInstance();
00080
00081 XMLStreamReader xmlr;
00082 try {
00083 xmlr = xmlif.createXMLStreamReader(new FileReader(xmlFileSource));
00084
00085 while (xmlr.hasNext()) {
00086 processEvent(xmlr);
00087 xmlr.next();
00088 }
00089 } catch (FileNotFoundException e) {
00090 e.printStackTrace();
00091 } catch (XMLStreamException e) {
00092 e.printStackTrace();
00093 }
00094
00095 }
00096
00101 private void processAttribute(XMLStreamReader xmlr, int index) {
00102
00103
00104 final String localName = xmlr.getAttributeName(index).toString();
00105
00106
00107 try {
00108 final Attributes type = Attributes.valueOf(localName.toUpperCase());
00109 final String value = xmlr.getAttributeValue(index);
00110 switch (type) {
00111 case ADDRESS:
00112 ink.setSourcePageAddress(new PageAddress(value));
00113 break;
00114 case BEGIN:
00115 beginTS = Long.parseLong(value);
00116 break;
00117 case END:
00118 endTS = Long.parseLong(value);
00119 break;
00120 case X:
00121 x = Double.parseDouble(value);
00122 break;
00123 case Y:
00124 y = Double.parseDouble(value);
00125 break;
00126 case F:
00127 f = Integer.parseInt(value);
00128 break;
00129 case T:
00130 t = Long.parseLong(value);
00131 break;
00132 }
00133 } catch (IllegalArgumentException iae) {
00134
00135 }
00136 }
00137
00141 private void processAttributes(XMLStreamReader xmlr) {
00142 for (int i = 0; i < xmlr.getAttributeCount(); i++) {
00143 processAttribute(xmlr, i);
00144 }
00145 }
00146
00152 private void processEvent(XMLStreamReader xmlr) {
00153 int start = 0;
00154 int length = 0;
00155 String text = "";
00156
00157 switch (xmlr.getEventType()) {
00158 case XMLStreamConstants.START_ELEMENT:
00159 recentXMLText = "";
00160 processTag(xmlr, TagType.BEGIN_TAG);
00161 processAttributes(xmlr);
00162 break;
00163 case XMLStreamConstants.END_ELEMENT:
00164 processTag(xmlr, TagType.END_TAG);
00165 recentXMLText = "";
00166 break;
00167 case XMLStreamConstants.CHARACTERS:
00168 start = xmlr.getTextStart();
00169 length = xmlr.getTextLength();
00170 text = new String(xmlr.getTextCharacters(), start, length);
00171 recentXMLText += text;
00172 break;
00173 case XMLStreamConstants.SPACE:
00174 start = xmlr.getTextStart();
00175 length = xmlr.getTextLength();
00176 text = new String(xmlr.getTextCharacters(), start, length);
00177 break;
00178 }
00179 }
00180
00185 private void processTag(XMLStreamReader xmlr, TagType beginOrEnd) {
00186 if (!xmlr.hasName()) {
00187 return;
00188 }
00189 final String localName = xmlr.getLocalName();
00190
00191 final Nodes type = Nodes.valueOf(localName.toUpperCase());
00192 if (beginOrEnd == TagType.BEGIN_TAG) {
00193 switch (type) {
00194 case STROKE:
00195
00196 currentStroke = new ArrayList<PenSample>();
00197 break;
00198 case P:
00199 break;
00200 case INK:
00201 break;
00202 }
00203 } else {
00204 switch (type) {
00205 case STROKE:
00206
00207 currentSample.setPenUp(true);
00208 ink.addStroke(new InkStroke(currentStroke));
00209 break;
00210 case P:
00211 currentSample = new PenSample(x, y, f, t);
00212 currentStroke.add(currentSample);
00213 break;
00214 case INK:
00215 break;
00216 }
00217 }
00218 }
00219
00220 }