add missing patch attributes and complete patch validation
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Fri, 17 Mar 2006 14:07:52 +0000 (14:07 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Fri, 17 Mar 2006 14:07:52 +0000 (14:07 +0000)
zypp/parser/xmlstore/XMLParserData.h
zypp/parser/xmlstore/XMLPatchParser.cc
zypp/parser/xmlstore/schema/patch.rnc [new file with mode: 0644]
zypp/parser/xmlstore/schema/patch.rng [new file with mode: 0644]
zypp/parser/xmlstore/schema/pattern.rnc
zypp/parser/xmlstore/schema/pattern.rng
zypp/parser/xmlstore/schemanames.h
zypp/target/store/serialize.cc

index ebc8fd6..2ff067d 100644 (file)
@@ -138,6 +138,7 @@ namespace zypp {
           std::string category;
           bool rebootNeeded;
           bool packageManager;
+          bool interactive;
           std::string updateScript;
           std::list<XMLPatchAtomData_Ptr > atoms;
       };
index 00ae620..0ae54ab 100644 (file)
@@ -31,7 +31,7 @@ namespace zypp {
       { }
       
       XMLPatchParser::XMLPatchParser(istream &is, const string& baseUrl)
-        : XMLNodeIterator<XMLPatchData_Ptr>(is, baseUrl /*,PATCHSCHEMA*/)
+        : XMLNodeIterator<XMLPatchData_Ptr>(is, baseUrl ,PATCHSCHEMA)
       {
         fetchNext();
       }
@@ -59,10 +59,7 @@ namespace zypp {
         XMLPatchData_Ptr patchPtr = new XMLPatchData();
         xmlNodePtr dataNode = xmlTextReaderExpand(reader);
         xml_assert(dataNode);
-        patchPtr->timestamp = _helper.attribute(dataNode,"timestamp");
-        patchPtr->patchId = _helper.attribute(dataNode,"patchid");
-        patchPtr->engine = _helper.attribute(dataNode,"engine");
-      
+        
         // default values for optional entries
         patchPtr->rebootNeeded = false;
         patchPtr->packageManager = false;
@@ -82,17 +79,23 @@ namespace zypp {
             else if (name == "description") {
               patchPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
             }
+            else if (name == "id") {
+              patchPtr->patchId = _helper.content(child);
+            }
+            else if (name == "timestamp") {
+              patchPtr->timestamp = _helper.content(child);
+            }
             else if (name == "category") {
             patchPtr->category = _helper.content(child);
             }
-            else if (name == "reboot_needed") {
+            else if (name == "reboot-needed") {
             patchPtr->rebootNeeded = true;
             }
-            else if (name == "package_manager") {
+            else if (name == "affects-package-manager") {
               patchPtr->packageManager = true;
             }
-            else if (name == "update_script") {
-              patchPtr->updateScript = _helper.content(child);
+            else if (name == "interactive") {
+              patchPtr->interactive = true;
             }
             else if (name == "atoms") {
               parseAtomsNode(patchPtr, child);
diff --git a/zypp/parser/xmlstore/schema/patch.rnc b/zypp/parser/xmlstore/schema/patch.rnc
new file mode 100644 (file)
index 0000000..bf43e19
--- /dev/null
@@ -0,0 +1,45 @@
+default namespace = "http://www.novell.com/metadata/zypp/xml-store"
+
+include "resolvable.rnc"
+
+start = element-patch
+
+element-patch =
+  element patch { patch }
+  
+element-message =
+   element message { message }
+   
+message =
+  resolvable-data,
+  element text { text }
+   
+element-script =
+   element script { script }
+   
+script =
+  resolvable-data,
+  element do { text },
+  element undo { text }
+   
+element-atom =
+   element atom { atom }
+   
+atom =
+  resolvable-data
+   
+atoms =
+  element-script* & element-message* & element-atom*
+   
+patch =
+   resolvable-data,
+   element-summary+,
+   element-description+,
+   element id { text },
+   element timestamp { text },
+   element category { text },
+   element affects-package-manager { boolean },
+   element reboot-needed { boolean },
+   element interactive { boolean },
+   element atoms { atoms }
+   
diff --git a/zypp/parser/xmlstore/schema/patch.rng b/zypp/parser/xmlstore/schema/patch.rng
new file mode 100644 (file)
index 0000000..7b4c54f
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar ns="http://www.novell.com/metadata/zypp/xml-store" xmlns="http://relaxng.org/ns/structure/1.0">
+  <include href="resolvable.rng"/>
+  <start>
+    <ref name="element-patch"/>
+  </start>
+  <define name="element-patch">
+    <element name="patch">
+      <ref name="patch"/>
+    </element>
+  </define>
+  <define name="element-message">
+    <element name="message">
+      <ref name="message"/>
+    </element>
+  </define>
+  <define name="message">
+    <ref name="resolvable-data"/>
+    <element name="text">
+      <text/>
+    </element>
+  </define>
+  <define name="element-script">
+    <element name="script">
+      <ref name="script"/>
+    </element>
+  </define>
+  <define name="script">
+    <ref name="resolvable-data"/>
+    <element name="do">
+      <text/>
+    </element>
+    <element name="undo">
+      <text/>
+    </element>
+  </define>
+  <define name="element-atom">
+    <element name="atom">
+      <ref name="atom"/>
+    </element>
+  </define>
+  <define name="atom">
+    <ref name="resolvable-data"/>
+  </define>
+  <define name="atoms">
+    <interleave>
+      <zeroOrMore>
+        <ref name="element-script"/>
+      </zeroOrMore>
+      <zeroOrMore>
+        <ref name="element-message"/>
+      </zeroOrMore>
+      <zeroOrMore>
+        <ref name="element-atom"/>
+      </zeroOrMore>
+    </interleave>
+  </define>
+  <define name="patch">
+    <ref name="resolvable-data"/>
+    <oneOrMore>
+      <ref name="element-summary"/>
+    </oneOrMore>
+    <oneOrMore>
+      <ref name="element-description"/>
+    </oneOrMore>
+    <element name="id">
+      <text/>
+    </element>
+    <element name="timestamp">
+      <text/>
+    </element>
+    <element name="category">
+      <text/>
+    </element>
+    <element name="affects-package-manager">
+      <ref name="boolean"/>
+    </element>
+    <element name="reboot-needed">
+      <ref name="boolean"/>
+    </element>
+    <element name="interactive">
+      <ref name="boolean"/>
+    </element>
+    <element name="atoms">
+      <ref name="atoms"/>
+    </element>
+  </define>
+</grammar>
index 494760c..264bdfb 100644 (file)
@@ -8,7 +8,7 @@ element-pattern =
   element pattern { pattern }
   
 pattern =
-   resolvable-data?,
+   resolvable-data,
    element-summary+,
    element-description+,
    element default { boolean }?,
index 0563781..8462bf1 100644 (file)
@@ -10,9 +10,7 @@
     </element>
   </define>
   <define name="pattern">
-    <optional>
-      <ref name="resolvable-data"/>
-    </optional>
+    <ref name="resolvable-data"/>
     <oneOrMore>
       <ref name="element-summary"/>
     </oneOrMore>
index 9f5e328..2fdcfd7 100644 (file)
@@ -25,7 +25,7 @@ namespace zypp {
     #define PATTERNSCHEMA (SCHEMABASE "pattern.rng")
     //#define FILELISTSCHEMA (SCHEMABASE "filelists.rng")
     //#define OTHERSCHEMA (SCHEMABASE "other.rng")
-    //#define PATCHSCHEMA (SCHEMABASE "patch.rng")
+    #define PATCHSCHEMA (SCHEMABASE "patch.rng")
     //#define PATCHESSCHEMA (SCHEMABASE "patches.rng")
     //#define PRODUCTSCHEMA (SCHEMABASE "product.rng")
     } // namespace xmlstore
index 28c1057..4e5afbc 100644 (file)
@@ -250,9 +250,6 @@ std::string toXML( const Atom::constPtr &obj )
   stringstream out;
   out << "<atom>" << std::endl;
   out << toXML(static_cast<Resolvable::constPtr>(obj)) << std::endl;
-
-  // access implementation
-  out << toXML(obj->deps()) << std::endl;
   out << "</atom>" << std::endl;
   return out.str();
 }
@@ -349,19 +346,28 @@ std::string toXML( const Patch::constPtr &obj )
 {
   stringstream out;
   out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl;
-  out << "<patch xmlns=\"http://www.novell.com/metadata/zypp/xml-store\"" << std::endl; 
-  out << "    patchid=\"" << xml_escape(obj->id()) << "\"" << std::endl;
-  out << "    timestamp=\"" << obj->timestamp().asSeconds() << "\"" << std::endl;
-  out << "    engine=\"1.0\">" << std::endl;
+  out << "<patch xmlns=\"http://www.novell.com/metadata/zypp/xml-store\">" << std::endl; 
+  
   // reuse Resolvable information serialize function
   out << toXML(static_cast<Resolvable::constPtr>(obj));
+  
+  // access implementation
+  detail::ResImplTraits<Patch::Impl>::constPtr pipp( detail::ImplConnect::resimpl( obj ) );
+  out << translatedTextToXML(pipp->summary(), "summary");
+  out << translatedTextToXML(pipp->description(), "description");
+  
+  out << "<id>" << xml_escape(obj->id()) << "</id>" << std::endl;
+  out << "<timestamp>" << obj->timestamp().asSeconds() << "</timestamp>" << std::endl;
+  
+  out << "<category>" << obj->category() << "</category>" << std::endl;
+  out << "<affects-package-manager>" << ( obj->affects_pkg_manager() ? "true" : "false" ) << "</affects-package-manager>" << std::endl;
+  out << "<reboot-needed>" << ( obj->reboot_needed() ? "true" : "false" ) << "</reboot-needed>" << std::endl;
+  out << "<interactive>" << ( obj->interactive() ? "true" : "false" ) << "</interactive>" << std::endl;
+  
   Patch::AtomList at = obj->atoms();
   out << "  <atoms>" << std::endl;
   for (Patch::AtomList::iterator it = at.begin(); it != at.end(); it++)
   {
-    // atoms tag here looks weird but lets follow YUM
-    
-    // I have a better idea to avoid the cast here (Michaels code in his tmp/)
     Resolvable::Ptr one_atom = *it;
     out << castedToXML(one_atom) << std::endl;
   }