1
- from abc import abstractmethod
2
1
from xml .etree import ElementTree
3
2
4
3
from . import BaseOutput
4
+ from .schema import BaseSchemaVersion , SchemaVersion1Dot0 , SchemaVersion1Dot1 , SchemaVersion1Dot2 , SchemaVersion1Dot3
5
5
from ..model .cyclonedx import Component
6
6
7
7
8
- def _xml_pretty_print (elem : ElementTree .Element , level : int = 0 ) -> ElementTree .Element :
9
- """
10
- Helper method lifed from cyclonedx-python original project for formatting
11
- XML without using any XML-libraries.
12
-
13
- NOTE: This method is recursive.
14
-
15
- :param elem:
16
- :param level:
17
- :return:
18
- """
19
- i = "\n " + level * " "
20
- if len (elem ):
21
- if not elem .text or not elem .text .strip ():
22
- elem .text = i + " "
23
- if not elem .tail or not elem .tail .strip ():
24
- elem .tail = i
25
- for elem in elem :
26
- _xml_pretty_print (elem , level + 1 )
27
- if not elem .tail or not elem .tail .strip ():
28
- elem .tail = i
29
- else :
30
- if level and (not elem .tail or not elem .tail .strip ()):
31
- elem .tail = i
32
- return elem
33
-
34
-
35
- class Xml (BaseOutput ):
8
+ class Xml (BaseOutput , BaseSchemaVersion ):
36
9
XML_VERSION_DECLARATION : str = '<?xml version="1.0" encoding="UTF-8"?>'
37
10
38
11
def get_target_namespace (self ) -> str :
39
- return 'http://cyclonedx.org/schema/bom/{}' .format (self ._get_schema_version ())
12
+ return 'http://cyclonedx.org/schema/bom/{}' .format (self .get_schema_version ())
40
13
41
14
def output_as_string (self ) -> str :
42
15
bom = self ._get_bom_root_element ()
43
16
44
- if self ._bom_supports_metadata ():
17
+ if self .bom_supports_metadata ():
45
18
bom = self ._add_metadata (bom = bom )
46
19
47
20
components = ElementTree .SubElement (bom , 'components' )
@@ -53,18 +26,21 @@ def output_as_string(self) -> str:
53
26
def output_to_file (self , filename : str ):
54
27
pass
55
28
29
+ def _component_supports_bom_ref_attribute (self ) -> bool :
30
+ return True
31
+
56
32
def _get_bom_root_element (self ) -> ElementTree .Element :
57
33
return ElementTree .Element ('bom' , {'xmlns' : self .get_target_namespace (), 'version' : '1' ,
58
34
'serialNumber' : self .get_bom ().get_urn_uuid ()})
59
35
60
36
def _get_component_as_xml_element (self , component : Component ) -> ElementTree .Element :
61
37
element_attributes = {'type' : component .get_type ().value }
62
- if self ._component_supports_bom_ref_attribute ():
38
+ if self .component_supports_bom_ref ():
63
39
element_attributes ['bom-ref' ] = component .get_purl ()
64
40
65
41
component_element = ElementTree .Element ('component' , element_attributes )
66
42
67
- if self ._component_supports_author () and component .get_author () is not None :
43
+ if self .component_supports_author () and component .get_author () is not None :
68
44
ElementTree .SubElement (component_element , 'author' ).text = component .get_author ()
69
45
70
46
# if publisher and publisher != "UNKNOWN":
@@ -104,57 +80,20 @@ def _add_metadata(self, bom: ElementTree.Element) -> ElementTree.Element:
104
80
ElementTree .SubElement (metadata_e , 'timestamp' ).text = self .get_bom ().get_metadata ().get_timestamp ().isoformat ()
105
81
return bom
106
82
107
- def _bom_supports_metadata (self ) -> bool :
108
- return True
109
-
110
- def _component_supports_author (self ) -> bool :
111
- return True
112
-
113
- def _component_supports_bom_ref_attribute (self ) -> bool :
114
- return True
115
-
116
- @abstractmethod
117
- def _get_schema_version (self ) -> str :
118
- pass
119
-
120
83
121
- class XmlV1Dot0 (Xml ):
84
+ class XmlV1Dot0 (Xml , SchemaVersion1Dot0 ):
122
85
123
86
def _get_bom_root_element (self ) -> ElementTree .Element :
124
87
return ElementTree .Element ('bom' , {'xmlns' : self .get_target_namespace (), 'version' : '1' })
125
88
126
- def _get_schema_version (self ) -> str :
127
- return '1.0'
128
-
129
- def _bom_supports_metadata (self ) -> bool :
130
- return False
131
-
132
- def _component_supports_bom_ref_attribute (self ) -> bool :
133
- return False
134
-
135
- def _component_supports_author (self ) -> bool :
136
- return False
137
-
138
-
139
- class XmlV1Dot1 (Xml ):
140
-
141
- def _get_schema_version (self ) -> str :
142
- return '1.1'
143
-
144
- def _bom_supports_metadata (self ) -> bool :
145
- return False
146
-
147
- def _component_supports_author (self ) -> bool :
148
- return False
149
-
150
89
151
- class XmlV1Dot2 (Xml ):
90
+ class XmlV1Dot1 (Xml , SchemaVersion1Dot1 ):
91
+ pass
152
92
153
- def _get_schema_version (self ) -> str :
154
- return '1.2'
155
93
94
+ class XmlV1Dot2 (Xml , SchemaVersion1Dot2 ):
95
+ pass
156
96
157
- class XmlV1Dot3 (Xml ):
158
97
159
- def _get_schema_version ( self ) -> str :
160
- return '1.3'
98
+ class XmlV1Dot3 ( Xml , SchemaVersion1Dot3 ) :
99
+ pass
0 commit comments