XmlRecordInput.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:7k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.record;
  19. import java.io.InputStream;
  20. import java.io.IOException;
  21. import java.util.ArrayList;
  22. import org.xml.sax.*;
  23. import org.xml.sax.helpers.DefaultHandler;
  24. import javax.xml.parsers.SAXParserFactory;
  25. import javax.xml.parsers.SAXParser;
  26. /**
  27.  * XML Deserializer.
  28.  */
  29. public class XmlRecordInput implements RecordInput {
  30.     
  31.   static private class Value {
  32.     private String type;
  33.     private StringBuffer sb;
  34.         
  35.     public Value(String t) {
  36.       type = t;
  37.       sb = new StringBuffer();
  38.     }
  39.     public void addChars(char[] buf, int offset, int len) {
  40.       sb.append(buf, offset, len);
  41.     }
  42.     public String getValue() { return sb.toString(); }
  43.     public String getType() { return type; }
  44.   }
  45.     
  46.   private static class XMLParser extends DefaultHandler {
  47.     private boolean charsValid = false;
  48.         
  49.     private ArrayList<Value> valList;
  50.         
  51.     private XMLParser(ArrayList<Value> vlist) {
  52.       valList = vlist;
  53.     }
  54.         
  55.     public void startDocument() throws SAXException {}
  56.         
  57.     public void endDocument() throws SAXException {}
  58.         
  59.     public void startElement(String ns,
  60.                              String sname,
  61.                              String qname,
  62.                              Attributes attrs) throws SAXException {
  63.       charsValid = false;
  64.       if ("boolean".equals(qname) ||
  65.           "i4".equals(qname) ||
  66.           "int".equals(qname) ||
  67.           "string".equals(qname) ||
  68.           "double".equals(qname) ||
  69.           "ex:i1".equals(qname) ||
  70.           "ex:i8".equals(qname) ||
  71.           "ex:float".equals(qname)) {
  72.         charsValid = true;
  73.         valList.add(new Value(qname));
  74.       } else if ("struct".equals(qname) ||
  75.                  "array".equals(qname)) {
  76.         valList.add(new Value(qname));
  77.       }
  78.     }
  79.         
  80.     public void endElement(String ns,
  81.                            String sname,
  82.                            String qname) throws SAXException {
  83.       charsValid = false;
  84.       if ("struct".equals(qname) ||
  85.           "array".equals(qname)) {
  86.         valList.add(new Value("/"+qname));
  87.       }
  88.     }
  89.         
  90.     public void characters(char buf[], int offset, int len)
  91.       throws SAXException {
  92.       if (charsValid) {
  93.         Value v = valList.get(valList.size()-1);
  94.         v.addChars(buf, offset, len);
  95.       }
  96.     }
  97.         
  98.   }
  99.     
  100.   private class XmlIndex implements Index {
  101.     public boolean done() {
  102.       Value v = valList.get(vIdx);
  103.       if ("/array".equals(v.getType())) {
  104.         valList.set(vIdx, null);
  105.         vIdx++;
  106.         return true;
  107.       } else {
  108.         return false;
  109.       }
  110.     }
  111.     public void incr() {}
  112.   }
  113.     
  114.   private ArrayList<Value> valList;
  115.   private int vLen;
  116.   private int vIdx;
  117.     
  118.   private Value next() throws IOException {
  119.     if (vIdx < vLen) {
  120.       Value v = valList.get(vIdx);
  121.       valList.set(vIdx, null);
  122.       vIdx++;
  123.       return v;
  124.     } else {
  125.       throw new IOException("Error in deserialization.");
  126.     }
  127.   }
  128.     
  129.   /** Creates a new instance of XmlRecordInput */
  130.   public XmlRecordInput(InputStream in) {
  131.     try{
  132.       valList = new ArrayList<Value>();
  133.       DefaultHandler handler = new XMLParser(valList);
  134.       SAXParserFactory factory = SAXParserFactory.newInstance();
  135.       SAXParser parser = factory.newSAXParser();
  136.       parser.parse(in, handler);
  137.       vLen = valList.size();
  138.       vIdx = 0;
  139.     } catch (Exception ex) {
  140.       throw new RuntimeException(ex);
  141.     }
  142.   }
  143.     
  144.   public byte readByte(String tag) throws IOException {
  145.     Value v = next();
  146.     if (!"ex:i1".equals(v.getType())) {
  147.       throw new IOException("Error deserializing "+tag+".");
  148.     }
  149.     return Byte.parseByte(v.getValue());
  150.   }
  151.     
  152.   public boolean readBool(String tag) throws IOException {
  153.     Value v = next();
  154.     if (!"boolean".equals(v.getType())) {
  155.       throw new IOException("Error deserializing "+tag+".");
  156.     }
  157.     return "1".equals(v.getValue());
  158.   }
  159.     
  160.   public int readInt(String tag) throws IOException {
  161.     Value v = next();
  162.     if (!"i4".equals(v.getType()) &&
  163.         !"int".equals(v.getType())) {
  164.       throw new IOException("Error deserializing "+tag+".");
  165.     }
  166.     return Integer.parseInt(v.getValue());
  167.   }
  168.     
  169.   public long readLong(String tag) throws IOException {
  170.     Value v = next();
  171.     if (!"ex:i8".equals(v.getType())) {
  172.       throw new IOException("Error deserializing "+tag+".");
  173.     }
  174.     return Long.parseLong(v.getValue());
  175.   }
  176.     
  177.   public float readFloat(String tag) throws IOException {
  178.     Value v = next();
  179.     if (!"ex:float".equals(v.getType())) {
  180.       throw new IOException("Error deserializing "+tag+".");
  181.     }
  182.     return Float.parseFloat(v.getValue());
  183.   }
  184.     
  185.   public double readDouble(String tag) throws IOException {
  186.     Value v = next();
  187.     if (!"double".equals(v.getType())) {
  188.       throw new IOException("Error deserializing "+tag+".");
  189.     }
  190.     return Double.parseDouble(v.getValue());
  191.   }
  192.     
  193.   public String readString(String tag) throws IOException {
  194.     Value v = next();
  195.     if (!"string".equals(v.getType())) {
  196.       throw new IOException("Error deserializing "+tag+".");
  197.     }
  198.     return Utils.fromXMLString(v.getValue());
  199.   }
  200.     
  201.   public Buffer readBuffer(String tag) throws IOException {
  202.     Value v = next();
  203.     if (!"string".equals(v.getType())) {
  204.       throw new IOException("Error deserializing "+tag+".");
  205.     }
  206.     return Utils.fromXMLBuffer(v.getValue());
  207.   }
  208.     
  209.   public void startRecord(String tag) throws IOException {
  210.     Value v = next();
  211.     if (!"struct".equals(v.getType())) {
  212.       throw new IOException("Error deserializing "+tag+".");
  213.     }
  214.   }
  215.     
  216.   public void endRecord(String tag) throws IOException {
  217.     Value v = next();
  218.     if (!"/struct".equals(v.getType())) {
  219.       throw new IOException("Error deserializing "+tag+".");
  220.     }
  221.   }
  222.     
  223.   public Index startVector(String tag) throws IOException {
  224.     Value v = next();
  225.     if (!"array".equals(v.getType())) {
  226.       throw new IOException("Error deserializing "+tag+".");
  227.     }
  228.     return new XmlIndex();
  229.   }
  230.     
  231.   public void endVector(String tag) throws IOException {}
  232.     
  233.   public Index startMap(String tag) throws IOException {
  234.     return startVector(tag);
  235.   }
  236.     
  237.   public void endMap(String tag) throws IOException { endVector(tag); }
  238. }