Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / devel / devel.ma / Xml.cc
index c7c83b9..07d06ef 100644 (file)
-#include "Tools.h"
-
-extern "C"
-{
-#include <libxml/xmlreader.h>
-#include <libxml/xmlerror.h>
-}
 #include <iostream>
-#include <fstream>
 #include <list>
 #include <map>
 #include <set>
 
-#include <boost/call_traits.hpp>
-
-#include <zypp/base/LogControl.h>
 #include <zypp/base/LogTools.h>
+#include <zypp/base/LogControl.h>
+#include <zypp/base/Exception.h>
 
-#include "zypp/base/Exception.h"
-#include "zypp/base/InputStream.h"
-#include "zypp/base/DefaultIntegral.h"
-#include <zypp/base/Function.h>
-#include <zypp/base/Iterator.h>
-#include <zypp/Pathname.h>
-#include <zypp/Edition.h>
-#include <zypp/CheckSum.h>
-#include <zypp/Date.h>
-#include <zypp/Rel.h>
-
-#include "zypp/parser/xml/Reader.h"
+#include <zypp/parser/xml/Reader.h>
+//#include <zypp/parser/xml/ParseDef.h>
+//#include <zypp/parser/xml/ParseDefConsume.h>
 
 using namespace std;
 using namespace zypp;
 
-///////////////////////////////////////////////////////////////////
-
-static const Pathname sysRoot( "/Local/ROOT" );
+#include <zypp/base/Measure.h>
+using zypp::debug::Measure;
 
 ///////////////////////////////////////////////////////////////////
 
-template<class _Cl>
-  void ti( const _Cl & c )
-  {
-    SEC << __PRETTY_FUNCTION__ << endl;
-  }
-
-///////////////////////////////////////////////////////////////////
-
-bool nopNode( xml::Reader & reader_r )
+/** Helper to detect an objects type. */
+template<class _Cl> void ti( const _Cl & c )
 {
-  return true;
+  SEC << __PRETTY_FUNCTION__ << endl;
 }
 
-///////////////////////////////////////////////////////////////////
-
-bool accNode( xml::Reader & reader_r )
+bool noop( xml::Reader & reader_r )
 {
-  int i;
-  xml::XmlString s;
-#define X(m) reader_r->m()
-      i=X(readState);
-      i=X(lineNumber);
-      i=X(columnNumber);
-      i=X(depth);
-      i=X(nodeType);
-      s=X(name);
-      s=X(prefix);
-      s=X(localName);
-      i=X(hasAttributes);
-      i=X(attributeCount);
-      i=X(hasValue);
-      s=X(value);
-#undef X
-      return true;
+  return true;
 }
+struct Noop
+{
+  bool operator()( xml::Reader & reader_r ) const
+  { return true; }
+};
 
 ///////////////////////////////////////////////////////////////////
 
 bool dumpNode( xml::Reader & reader_r )
 {
   switch ( reader_r->nodeType() )
-    {
+  {
+    case XML_READER_TYPE_ELEMENT:
+      MIL << *reader_r << endl;
+      for ( int i = 0; i < reader_r->attributeCount(); ++i )
+      {
+       MIL << " attr no " << i << " '" << reader_r->getAttributeNo( i ) << "'" << endl;
+      }
+      break;
+
     case XML_READER_TYPE_ATTRIBUTE:
+      WAR << *reader_r << endl;
+      break;
+
     case XML_READER_TYPE_TEXT:
     case XML_READER_TYPE_CDATA:
-       DBG << *reader_r << endl;
-       break;
-    case XML_READER_TYPE_ELEMENT:
+      DBG << *reader_r << endl;
+      break;
 
-       MIL << *reader_r << endl;
-       break;
     default:
-       //WAR << *reader_r << endl;
-       break;
-    }
+      //ERR << *reader_r << endl;
+      break;
+  }
   return true;
 }
 
 ///////////////////////////////////////////////////////////////////
 
