From e1ee5a0ce30eb2d8e3622901f4a02617e04177e6 Mon Sep 17 00:00:00 2001 From: ThatSilentCoder <184309164+ThatSilentCoder@users.noreply.github.com> Date: Thu, 10 Apr 2025 17:56:35 -0400 Subject: [PATCH] v3_issue_811: Trying to implement search feature for validation summary report. Added a new service. Will start moving bulky functions in the controller to the summary service class. --- .../persist/service/CertificateService.java | 28 +- .../ValidationSummaryReportsService.java | 101 ++++ .../controllers/DevicePageController.java | 2 +- .../EndorsementCredentialPageController.java | 16 +- .../IDevIdCertificatePageController.java | 16 +- ...a => IssuedCertificatePageController.java} | 18 +- .../PlatformCredentialPageController.java | 17 +- .../TrustChainCertificatePageController.java | 18 +- .../ValidationReportsPageController.java | 65 ++- .../webapp/WEB-INF/jsp/validation-reports.jsp | 515 ++++++++++-------- 10 files changed, 493 insertions(+), 303 deletions(-) create mode 100644 HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/ValidationSummaryReportsService.java rename HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/{IssuedCertificateController.java => IssuedCertificatePageController.java} (94%) diff --git a/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/CertificateService.java b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/CertificateService.java index 6de71cde..f2897d30 100644 --- a/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/CertificateService.java +++ b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/CertificateService.java @@ -49,11 +49,11 @@ public class CertificateService { private final EntityManager entityManager; /** - * Con + * Constructor for the Certificate Service. * - * @param certificateRepository - * @param componentResultRepository - * @param entityManager + * @param certificateRepository certificateRepository + * @param componentResultRepository componentResultRepository + * @param entityManager entityManager */ @Autowired public CertificateService(final CertificateRepository certificateRepository, @@ -65,6 +65,9 @@ public class CertificateService { } /** + * Takes the provided column names, the search term that the user entered and attempts to find + * certificates whose field values matches the provided search term. + * * @param entityClass generic entity class * @param searchableColumns list of the searchable column name * @param searchText text that was input in the search textbox @@ -73,11 +76,12 @@ public class CertificateService { * @param generic entity class * @return page full of the generic certificates. */ - public Page findBySearchableColumnsAndArchiveFlag(Class entityClass, - List searchableColumns, - String searchText, - Boolean archiveFlag, - Pageable pageable) { + public Page findCertificatesBySearchableColumnsAndArchiveFlag( + Class entityClass, + final List searchableColumns, + final String searchText, + Boolean archiveFlag, + Pageable pageable) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(entityClass); Root certificate = query.from(entityClass); @@ -88,6 +92,12 @@ public class CertificateService { if (!StringUtils.isBlank(searchText)) { // Dynamically loop through columns and create LIKE conditions for each searchable column for (String columnName : searchableColumns) { + + // todo + if (columnName.contains(".")) { + + } + Predicate predicate = criteriaBuilder.like(criteriaBuilder.lower(certificate.get(columnName)), "%" + searchText.toLowerCase() + "%"); diff --git a/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/ValidationSummaryReportsService.java b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/ValidationSummaryReportsService.java new file mode 100644 index 00000000..29c2280a --- /dev/null +++ b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/service/ValidationSummaryReportsService.java @@ -0,0 +1,101 @@ +package hirs.attestationca.persist.service; + +import hirs.attestationca.persist.entity.userdefined.SupplyChainValidationSummary; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * Service layer class that handles the storage and retrieval of validation reports. + */ +@Service +@Log4j2 +public class ValidationSummaryReportsService { + + private final EntityManager entityManager; + + @Autowired + public ValidationSummaryReportsService(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public static Path getNestedPath(Root root, CriteriaBuilder cb, String... fieldNames) { + Path path = root; + for (String fieldName : fieldNames) { + path = path.get(fieldName); + } + return path; + } + + /** + * Takes the provided column names, the search term that the user entered and attempts to find + * validation summaries whose field values matches the provided search term. + * + * @param searchableColumns list of the searchable column name + * @param searchText text that was input in the search textbox + * @param archiveFlag archive flag + * @param pageable pageable + * @return page full of the validation summaries. + */ + public Page findValidationReportsBySearchableColumnsAndArchiveFlag( + final List searchableColumns, + final String searchText, + Boolean archiveFlag, + Pageable pageable) { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = + criteriaBuilder.createQuery(SupplyChainValidationSummary.class); + Root supplyChainValidationSummaryRoot = + query.from(SupplyChainValidationSummary.class); + + List predicates = new ArrayList<>(); + + // Dynamically add search conditions for each field that should be searchable + if (!StringUtils.isBlank(searchText)) { + // Dynamically loop through columns and create LIKE conditions for each searchable column + for (String columnName : searchableColumns) { + + // todo + if (columnName.contains(".")) { + + } + + Predicate predicate = + criteriaBuilder.like( + criteriaBuilder.lower(supplyChainValidationSummaryRoot.get(columnName)), + "%" + searchText.toLowerCase() + "%"); + predicates.add(predicate); + } + } + + Predicate likeConditions = criteriaBuilder.or(predicates.toArray(new Predicate[0])); + + // Add archiveFlag condition if specified + query.where(criteriaBuilder.and(likeConditions, + criteriaBuilder.equal(supplyChainValidationSummaryRoot.get("archiveFlag"), archiveFlag))); + + // Apply pagination + TypedQuery typedQuery = entityManager.createQuery(query); + int totalRows = typedQuery.getResultList().size(); // Get the total count for pagination + typedQuery.setFirstResult((int) pageable.getOffset()); + typedQuery.setMaxResults(pageable.getPageSize()); + + // Wrap the result in a Page object to return pagination info + List resultList = typedQuery.getResultList(); + return new PageImpl<>(resultList, pageable, totalRows); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java index 20ba2af3..be8635df 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java @@ -97,7 +97,7 @@ public class DevicePageController extends PageController { produces = MediaType.APPLICATION_JSON_VALUE) public DataTableResponse> getTableData( final DataTableInput input) { - log.debug("Receiving request to for device list"); + log.debug("Received request to for device list"); String orderColumnName = input.getOrderColumnName(); log.debug("Ordering on column: {}", orderColumnName); diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/EndorsementCredentialPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/EndorsementCredentialPageController.java index ae326083..ade27368 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/EndorsementCredentialPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/EndorsementCredentialPageController.java @@ -98,7 +98,7 @@ public class EndorsementCredentialPageController extends PageController getEndorsementCredentialsTableData( final DataTableInput input) { - log.info("Receiving request to display list of endorsement credentials"); + log.info("Received request to display list of endorsement credentials"); log.debug("Request received a datatable input object for the endorsement credentials page: {}", input); @@ -107,8 +107,8 @@ public class EndorsementCredentialPageController extends PageController searchableColumns = findSearchableColumnsNames(input.getColumns()); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); int currentPage = input.getStart() / input.getLength(); Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); @@ -121,7 +121,7 @@ public class EndorsementCredentialPageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); @@ -286,7 +286,7 @@ public class EndorsementCredentialPageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IDevIdCertificatePageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IDevIdCertificatePageController.java index 055f34dd..26a20a0b 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IDevIdCertificatePageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IDevIdCertificatePageController.java @@ -98,7 +98,7 @@ public class IDevIdCertificatePageController extends PageController getIDevIdCertificatesTableData( final DataTableInput input) { - log.info("Receiving request to display list of idevid certificates"); + log.info("Received request to display list of idevid certificates"); log.debug("Request received a datatable input object for the idevid certificates page: {}", input); // attempt to get the column property based on the order index. @@ -106,8 +106,8 @@ public class IDevIdCertificatePageController extends PageController searchableColumns = findSearchableColumnsNames(input.getColumns()); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); int currentPage = input.getStart() / input.getLength(); Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); @@ -120,7 +120,7 @@ public class IDevIdCertificatePageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); @@ -284,7 +284,7 @@ public class IDevIdCertificatePageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificateController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificatePageController.java similarity index 94% rename from HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificateController.java rename to HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificatePageController.java index 1a654459..1378df68 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificateController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/IssuedCertificatePageController.java @@ -48,7 +48,7 @@ import java.util.zip.ZipOutputStream; @Log4j2 @Controller @RequestMapping("/HIRS_AttestationCAPortal/portal/certificate-request/issued-certificates") -public class IssuedCertificateController extends PageController { +public class IssuedCertificatePageController extends PageController { private static final String ISSUED_CERTIFICATES = "issued-certificates"; @@ -62,7 +62,7 @@ public class IssuedCertificateController extends PageController { * @param certificateService certificateService */ @Autowired - public IssuedCertificateController( + public IssuedCertificatePageController( final IssuedCertificateRepository issuedCertificateRepository, final CertificateService certificateService) { super(Page.TRUST_CHAIN); @@ -96,7 +96,7 @@ public class IssuedCertificateController extends PageController { produces = MediaType.APPLICATION_JSON_VALUE) public DataTableResponse getIssuedCertificatesTableData( final DataTableInput input) { - log.info("Receiving request to display list of issued attestation certificates"); + log.info("Received request to display list of issued attestation certificates"); log.debug("Request received a datatable input object for the issued attestation certificate page: " + "{}", input); @@ -105,8 +105,8 @@ public class IssuedCertificateController extends PageController { log.debug("Ordering on column: {}", orderColumnName); - String searchText = input.getSearch().getValue(); - List searchableColumns = findSearchableColumnsNames(input.getColumns()); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); int currentPage = input.getStart() / input.getLength(); Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); @@ -119,7 +119,7 @@ public class IssuedCertificateController extends PageController { this.issuedCertificateRepository.findByArchiveFlag(false, pageable); } else { pagedResult = - this.certificateService.findBySearchableColumnsAndArchiveFlag( + this.certificateService.findCertificatesBySearchableColumnsAndArchiveFlag( IssuedAttestationCertificate.class, searchableColumns, searchText, @@ -153,7 +153,7 @@ public class IssuedCertificateController extends PageController { @RequestParam final String id, final HttpServletResponse response) throws IOException { - log.info("Receiving request to download issued certificate id {}", id); + log.info("Received request to download issued certificate id {}", id); try { UUID uuid = UUID.fromString(id); @@ -208,7 +208,7 @@ public class IssuedCertificateController extends PageController { @GetMapping("/bulk-download") public void bulkDownloadIssuedCertificates(final HttpServletResponse response) throws IOException { - log.info("Receiving request to download all issued certificates"); + log.info("Received request to download all issued certificates"); final String singleFileName = "Issued_Certificate"; final String fileName = "issued_certificates.zip"; @@ -243,7 +243,7 @@ public class IssuedCertificateController extends PageController { public RedirectView deleteIssuedCertificate( @RequestParam final String id, final RedirectAttributes attr) throws URISyntaxException { - log.info("Receiving request to delete issued attestation certificate id {}", id); + log.info("Received request to delete issued attestation certificate id {}", id); Map model = new HashMap<>(); PageMessages messages = new PageMessages(); diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/PlatformCredentialPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/PlatformCredentialPageController.java index 58e01a28..93d23d94 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/PlatformCredentialPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/PlatformCredentialPageController.java @@ -104,7 +104,7 @@ public class PlatformCredentialPageController extends PageController getPlatformCredentialsTableData( final DataTableInput input) { - log.info("Receiving request to display list of platform credentials"); + log.info("Received request to display list of platform credentials"); log.debug("Request received a datatable input object for the platform credentials page: {}", input); // attempt to get the column property based on the order index. @@ -112,8 +112,8 @@ public class PlatformCredentialPageController extends PageController searchableColumns = findSearchableColumnsNames(input.getColumns()); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); int currentPage = input.getStart() / input.getLength(); Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); @@ -127,7 +127,7 @@ public class PlatformCredentialPageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); @@ -310,7 +310,7 @@ public class PlatformCredentialPageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); @@ -350,6 +350,7 @@ public class PlatformCredentialPageController extends PageController getTrustChainCertificatesTableData( final DataTableInput input) { - log.info("Receiving request to display list of trust chain certificates"); + log.info("Received request to display list of trust chain certificates"); log.debug("Request received a datatable input object for the trust chain certificates page: {}", input); @@ -145,8 +145,8 @@ public class TrustChainCertificatePageController extends PageController searchableColumns = findSearchableColumnsNames(input.getColumns()); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); int currentPage = input.getStart() / input.getLength(); Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); @@ -160,7 +160,7 @@ public class TrustChainCertificatePageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); @@ -351,7 +351,7 @@ public class TrustChainCertificatePageController extends PageController model = new HashMap<>(); PageMessages messages = new PageMessages(); diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ValidationReportsPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ValidationReportsPageController.java index e9926aa3..238e213c 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ValidationReportsPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ValidationReportsPageController.java @@ -12,15 +12,17 @@ import hirs.attestationca.persist.entity.userdefined.SupplyChainValidationSummar import hirs.attestationca.persist.entity.userdefined.certificate.PlatformCredential; import hirs.attestationca.persist.entity.userdefined.certificate.attributes.ComponentIdentifier; import hirs.attestationca.persist.entity.userdefined.certificate.attributes.V2.ComponentIdentifierV2; +import hirs.attestationca.persist.service.ValidationSummaryReportsService; +import hirs.attestationca.portal.datatables.Column; import hirs.attestationca.portal.datatables.DataTableInput; import hirs.attestationca.portal.datatables.DataTableResponse; import hirs.attestationca.portal.page.Page; import hirs.attestationca.portal.page.PageController; import hirs.attestationca.portal.page.params.NoPageParams; -import jakarta.persistence.EntityManager; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -47,6 +49,7 @@ import java.util.Enumeration; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Controller for the Validation Reports page. @@ -63,12 +66,12 @@ public class ValidationReportsPageController extends PageController getTableData( + public DataTableResponse getValidationReportsTableData( final DataTableInput input) { - log.debug("Handling request for summary list: {}", input); + log.info("Received request to display list of validation reports"); + log.debug("Request received a datatable input object for the validation reports page: {}", input); + // attempt to get the column property based on the order index. String orderColumnName = input.getOrderColumnName(); log.debug("Ordering on column: {}", orderColumnName); + final String searchText = input.getSearch().getValue(); + final List searchableColumns = findSearchableColumnsNames(input.getColumns()); + FilteredRecordsList records = new FilteredRecordsList<>(); + int currentPage = input.getStart() / input.getLength(); - Pageable paging = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); - org.springframework.data.domain.Page pagedResult = - supplyChainValidatorSummaryRepository.findByArchiveFlagFalse(paging); + + Pageable pageable = PageRequest.of(currentPage, input.getLength(), Sort.by(orderColumnName)); + + org.springframework.data.domain.Page pagedResult; + + if (StringUtils.isBlank(searchText)) { + pagedResult = + this.supplyChainValidatorSummaryRepository.findByArchiveFlagFalse(pageable); + } else { + pagedResult = + this.validationSummaryReportsService.findValidationReportsBySearchableColumnsAndArchiveFlag( + searchableColumns, + searchText, + false, + pageable); + } if (pagedResult.hasContent()) { records.addAll(pagedResult.getContent()); @@ -135,6 +161,7 @@ public class ValidationReportsPageController extends PageController(records, input); } @@ -145,11 +172,11 @@ public class ValidationReportsPageController extends PageController findSearchableColumnsNames(final List columns) { + // Retrieve all searchable columns and collect their names into a list of strings. + return columns.stream().filter(Column::isSearchable).map(Column::getName) + .collect(Collectors.toList()); + } + /** * This method builds a JSON object from the system and component data in a * validation report. @@ -339,7 +378,7 @@ public class ValidationReportsPageController extends PageController + + + + Validation Reports - - - - Validation Reports + + + + + + + + + + - - - - - - - - - - - - - Download Validation Reports - - +
+ + + + -
- - - - - - - - - - - - - - -
ResultTimestampDeviceCredential Validations
EndorsementPlatformFirmware
-
- -
+ } else { + html += unknownStatus; + } -
\ No newline at end of file + return html; + }, + }, + { + // Note: DB column is create_time, while the + // JSON property / java property is createTime. Need to sort + // on the field createTime, but the column's + // date source is create_time. + name: "create_time", + data: "create_time", + name: "createTime", + searchable: false, + orderable: false, + render: function (data, type, full, meta) { + return formatCertificateDate(full.createTime); + }, + }, + { + // TODO render a link to a device details page, + // passing the device.id + name: "device.name", + data: "device.name", + searchable: true, + orderable: true + }, + { + data: "id", + searchable: false, + orderable: false, + render: function (data, type, full, meta) { + return getValidationDisplayHtml(full, "ENDORSEMENT_CREDENTIAL"); + }, + }, + { + data: "id", + searchable: false, + orderable: false, + render: function (data, type, full, meta) { + return getValidationDisplayHtml(full, "PLATFORM_CREDENTIAL"); + }, + }, + { + data: "id", + searchable: false, + orderable: false, + render: function (data, type, full, meta) { + return getValidationDisplayHtml(full, "FIRMWARE"); + }, + }, + ]; + + //Set data tables + let dataTable = setDataTables("#reportTable", url, columns); + dataTable.order([1, "desc"]).draw(); //order by createTime + }); + + $("#download").submit(function (e) { + let tableLength = $("#reportTable").rows; + let createTimes = ""; + let deviceNames = ""; + $("#reportTable tr") + .not("thead tr") + .each(function () { + createTimes += $(this).find("td").eq(1).html() + ","; + deviceNames += $(this).find("td").eq(2).html() + ","; + }); + createTimes = createTimes.substring(0, createTimes.length - 1); + deviceNames = deviceNames.substring(0, deviceNames.length - 1); + let params = [ + { + name: "createTimes", + value: createTimes, + }, + { + name: "deviceNames", + value: deviceNames, + }, + ]; + $(this).append( + $.map(params, function (param) { + return $("", { + type: "hidden", + name: param.name, + value: param.value, + }); + }) + ); + }); + + $(".btn-primary").click(function () { + $("#validationReportsDownload").modal("hide"); + }); + + /** + * Gets HTML to display (icon tag) for the specified validation type. + * If a validation for the requested type is not found, an empty + * string is returned (and no icon will be displayed). + */ + function getValidationDisplayHtml(full, validation_type) { + let html = ""; + // loop through all the validations, looking for the one matching + // the validation_type. + for (let i = 0; i < full.validations.length; i++) { + let curValidation = full.validations[i]; + let curResult = curValidation.validationResult; + let curMessage = curValidation.message; + + if (curValidation.validationType === validation_type) { + let unknownStatus = + ''; + + // display appropriate icon based on result + if (curResult) { + // if this validation is associated with a certificate, + // link to the details page + if (curValidation.certificatesUsed.length > 0) { + let certType = ""; + switch (validation_type) { + case "PLATFORM_CREDENTIAL": + case "PLATFORM_CREDENTIAL_ATTRIBUTES": + certType = "platform"; + break; + case "ENDORSEMENT_CREDENTIAL": + certType = "endorsement"; + break; + } + + switch (validation_type) { + case "PLATFORM_CREDENTIAL": + case "PLATFORM_CREDENTIAL_ATTRIBUTES": + case "ENDORSEMENT_CREDENTIAL": + html += + ''; + break; + } + } + + switch (validation_type) { + case "FIRMWARE": + html += + ''; + break; + } + + switch (curResult) { + case "PASS": + html += ''; + break; + case "FAIL": + html += ''; + break; + case "ERROR": + html += + ''; + break; + default: + html += unknownStatus; + break; + } + + // add closing tag for href tag if needed. + if ( + curValidation.certificatesUsed.length > 0 || + curValidation.rimId !== "" + ) { + html += ""; + } + } else { + html += unknownStatus; + } + } + } + return html; + } + + +