CVRF: 处理 producttree
Signed-off-by: Jia Chao <jiac13@chinaunicom.cn>
This commit is contained in:
parent
b70a48ce3c
commit
973e22c89e
99
src/lib.rs
99
src/lib.rs
|
@ -162,6 +162,7 @@ impl CVRF {
|
||||||
"DocumentTracking" => self.documenttracking.load_from_xmlreader(xmlreader),
|
"DocumentTracking" => self.documenttracking.load_from_xmlreader(xmlreader),
|
||||||
"DocumentNotes" => self.handle_notes(xmlreader),
|
"DocumentNotes" => self.handle_notes(xmlreader),
|
||||||
"DocumentReferences" => self.handle_references(xmlreader),
|
"DocumentReferences" => self.handle_references(xmlreader),
|
||||||
|
"ProductTree" => self.producttree.load_from_xmlreader(xmlreader),
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -583,6 +584,77 @@ impl ProductTree {
|
||||||
packages: HashMap::new(),
|
packages: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(self, xmlreader))]
|
||||||
|
fn load_from_xmlreader(&mut self, xmlreader: &mut XmlReader) {
|
||||||
|
let mut _type = String::new();
|
||||||
|
let mut _name = String::new();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match xmlreader.next() {
|
||||||
|
Ok(XmlEvent::StartElement { attributes, .. }) => {
|
||||||
|
for attr in attributes {
|
||||||
|
match attr.name.local_name.as_str() {
|
||||||
|
"Type" => {
|
||||||
|
_type = attr.value.clone();
|
||||||
|
}
|
||||||
|
"Name" => {
|
||||||
|
_name = attr.value.clone();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(XmlEvent::EndElement { .. }) => {
|
||||||
|
if xmlreader.depth < 2 {
|
||||||
|
trace!("ProductTree read end.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("XmlReader Error: {e}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _type.as_str() == "Product Name" {
|
||||||
|
self._load_products_branch(xmlreader);
|
||||||
|
}
|
||||||
|
if _type.as_str() == "Package Arch" {
|
||||||
|
self.packages.insert(_name.clone(), vec![]);
|
||||||
|
self._load_packages_branch(&_name, xmlreader);
|
||||||
|
}
|
||||||
|
_type.clear();
|
||||||
|
_name.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(self, xmlreader))]
|
||||||
|
fn _load_products_branch(&mut self, xmlreader: &mut XmlReader) {
|
||||||
|
loop {
|
||||||
|
let mut product = Product::new();
|
||||||
|
product.load_from_xmlreader(xmlreader);
|
||||||
|
if xmlreader.depth < 3 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
self.products.push(product);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(self, key, xmlreader))]
|
||||||
|
fn _load_packages_branch(&mut self, key: &str, xmlreader: &mut XmlReader) {
|
||||||
|
let packages = self.packages.get_mut(key).unwrap();
|
||||||
|
loop {
|
||||||
|
let mut package = Product::new();
|
||||||
|
package.load_from_xmlreader(xmlreader);
|
||||||
|
if xmlreader.depth < 3 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
packages.push(package);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// depth = 4
|
// depth = 4
|
||||||
|
@ -609,6 +681,33 @@ impl Product {
|
||||||
content: String::new(),
|
content: String::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(self, xmlreader))]
|
||||||
|
fn load_from_xmlreader(&mut self, xmlreader: &mut XmlReader) {
|
||||||
|
loop {
|
||||||
|
match xmlreader.next() {
|
||||||
|
Ok(XmlEvent::StartElement { attributes, .. }) => {
|
||||||
|
for attr in attributes {
|
||||||
|
match attr.name.local_name.as_str() {
|
||||||
|
"ProductID" => self.productid = attr.value.clone(),
|
||||||
|
"CPE" => self.cpe = attr.value.clone(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.content = xmlreader.next_characters();
|
||||||
|
}
|
||||||
|
Ok(XmlEvent::EndElement { .. }) => {
|
||||||
|
trace!("Product read end.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("XmlReader Error: {e}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// depth = 2
|
// depth = 2
|
||||||
|
|
29
src/test.rs
29
src/test.rs
|
@ -55,4 +55,33 @@ fn cvrf_works() {
|
||||||
assert_eq!(cvrf.documentreferences.len(), 3);
|
assert_eq!(cvrf.documentreferences.len(), 3);
|
||||||
assert_eq!(cvrf.documentreferences[1].r#type, reference_type);
|
assert_eq!(cvrf.documentreferences[1].r#type, reference_type);
|
||||||
assert_eq!(cvrf.documentreferences[1].r#url, reference_url);
|
assert_eq!(cvrf.documentreferences[1].r#url, reference_url);
|
||||||
|
|
||||||
|
// producttree
|
||||||
|
let producttree_productid = "openEuler-22.03-LTS";
|
||||||
|
let producttree_cep = "cpe:/a:openEuler:openEuler:22.03-LTS";
|
||||||
|
let producttree_content = "openEuler-22.03-LTS";
|
||||||
|
assert_eq!(cvrf.producttree.products.len(), 6);
|
||||||
|
assert_eq!(
|
||||||
|
cvrf.producttree.products[2].productid,
|
||||||
|
producttree_productid
|
||||||
|
);
|
||||||
|
assert_eq!(cvrf.producttree.products[2].cpe, producttree_cep);
|
||||||
|
assert_eq!(cvrf.producttree.products[2].content, producttree_content);
|
||||||
|
let producttree_src = "src";
|
||||||
|
let producttree_src_productid = "golang-1.17.3-32";
|
||||||
|
let producttree_src_cep = "cpe:/a:openEuler:openEuler:22.03-LTS";
|
||||||
|
let producttree_src_content = "golang-1.17.3-32.oe2203.src.rpm";
|
||||||
|
assert_eq!(cvrf.producttree.packages.len(), 4);
|
||||||
|
assert_eq!(
|
||||||
|
cvrf.producttree.packages.get(producttree_src).unwrap()[2].productid,
|
||||||
|
producttree_src_productid
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
cvrf.producttree.packages.get(producttree_src).unwrap()[2].cpe,
|
||||||
|
producttree_src_cep
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
cvrf.producttree.packages.get(producttree_src).unwrap()[2].content,
|
||||||
|
producttree_src_content
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user