-bool dumpEd( xml::Reader & reader_r )
+bool consume( xml::Reader & reader_r )
 {
-  static int num = 5;
-  if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT
-       && reader_r->name() == "version" )
-    {
-      MIL << *reader_r << endl;
-      DBG << reader_r->getAttribute( "rel" ) << endl;
-      ERR << *reader_r << endl;
-      DBG << reader_r->getAttribute( "ver" ) << endl;
-      ERR << *reader_r << endl;
-      DBG << reader_r->getAttribute( "epoch" ) << endl;
-      ERR << *reader_r << endl;
-      WAR << Edition( reader_r->getAttribute( "ver" ).asString(),
-                      reader_r->getAttribute( "rel" ).asString(),
-                      reader_r->getAttribute( "epoch" ).asString() ) << endl;
-      --num;
-    }
-  return num;
-}
-
-///////////////////////////////////////////////////////////////////
-
-template<class _OutputIterator>
-  struct DumpDeps
+  switch ( reader_r->nodeType() )
   {
-    DumpDeps( _OutputIterator result_r )
-    : _result( result_r )
-    {}
-
-    bool operator()( xml::Reader & reader_r )
-    {
-      if ( reader_r->nodeType()     == XML_READER_TYPE_ELEMENT
-           && reader_r->prefix()    == "rpm"
-           && reader_r->localName() == "entry" )
-        {
-          string n( reader_r->getAttribute( "name" ).asString() );
-          Rel op( reader_r->getAttribute( "flags" ).asString() );
-          if ( op != Rel::ANY )
-            {
-              n += " ";
-              n += op.asString();
-              n += " ";
-              n += reader_r->getAttribute( "ver" ).asString();
-              n += "-";
-              n += reader_r->getAttribute( "rel" ).asString();
-            }
-          *_result = n;
-          ++_result;
-        }
-      return true;
-    }
+    case XML_READER_TYPE_ELEMENT:
+      MIL << *reader_r << endl;
+      for ( int i = 0; i < reader_r->attributeCount(); ++i )
+      {
+       MIL << " attr no " << i << " '" << reader_r->getAttributeNo( i ) << "'" << endl;
+      }
+      break;
 
-    _OutputIterator _result;
-  };
+    case XML_READER_TYPE_ATTRIBUTE:
+      WAR << *reader_r << endl;
+      break;
 
-template<class _OutputIterator>
-  DumpDeps<_OutputIterator> dumpDeps( _OutputIterator result_r )
-  { return DumpDeps<_OutputIterator>( result_r ); }
+    case XML_READER_TYPE_TEXT:
+    case XML_READER_TYPE_CDATA:
+      DBG << *reader_r << endl;
+      break;
 
-///////////////////////////////////////////////////////////////////
+    default:
+      //ERR << *reader_r << endl;
+      break;
+  }
+  return true;
+}
 
 /******************************************************************
 **
@@ -167,32 +102,116 @@ template<class _OutputIterator>
 */
 int main( int argc, char * argv[] )
 {
+  --argc, ++argv;
   INT << "===[START]==========================================" << endl;
 
-  --argc;
-  ++argv;
+  bool verbose( true );
+  Pathname input( "test.xml" );
+  xml::Reader::ProcessNode consumer( consume );
 
-  Pathname repodata;
-  if ( argc )
-    {
-      repodata = *argv;
-    }
-  else
-    {
-      repodata = "/Local/FACTORY/repodata";
-      //repodata = "/Local/PATCHES/repodata";
-      repodata /= "primary.xml";
-    }
+  if ( argc && !strcmp( *argv, "-q" ) )
+  {
+    --argc, ++argv;
+    verbose = false;
+  }
 
-  if ( 1 )
+  {
+    Measure m( "Parse all" );
+    for ( ; argc; --argc, ++argv )
     {
-      Measure m( "Parse" );
-      xml::Reader reader( repodata );
-      //reader.foreachNodeOrAttribute( accNode );
-      reader.foreachNodeOrAttribute( accNode );
+      input = *argv;
+
+      try {
+       Measure m( input.basename() );
+//     zypp::base::LogControl::TmpLineWriter shutUp;
+       xml::Reader reader( input );
+       if ( verbose )
+         reader.foreachNodeOrAttribute( consumer );
+       else
+         reader.foreachNode( consumer );
+      }
+      catch ( const Exception & exp )
+      {
+       INT << exp << endl << exp.historyAsString();
+      }
     }
-
+  }
   INT << "===[END]============================================" << endl << endl;
   return 0;
 }
 
