Skip to content

Commit 2a9bee1

Browse files
committed
Fix: Modify the related issues based on the suggestions.
1 parent c2f7976 commit 2a9bee1

File tree

2 files changed

+56
-48
lines changed

2 files changed

+56
-48
lines changed

modules/ingestor/src/graph/sbom/common/license.rs

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ const NAMESPACE: Uuid = Uuid::from_bytes([
1111
0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x41, 0x18, 0xa1, 0x38, 0xb8, 0x9f, 0x19, 0x35, 0xe0, 0xa7,
1212
]);
1313

14+
/// SPDX license information extracted from an SPDX expression
15+
#[derive(Debug, Clone, PartialEq, Eq)]
16+
pub struct SPDXInfo {
17+
pub spdx_licenses: Vec<String>,
18+
pub spdx_license_exceptions: Vec<String>,
19+
pub custom_license_refs: Vec<String>,
20+
pub custom_document_license_refs: Vec<String>,
21+
}
22+
1423
#[derive(Default, Debug, Clone, PartialEq, Eq)]
1524
pub struct LicenseInfo {
1625
pub license: String,
@@ -22,7 +31,7 @@ impl LicenseInfo {
2231
Uuid::new_v5(&NAMESPACE, self.license.to_lowercase().as_bytes())
2332
}
2433

25-
pub fn spdx_info(&self) -> (Vec<String>, Vec<String>, Vec<String>, Vec<String>) {
34+
pub fn spdx_info(&self) -> SPDXInfo {
2635
SpdxExpression::parse(&self.license)
2736
.map(|parsed| {
2837
let spdx_licenses = parsed
@@ -62,14 +71,19 @@ impl LicenseInfo {
6271
})
6372
.collect::<Vec<_>>();
6473

65-
(
74+
SPDXInfo {
6675
spdx_licenses,
6776
spdx_license_exceptions,
6877
custom_license_refs,
6978
custom_document_license_refs,
70-
)
79+
}
80+
})
81+
.unwrap_or(SPDXInfo {
82+
spdx_licenses: vec![],
83+
spdx_license_exceptions: vec![],
84+
custom_license_refs: vec![],
85+
custom_document_license_refs: vec![],
7186
})
72-
.unwrap_or((vec![], vec![], vec![], vec![]))
7387
}
7488
}
7589

@@ -81,37 +95,41 @@ pub struct LicenseCreator {
8195
/// database.
8296
pub licenses: BTreeMap<Uuid, license::ActiveModel>,
8397

84-
pub custom_license_list: Vec<licensing_infos::ActiveModel>,
98+
/// Custom license lookup map: license_id -> name
99+
custom_license_map: std::collections::HashMap<String, String>,
85100
}
86101

