FOSSology  4.5.1
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 
13 require_once 'ImportSource.php';
14 
15 class XmlImportSource implements ImportSource
16 {
18  private $filename;
20  private $xml;
21 
23  private $datas = array();
24 
29  function __construct($filename)
30  {
31  $this->filename = $filename;
32  }
33 
37  public function parse()
38  {
39  $this->xml = simplexml_load_file($this->filename, null, LIBXML_NOCDATA);
40 
42  $licenses = $this->xml->xpath("License");
44  $copyrights = $this->xml->xpath("Copyright");
45 
46  $this->parseLicenseInformation($licenses);
47  $this->parseCopyrightInformation($copyrights);
48 
49  return true;
50  }
51 
55  public function getVersion(){
56  return null;
57  }
58 
63  private function splitFilesList($filesNode)
64  {
65  $files = array();
66 
67  $separator = "\r\n";
68  $line = strtok((string) $filesNode, $separator);
69 
70  while ($line !== false) {
71  if(! array_key_exists($line, $this->datas))
72  {
73  $this->datas[$line] = new ReportImportData();
74  }
75  $files[] = $line;
76  $line = strtok($separator);
77  }
78 
79  return $files;
80  }
81 
85  private function parseLicenseInformation($licenses)
86  {
87  foreach ($licenses as $licenseNode)
88  {
89  $attributes = $licenseNode->attributes();
90  $licenseName = (string) $attributes["name"];
91  $licenseId = $attributes["spdxidentifier"] !== NULL ? (string) $attributes["spdxidentifier"] : $licenseName;
92  $licenseText = (string) $licenseNode->xpath("Content")[0];
93  $item = new ReportImportDataItem($licenseId);
94  $item->setLicenseCandidate($licenseName, $licenseText, false);
95  $item->setCustomText((string) $licenseNode);
96 
97  foreach ($licenseNode->xpath("Files") as $filesNode)
98  {
99  $files = $this->splitFilesList($filesNode);
100  foreach ($files as $file)
101  {
102  $this->datas[$file]->addLicenseInfoInFile($item);
103  }
104  }
105  }
106  }
107 
111  private function parseCopyrightInformation($copyrights)
112  {
113  foreach ($copyrights as $copyrightNode)
114  {
115  foreach ($copyrightNode->xpath("Files") as $filesNode)
116  {
117  $files = $this->splitFilesList($filesNode);
118  foreach ($files as $file) {
119  foreach ($copyrightNode->xpath("Content") as $content) {
120  $this->datas[$file]->addCopyrightText((string)$content);
121  }
122  }
123  }
124  }
125  }
126 
130  public function getAllFiles()
131  {
132  $allFiles = array();
133  foreach ($this->datas as $fileName => $data)
134  {
135  $allFiles[$fileName] = $fileName;
136  }
137  return $allFiles;
138  }
139 
144  public function getHashesMap($fileId)
145  {
146  return array();
147  }
148 
153  public function getDataForFile($fileid)
154  {
155  return $this->datas[$fileid];
156  }
157 }