FOSSology  4.4.0
Open Source License Compliance by Open Source Software
DecisionImporterDataCreator.php
Go to the documentation of this file.
1 <?php
2 /*
3  Author: Gaurav Mishra <mishra.gaurav@siemens.com>
4  SPDX-FileCopyrightText: © 2022 Siemens AG
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
8 
14 namespace Fossology\DecisionImporter;
15 
23 use UnexpectedValueException;
24 
25 require_once "FoDecisionData.php";
26 
31 {
36  private $dbManager;
37 
42  private $agentDao;
43 
48  private $copyrightDao;
49 
54  private $licenseDao;
55 
60  private $uploadDao;
61 
66  private $clearingDao;
67 
72  private $userId;
73 
78  private $groupId;
79 
84  private $uploadId;
85 
96  {
97  $this->dbManager = $dbManager;
98  $this->agentDao = $agentDao;
99  $this->copyrightDao = $copyrightDao;
100  $this->licenseDao = $licenseDao;
101  $this->uploadDao = $uploadDao;
102  $this->clearingDao = $clearingDao;
103  }
104 
108  public function setUserId(int $userId): void
109  {
110  $this->userId = $userId;
111  }
112 
116  public function setGroupId(int $groupId): void
117  {
118  $this->groupId = $groupId;
119  }
120 
124  public function setUploadId(int $uploadId): void
125  {
126  $this->uploadId = $uploadId;
127  }
128 
135  public function createClearingDecisions(FoDecisionData &$reportData,
136  DecisionImporterAgent &$agentObj): void
137  {
138  $clearingDecisionList = $reportData->getClearingDecisionList();
139  $clearingEventList = $reportData->getClearingEventList();
140  $clearingDecisionEventList = $reportData->getClearingDecisionEventList();
141 
142  $i = 0;
143  foreach ($clearingDecisionList as $oldDecisionId => $decisionItem) {
144  if ($decisionItem["new_itemid"] !== null) {
145  $newCdId = $this->dbManager->insertTableRow("clearing_decision", [
146  "uploadtree_fk" => $decisionItem["new_itemid"],
147  "pfile_fk" => $decisionItem["new_pfile"],
148  "decision_type" => $decisionItem["decision_type"],
149  "group_fk" => $this->groupId,
150  "user_fk" => $this->userId,
151  "scope" => $decisionItem["scope"],
152  "date_added" => $decisionItem["date_added"]
153  ], __METHOD__ . ".insertCd", "clearing_decision_pk");
154  } else {
155  $newCdId = null;
156  }
157  $clearingDecisionList[$oldDecisionId]["new_decision"] = $newCdId;
158  $i++;
161  $i = 0;
162  }
163  }
164  if ($i != 0) {
165  $agentObj->heartbeat($i);
166  }
167 
168  $i = 0;
169  foreach ($clearingEventList as $oldEventId => $eventItem) {
170  if ($eventItem["new_itemid"] !== null) {
171  $newCeId = $this->dbManager->insertTableRow("clearing_event", [
172  "uploadtree_fk" => $eventItem["new_itemid"],
173  "rf_fk" => $eventItem["new_rfid"],
174  "removed" => $eventItem["removed"],
175  "user_fk" => $this->userId,
176  "group_fk" => $this->groupId,
177  "job_fk" => null,
178  "type_fk" => $eventItem["type_fk"],
179  "comment" => $eventItem["comment"],
180  "reportinfo" => $eventItem["reportinfo"],
181  "acknowledgement" => $eventItem["acknowledgement"],
182  "date_added" => $eventItem["date_added"]
183  ], __METHOD__ . ".insertCe", "clearing_event_pk");
184  } else {
185  $newCeId = null;
186  }
187  $clearingEventList[$oldEventId]["new_event"] = $newCeId;
188  $i++;
191  $i = 0;
192  }
193  }
194  if ($i != 0) {
195  $agentObj->heartbeat($i);
196  }
197 
198  foreach ($clearingDecisionEventList as $oldCdId => $ceList) {
199  $newCdId = $clearingDecisionList[$oldCdId]["new_decision"];
200  if ($newCdId === null) {
201  continue;
202  }
203  foreach ($ceList as $oldCeId) {
204  $newCeId = $clearingEventList[$oldCeId]["new_event"];
205  if ($newCeId === null) {
206  continue;
207  }
208  $this->dbManager->insertTableRow("clearing_decision_event", [
209  "clearing_decision_fk" => $newCdId,
210  "clearing_event_fk" => $newCeId
211  ], __METHOD__ . ".insertCdCe");
212  }
213  }
214  $agentObj->heartbeat(0);
215 
216  $reportData->setClearingDecisionList($clearingDecisionList)
217  ->setClearingEventList($clearingEventList);
218  }
219 
225  public function createReportData(FoDecisionData &$reportData): void
226  {
227  $reportInfo = $reportData->getReportInfo();
228  $assocParams = [
229  "upload_fk" => $this->uploadId,
230  "ri_ga_checkbox_selection" => $reportInfo["ri_ga_checkbox_selection"],
231  "ri_spdx_selection" => $reportInfo["ri_spdx_selection"],
232  "ri_excluded_obligations" => $reportInfo["ri_excluded_obligations"],
233  "ri_reviewed" => $reportInfo["ri_reviewed"],
234  "ri_footer" => $reportInfo["ri_footer"],
235  "ri_report_rel" => $reportInfo["ri_report_rel"],
236  "ri_community" => $reportInfo["ri_community"],
237  "ri_component" => $reportInfo["ri_component"],
238  "ri_version" => $reportInfo["ri_version"],
239  "ri_release_date" => $reportInfo["ri_release_date"],
240  "ri_sw360_link" => $reportInfo["ri_sw360_link"],
241  "ri_general_assesment" => $reportInfo["ri_general_assesment"],
242  "ri_ga_additional" => $reportInfo["ri_ga_additional"],
243  "ri_ga_risk" => $reportInfo["ri_ga_risk"],
244  "ri_department" => $reportInfo["ri_department"],
245  "ri_depnotes" => $reportInfo["ri_depnotes"],
246  "ri_exportnotes" => $reportInfo["ri_exportnotes"],
247  "ri_copyrightnotes" => $reportInfo["ri_copyrightnotes"],
248  "ri_unifiedcolumns" => $reportInfo["ri_unifiedcolumns"],
249  "ri_globaldecision" => $reportInfo["ri_globaldecision"],
250  "ri_component_id" => $reportInfo["ri_component_id"],
251  "ri_component_type" => $reportInfo["ri_component_type"]
252  ];
253  $existsSql = "SELECT ri_pk FROM report_info WHERE upload_fk = $1;";
254  $existsStatement = __METHOD__ . ".reportInfoExists";
255 
256  if ($this->dbManager->getSingleRow($existsSql, [$this->uploadId], $existsStatement)) {
257  $this->dbManager->updateTableRow("report_info", $assocParams, "upload_fk", $this->uploadId,
258  __METHOD__ . ".updateReportInfo");
259  } else {
260  $this->dbManager->insertTableRow("report_info", $assocParams, __METHOD__ . ".insertReportInfo");
261  }
262  }
263 
275  public function createCopyrightData(FoDecisionData &$reportData,
276  DecisionImporterAgent &$agentObj,
277  string $agentName, int $jobId): void
278  {
279  if (!$this->agentDao->arsTableExists($agentName)) {
280  throw new UnexpectedValueException("No agent '$agentName' exists on server.");
281  }
282  $latestAgentId = $this->agentDao->getCurrentAgentId($agentName);
283  $this->createCxJobs($agentName, $jobId, $latestAgentId);
284 
285  $type = $agentName;
286  if ($agentName == "copyright") {
287  $type = "statement";
288  }
289  $capitalizedAgentName = strtoupper(substr($agentName, 0, 1)) . substr($agentName, 1);
290  $cxListMethod = "get" . $capitalizedAgentName . "List";
291  $decisionListMethod = "get" . $capitalizedAgentName . "DecisionList";
292  $eventListMethod = "get" . $capitalizedAgentName . "EventList";
293  $cxList = $reportData->$cxListMethod();
294  $decisionList = $reportData->$decisionListMethod();
295  $eventList = $reportData->$eventListMethod();
296 
297  $cxExistSql = "SELECT " . $agentName . "_pk FROM $agentName WHERE pfile_fk = $1 AND agent_fk = $2 AND hash = $3;";
298  $cxExistStatement = __METHOD__ . ".$agentName" . "Exist";
299 
300  $ceExistSql = "SELECT " . $agentName . "_event_pk FROM " . $agentName .
301  "_event WHERE uploadtree_fk = $1 AND hash = $2 AND is_enabled = $3;";
302  $ceExistStatement = __METHOD__ . ".$agentName" . "EventExist";
303 
304  $i = 0;
305  foreach ($cxList as $oldId => $cItem) {
306  $newCp = $this->dbManager->getSingleRow($cxExistSql, [
307  $cItem["new_pfile"],
308  $latestAgentId,
309  $cItem["hash"]
310  ], $cxExistStatement);
311  if (empty($newCp)) {
312  $newCp = $this->dbManager->insertTableRow($agentName, [
313  "agent_fk" => $latestAgentId,
314  "pfile_fk" => $cItem["new_pfile"],
315  "content" => $cItem["content"],
316  "type" => $type,
317  "hash" => $cItem["hash"],
318  "copy_startbyte" => $cItem["copy_startbyte"],
319  "copy_endbyte" => $cItem["copy_endbyte"]
320  ], __METHOD__ . ".insertCp." . $agentName, $agentName . "_pk");
321  } else {
322  $newCp = $newCp[$agentName . "_pk"];
323  }
324  $cxList[$oldId]["new_id"] = $newCp;
325  $i++;
328  $i = 0;
329  }
330  }
331  if ($i != 0) {
332  $agentObj->heartbeat($i);
333  }
334 
335  $i = 0;
336  foreach ($decisionList as $oldId => $decisionItem) {
337  $newDecision = $this->copyrightDao->saveDecision($agentName . "_decision", $decisionItem['new_pfile'],
338  $this->userId, $decisionItem['clearing_decision_type_fk'], $decisionItem['description'],
339  $decisionItem['textfinding'], $decisionItem['comment']);
340  $decisionList[$oldId]["new_id"] = $newDecision;
341  $i++;
344  $i = 0;
345  }
346  }
347  if ($i != 0) {
348  $agentObj->heartbeat($i);
349  }
350 
351  $i = 0;
352  foreach ($eventList as $eventItem) {
353  if ($eventItem["new_itemid"] == null) {
354  echo "ItemId of event hash " . $eventItem["hash"] . " is NULL\n";
355  continue;
356  }
357  $ceId = $this->dbManager->getSingleRow($ceExistSql, [
358  $eventItem["new_itemid"],
359  $eventItem["hash"],
360  $eventItem["is_enabled"]
361  ], $ceExistStatement);
362  if (empty($ceId)) {
363  $this->dbManager->insertTableRow($agentName . "_event", [
364  "upload_fk" => $this->uploadId,
365  "uploadtree_fk" => $eventItem["new_itemid"],
366  $agentName . "_fk" => $cxList[$eventItem["old_cpid"]]["new_id"],
367  "content" => $eventItem["content"],
368  "hash" => $eventItem["hash"],
369  "is_enabled" => $eventItem["is_enabled"],
370  "scope" => $eventItem["scope"]
371  ], __METHOD__ . ".insertCe." . $agentName);
372  }
373  $i++;
376  $i = 0;
377  }
378  }
379  if ($i != 0) {
380  $agentObj->heartbeat($i);
381  }
382 
383  $cxListMethod = "set" . $capitalizedAgentName . "List";
384  $reportData->$cxListMethod($cxList);
385  }
386 
395  private function createCxJobs(string $agentName, int $currentJobId, int $agentId): void
396  {
397  $scanJobProxy = new ScanJobProxy($this->agentDao, $this->uploadId);
398  $scanJobProxy->createAgentStatus(array($agentName));
399  $selectedScanners = $scanJobProxy->getLatestSuccessfulAgentIds();
400  if (!empty($selectedScanners)) {
401  return;
402  }
403  $markJobCompletedSql = "UPDATE jobqueue SET jq_end_bits = 1, jq_endtext = 'Completed', jq_endtime = NOW(), " .
404  "jq_starttime = NOW() WHERE jq_pk = $1;";
405  $markJobCompletedStatement = __METHOD__ . ".markComplete";
406 
407  $jqId = JobQueueAdd($currentJobId, $agentName, $this->uploadId, "no", NULL);
408  $this->dbManager->getSingleRow($markJobCompletedSql, [$jqId], $markJobCompletedStatement);
409 
410  $arsId = $this->agentDao->writeArsRecord($agentName, $agentId, $this->uploadId);
411  $this->agentDao->writeArsRecord($agentName, $agentId, $this->uploadId, $arsId, true);
412  }
413 
424  public function createMonkBulkData(FoDecisionData &$reportData,
425  DecisionImporterAgent &$agentObj): void
426  {
427  $licenseRefBulkList = $reportData->getLicenseRefBulkList();
428  $licenseSetBulkList = $reportData->getLicenseSetBulkList();
429  $highlightBulkList = $reportData->getHighlightBulk();
430  $clearingEventList = $reportData->getClearingEventList();
431 
432  // NOTE: Always run monkbulk on entire upload even if it was set for a folder, as it is done in reuser with bulk.
433  // BulkReuser::rerunBulkAndDeciderOnUpload() ¯\_(ツ)_/¯
434  $parentItem = $this->uploadDao->getUploadParent($this->uploadId);
435 
436  $i = 0;
437  foreach ($licenseRefBulkList as $oldId => $licenseRefBulkItem) {
438  $oldEventId = $this->getClearingEventForLrb($clearingEventList, $oldId);
439  if (empty($oldEventId)) {
440  echo "No clearing event for old LRB: $oldId\n";
441  continue;
442  }
443  $licenseRemovals = [];
444  foreach ($licenseSetBulkList[$oldId] as $licenseSetItem) {
445  $licenseRemovals[$licenseSetItem["new_rfid"]] = [
446  $licenseSetItem["removing"],
447  $licenseSetItem["comment"],
448  $licenseSetItem["reportinfo"],
449  $licenseSetItem["acknowledgement"],
450  ];
451  }
452 
453  $newLrbId = $this->licenseDao->insertBulkLicense($this->userId, $this->groupId, $parentItem, $licenseRemovals,
454  $licenseRefBulkItem["rf_text"], $licenseRefBulkItem["ignore_irrelevant"],
455  $licenseRefBulkItem["bulk_delimiters"], $licenseRefBulkItem["scan_findings"]);
456  $licenseRefBulkList[$oldId]["new_lrbid"] = $newLrbId;
457  $jobId = $this->createMonkBulkJobs($newLrbId);
458  $clearingEventList[$oldEventId]["new_lrbid"] = $newLrbId;
459  $clearingEventList[$oldEventId]["job_fk"] = $jobId;
460  $i++;
463  $i = 0;
464  }
465  }
466  if ($i != 0) {
467  $agentObj->heartbeat($i);
468  }
469 
470  $i = 0;
471  foreach ($clearingEventList as $clearingEventItem) {
472  if (array_key_exists("job_fk", $clearingEventItem)) {
473  $assocParams = [
474  "job_fk" => $clearingEventItem["job_fk"]
475  ];
476  $this->dbManager->updateTableRow("clearing_event", $assocParams, "clearing_event_pk",
477  $clearingEventItem["new_event"], __METHOD__ . ".updateCeJob");
478  $i++;
481  $i = 0;
482  }
483  }
484  }
485  if ($i != 0) {
486  $agentObj->heartbeat($i);
487  }
488 
489  $i = 0;
490  foreach ($highlightBulkList as $highlightBulkItem) {
491  $assocParams = [
492  "clearing_event_fk" => $clearingEventList[$highlightBulkItem["old_ceid"]]["new_event"],
493  "lrb_fk" => $licenseRefBulkList[$highlightBulkItem["old_lrbid"]]["new_lrbid"],
494  "start" => $highlightBulkItem["start"],
495  "len" => $highlightBulkItem["len"]
496  ];
497  $this->dbManager->insertTableRow("highlight_bulk", $assocParams, __METHOD__ . ".insertHighlightBulk");
498  $i++;
500  $agentObj->heartbeat(0);
501  $i = 0;
502  }
503  }
504 
505  $reportData->setLicenseRefBulkList($licenseRefBulkList)
506  ->setClearingEventList($clearingEventList);
507  }
508 
515  private function getClearingEventForLrb(array $clearingEventList, int $oldLrbId)
516  {
517  foreach ($clearingEventList as $index => $clearingEventId) {
518  if ($clearingEventId["old_lrbid"] == $oldLrbId) {
519  return $index;
520  }
521  }
522  return null;
523  }
524 
531  private function createMonkBulkJobs(int $bulkId): int
532  {
533  $markJobCompletedSql = "UPDATE jobqueue SET jq_end_bits = 1, jq_endtext = 'Completed', jq_endtime = NOW(), " .
534  "jq_starttime = NOW() WHERE jq_pk = $1;";
535  $markJobCompletedStatement = __METHOD__ . ".markComplete";
536 
537  $upload = $this->uploadDao->getUpload($this->uploadId);
538  $uploadName = $upload->getFilename();
539  $latestDeciderAgentId = $this->agentDao->getCurrentAgentId("deciderjob");
540  $latestMonkBulkAgentId = $this->agentDao->getCurrentAgentId("monkbulk");
541  $jobId = JobAddJob($this->userId, $this->groupId, $uploadName, $this->uploadId);
542 
543  $monkbulkJobId = JobQueueAdd($jobId, "monkbulk", $bulkId, "no", null);
544  $deciderJobId = JobQueueAdd($jobId, "deciderjob", $this->uploadId, "no", [$monkbulkJobId]);
545 
546  $monkbulkArsId = $this->agentDao->writeArsRecord("monkbulk", $latestMonkBulkAgentId, $this->uploadId);
547  $this->agentDao->writeArsRecord("monkbulk", $latestDeciderAgentId, $this->uploadId, $monkbulkArsId, true);
548  $this->dbManager->getSingleRow($markJobCompletedSql, [$monkbulkJobId], $markJobCompletedStatement);
549 
550  $deciderArsId = $this->agentDao->writeArsRecord("deciderjob", $latestDeciderAgentId, $this->uploadId);
551  $this->agentDao->writeArsRecord("deciderjob", $latestDeciderAgentId, $this->uploadId, $deciderArsId, true);
552  $this->dbManager->getSingleRow($markJobCompletedSql, [$deciderJobId], $markJobCompletedStatement);
553 
554  return $jobId;
555  }
556 
563  public function createMainLicenses(FoDecisionData &$reportData, int $uploadId, int $groupId)
564  {
565  $mainLicenseList = $reportData->getMainLicenseList();
566  foreach ($mainLicenseList as $mainLicenseItem) {
567  $this->clearingDao->makeMainLicense($uploadId, $groupId, $mainLicenseItem["new_rfid"]);
568  }
569  }
570 }
Import decisions generated by Decision Exporter from JSON files.
createClearingDecisions(FoDecisionData &$reportData, DecisionImporterAgent &$agentObj)
createMainLicenses(FoDecisionData &$reportData, int $uploadId, int $groupId)
getClearingEventForLrb(array $clearingEventList, int $oldLrbId)
createCxJobs(string $agentName, int $currentJobId, int $agentId)
createCopyrightData(FoDecisionData &$reportData, DecisionImporterAgent &$agentObj, string $agentName, int $jobId)
Create copyright and sibling agent's related data in DB.
createMonkBulkData(FoDecisionData &$reportData, DecisionImporterAgent &$agentObj)
Create monkbulk findings from the report.
__construct(DbManager $dbManager, AgentDao $agentDao, CopyrightDao $copyrightDao, LicenseDao $licenseDao, UploadDao $uploadDao, ClearingDao $clearingDao)
setLicenseRefBulkList(array $license_ref_bulkList)
setClearingDecisionList(array $clearing_decisionList)
heartbeat($newProcessed)
Send hear beat to the scheduler.
Definition: Agent.php:203
JobQueueAdd($job_pk, $jq_type, $jq_args, $jq_runonpfile, $Depends, $host=NULL, $jq_cmd_args=NULL)
Insert a jobqueue + jobdepends records.
Definition: common-job.php:157
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16
FUNCTION char * strtoupper(char *s)
Helper function to upper case a string.
Definition: utils.c:39