Skip to content

Commit 2914d49

Browse files
committed
Add and use PerformantOvalDocument in the Oval parser to increase performance
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 44a8843 commit 2914d49

1 file changed

Lines changed: 40 additions & 2 deletions

File tree

vulnerabilities/scraper/oval_parser.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,58 @@
22
from typing import Dict
33
from typing import Tuple
44
from typing import Set
5+
from typing import Optional
56
import xml.etree.ElementTree as ET
67

78
from dephell_specifier import RangeSpecifier
89

910
from vulnerabilities.scraper.lib_oval import (
10-
OvalDefinition, OvalDocument, OvalTest, OvalObject, OvalState)
11+
OvalDefinition, OvalDocument, OvalTest, OvalObject, OvalState, OvalElement)
12+
13+
14+
class PerformantOvalDocument(OvalDocument):
15+
16+
def __init__(self, tree):
17+
super().__init__(tree)
18+
self.id_to_definition = {
19+
el.getId(): el for el in self.getDefinitions()}
20+
self.id_to_test = {el.getId(): el for el in self.getTests()}
21+
self.id_to_object = {el.getId(): el for el in self.getObjects()}
22+
self.id_to_state = {el.getId(): el for el in self.getStates()}
23+
self.id_to_variable = {el.getId(): el for el in self.getVariables()}
24+
25+
def getElementByID(self, oval_id: str) -> OvalElement:
26+
if not oval_id:
27+
return None
28+
29+
root = self.getDocumentRoot()
30+
if not root:
31+
return None
32+
try:
33+
oval_type = OvalElement.getElementTypeFromOvalID(oval_id)
34+
except Exception:
35+
return None
36+
37+
if oval_type == OvalDefinition.DEFINITION:
38+
return self.id_to_definition[oval_id]
39+
elif oval_type == OvalDefinition.TEST:
40+
return self.id_to_test[oval_id]
41+
elif oval_type == OvalDefinition.OBJECT:
42+
return self.id_to_object[oval_id]
43+
elif oval_type == OvalDefinition.STATE:
44+
return self.id_to_state[oval_id]
45+
elif oval_type == OvalDefinition.VARIABLE:
46+
return self.id_to_variable[oval_id]
47+
else:
48+
return None
1149

1250

1351
class OvalExtractor:
1452

1553
def __init__(self, translations: Dict, oval_document: ET.ElementTree):
1654

1755
self.translations = translations
18-
self.oval_document = OvalDocument(oval_document)
56+
self.oval_document = PerformantOvalDocument(oval_document)
1957
self.all_definitions = self.oval_document.getDefinitions()
2058
self.all_tests = self.oval_document.getTests()
2159

0 commit comments

Comments
 (0)