+/*
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="23230">
+<package type="rpm">
+<name>fam-devel</name>
+<arch>ppc</arch>
+<version epoch="0" ver="2.6.10" rel="141"/>
+<checksum type="sha" pkgid="YES">59d6a65cdadd911fe8ceee87740a54305b2ab053</checksum>
+<summary>Include Files and Libraries Mandatory for Development</summary>
+<description>Fam is a file alteration monitoring service. This means that you can
+
+foreachNode( dumpNode )
+=======================
+START MEASURE(Parse)
+0:ELEMENT <metadata>  [attr 3]
+ attr no 0 'http://linux.duke.edu/metadata/common'
+ attr no 1 'http://linux.duke.edu/metadata/rpm'
+ attr no 2 '23230'
+1: ELEMENT <package>  [attr 1]
+ attr no 0 'rpm'
+2:  ELEMENT <name>  [noattr]
+3:   TEXT <#text>  [noattr] {fam-devel}
+2:  ELEMENT <arch>  [noattr]
+3:   TEXT <#text>  [noattr] {ppc}
+2:  ELEMENT <version>  [attr 3|empty]
+ attr no 0 '0'
+ attr no 1 '2.6.10'
+ attr no 2 '141'
+2:  ELEMENT <checksum>  [attr 2]
+ attr no 0 'sha'
+ attr no 1 'YES'
+3:   TEXT <#text>  [noattr] {59d6a65cdadd911fe8ceee87740a54305b2ab053}
+2:  ELEMENT <summary>  [noattr]
+3:   TEXT <#text>  [noattr] {Include Files and Libraries Mandatory for Development}
+2:  ELEMENT <description>  [noattr]
+3:   TEXT <#text>  [noattr] {Fam is a file alteration monitoring service. This means that you can
+
+foreachNodeOrAttribute( dumpNode )
+==================================
+START MEASURE(Parse)
+0:ELEMENT <metadata>  [attr 3]
+ attr no 0 'http://linux.duke.edu/metadata/common'
+ attr no 1 'http://linux.duke.edu/metadata/rpm'
+ attr no 2 '23230'
+1: ATTRIBUTE <xmlns>  [noattr] {http://linux.duke.edu/metadata/common}
+1: ATTRIBUTE <xmlns:rpm>  [noattr] {http://linux.duke.edu/metadata/rpm}
+1: ATTRIBUTE <packages>  [noattr] {23230}
+1: ELEMENT <package>  [attr 1]
+ attr no 0 'rpm'
+2:  ATTRIBUTE <type>  [noattr] {rpm}
+2:  ELEMENT <name>  [noattr]
+3:   TEXT <#text>  [noattr] {fam-devel}
+2:  ELEMENT <arch>  [noattr]
+3:   TEXT <#text>  [noattr] {ppc}
+2:  ELEMENT <version>  [attr 3|empty]
+ attr no 0 '0'
+ attr no 1 '2.6.10'
+ attr no 2 '141'
+3:   ATTRIBUTE <epoch>  [noattr] {0}
+3:   ATTRIBUTE <ver>  [noattr] {2.6.10}
+3:   ATTRIBUTE <rel>  [noattr] {141}
+2:  ELEMENT <checksum>  [attr 2]
+ attr no 0 'sha'
+ attr no 1 'YES'
+3:   ATTRIBUTE <type>  [noattr] {sha}
+3:   ATTRIBUTE <pkgid>  [noattr] {YES}
+3:   TEXT <#text>  [noattr] {59d6a65cdadd911fe8ceee87740a54305b2ab053}
+3:   ATTRIBUTE <type>  [noattr] {sha}
+3:   ATTRIBUTE <pkgid>  [noattr] {YES}
+2:  ELEMENT <summary>  [noattr]
+3:   TEXT <#text>  [noattr] {Include Files and Libraries Mandatory for Development}
+2:  ELEMENT <description>  [noattr]
+3:   TEXT <#text>  [noattr] {Fam is a file alteration monitoring service. This means that you can
+
+*/