26 use Symfony\Component\HttpFoundation\JsonResponse;
27 use Symfony\Component\HttpFoundation\Request;
28 use Symfony\Component\HttpFoundation\Response;
38 const NAME =
"ajax_explorer";
40 private $uploadtree_tablename =
"";
50 private $clearingFilter;
52 private $licenseProjector;
54 private $filesThatShouldStillBeCleared;
56 private $filesToBeCleared;
64 protected $agentNames = AgentRef::AGENT_LIST;
69 public function __construct()
71 parent::__construct(self::NAME, array(
72 self::TITLE => _(
"Ajax: License Browser"),
73 self::DEPENDENCIES => array(
"license"),
75 self::REQUIRES_LOGIN =>
false
78 $this->uploadDao = $this->
getObject(
'dao.upload');
79 $this->licenseDao = $this->
getObject(
'dao.license');
80 $this->clearingDao = $this->
getObject(
'dao.clearing');
81 $this->agentDao = $this->
getObject(
'dao.agent');
82 $this->clearingFilter = $this->
getObject(
'businessrules.clearing_decision_filter');
83 $this->filesThatShouldStillBeCleared = [];
84 $this->filesToBeCleared = [];
85 $this->alreadyClearedUploadTreeView = NULL;
86 $this->noLicenseUploadTreeView = NULL;
87 $this->cacheClearedCounter = [];
90 public function __destruct()
93 if ($this->alreadyClearedUploadTreeView !== NULL) {
94 $this->alreadyClearedUploadTreeView->unmaterialize();
96 if ($this->noLicenseUploadTreeView !== NULL) {
97 $this->noLicenseUploadTreeView->unmaterialize();
107 $upload = intval($request->get(
"upload"));
109 if (!$this->uploadDao->isAccessible($upload, $groupId)) {
110 throw new \Exception(
"Permission Denied");
113 $item = intval($request->get(
"item"));
116 $left = $itemTreeBounds->getLeft();
118 throw new \Exception(
"Job unpack/adj2nest hasn't completed.");
121 $scannerAgents = array_keys($this->agentNames);
122 $scanJobProxy =
new ScanJobProxy($this->agentDao, $upload);
123 $scanJobProxy->createAgentStatus($scannerAgents);
124 $selectedAgentId = intval($request->get(
'agentId'));
125 $tag_pk = intval($request->get(
'tag'));
127 $UniqueTagArray = array();
128 $this->licenseProjector =
new LicenseMap($this->
getObject(
'db.manager'),$groupId,LicenseMap::CONCLUSION,
true);
129 $vars = $this->
createFileListing($tag_pk, $itemTreeBounds, $UniqueTagArray, $selectedAgentId, $groupId, $scanJobProxy, $request);
131 return new JsonResponse(array(
132 'sEcho' => intval($request->get(
'sEcho')),
133 'aaData' => $vars[
'fileData'],
134 'iTotalRecords' => intval($request->get(
'totalRecords')),
135 'iTotalDisplayRecords' => $vars[
'iTotalDisplayRecords']
152 if (!empty($selectedAgentId)) {
153 $agentName = $this->agentDao->getAgentName($selectedAgentId);
154 $selectedScanners = array($agentName=>$selectedAgentId);
156 $selectedScanners = $scanJobProxy->getLatestSuccessfulAgentIds();
161 $isFlat = $request->get(
'flatten') !==
null;
164 $options = array(UploadTreeProxy::OPT_RANGE => $itemTreeBounds);
166 $options = array(UploadTreeProxy::OPT_REALPARENT => $itemTreeBounds->
getItemId());
169 $searchMap = array();
170 foreach (explode(
' ',$request->get(
'sSearch')) as $pair) {
171 $a = explode(
':',$pair);
172 if (count($a) == 1) {
173 $searchMap[
'head'] = $pair;
175 $searchMap[$a[0]] = $a[1];
179 if (array_key_exists(
'ext', $searchMap) && strlen($searchMap[
'ext'])>=1) {
180 $options[UploadTreeProxy::OPT_EXT] = $searchMap[
'ext'];
182 if (array_key_exists(
'head', $searchMap) && strlen($searchMap[
'head'])>=1) {
183 $options[UploadTreeProxy::OPT_HEAD] = $searchMap[
'head'];
185 if (($rfId=$request->get(
'scanFilter'))>0) {
186 $options[UploadTreeProxy::OPT_AGENT_SET] = $selectedScanners;
187 $options[UploadTreeProxy::OPT_SCAN_REF] = $rfId;
189 if (($rfId=$request->get(
'conFilter'))>0) {
191 $options[UploadTreeProxy::OPT_CONCLUDE_REF] = $rfId;
193 $openFilter = $request->get(
'openCBoxFilter');
194 if ($openFilter==
'true' || $openFilter==
'checked') {
195 $options[UploadTreeProxy::OPT_AGENT_SET] = $selectedScanners;
197 $options[UploadTreeProxy::OPT_SKIP_ALREADY_CLEARED] =
true;
202 $vars[
'iTotalDisplayRecords'] = $descendantView->count();
204 $columnNamesInDatabase = array($isFlat?
'ufile_name':
'lft');
205 $defaultOrder = array(array(0,
"asc"));
207 $orderString = $this->
getObject(
'utils.data_tables_utility')->getSortingString($request->get(
'fromRest') ? $request->request->all(): $request->query->all(), $columnNamesInDatabase, $defaultOrder);
209 $offset = $request->get(
'iDisplayStart');
210 $limit = $request->get(
'iDisplayLength');
212 $orderString .=
" OFFSET $offset";
215 $orderString .=
" LIMIT $limit";
219 $sql = $descendantView->getDbViewQuery().
" $orderString";
220 $dbManager = $this->
getObject(
'db.manager');
222 $dbManager->prepare($stmt=__METHOD__.$orderString,$sql);
223 $res = $dbManager->execute($stmt,$descendantView->getParams());
224 $descendants = $dbManager->fetchAll($res);
225 $dbManager->freeResult($res);
228 if (!empty($tagId)) {
231 if (empty($descendants)) {
232 $vars[
'fileData'] = array();
237 $firstChild = reset($descendants);
238 $lastChild = end($descendants);
239 $nameRange = array($firstChild[
'ufile_name'],$lastChild[
'ufile_name']);
241 $nameRange = array();
244 $allDecisions = $this->clearingDao->getFileClearingsFolder($itemTreeBounds, $groupId, $isFlat);
245 $editedMappedLicenses = $this->clearingFilter->filterCurrentClearingDecisions($allDecisions);
248 $isFlat, $groupId, $editedMappedLicenses, $itemTreeBounds, $nameRange);
252 $tableData = array();
254 $ModLicView = &$Plugins[plugin_find_id(
"view-license")];
255 $latestSuccessfulAgentIds = $scanJobProxy->getLatestSuccessfulAgentIds();
256 foreach ($descendants as $child) {
260 $tableData[] = $this->createFileDataRow($child, $uploadId, $selectedAgentId, $pfileLicenses, $groupId, $editedMappedLicenses, $baseUri, $ModLicView, $UniqueTagArray, $isFlat, $latestSuccessfulAgentIds, $request);
263 $vars[
'fileData'] = $tableData;
283 private function createFileDataRow($child, $uploadId, $selectedAgentId, $pfileLicenses, $groupId, $editedMappedLicenses, $uri, $ModLicView, &$UniqueTagArray, $isFlat, $latestSuccessfulAgentIds, $request)
285 $fileDetails = array(
286 "fileName" =>
"",
"id" =>
"",
"uploadId" => $uploadId,
"agentId" =>
"",
"isContainer" =>
false,
289 $fileId = $child[
'pfile_fk'];
290 $childUploadTreeId = $child[
'uploadtree_pk'];
292 if (!empty($fileId) && !empty($ModLicView)) {
294 $linkUri .=
"?mod=view-license&upload=$uploadId&item=$childUploadTreeId";
295 $fileDetails[
"id"] = intval($childUploadTreeId);
296 $fileDetails[
"uploadId"] = $uploadId;
297 if ($selectedAgentId) {
298 $linkUri .=
"&agentId=$selectedAgentId";
299 $fileDetails[
"agentId"] = $selectedAgentId;
305 if ($isContainer && !$isFlat) {
306 $fatChild = $this->uploadDao->getFatItemArray($child[
'uploadtree_pk'], $uploadId, $this->
uploadtree_tablename);
307 $uploadtree_pk = $fatChild[
'item_id'];
308 $childUploadTreeId = $uploadtree_pk;
310 $fileId = $upload[
'pfile_fk'];
311 $parent = $upload[
'realparent'];
312 $parentItemTreeBound = $this->uploadDao->getItemTreeBounds($parent, $this->
uploadtree_tablename);
314 $pfileLicenses = array_replace($pfileLicenses,
316 $groupId, $editedMappedLicenses, $parentItemTreeBound));
318 $linkUri =
"$uri&item=" . $uploadtree_pk;
319 $fileDetails[
"id"] = intval($uploadtree_pk);
320 if ($selectedAgentId) {
321 $linkUri .=
"&agentId=$selectedAgentId";
322 $fileDetails[
"agentId"] = $selectedAgentId;
324 $child[
'ufile_name'] = $fatChild[
'ufile_name'];
326 $isContainer =
false;
328 }
else if ($isContainer) {
330 $linkUri =
"$uri&item=" . $uploadtree_pk;
331 $fileDetails[
"id"] = intval($uploadtree_pk);
332 $fileDetails[
"isContainer"] =
true;
333 if ($selectedAgentId) {
334 $linkUri .=
"&agentId=$selectedAgentId";
335 $fileDetails[
"agentId"] = $selectedAgentId;
341 $fileName = $child[
'ufile_name'];
343 $fileDetails[
"fileName"] = $fileName;
344 $fileName =
"<a href='$linkUri'><span style='color: darkblue'> <b>$fileName</b> </span></a>";
345 }
else if (!empty($linkUri)) {
346 $fileDetails[
"fileName"] = $fileName;
347 $fileName =
"<a href='$linkUri'>$fileName</a>";
350 $childItemTreeBounds =
351 new ItemTreeBounds($childUploadTreeId, $this->
uploadtree_tablename, $child[
'upload_fk'], $child[
'lft'], $child[
'rgt']);
352 $totalFilesCount = $this->uploadDao->countPlainFiles($childItemTreeBounds);
353 $licenseEntriesRest = array();
355 $fileDetails[
"isContainer"] =
true;
356 $agentFilter = $selectedAgentId ? array($selectedAgentId) : $latestSuccessfulAgentIds;
357 $licenseEntries = $this->licenseDao->getLicenseShortnamesContained($childItemTreeBounds, $agentFilter, array());
358 $editedLicenses = $this->clearingDao->getClearedLicenses($childItemTreeBounds, $groupId);
360 if ($request->get(
'fromRest')) {
361 foreach ($licenseEntries as $shortName) {
362 $licenseEntriesRest[] = array(
363 "id" => $this->licenseDao->getLicenseByShortName($shortName, $groupId)->getId(),
364 "name" => $shortName,
370 $licenseEntries = array();
371 if (array_key_exists($fileId, $pfileLicenses)) {
372 foreach ($pfileLicenses[$fileId] as $shortName => $rfInfo) {
373 $agentEntries = array();
374 $agentEntriesRest = array();
375 foreach ($rfInfo as $agent => $match) {
376 $agentName = $this->agentNames[$agent];
377 $agentEntry =
"<a href='?mod=view-license&upload=$child[upload_fk]&item=$childUploadTreeId&format=text&agentId=$match[agent_id]&licenseId=$match[license_id]#highlight'>" . $agentName .
"</a>";
379 if ($match[
'match_percentage'] > 0) {
380 $agentEntry .=
": $match[match_percentage]%";
382 $agentEntries[] = $agentEntry;
383 $agentEntriesRest[] = array(
384 "name" => $agentName,
385 "id" => intval($match[
'agent_id']),
386 "matchPercentage" => intval($match[
'match_percentage']),
389 $licenseEntriesRest[] = array(
390 "id" => $this->licenseDao->getLicenseByShortName($shortName, $groupId)->getId(),
391 "name" => $shortName,
392 "agents" => $agentEntriesRest,
394 $licenseEntries[] = $shortName .
" [" . implode(
"][", $agentEntries) .
"]";
399 if (
false !== ($decision = $this->clearingFilter->getDecisionOf($editedMappedLicenses,$childUploadTreeId, $fileId))) {
400 $editedLicenses = $decision->getPositiveLicenses();
402 $editedLicenses = array();
405 $concludedLicensesRest = array();
406 $concludedLicenses = array();
408 foreach ($editedLicenses as $licenseRef) {
409 $projectedId = $this->licenseProjector->getProjectedId($licenseRef->getId());
410 $projectedName = $this->licenseProjector->getProjectedShortname($licenseRef->getId(),$licenseRef->getShortName());
411 $concludedLicenses[$projectedId] = $projectedName;
412 $concludedLicensesRest[] = array(
'id' => $projectedId,
'name' => $projectedName);
415 $editedLicenseList = implode(
', ', $concludedLicenses);
416 $licenseList = implode(
', ', $licenseEntries);
420 $getTextEditUser = _(
"Edit");
421 $fileListLinks .=
"[<a href='#' onclick='openUserModal($childUploadTreeId)' >$getTextEditUser</a>]";
424 $getTextEditBulk = _(
"Bulk");
425 $fileListLinks .=
"[<a href='#' data-toggle='modal' data-target='#bulkModal' onclick='openBulkModal($childUploadTreeId)' >$getTextEditBulk</a>]";
427 $fileListLinks .=
"<input type='checkbox' class='selectedForIrrelevant' class='info-bullet view-license-rc-size' value='".$childUploadTreeId.
"'>";
428 $filesThatShouldStillBeCleared = array_key_exists($childItemTreeBounds->getItemId()
429 , $this->filesThatShouldStillBeCleared) ? $this->filesThatShouldStillBeCleared[$childItemTreeBounds->getItemId()] : 0;
431 $filesToBeCleared = array_key_exists($childItemTreeBounds->getItemId()
432 , $this->filesToBeCleared) ? $this->filesToBeCleared[$childItemTreeBounds->getItemId()] : 0;
434 $filesCleared = $filesToBeCleared - $filesThatShouldStillBeCleared;
436 $img = ($filesCleared == $filesToBeCleared) ?
'green' :
'red';
439 if (!empty($licenseList) && empty($editedLicenseList)) {
441 (strpos($licenseList, LicenseDao::NO_LICENSE_FOUND) !==
false)
443 (count(explode(
",", $licenseList)) == 1)
448 $isDecisionTBD = $this->clearingDao->isDecisionCheck($childUploadTreeId, $groupId, DecisionTypes::TO_BE_DISCUSSED);
449 $img = $isDecisionTBD ?
'yellow' : $img;
452 $isDecisionDNU = $this->clearingDao->isDecisionCheck($childUploadTreeId, $groupId, DecisionTypes::DO_NOT_USE);
453 $isDecisionNonFunctional = $this->clearingDao->isDecisionCheck($childUploadTreeId, $groupId, DecisionTypes::NON_FUNCTIONAL);
455 $img = ($isDecisionDNU || $isDecisionNonFunctional) ?
'redGreen' : $img;
457 return $request->get(
'fromRest') ? array(
458 "fileDetails" => $fileDetails,
459 "licenseList" => $licenseEntriesRest,
460 "editedLicenseList" => $concludedLicensesRest,
461 "clearingStatus" => $img,
462 "clearingProgress" => array(
463 "filesCleared" => intval($filesCleared),
464 "filesToBeCleared" => intval($filesToBeCleared),
465 "totalFilesCount" => intval($totalFilesCount)
467 ) : array($fileName, $licenseList, $editedLicenseList, $img,
"$filesCleared / $filesToBeCleared / $totalFilesCount", $fileListLinks);
483 &$editedMappedLicenses, $itemTreeBounds, $nameRange = array())
489 foreach ($agentIds as $agentName => $agentId) {
490 $licensePerPfile = $this->licenseDao->getLicenseIdPerPfileForAgentId(
491 $itemTreeBounds, $agentId, $isFlat, $nameRange);
492 foreach ($licensePerPfile as $pfile => $licenseRow) {
493 foreach ($licenseRow as $licId => $row) {
494 $lic = $this->licenseProjector->getProjectedShortname($licId);
495 $pfileLicenses[$pfile][$lic][$agentName] = $row;
500 if ($this->alreadyClearedUploadTreeView === NULL) {
503 $itemTreeBounds->getUploadId(),
505 UploadTreeProxy::OPT_SKIP_THESE => UploadTreeProxy::OPT_SKIP_ALREADY_CLEARED,
506 UploadTreeProxy::OPT_ITEM_FILTER =>
"AND (lft BETWEEN " .
507 $itemTreeBounds->getLeft() .
" AND " . $itemTreeBounds->getRight() .
")",
508 UploadTreeProxy::OPT_GROUP_ID => $groupId
509 ), $itemTreeBounds->getUploadTreeTableName(),
510 $viewName =
'already_cleared_uploadtree' . $itemTreeBounds->getUploadId());
512 $this->alreadyClearedUploadTreeView->materialize();
515 if ($this->noLicenseUploadTreeView === NULL) {
518 $itemTreeBounds->getUploadId(),
520 UploadTreeProxy::OPT_SKIP_THESE =>
"noLicense",
521 UploadTreeProxy::OPT_ITEM_FILTER =>
"AND (lft BETWEEN " .
522 $itemTreeBounds->getLeft() .
" AND " . $itemTreeBounds->getRight() .
")",
523 UploadTreeProxy::OPT_GROUP_ID => $groupId
524 ), $itemTreeBounds->getUploadTreeTableName(),
525 $viewName =
'no_license_uploadtree' . $itemTreeBounds->getUploadId());
526 $this->noLicenseUploadTreeView->materialize();
530 $allDecisions = $this->clearingDao->getFileClearingsFolder($itemTreeBounds,
532 $editedMappedLicenses = array_replace($editedMappedLicenses,
533 $this->clearingFilter->filterCurrentClearingDecisions($allDecisions));
534 return $pfileLicenses;
545 $itemId = $itemTreeBounds->getItemId();
546 if (in_array($itemId, $this->cacheClearedCounter)) {
550 $this->cacheClearedCounter[] = $itemId;
552 $this->filesThatShouldStillBeCleared = array_replace(
553 $this->filesThatShouldStillBeCleared,
554 $this->alreadyClearedUploadTreeView->countMaskedNonArtifactChildren(
556 $this->filesToBeCleared = array_replace($this->filesToBeCleared,
557 $this->noLicenseUploadTreeView->countMaskedNonArtifactChildren(
560 $this->filesThatShouldStillBeCleared = array_replace(
561 $this->filesThatShouldStillBeCleared,
562 $this->alreadyClearedUploadTreeView->getNonArtifactDescendants(
564 $this->filesToBeCleared = array_replace($this->filesToBeCleared,
565 $this->noLicenseUploadTreeView->getNonArtifactDescendants($itemTreeBounds));
570 register_plugin(
new AjaxExplorer());
char * uploadtree_tablename
upload.uploadtree_tablename
Contains the constants and helpers for authentication of user.
static getGroupId()
Get the current user's group id.
Various utility functions to filter ClearingDecision.
Wrapper class for license map.
updateTheFindingsAndDecisions($agentIds, $isFlat, $groupId, &$editedMappedLicenses, $itemTreeBounds, $nameRange=array())
Fetch the license findings and decisions.
updateFilesToBeCleared($isFlat, $itemTreeBounds)
$alreadyClearedUploadTreeView
createFileListing($tagId, ItemTreeBounds $itemTreeBounds, &$UniqueTagArray, $selectedAgentId, $groupId, $scanJobProxy, $request)
DirGetNonArtifact($UploadtreePk, $uploadtree_tablename='uploadtree')
Given an artifact directory (uploadtree_pk), return the first non-artifact directory (uploadtree_pk).
FileListLinks($upload_fk, $uploadtree_pk, $napk, $pfile_pk, $Recurse=True, &$UniqueTagArray=array(), $uploadtree_tablename="uploadtree", $wantTags=true)
Get list of links: [View][Info][Download]
Traceback_uri()
Get the URI without query to this location.
Traceback_parm_keep($List)
Create a new URI, keeping only these items.