InkXMLParser.java

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                 // Create an input factory
00079                 final XMLInputFactory xmlif = XMLInputFactory.newInstance();
00080                 // Create an XML stream reader
00081                 XMLStreamReader xmlr;
00082                 try {
00083                         xmlr = xmlif.createXMLStreamReader(new FileReader(xmlFileSource));
00084                         // Loop over XML input stream and process events
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                 // String prefix = xmlr.getAttributePrefix(index);
00103                 // String namespace = xmlr.getAttributeNamespace(index);
00104                 final String localName = xmlr.getAttributeName(index).toString();
00105                 // DebugUtils.println(localName);
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                         // System.out.println("Not Handling Attribute: " + localName);
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                 // DebugUtils.println(localName);
00191                 final Nodes type = Nodes.valueOf(localName.toUpperCase());
00192                 if (beginOrEnd == TagType.BEGIN_TAG) { // BEGIN
00193                         switch (type) {
00194                         case STROKE:
00195                                 // DebugUtils.println("Stroke");
00196                                 currentStroke = new ArrayList<PenSample>();
00197                                 break;
00198                         case P:
00199                                 break;
00200                         case INK:
00201                                 break;
00202                         }
00203                 } else { // END
00204                         switch (type) {
00205                         case STROKE:
00206                                 // set the up flag for the last sample we parsed
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 }

Generated on Sat Apr 14 18:21:36 2007 for R3 Paper Toolkit by  doxygen 1.4.7