diff --git a/main/src/com/google/refine/importers/XmlImportUtilities.java b/main/src/com/google/refine/importers/XmlImportUtilities.java index c20f1658a..b477d8c52 100644 --- a/main/src/com/google/refine/importers/XmlImportUtilities.java +++ b/main/src/com/google/refine/importers/XmlImportUtilities.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.refine.importers.parsers.TreeParser; +import com.google.refine.importers.parsers.TreeParserToken; import com.google.refine.model.Cell; import com.google.refine.model.Project; import com.google.refine.model.Row; @@ -25,8 +26,8 @@ public class XmlImportUtilities extends TreeImportUtilities { static public String[] detectPathFromTag(TreeParser parser, String tag) { try { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) { //FIXME uses Xml + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { List path = detectRecordElement(parser, tag); if (path != null) { String[] path2 = new String[path.size()]; @@ -73,10 +74,10 @@ public class XmlImportUtilities extends TreeImportUtilities { } while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.END_ELEMENT) { //FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.EndEntity) {//XMLStreamConstants.END_ELEMENT) { break; - } else if (eventType == XMLStreamConstants.START_ELEMENT) { //FIXME uses Xml, and is not generic + } else if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { List path = detectRecordElement(parser, tag); if (path != null) { path.add(0, localName); @@ -110,8 +111,8 @@ public class XmlImportUtilities extends TreeImportUtilities { try { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) {//FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity){ //XMLStreamConstants.START_ELEMENT) { RecordElementCandidate candidate = detectRecordElement( parser, @@ -146,14 +147,14 @@ public class XmlImportUtilities extends TreeImportUtilities { try { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.END_ELEMENT) {//FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.EndEntity) {//XMLStreamConstants.END_ELEMENT) { break; - } else if (eventType == XMLStreamConstants.CHARACTERS) {//FIXME uses Xml, and is not generic + } else if (eventType == TreeParserToken.Value) {//XMLStreamConstants.CHARACTERS) { if (parser.getText().trim().length() > 0) { textNodeCount++; } - } else if (eventType == XMLStreamConstants.START_ELEMENT) {//FIXME uses Xml, and is not generic + } else if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { childElementNodeCount++; String tagName = parser.getLocalName(); @@ -237,8 +238,8 @@ public class XmlImportUtilities extends TreeImportUtilities { ) { try { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) { //FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { findRecord(project, parser, recordPath, 0, rootColumnGroup); } } @@ -275,10 +276,10 @@ public class XmlImportUtilities extends TreeImportUtilities { if (tagName.equals(recordPath[pathIndex])) { if (pathIndex < recordPath.length - 1) { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) {//FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { findRecord(project, parser, recordPath, pathIndex + 1, rootColumnGroup); - } else if (eventType == XMLStreamConstants.END_ELEMENT) {//FIXME uses Xml, and is not generic + } else if (eventType == TreeParserToken.EndEntity) {//XMLStreamConstants.END_ELEMENT) { break; } } @@ -292,10 +293,10 @@ public class XmlImportUtilities extends TreeImportUtilities { static protected void skip(TreeParser parser) throws ServletException { while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) { //FIXME uses Xml, and is not generic + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { skip(parser); - } else if (eventType == XMLStreamConstants.END_ELEMENT) { //FIXME uses Xml, and is not generic + } else if (eventType == TreeParserToken.EndEntity) { //XMLStreamConstants.END_ELEMENT) { return; } } @@ -374,8 +375,8 @@ public class XmlImportUtilities extends TreeImportUtilities { } while (parser.hasNext()) { - int eventType = parser.next(); - if (eventType == XMLStreamConstants.START_ELEMENT) { + TreeParserToken eventType = parser.next(); + if (eventType == TreeParserToken.StartEntity) {//XMLStreamConstants.START_ELEMENT) { processSubRecord( project, parser, @@ -383,7 +384,7 @@ public class XmlImportUtilities extends TreeImportUtilities { record ); } else if (//eventType == XMLStreamConstants.CDATA || - eventType == XMLStreamConstants.CHARACTERS) { + eventType == TreeParserToken.Value) { //XMLStreamConstants.CHARACTERS) { String text = parser.getText().trim(); if (text.length() > 0) { addCell( @@ -394,7 +395,7 @@ public class XmlImportUtilities extends TreeImportUtilities { parser.getText() ); } - } else if (eventType == XMLStreamConstants.END_ELEMENT) { + } else if (eventType == TreeParserToken.EndEntity) { //XMLStreamConstants.END_ELEMENT) { break; } } diff --git a/main/src/com/google/refine/importers/parsers/JSONParser.java b/main/src/com/google/refine/importers/parsers/JSONParser.java index 1a0e6d7b2..b336bc9c0 100644 --- a/main/src/com/google/refine/importers/parsers/JSONParser.java +++ b/main/src/com/google/refine/importers/parsers/JSONParser.java @@ -7,6 +7,7 @@ import javax.servlet.ServletException; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonToken; public class JSONParser implements TreeParser{ JsonFactory factory = new JsonFactory(); @@ -78,9 +79,32 @@ public class JSONParser implements TreeParser{ } @Override - public int next() throws ServletException { - // TODO Auto-generated method stub - return 0; + public TreeParserToken next() throws ServletException { + JsonToken next; + try { + next = parser.nextToken(); + } catch (JsonParseException e) { + throw new ServletException(e.getMessage()); + } catch (IOException e) { + throw new ServletException(e.getMessage()); + } + + if(next == null) + throw new ServletException("No more Json Tokens in stream"); + + return convertToTreeParserToken(next); + } + + protected TreeParserToken convertToTreeParserToken(JsonToken token) throws ServletException{ + switch(token){ + case START_ARRAY: return TreeParserToken.StartEntity; + case END_ARRAY: return TreeParserToken.EndEntity; + case START_OBJECT: return TreeParserToken.StartEntity; + case END_OBJECT: return TreeParserToken.EndEntity; + case VALUE_STRING: return TreeParserToken.Value; + //TODO finish the rest of the cases + default: throw new ServletException("Not yet implemented"); + } } } diff --git a/main/src/com/google/refine/importers/parsers/TreeParser.java b/main/src/com/google/refine/importers/parsers/TreeParser.java index 3a0aa75b5..51062c680 100644 --- a/main/src/com/google/refine/importers/parsers/TreeParser.java +++ b/main/src/com/google/refine/importers/parsers/TreeParser.java @@ -3,8 +3,8 @@ package com.google.refine.importers.parsers; import javax.servlet.ServletException; public interface TreeParser { - public int next() throws ServletException; - public int getEventType(); + public TreeParserToken next() throws ServletException; + public int getEventType(); //aka getCurrentToken public boolean hasNext() throws ServletException; public String getLocalName(); public String getPrefix(); diff --git a/main/src/com/google/refine/importers/parsers/TreeParserToken.java b/main/src/com/google/refine/importers/parsers/TreeParserToken.java new file mode 100644 index 000000000..4e8003da2 --- /dev/null +++ b/main/src/com/google/refine/importers/parsers/TreeParserToken.java @@ -0,0 +1,9 @@ +package com.google.refine.importers.parsers; + + +public enum TreeParserToken { + StartEntity, + EndEntity, + Value + //TODO +} diff --git a/main/src/com/google/refine/importers/parsers/XmlParser.java b/main/src/com/google/refine/importers/parsers/XmlParser.java index 021dfb1ae..6d188de0d 100644 --- a/main/src/com/google/refine/importers/parsers/XmlParser.java +++ b/main/src/com/google/refine/importers/parsers/XmlParser.java @@ -5,6 +5,7 @@ import java.io.InputStream; import javax.servlet.ServletException; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -23,13 +24,32 @@ public class XmlParser implements TreeParser{ } } - public int next() throws ServletException{ + public TreeParserToken next() throws ServletException{ try { - return parser.next(); + if(!parser.hasNext()) + throw new ServletException("End of XML stream"); } catch (XMLStreamException e) { - //TODO log and return throw new ServletException(e.getMessage()); - } + } + + int currentToken = -1; + try { + currentToken = parser.next(); + } catch (XMLStreamException e) { + throw new ServletException(e.getMessage()); + } + + return convertToTreeParserToken(currentToken); + } + + protected TreeParserToken convertToTreeParserToken(int token) throws ServletException { + switch(token){ + case XMLStreamConstants.START_ELEMENT: return TreeParserToken.StartEntity; + case XMLStreamConstants.END_ELEMENT: return TreeParserToken.EndEntity; + case XMLStreamConstants.CHARACTERS: return TreeParserToken.Value; + //TODO + default: throw new ServletException("Not yet implemented"); + } } public int getEventType(){