xmlarchive.hh
上传用户: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. #ifndef XMLARCHIVE_HH_
  19. #define XMLARCHIVE_HH_
  20. #include <xercesc/parsers/SAXParser.hpp>
  21. #include <xercesc/util/PlatformUtils.hpp>
  22. #include <xercesc/util/BinInputStream.hpp>
  23. #include <xercesc/sax/HandlerBase.hpp>
  24. #include <xercesc/sax/InputSource.hpp>
  25. #include "recordio.hh"
  26. XERCES_CPP_NAMESPACE_USE
  27. namespace hadoop {
  28. class Value {
  29. private:
  30.   std::string type;
  31.   std::string value;
  32. public:
  33.   Value(const std::string& t) { type = t; }
  34.   void addChars(const char* buf, unsigned int len) {
  35.     value += std::string(buf, len);
  36.   }
  37.   const std::string& getType() const { return type; }
  38.   const std::string& getValue() const { return value; }
  39. };
  40.   
  41. class MySAXHandler : public HandlerBase {
  42. private:
  43.   std::vector<Value>& vlist;
  44.   bool charsValid;
  45. public:
  46.   MySAXHandler(std::vector<Value>& list) : vlist(list) {charsValid = false;}
  47.   void startElement(const XMLCh* const name, AttributeList& attr);
  48.   void endElement(const XMLCh* const name);
  49.   void characters(const XMLCh* const buf, unsigned int len);
  50. };
  51. class XmlIndex : public Index {
  52. private:
  53.   std::vector<Value>& vlist;
  54.   unsigned int& vidx;
  55. public:
  56.   XmlIndex(std::vector<Value>& list, unsigned int& idx) : vlist(list), vidx(idx) {}
  57.   bool done() {
  58.    Value v = vlist[vidx];
  59.    return (v.getType() == "/array") ? true : false;
  60.   }
  61.   void incr() {}
  62.   ~XmlIndex() {} 
  63. };
  64. class MyBinInputStream : public BinInputStream {
  65. private:
  66.   InStream& stream;
  67.   unsigned int pos;
  68. public:
  69.   MyBinInputStream(InStream& s) : stream(s) { pos = 0; }
  70.   virtual unsigned int curPos() const { return pos; }
  71.   virtual unsigned int readBytes(XMLByte* const toFill,
  72.       const unsigned int maxToRead) {
  73.     ssize_t nread = stream.read(toFill, maxToRead);
  74.     if (nread < 0) {
  75.       return 0;
  76.     } else {
  77.       pos += nread;
  78.       return nread;
  79.     }
  80.   }
  81. };
  82. class MyInputSource : public InputSource {
  83. private:
  84.   InStream& stream;
  85. public:
  86.   MyInputSource(InStream& s) : stream(s) {  }
  87.   virtual BinInputStream* makeStream() const {
  88.     return new MyBinInputStream(stream);
  89.   }
  90.   virtual const XMLCh* getEncoding() const {
  91.     return XMLString::transcode("UTF-8");
  92.   }
  93.   virtual ~MyInputSource() {}
  94. };
  95.   
  96. class IXmlArchive : public IArchive {
  97. private:
  98.   std::vector<Value> vlist;
  99.   unsigned int vidx;
  100.   MySAXHandler *docHandler;
  101.   SAXParser *parser;
  102.   MyInputSource* src;
  103.   Value next() {
  104.     Value v = vlist[vidx];
  105.     vidx++;
  106.     return v;
  107.   }
  108. public:
  109.   IXmlArchive(InStream& _stream) {
  110.     vidx = 0;
  111.     try {
  112.       XMLPlatformUtils::Initialize();
  113.     } catch (const XMLException& e) {
  114.       throw new IOException("Unable to initialize XML Parser.");
  115.     }
  116.     parser = new SAXParser();
  117.     docHandler = new MySAXHandler(vlist);
  118.     parser->setDocumentHandler(docHandler);
  119.     src = new MyInputSource(_stream);
  120.     try {
  121.       parser->parse(*src);
  122.     } catch (const XMLException& e) {
  123.       throw new IOException("Unable to parse XML stream.");
  124.     } catch (const SAXParseException& e) {
  125.       throw new IOException("Unable to parse XML stream.");
  126.     }
  127.     delete parser;
  128.     delete docHandler;
  129.   }
  130.   virtual void deserialize(int8_t& t, const char* tag);
  131.   virtual void deserialize(bool& t, const char* tag);
  132.   virtual void deserialize(int32_t& t, const char* tag);
  133.   virtual void deserialize(int64_t& t, const char* tag);
  134.   virtual void deserialize(float& t, const char* tag);
  135.   virtual void deserialize(double& t, const char* tag);
  136.   virtual void deserialize(std::string& t, const char* tag);
  137.   virtual void deserialize(std::string& t, size_t& len, const char* tag);
  138.   virtual void startRecord(Record& s, const char* tag);
  139.   virtual void endRecord(Record& s, const char* tag);
  140.   virtual Index* startVector(const char* tag);
  141.   virtual void endVector(Index* idx, const char* tag);
  142.   virtual Index* startMap(const char* tag);
  143.   virtual void endMap(Index* idx, const char* tag);
  144.   virtual ~IXmlArchive() {
  145.     XMLPlatformUtils::Terminate();
  146.   }
  147. };
  148. class OXmlArchive : public OArchive {
  149. private:
  150.   OutStream& stream;
  151.   
  152.   std::vector<std::string> cstack;
  153.   
  154.   void insideRecord(const char* tag) {
  155.     printBeginEnvelope(tag);
  156.     cstack.push_back("record");
  157.   }
  158.   
  159.   void outsideRecord(const char* tag) {
  160.     std::string s = cstack.back();
  161.     cstack.pop_back();
  162.     if (s != "record") {
  163.       throw new IOException("Error deserializing record.");
  164.     }
  165.     printEndEnvelope(tag);
  166.   }
  167.   
  168.   void insideVector(const char* tag) {
  169.     printBeginEnvelope(tag);
  170.     cstack.push_back("vector");
  171.   }
  172.   
  173.   void outsideVector(const char* tag) {
  174.     std::string s = cstack.back();
  175.     cstack.pop_back();
  176.     if (s != "vector") {
  177.       throw new IOException("Error deserializing vector.");
  178.     }
  179.     printEndEnvelope(tag);
  180.   }
  181.   
  182.   void insideMap(const char* tag) {
  183.     printBeginEnvelope(tag);
  184.     cstack.push_back("map");
  185.   }
  186.   
  187.   void outsideMap(const char* tag) {
  188.     std::string s = cstack.back();
  189.     cstack.pop_back();
  190.     if (s != "map") {
  191.       throw new IOException("Error deserializing map.");
  192.     }
  193.     printEndEnvelope(tag);
  194.   }
  195.   
  196.   void p(const char* cstr) {
  197.     stream.write(cstr, strlen(cstr));
  198.   }
  199.   
  200.   void printBeginEnvelope(const char* tag) {
  201.     if (cstack.size() != 0) {
  202.       std::string s = cstack.back();
  203.       if ("record" == s) {
  204.         p("<member>n");
  205.         p("<name>");
  206.         p(tag);
  207.         p("</name>n");
  208.         p("<value>");
  209.       } else if ("vector" == s) {
  210.         p("<value>");
  211.       } else if ("map" == s) {
  212.         p("<value>");
  213.       }
  214.     } else {
  215.       p("<value>");
  216.     }
  217.   }
  218.   
  219.   void printEndEnvelope(const char* tag) {
  220.     if (cstack.size() != 0) {
  221.       std::string s = cstack.back();
  222.       if ("record" == s) {
  223.         p("</value>n");
  224.         p("</member>n");
  225.       } else if ("vector" == s) {
  226.         p("</value>n");
  227.       } else if ("map" == s) {
  228.         p("</value>n");
  229.       }
  230.     } else {
  231.       p("</value>n");
  232.     }
  233.   }
  234.   
  235. public:
  236.   OXmlArchive(OutStream& _stream) : stream(_stream) {}
  237.   virtual void serialize(int8_t t, const char* tag);
  238.   virtual void serialize(bool t, const char* tag);
  239.   virtual void serialize(int32_t t, const char* tag);
  240.   virtual void serialize(int64_t t, const char* tag);
  241.   virtual void serialize(float t, const char* tag);
  242.   virtual void serialize(double t, const char* tag);
  243.   virtual void serialize(const std::string& t, const char* tag);
  244.   virtual void serialize(const std::string& t, size_t len, const char* tag);
  245.   virtual void startRecord(const Record& s, const char* tag);
  246.   virtual void endRecord(const Record& s, const char* tag);
  247.   virtual void startVector(size_t len, const char* tag);
  248.   virtual void endVector(size_t len, const char* tag);
  249.   virtual void startMap(size_t len, const char* tag);
  250.   virtual void endMap(size_t len, const char* tag);
  251.   virtual ~OXmlArchive();
  252. };
  253. }
  254. #endif /*XMLARCHIVE_HH_*/