87102
impl LicenseCreator {
88103
pub fn new() -> Self {
89104
Self {
90105
licenses: Default::default(),
91-
custom_license_list: vec![],
106+
custom_license_map: std::collections::HashMap::new(),
92107
}
93108
}
94109

95110
pub fn put_custom_license_list(
96111
&mut self,
97112
custom_license_list: Vec<licensing_infos::ActiveModel>,
98113
) {
99-
self.custom_license_list = custom_license_list;
114+
self.custom_license_map = custom_license_list
115+
.into_iter()
116+
.filter_map(|c| {
117+
if let (Set(license_id), Set(name)) = (&c.license_id, &c.name) {
118+
Some((license_id.clone(), name.clone()))
119+
} else {
120+
None
121+
}
122+
})
123+
.collect();
100124
}
101125

102126
pub fn add(&mut self, info: &LicenseInfo) {
103127
let uuid = info.uuid();
104128

105-
let (spdx_licenses, spdx_exceptions, custom_license_refs, custom_document_license_refs) =
106-
info.spdx_info();
107-
let missing_custom_refs: Vec<_> = custom_license_refs
129+
let spdx_info = info.spdx_info();
130+
let missing_custom_refs: Vec<_> = spdx_info.custom_license_refs
108131
.iter()
109-
.filter(|ref_id| {
110-
!self
111-
.custom_license_list
112-
.iter()
113-
.any(|c| c.license_id == Set((*ref_id).to_string()))
114-
})
132+
.filter(|ref_id| !self.custom_license_map.contains_key(*ref_id))
115133
.cloned()
116134
.collect();
117135
if !missing_custom_refs.is_empty() {
@@ -120,51 +138,42 @@ impl LicenseCreator {
120138
missing_custom_refs
121139
);
122140
}
123-
let custom_license_refs_value = if custom_license_refs.is_empty() {
141+
let custom_license_refs_value = if spdx_info.custom_license_refs.is_empty() {
124142
None
125143
} else {
126-
Some(self.construct_custom_license(custom_license_refs.clone()))
144+
Some(self.construct_custom_license(spdx_info.custom_license_refs.clone()))
127145
};
128146

129147
self.licenses.entry(uuid).or_insert(license::ActiveModel {
130148
id: Set(uuid),
131149
text: Set(info.license.clone()),
132-
spdx_licenses: if spdx_licenses.is_empty() {
150+
spdx_licenses: if spdx_info.spdx_licenses.is_empty() {
133151
Set(None)
134152
} else {
135-
Set(Some(spdx_licenses))
153+
Set(Some(spdx_info.spdx_licenses))
136154
},
137-
spdx_license_exceptions: if spdx_exceptions.is_empty() {
155+
spdx_license_exceptions: if spdx_info.spdx_license_exceptions.is_empty() {
138156
Set(None)
139157
} else {
140-
Set(Some(spdx_exceptions))
158+
Set(Some(spdx_info.spdx_license_exceptions))
141159
},
142160
custom_license_refs: Set(custom_license_refs_value),
143-
custom_document_license_refs: if custom_document_license_refs.is_empty() {
161+
custom_document_license_refs: if spdx_info.custom_document_license_refs.is_empty() {
144162
Set(None)
145163
} else {
146-
Set(Some(custom_document_license_refs))
164+
Set(Some(spdx_info.custom_document_license_refs))
147165
},
148166
});
149167
}
150168

151169
fn construct_custom_license(&self, custom_license_ids: Vec<String>) -> Vec<String> {
152-
use std::collections::HashMap;
153-
// Build a HashMap from license_id to name for fast lookup
154-
let license_map: HashMap<&String, &String> = self
155-
.custom_license_list
156-
.iter()
157-
.filter_map(|c| {
158-
if let (Set(license_id), Set(name)) = (&c.license_id, &c.name) {
159-
Some((license_id, name))
160-
} else {
161-
None
162-
}
163-
})
164-
.collect();
165170
custom_license_ids
166171
.into_iter()
167-
.filter_map(|id| license_map.get(&id).map(|name| format!("{}:{}", id, name)))
172+
.filter_map(|id| {
173+
self.custom_license_map
174+
.get(&id)
175+
.map(|name| format!("{}:{}", id, name))
176+
})
168177
.collect()
169178
}
170179

modules/ingestor/src/graph/sbom/mod.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,7 @@ impl SbomContext {
424424
license: license.to_string(),
425425
};
426426

427-
let (spdx_licenses, spdx_exceptions, custom_license_refs, custom_document_license_refs) =
428-
license_info.spdx_info();
427+
let spdx_info = license_info.spdx_info();
429428

430429
let license = license::Entity::find_by_id(license_info.uuid())
431430
.one(connection)
@@ -437,26 +436,26 @@ impl SbomContext {
437436
license::ActiveModel {
438437
id: Set(license_info.uuid()),
439438
text: Set(license_info.license.clone()),
440-
spdx_licenses: if spdx_licenses.is_empty() {
439+
spdx_licenses: if spdx_info.spdx_licenses.is_empty() {
441440
Set(None)
442441
} else {
443-
Set(Some(spdx_licenses))
442+
Set(Some(spdx_info.spdx_licenses))
444443
},
445-
spdx_license_exceptions: if spdx_exceptions.is_empty() {
444+
spdx_license_exceptions: if spdx_info.spdx_license_exceptions.is_empty() {
446445
Set(None)
447446
} else {
448-
Set(Some(spdx_exceptions))
447+
Set(Some(spdx_info.spdx_license_exceptions))
449448
},
450-
custom_license_refs: if custom_license_refs.is_empty() {
449+
custom_license_refs: if spdx_info.custom_license_refs.is_empty() {
451450
Set(None)
452451
} else {
453-
Set(Some(custom_license_refs))
452+
Set(Some(spdx_info.custom_license_refs))
454453
},
455454

456-
custom_document_license_refs: if custom_document_license_refs.is_empty() {
455+
custom_document_license_refs: if spdx_info.custom_document_license_refs.is_empty() {
457456
Set(None)
458457
} else {
459-
Set(Some(custom_document_license_refs))
458+
Set(Some(spdx_info.custom_document_license_refs))
460459
},
461460
}
462461
.insert(connection)

0 commit comments

Comments
 (0)