FOSSology  4.4.0
Open Source License Compliance by Open Source Software
XmlImportSource.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2017 Siemens AG
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
8 namespace Fossology\ReportImport;
9 
10 
11 use Symfony\Component\DependencyInjection\SimpleXMLElement;
12 require_once 'ImportSource.php';
13 
14 class XmlImportSource implements ImportSource
15 {
17  private $filename;
19  private $xml;
20 
22  private $datas = array();
23 
28  function __construct($filename)
29  {
30  $this->filename = $filename;
31  }
32 
36  public function parse()
37  {
38  $this->xml = simplexml_load_file($this->filename, null, LIBXML_NOCDATA);
39 
41  $licenses = $this->xml->xpath("License");
43  $copyrights = $this->xml->xpath("Copyright");
44 
45  $this->parseLicenseInformation($licenses);
46  $this->parseCopyrightInformation($copyrights);
47 
48  return true;
49  }
50 
55  private function splitFilesList($filesNode)
56  {
57  $files = array();
58 
59  $separator = "\r\n";
60  $line = strtok((string) $filesNode, $separator);
61 
62  while ($line !== false) {
63  if(! array_key_exists($line, $this->datas))
64  {
65  $this->datas[$line] = new ReportImportData();
66  }
67  $files[] = $line;
68  $line = strtok($separator);
69  }
70 
71  return $files;
72  }
73 
77  private function parseLicenseInformation($licenses)
78  {
79  foreach ($licenses as $licenseNode)
80  {
81  $attributes = $licenseNode->attributes();
82  $licenseName = (string) $attributes["name"];
83  $licenseId = $attributes["spdxidentifier"] !== NULL ? (string) $attributes["spdxidentifier"] : $licenseName;
84  $licenseText = (string) $licenseNode->xpath("Content")[0];
85  $item = new ReportImportDataItem($licenseId);
86  $item->setLicenseCandidate($licenseName, $licenseText, false);
87  $item->setCustomText((string) $licenseNode);
88 
89  foreach ($licenseNode->xpath("Files") as $filesNode)
90  {
91  $files = $this->splitFilesList($filesNode);
92  foreach ($files as $file)
93  {
94  $this->datas[$file]->addLicenseInfoInFile($item);
95  }
96  }
97  }
98  }
99 
103  private function parseCopyrightInformation($copyrights)
104  {
105  foreach ($copyrights as $copyrightNode)
106  {
107  foreach ($copyrightNode->xpath("Files") as $filesNode)
108  {
109  $files = $this->splitFilesList($filesNode);
110  foreach ($files as $file) {
111  foreach ($copyrightNode->xpath("Content") as $content) {
112  $this->datas[$file]->addCopyrightText((string)$content);
113  }
114  }
115  }
116  }
117  }
118 
122  public function getAllFiles()
123  {
124  $allFiles = array();
125  foreach ($this->datas as $fileName => $data)
126  {
127  $allFiles[$fileName] = $fileName;
128  }
129  return $allFiles;
130  }
131 
136  public function getHashesMap($fileid)
137  {
138  return array();
139  }
140 
145  public function getDataForFile($fileid)
146  {
147  return $this->datas[$fileid];
148  }
149 }