1
|
|
|
# Copyright 2024, Red Hat, Inc. |
2
|
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later |
3
|
|
|
|
4
|
1 |
|
from ..data_structures import OVALItems |
5
|
1 |
|
from ..namespaces import NAMESPACES |
6
|
1 |
|
from .shared_static_methods_of_parser import SharedStaticMethodsOfParser |
7
|
|
|
|
8
|
1 |
|
PROCURED_ITEMS_LIMIT = 100 |
9
|
|
|
|
10
|
|
|
|
11
|
1 |
|
class OVALItemsParser: |
12
|
1 |
|
def __init__(self, collected_objects, system_data): |
13
|
1 |
|
self.collected_objects = collected_objects |
14
|
1 |
|
self.system_data = system_data |
15
|
|
|
|
16
|
1 |
|
def _get_item(self, item_ref): |
17
|
1 |
|
item_el = self.system_data.get(item_ref) |
18
|
1 |
|
item_data = {} |
19
|
1 |
|
for child_el in item_el: |
20
|
1 |
|
if child_el.text and child_el.text.strip(): |
21
|
1 |
|
key = SharedStaticMethodsOfParser.get_key_of_xml_element(child_el) |
22
|
1 |
|
item_data[key] = child_el.text |
23
|
1 |
|
return item_data |
24
|
|
|
|
25
|
1 |
|
def _get_items(self, references): |
26
|
1 |
|
items = [] |
27
|
1 |
|
for reference_el in references: |
28
|
1 |
|
item_ref = reference_el.get("item_ref") |
29
|
1 |
|
item = self._get_item(item_ref) |
30
|
1 |
|
items.append(item) |
31
|
1 |
|
return items |
32
|
|
|
|
33
|
1 |
|
@staticmethod |
34
|
1 |
|
def _get_header(items): |
35
|
1 |
|
header = [] |
36
|
1 |
|
for item in items: |
37
|
1 |
|
for key in item.keys(): |
38
|
1 |
|
if key not in header: |
39
|
1 |
|
header.append(key) |
40
|
1 |
|
return tuple(header) |
41
|
|
|
|
42
|
1 |
|
@staticmethod |
43
|
1 |
|
def _get_entries(header, items): |
44
|
1 |
|
entries = [] |
45
|
1 |
|
for item in items: |
46
|
1 |
|
entry = [] |
47
|
1 |
|
for key in header: |
48
|
1 |
|
entry.append(item.get(key, "")) |
49
|
1 |
|
entries.append(tuple(entry)) |
50
|
1 |
|
return entries |
51
|
|
|
|
52
|
1 |
|
def get_oval_items(self, object_id): |
53
|
1 |
|
collected_object_el = self.collected_objects.get(object_id) |
54
|
1 |
|
if collected_object_el is None: |
55
|
1 |
|
return None |
56
|
1 |
|
references = collected_object_el.findall( |
57
|
|
|
"oval-characteristics:reference", NAMESPACES |
58
|
|
|
) |
59
|
1 |
|
if len(references) == 0: |
60
|
1 |
|
return None |
61
|
1 |
|
items = self._get_items(references) |
62
|
1 |
|
header = self._get_header(items) |
63
|
1 |
|
entries = self._get_entries(header, items) |
64
|
1 |
|
message = None |
65
|
1 |
|
len_entries = len(entries) |
66
|
1 |
|
if len_entries > PROCURED_ITEMS_LIMIT: |
67
|
1 |
|
entries = entries[:PROCURED_ITEMS_LIMIT] |
68
|
1 |
|
message = ( |
69
|
|
|
f"Collected {len_entries} items, showing only first " |
70
|
|
|
f"{PROCURED_ITEMS_LIMIT} items") |
71
|
|
|
return OVALItems(header=header, entries=entries, message=message) |
72
|
|
|
|