diff --git a/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java b/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java index 2d24d152f60710afab5d8ca2fbc71ede2623d9de..df6a45e45bd4b34b6432f29421f73e3bb453f0c2 100644 --- a/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java +++ b/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java @@ -32,6 +32,7 @@ import net.ihe.gazelle.contentanalyzer.business.McaApi; import net.ihe.gazelle.contentanalyzer.business.MessageContentAnalyzer; import net.ihe.gazelle.contentanalyzer.business.analyzers.MimeTypeDetector; import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzer; +import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzerFactory; import net.ihe.gazelle.contentanalyzer.business.exceptions.UnexpectedAnalysisException; import net.ihe.gazelle.contentanalyzer.business.model.*; import net.ihe.gazelle.contentanalyzer.business.model.config.McaConfigDAO; @@ -108,7 +109,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { private String displayedMessagePart; private Boolean indentMessageInGUI = Boolean.FALSE; private String messagePartLog; - private Map<String, String> namespaces = null ; + private Map<String, String> namespaces = null; private Boolean namespacesActuallyAdded = Boolean.FALSE; private String originalMessagePart; private boolean selectedMessagePartEdited; @@ -131,24 +132,24 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { //////////////////// Getter and setter ///////////////////////////////// /////////////////////////////////////////////////////////////////////////////// - public void setMcaConfigDao(McaConfigDAO mcaConfigDao){ + public void setMcaConfigDao(McaConfigDAO mcaConfigDao) { this.mcaConfigDao = mcaConfigDao; } - public McaConfigDAO getMcaConfigDao(){ + public McaConfigDAO getMcaConfigDao() { return this.mcaConfigDao; } - public void setOidGenerator(OIDGenerator oidGenerator){ - this.oidGenerator=oidGenerator; + public void setOidGenerator(OIDGenerator oidGenerator) { + this.oidGenerator = oidGenerator; } - public void setValidationCacheManager(ValidationCacheManager validationCacheManager){ + public void setValidationCacheManager(ValidationCacheManager validationCacheManager) { this.validationCacheManager = validationCacheManager; } public void setMcaApi(McaApi mcaApi) { - this.mcaApi=mcaApi; + this.mcaApi = mcaApi; } public void setXmlAnalyzer(XMLAnalyzer xmlAnalyzer) { @@ -173,11 +174,11 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return this.dataModel; } - public String getDisplayedMessagePart(){ + public String getDisplayedMessagePart() { return this.displayedMessagePart; } - public String getEditedMessagePart(){ + public String getEditedMessagePart() { return this.displayedMessagePart; } @@ -185,7 +186,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { setDisplayedMessagePart(computeNewDisplayedMessagePart()); } - public void setDisplayedMessagePart(String displayedMessagePart){ + public void setDisplayedMessagePart(String displayedMessagePart) { this.displayedMessagePart = displayedMessagePart; } @@ -278,7 +279,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { if (instance != null && instance.isLoggedIn()) { login = instance.getCredentials().getUsername(); institutionKeyword = instance.getInstitutionKeyword(); - if (instance.hasRole("monitor_role")|| instance.hasRole("admin_role")) { + if (instance.hasRole("monitor_role") || instance.hasRole("admin_role")) { monitor = true; } } @@ -307,11 +308,11 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { analyzerBeanBusiness.setAnalyzedObject(analyzedObject); } - public String getDescription(){ + public String getDescription() { return analyzerBeanBusiness.getDescription(); } - public void setDescription(String description){ + public void setDescription(String description) { analyzerBeanBusiness.setDescription(description); } @@ -319,7 +320,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return analyzerBeanBusiness.getFileContent(); } - public String getFilePath(){ + public String getFilePath() { return analyzerBeanBusiness.getFilePath(); } @@ -354,7 +355,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { public void init() { final Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); String privacyKey = null; - if(params.get("privacyKey")!= null){ + if (params.get("privacyKey") != null) { privacyKey = params.get("privacyKey"); } if (params.get("oid") != null) { @@ -362,8 +363,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { analyzerBeanBusiness.initWithOid(params.get("oid"), privacyKey, params.get(AnalyzerBean.TOOL_OID), params.get("externalId"), params.get("proxyType"), EVSClientResults.getXValResultOidFromUrl(params), analyzedObjectPartDAO); viewMessagePart(getAnalyzedObject().getFilePath(), getAnalyzedObject().getParentAnalyzedObjectPart().getChildList().get(0)); - } - catch(UnexpectedAnalysisException e) { + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); } } else if (params.get("id") != null) { @@ -379,8 +379,8 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { analyzerBeanBusiness.setToolOID(params.get(AnalyzerBean.TOOL_OID)); } // Get the tool externalId if exist (To send back the result) - if ( params.get("externalId") != null) { - analyzerBeanBusiness.setExternalId( params.get("externalId")); + if (params.get("externalId") != null) { + analyzerBeanBusiness.setExternalId(params.get("externalId")); } // Get the proxy type if exist and add it(To send back the result) if (params.get("proxyType") != null) { @@ -397,8 +397,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { final List tmpList = analyzedObjectPart.getChildList(); if (tmpList != null && !tmpList.isEmpty()) { tree.addChild(Integer.valueOf(index), this.processFileList(analyzedObjectPart)); - } - else { + } else { final GazelleTreeNodeImpl<AnalyzedObjectPart> node = new GazelleTreeNodeImpl<>(); node.setData(analyzedObjectPart); tree.addChild(Integer.valueOf(index), node); @@ -413,18 +412,18 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { String fileContent; - if(node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){ + if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) { FacesMessages.instance().add(Severity.INFO, "Cannot download folders"); return; - } else{ + } else { try { fileContent = getOriginalPartContent(objectPath, node); - } catch (UnexpectedAnalysisException e){ + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); return; } } - if ((node.getValidationType()!=null && node.getValidationType() == ValidationType.DICOM)) { + if ((node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM)) { try { // Test base 64 final boolean result = Base64Converter.base64Detection(fileContent); @@ -445,12 +444,13 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { } } else { Map<String, String> namespaces = node.getListOfNamespacesForAnalyzedObjectPart(); - if (namespaces != null && downloadAddedNamespaces){ + if (namespaces != null && downloadAddedNamespaces) { + XMLAnalyzer xmlAnalyzer = new XMLAnalyzerFactory().getXMLAnalyzer(); fileContent = xmlAnalyzer.addNamespacesToFileContent(fileContent, namespaces); FilesDownloader.downloadFile(fileContent, node, getAnalyzedObject(), FacesContext.getCurrentInstance()); } else if (analyzerBeanBusiness.isZipNode(node, mcaConfigDao) || - (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() && analyzerBeanBusiness.isZipNode(node.getChildList().get(0), mcaConfigDao))){ + (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() && analyzerBeanBusiness.isZipNode(node.getChildList().get(0), mcaConfigDao))) { FilesDownloader.downloadZipFile(objectPath, node, getAnalyzedObject(), FacesContext.getCurrentInstance()); } else { FilesDownloader.downloadFile(fileContent, node, getAnalyzedObject() @@ -461,34 +461,32 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { public void execute() { - if(analyzerBeanBusiness.getUploadedFileContent() != null){ - try{ + if (analyzerBeanBusiness.getUploadedFileContent() != null) { + try { analyzerBeanBusiness.execute(getUploadedFileContent(), oidGenerator, validationCacheManager, mcaApi); - } catch (UnexpectedAnalysisException e){ + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); } final ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); try { ec.redirect(getAnalyzedObject().permanentLink()); - } catch (IOException e){ + } catch (IOException e) { FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result"); } - } - else if (getAnalyzedObject() != null){ + } else if (getAnalyzedObject() != null) { analyzerBeanBusiness.setDescription(getAnalyzedObject().getDescription()); try { analyzerBeanBusiness.executeFromPath(getAnalyzedObject().getFilePath(), oidGenerator, validationCacheManager, mcaApi); - } catch (UnexpectedAnalysisException e){ + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); } try { redirectWithCallingToolsInfo(getAnalyzedObject().permanentLink()); - } catch (IOException e){ + } catch (IOException e) { FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result"); } - } - else{ + } else { FacesMessages.instance().add(Severity.ERROR, "Please select a file BEFORE requesting the analysis"); } } @@ -500,21 +498,21 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { public void executeWithString(final String fileContent) { setDescription(EXECUTE_FROM_STR_DESCRIPTION); - try{ + try { analyzerBeanBusiness.executeWithString(fileContent, oidGenerator, validationCacheManager, mcaApi); - } catch (UnexpectedAnalysisException e){ + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); return; } try { redirectWithCallingToolsInfo(getAnalyzedObject().permanentLink()); - } catch (IOException e){ + } catch (IOException e) { FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result"); } } - private void redirectWithCallingToolsInfo(String url) throws IOException{ - if (url != null && !url.isEmpty()){ + private void redirectWithCallingToolsInfo(String url) throws IOException { + if (url != null && !url.isEmpty()) { if (analyzerBeanBusiness.getToolOID() != null && !analyzerBeanBusiness.getToolOID().isEmpty()) { url += "&toolOid=" + analyzerBeanBusiness.getToolOID(); } @@ -559,17 +557,17 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return res; } - public String getValidationPermanentLinkFromDb(final String messageContentAnalyzerOid){ + public String getValidationPermanentLinkFromDb(final String messageContentAnalyzerOid) { return AnalyzerBeanBusiness.getValidationPermanentLinkFromDb(messageContentAnalyzerOid); } - public String getCrossValidationPermanentLink(String oid){ + public String getCrossValidationPermanentLink(String oid) { return EVSClientResults.getLastXValPermanentLinkWithExternalId(oid, ApplicationPreferenceManager.getStringValue("mca_tool_oid"), ApplicationPreferenceManager.getStringValue("application_url")); } - public String getIconForXNode(String oid){ - if (oid != null && !oid.isEmpty()){ + public String getIconForXNode(String oid) { + if (oid != null && !oid.isEmpty()) { String status = EVSClientResults.getLastXValStatusWithExternalId(oid, ApplicationPreferenceManager.getStringValue("mca_tool_oid"), ApplicationPreferenceManager.getStringValue("application_url")); if (status == null) { @@ -585,15 +583,15 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return null; } - public boolean crossValidatorAvailable(String xValidatorOid){ - if (xValidatorOid != null && !xValidatorOid.isEmpty()){ + public boolean crossValidatorAvailable(String xValidatorOid) { + if (xValidatorOid != null && !xValidatorOid.isEmpty()) { String validatorStatus = EVSClientResults.getXValidatorStatus(xValidatorOid, ApplicationPreferenceManager.getStringValue("application_url")); return validatorStatus != null && !validatorStatus.isEmpty() && validatorStatus.equals("Available"); } return false; } - public Boolean needsUpload(){ + public Boolean needsUpload() { return (getAnalyzedObject() == null && getUploadedFileContent() == null); } @@ -630,13 +628,13 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { public String validate(final String objectPath, final AnalyzedObjectPart node) { String evsClientUrl = ApplicationPreferenceManager.getStringValue("application_url"); try { - if ((node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() - && node.getChildList().get(0).getDocType().equals("ZIP"))) || - (mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() - && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null))){ + if (isNodeZip(node) || isMcaConfigZip(node)) { FacesMessages.instance().add(Severity.ERROR, "Cannot Validate a ZIP file"); - } else if (node.getDecodedPartFilePath() != null) { - if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node .getListOfNamespacesForAnalyzedObjectPart().isEmpty()){ + return "/messageContentAnalyzerDetailedResult.seam?oid=" + this.getAnalyzedObject().getOid(); + } + + if (node.getDecodedPartFilePath() != null) { + if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) { ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(node.getDecodedPart(), node.getValidationType(), node.getStartOffset(), node.getEndOffset(), node.getMessageContentAnalyzerOid()); return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl); @@ -653,7 +651,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { } String toDecodeStringContent = getOriginalPartContent(objectPath, parent); byte[] decodedPartBytesContent = Base64Converter.base64Decoding(toDecodeStringContent.getBytes(StandardCharsets.UTF_8)); - if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){ + if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) { createDecodedPart(decodedPartBytesContent, objectPath, node); ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedPartBytesContent, node.getValidationType(), node.getStartOffset(), node.getEndOffset(), node.getMessageContentAnalyzerOid()); @@ -661,14 +659,14 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { } else { String decodedStringContent = new String(decodedPartBytesContent, StandardCharsets.UTF_8); decodedStringContent = xmlAnalyzer.addNamespacesToFileContent(decodedStringContent - .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart()); + .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart()); String decodedPartPath = createAddedNamespacePart(decodedStringContent.getBytes(StandardCharsets.UTF_8), objectPath, node); ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedStringContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0, 0, node.getMessageContentAnalyzerOid()); return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl); } } else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)) { - if (node.getDocType().contains(MimeTypeDetector.FOLDER_PREFIX)) { + if (isNodeFolder(node)) { FacesMessages.instance().add(Severity.ERROR, "Cannot validate folders"); } else if (node.getDocType().contains(MimeTypeDetector.FILE_PREFIX)) { String decodedStringContent = getOriginalPartContent(objectPath, node); @@ -683,7 +681,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { } String decodedStringContent = getOriginalPartContent(objectPath, parent); - if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){ + if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) { String decodedPartPath = createDecodedPart(decodedStringContent.getBytes(StandardCharsets.UTF_8), objectPath, node); node.setDecodedPartFilePath(decodedPartPath); @@ -692,7 +690,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl); } else { decodedStringContent = xmlAnalyzer.addNamespacesToFileContent(decodedStringContent - .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart()); + .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart()); String decodedPartPath = createAddedNamespacePart(decodedStringContent.getBytes(StandardCharsets.UTF_8), objectPath, node); ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedStringContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0, @@ -702,21 +700,21 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { } } } else { - if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){ + if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) { ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(getFileContent().getBytes(StandardCharsets.UTF_8), node.getValidationType(), node.getStartOffset(), node.getEndOffset(), node.getMessageContentAnalyzerOid()); return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl); } else { String stringFileContent; - try{ + try { stringFileContent = new String(FileUtils.readFileToByteArray(new File(objectPath)), StandardCharsets.UTF_8); - }catch (IOException e){ - LOGGER.error("Unable to read file : ",e); - throw new UnexpectedAnalysisException("Unable to read File.",e); + } catch (IOException e) { + LOGGER.error("Unable to read file : ", e); + throw new UnexpectedAnalysisException("Unable to read File.", e); } stringFileContent = xmlAnalyzer.addNamespacesToFileContent(stringFileContent - .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart()); + .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart()); String addedNamespacesPartPath = createAddedNamespacePart(stringFileContent.getBytes(StandardCharsets.UTF_8), objectPath, node); ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(stringFileContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0, @@ -730,20 +728,20 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return "/messageContentAnalyzerDetailedResult.seam?oid=" + this.getAnalyzedObject().getOid(); } - public void viewMessagePart(final String objectPath,final AnalyzedObjectPart node) { + public void viewMessagePart(final String objectPath, final AnalyzedObjectPart node) { this.selectedMessagePartEdited = false; if (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() - && node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart() != null){ + && node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart() != null) { this.namespaces = node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart(); } else { this.namespaces = node.getListOfNamespacesForAnalyzedObjectPart(); } - if(this.namespaces == null){ + if (this.namespaces == null) { this.showAddedNamespacesInGUI = false; this.indentMessageInGUI = false; } - if(node.isXmlChild()){ + if (node.isXmlChild()) { this.isDisplayedPartXml = true; } else { this.isDisplayedPartXml = false; @@ -751,15 +749,12 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { setMessagePartLog(node.getPartLog()); - if ((node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() - && node.getChildList().get(0).getDocType().equals("ZIP"))) || - (mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() - && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null))){ + if (isNodeZip(node) || isMcaConfigZip(node)) { FacesMessages.instance().add(Severity.INFO, "Cannot show ZIP content"); setOriginalMessagePart(null); setDisplayedMessagePart(); return; - }else if (node.getDocType().endsWith("/")){ + } else if (isNodeFolder(node)) { FacesMessages.instance().add(Severity.INFO, "This is a directory, no content to show."); setOriginalMessagePart(null); setDisplayedMessagePart(); @@ -780,38 +775,135 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { setDisplayedMessagePart(); } + /** + * Check if it has a valid XValidationResultOid + * + * @param node + * @return a boolean according to the getxValidationResultOid() value + */ + public boolean hasValidationResultOid(final AnalyzedObjectPart node) { + return node != null && node.getxValidationResultOid() != null && !node.getxValidationResultOid().isEmpty(); + } + + + /** + * Check if it has a valid ValidationType + * + * @param node + * @return a boolean according to the getValidationType() value + */ + public boolean hasValidationType(final AnalyzedObjectPart node) { + return node != null && node.getValidationType() != null; + } + + + /** + * Check if it has a valid XValidatorOid + * + * @param node + * @return a boolean according to the getxValidatorOid() value + */ + public boolean hasXValidatorOid(final AnalyzedObjectPart node) { + return node != null && node.getxValidatorOid() != null; + } + + /** + * Check if the global node has a zip structure + * + * @param node + * @return a boolean according to the node's structure + */ + public boolean isMcaConfigZip(final AnalyzedObjectPart node) { + if (hasDoctype(node)) { + return mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() + && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null); + } + return false; + } + + /** + * Check if the node is a zip, or one of its child is a zip + * + * @param node + * @return a boolean according to the node's type + */ + public boolean isNodeZip(final AnalyzedObjectPart node) { + if (hasDoctype(node)) { + return node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() + && node.getChildList().get(0).getDocType().equals("ZIP")); + } + return false; + } + + /** + * Check if the node is a folder + * + * @param node + * @return a boolean according to the node's type + */ + public boolean isNodeFolder(AnalyzedObjectPart node) { + if (hasDoctype(node)) { + return node.getDocType().contains(MimeTypeDetector.FOLDER_PREFIX) || node.getDocType().endsWith("/"); + } + return false; + } + + /** + * Check if it has a valid DocType + * + * @param node + * @return a boolean according to the getValidationType() value + */ + public boolean hasDoctype(final AnalyzedObjectPart node) { + return node != null && node.getDocType() != null && !node.getDocType().isEmpty(); + } + + /** + * Business logic : Check if the node has a validationType, is not a zip nor a folder before rendering the icon + * + * @param node + * @return a boolean according to the business logic + */ + public boolean shouldRenderValidationIcon(final AnalyzedObjectPart node) { + if (hasValidationType(node)) { + return false; + } + return !isNodeFolder(node) && !isNodeZip(node) && !isMcaConfigZip(node); + } + + /////////////////////////////////////////////////////////////////////////////// //////////////////// Private Methods ///////////////////////////////// /////////////////////////////////////////////////////////////////////////////// private String computeNewDisplayedMessagePart() { - if (this.originalMessagePart == null){ + if (this.originalMessagePart == null) { return ""; } String fileContent = null; - if (this.showAddedNamespacesInGUI && namespaces != null){ - fileContent = xmlAnalyzer.addNamespacesToFileContent(this.originalMessagePart,namespaces); - if(fileContent.equals(this.originalMessagePart)){ + if (this.showAddedNamespacesInGUI && namespaces != null) { + fileContent = xmlAnalyzer.addNamespacesToFileContent(this.originalMessagePart, namespaces); + if (fileContent.equals(this.originalMessagePart)) { this.namespacesActuallyAdded = false; } else { this.namespacesActuallyAdded = true; } } - if (this.indentMessageInGUI){ - if (fileContent != null){ + if (this.indentMessageInGUI) { + if (fileContent != null) { return AnalyzerUtils.prettyFormat(fileContent); } return AnalyzerUtils.prettyFormat(this.originalMessagePart); } - if (fileContent != null){ + if (fileContent != null) { return fileContent; } return this.originalMessagePart; } - private String createDecodedPart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node){ + private String createDecodedPart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node) { String decodedPartPath = abpm.computeEditedPartPath(objectPath, node.getMessageContentAnalyzerOid(), getAnalyzedObject().getOid()); abpm.createFile(decodedPartBytesContent, decodedPartPath); @@ -820,7 +912,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return decodedPartPath; } - private String createAddedNamespacePart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node){ + private String createAddedNamespacePart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node) { String decodedPartPathWithAddedNamespaces = abpm.computeEditedPartPath(objectPath, node.getMessageContentAnalyzerOid(), getAnalyzedObject().getOid()); abpm.createFile(decodedPartBytesContent, decodedPartPathWithAddedNamespaces); @@ -829,7 +921,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return decodedPartPathWithAddedNamespaces; } - private String getOriginalPartContent(final String objectPath, final AnalyzedObjectPart node) throws UnexpectedAnalysisException{ + private String getOriginalPartContent(final String objectPath, final AnalyzedObjectPart node) throws UnexpectedAnalysisException { File file = new File(objectPath); @@ -838,31 +930,31 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { byte[] bytes = null; DicomToTxtTransformer dicomToTxtTransformer = new DicomToTxtTransformer(); - if (node.getDecodedPartFilePath() != null && (node.getListOfNamespacesForAnalyzedObjectPart()==null + if (node.getDecodedPartFilePath() != null && (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty())) { - try{ + try { return new String(FileUtils.readFileToByteArray(new File(node.getDecodedPartFilePath())), StandardCharsets.UTF_8); - }catch (IOException e){ - LOGGER.error("Unable to read file : ",e); - throw new UnexpectedAnalysisException("Unable to read File.",e); + } catch (IOException e) { + LOGGER.error("Unable to read file : ", e); + throw new UnexpectedAnalysisException("Unable to read File.", e); } } - if(node.getDocType().equals("DOCUMENT")){ - try{ - byte [] byteFileContent = FileUtils.readFileToByteArray(file); - if(!node.getChildList().isEmpty() - && node.getChildList().get(0).getDocType().equals(DICOM)){ + if (node.getDocType().equals("DOCUMENT")) { + try { + byte[] byteFileContent = FileUtils.readFileToByteArray(file); + if (!node.getChildList().isEmpty() + && node.getChildList().get(0).getDocType().equals(DICOM)) { byteFileContent = dicomToTxtTransformer.dicom2txt(byteFileContent); } return new String(byteFileContent, StandardCharsets.UTF_8); - }catch (IOException e){ - LOGGER.error("Unable to read file : ",e); - throw new UnexpectedAnalysisException("Unable to read File.",e); + } catch (IOException e) { + LOGGER.error("Unable to read file : ", e); + throw new UnexpectedAnalysisException("Unable to read File.", e); } } - if (!node.getEncodedType().equals(EncodedType.NOT_ENCODED)){ + if (!node.getEncodedType().equals(EncodedType.NOT_ENCODED)) { if (node.getEncodedType().equals(EncodedType.B64_ENCODED)) { while (!parent.getDocType().equals(MessageContentAnalyzer.BASE64)) { parent = parent.getParent(); @@ -880,19 +972,19 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { fileContent = new String(decodedByteContent, StandardCharsets.UTF_8).substring(node.getStartOffset(), node.getEndOffset()); return fileContent; } - }else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)){ - if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) || node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){ + } else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)) { + if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) || node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) { ZipInputStream zipIn = null; String expectedEntryName = ""; String entryName; - if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)){ + if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)) { expectedEntryName = node.getDocType().replace(MimeTypeDetector.FILE_PREFIX, ""); - } else if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){ + } else if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) { expectedEntryName = node.getDocType().replace(MimeTypeDetector.FOLDER_PREFIX, ""); } - try{ + try { zipIn = new ZipInputStream(new ByteArrayInputStream(FileUtils.readFileToByteArray(file))); ZipEntry entry = zipIn.getNextEntry(); entryName = entry.getName(); @@ -906,57 +998,57 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { byte[] zipFileContent = mimeTypeDetector.extractFile(zipIn); if (!node.getChildList().isEmpty() && node.getChildList().get(0).getValidationType() != null && - node.getChildList().get(0).getValidationType() == ValidationType.DICOM){ + node.getChildList().get(0).getValidationType() == ValidationType.DICOM) { zipFileContent = dicomToTxtTransformer.dicom2txt(zipFileContent); return new String(zipFileContent, StandardCharsets.UTF_8); } return new String(zipFileContent, StandardCharsets.UTF_8); - } catch (IOException e){ - LOGGER.error("Unable to read zip file : ",e); - throw new UnexpectedAnalysisException("Unable to read zip File.",e); + } catch (IOException e) { + LOGGER.error("Unable to read zip file : ", e); + throw new UnexpectedAnalysisException("Unable to read zip File.", e); } - }else{ + } else { while (!parent.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX) - && !parent.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) ) { + && !parent.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)) { parent = parent.getParent(); } fileContent = getOriginalPartContent(objectPath, parent); if (node.getValidationType() != null && - node.getValidationType() == ValidationType.DICOM){ + node.getValidationType() == ValidationType.DICOM) { return fileContent; } return fileContent.substring(node.getStartOffset(), node.getEndOffset()); } } - } else if (node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM){ + } else if (node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM) { try { bytes = FileUtils.readFileToByteArray(file); } catch (final IOException e) { AnalyzerBean.LOGGER.error(e.getMessage()); } - if(bytes != null) { + if (bytes != null) { bytes = dicomToTxtTransformer.dicom2txt(bytes); return new String(bytes, StandardCharsets.UTF_8); } - }else if(node.getDocType().equals(MimeTypeConfigEnum.ZIP.getDocType())){ + } else if (node.getDocType().equals(MimeTypeConfigEnum.ZIP.getDocType())) { try { byte[] byteContent = FileUtils.readFileToByteArray(file); fileContent = new String(byteContent, StandardCharsets.UTF_8); return fileContent; - }catch (IOException e){ - LOGGER.error("Unable to read file : ",e); - throw new UnexpectedAnalysisException("Unable to read File",e); + } catch (IOException e) { + LOGGER.error("Unable to read file : ", e); + throw new UnexpectedAnalysisException("Unable to read File", e); } } else { - try{ + try { fileContent = new String(FileUtils.readFileToByteArray(file), StandardCharsets.UTF_8); - } catch (IOException e){ - LOGGER.error("Unable to read file : ",e); - throw new UnexpectedAnalysisException("Unable to read File",e); + } catch (IOException e) { + LOGGER.error("Unable to read file : ", e); + throw new UnexpectedAnalysisException("Unable to read File", e); } fileContent = fileContent.substring(node.getStartOffset(), node.getEndOffset()); return fileContent; @@ -964,9 +1056,9 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return "Error retrieving string content"; } - private void logUnexpectedAnalysisException(UnexpectedAnalysisException e){ + private void logUnexpectedAnalysisException(UnexpectedAnalysisException e) { - FacesMessages.instance().add(Severity.ERROR, e.getMessage() + " Please contact an administrator."); + FacesMessages.instance().add(Severity.ERROR, e.getMessage() + "Please contact an administrator."); } private GazelleTreeNodeImpl<AnalyzedObjectPart> processFileList(final AnalyzedObjectPart file) { @@ -987,24 +1079,24 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> { return tree; } - public void sendToXValidation(final AnalyzedObjectPart p_o_analyzedObjectPart){ + public void sendToXValidation(final AnalyzedObjectPart p_o_analyzedObjectPart) { List<AnalyzedObjectPart> l_l_xValInputsList = p_o_analyzedObjectPart.getXValInputList(); List<EVSClientCrossValidatedObject> l_l_crossValidationInputList = new ArrayList<>(); - for (AnalyzedObjectPart l_o_input: l_l_xValInputsList){ + for (AnalyzedObjectPart l_o_input : l_l_xValInputsList) { try { l_l_crossValidationInputList.add(new CrossValidationInput(l_o_input.getxValInputType(), - getOriginalPartContent(this.getAnalyzedObject().getFilePath(), l_o_input).getBytes(StandardCharsets.UTF_8), + getOriginalPartContent(this.getAnalyzedObject().getFilePath(), l_o_input).getBytes(StandardCharsets.UTF_8), "xml")); - } catch (UnexpectedAnalysisException e){ + } catch (UnexpectedAnalysisException e) { logUnexpectedAnalysisException(e); } } - try{ + try { EVSClientServletConnector.sendToXValidation(l_l_crossValidationInputList, FacesContext.getCurrentInstance().getExternalContext(), ApplicationPreferenceManager.getStringValue("application_url"), ApplicationPreferenceManager.getStringValue("mca_tool_oid"), p_o_analyzedObjectPart.getxValidatorOid(), p_o_analyzedObjectPart.getMessageContentAnalyzerOid()); - } catch (IOException e){ + } catch (IOException e) { FacesMessages.instance().add(Severity.ERROR, "Cannot redirect to Cross Validation"); } } diff --git a/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java b/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java index d00820780a2672d59c1f9d61dd246b4bb1e68ca4..4a1a11842ca9736f3d0f5d77296aad556606f5a8 100644 --- a/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java +++ b/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java @@ -4,8 +4,11 @@ import net.ihe.gazelle.common.application.action.ApplicationPreferenceManager; import net.ihe.gazelle.contentanalyzer.app.AnalyzerBeanBusiness; import net.ihe.gazelle.contentanalyzer.app.McaPersistenceManager; import net.ihe.gazelle.contentanalyzer.business.McaApiImpl; +import net.ihe.gazelle.contentanalyzer.business.analyzers.MimeTypeDetector; import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzerFactory; import net.ihe.gazelle.contentanalyzer.business.model.AnalyzedObject; +import net.ihe.gazelle.contentanalyzer.business.model.AnalyzedObjectPart; +import net.ihe.gazelle.contentanalyzer.business.model.ValidationType; import net.ihe.gazelle.contentanalyzer.business.model.config.McaConfigDaoStub; import net.ihe.gazelle.evsclient.common.action.ValidationCacheManager; import net.ihe.gazelle.evsclient.common.model.OIDGenerator; @@ -30,16 +33,20 @@ import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.persistence.EntityManager; +import java.util.ArrayList; +import java.util.List; + import static org.junit.Assert.*; import static org.mockito.Matchers.any; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @RunWith(PowerMockRunner.class) -@PrepareForTest({ ApplicationPreferenceManager.class, OIDGenerator.class, EntityManager.class, SharedResult.class, +@PrepareForTest({ApplicationPreferenceManager.class, OIDGenerator.class, EntityManager.class, SharedResult.class, ValidationCacheManager.class, EntityManagerService.class, VersionProvider.class, ExternalContext.class, FacesContext.class, AnalyzerBeanBusiness.class}) -@PowerMockIgnore({ "org.xml.*", "org.w3c.*", "javax.xml.*" }) +@PowerMockIgnore({"org.xml.*", "org.w3c.*", "javax.xml.*"}) public class AnalyzerBeanTest { @Mock @@ -50,7 +57,7 @@ public class AnalyzerBeanTest { AnalyzerBean analyzerBean; @Before - public void setUp() throws Exception{ + public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -71,6 +78,31 @@ public class AnalyzerBeanTest { mockEntityManager(); } + private void setOriginalMessagePart() { + analyzerBean.setOriginalMessagePart("<s:Body xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n" + + " <wsnt:Subscribe xmlns:wsnt=\"http://docs.oasis-open.org/wsn/b-2\">\n" + + " <wsnt:ConsumerReference>\n" + + " <a:Address xmlns:a=\"http://www.w3.org/2005/08/addressing\">http://abc.com/1123</a:Address>\n" + + " </wsnt:ConsumerReference>\n" + + " <wsnt:Filter>\n" + + " <wsnt:TopicExpression Dialect=\"http://docs.oasis-open.org/wsn/t-1080 1/TopicExpression/Simple\">\n" + + " ihe:FullDocumentEntry\n" + + " </wsnt:TopicExpression>\n" + + " <rim:AdhocQuery xmlns:rim=\"urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0\" id=\"urn:uuid:aa2332d0-f8fe-11e0-be50-0800200c9a66\">\n" + + " <rim:Slot name=\"$XDSDocumentEntryPatientId\">\n" + + " <rim:ValueList>\n" + + " <rim:Value>'1234'</rim:Value>\n" + + " </rim:ValueList>\n" + + " </rim:Slot>\n" + + " </rim:AdhocQuery>\n" + + " </wsnt:Filter>\n" + + " <wsnt:InitialTerminationTime>2014-05-19T16:16:02.7686801+01:00</wsnt:InitialTerminationTime>\n" + + " </wsnt:Subscribe>\n" + + " </s:Body>"); + analyzerBean.setDisplayedMessagePart(); + analyzerBean.executeOnEditedPart(); + } + private void mockObjectSave() { PowerMockito.mockStatic(ApplicationPreferenceManager.class); PowerMockito.mockStatic(SharedResult.class); @@ -109,13 +141,13 @@ public class AnalyzerBeanTest { private void mockExternalContext() { PowerMockito.mockStatic(FacesContext.class); PowerMockito.mockStatic(ExternalContext.class); - FacesContext facesContext = PowerMockito.mock(FacesContext.class); + FacesContext facesContext = PowerMockito.mock(FacesContext.class); ExternalContext externalContext = PowerMockito.mock(ExternalContext.class); PowerMockito.when(FacesContext.getCurrentInstance()).thenReturn(facesContext); PowerMockito.when(facesContext.getExternalContext()).thenReturn(externalContext); } - private void mockEntityManager() throws Exception{ + private void mockEntityManager() throws Exception { EntityManager em = PowerMockito.mock(EntityManager.class); PowerMockito.mockStatic(EntityManagerService.class); PowerMockito.when(EntityManagerService.provideEntityManager()).thenReturn(em); @@ -148,6 +180,150 @@ public class AnalyzerBeanTest { }); } + @Test + public void testFolderWithoutDocType() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType(null); + assertFalse(analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testWithFolderPrefix() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType(MimeTypeDetector.FOLDER_PREFIX); + assert (analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testFolderWithSlashEnding() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("/"); + assert (analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testFolderWithoutFolderContent() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("notAFolder"); + assertFalse(analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testMCAZipWithoutDocType() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType(null); + assertFalse(analyzerBean.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testMCAZipWithZipContent() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("ZIP"); + AnalyzerBean analyzerBeanMock = spy(analyzerBean); + when(analyzerBeanMock.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart())).thenReturn(true); + assert (analyzerBeanMock.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testZipWithoutDocType() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType(null); + assertFalse(analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testNodeZipWithZipContent() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("ZIP"); + assert (analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testNodeZipWithoutZipContent() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("NotAZIP"); + assertFalse(analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testNodeZipWithChildZipContent() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setDocType("DOCUMENT"); + + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject childObject = analyzerBean.getAnalyzedObject(); + childObject.getParentAnalyzedObjectPart().setDocType("ZIP"); + List<AnalyzedObjectPart> childObjectParts = new ArrayList<>(); + childObjectParts.add(childObject.getParentAnalyzedObjectPart()); + + analyzedObject.getParentAnalyzedObjectPart().setChildList(childObjectParts); + assert (analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart())); + } + + + @Test + public void testNullObjectDocType() { + analyzerBean.reset(); + assertFalse(analyzerBean.hasDoctype(null)); + } + + @Test + public void testNullDocType() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.setParentAnalyzedObjectPart(null); + assertFalse(analyzerBean.hasDoctype(analyzedObject.getParentAnalyzedObjectPart())); + } + + + @Test + public void testHasDocType() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + assert (analyzerBean.hasDoctype(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testRenderValidationIconWithDoctype() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + analyzedObject.getParentAnalyzedObjectPart().setValidationType(ValidationType.ATNA); + assertFalse(analyzerBean.shouldRenderValidationIcon(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test + public void testRenderValidationIconWithoutDoctype() { + analyzerBean.reset(); + setOriginalMessagePart(); + AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); + assert(analyzerBean.shouldRenderValidationIcon(analyzedObject.getParentAnalyzedObjectPart())); + } + + @Test public void test_reset() { analyzerBean.reset(); @@ -159,30 +335,9 @@ public class AnalyzerBeanTest { } @Test - public void executeWithStringTest(){ - analyzerBean.setOriginalMessagePart("<s:Body xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n" + - " <wsnt:Subscribe xmlns:wsnt=\"http://docs.oasis-open.org/wsn/b-2\">\n" + - " <wsnt:ConsumerReference>\n" + - " <a:Address xmlns:a=\"http://www.w3.org/2005/08/addressing\">http://abc.com/1123</a:Address>\n" + - " </wsnt:ConsumerReference>\n" + - " <wsnt:Filter>\n" + - " <wsnt:TopicExpression Dialect=\"http://docs.oasis-open.org/wsn/t-1080 1/TopicExpression/Simple\">\n" + - " ihe:FullDocumentEntry\n" + - " </wsnt:TopicExpression>\n" + - " <rim:AdhocQuery xmlns:rim=\"urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0\" id=\"urn:uuid:aa2332d0-f8fe-11e0-be50-0800200c9a66\">\n" + - " <rim:Slot name=\"$XDSDocumentEntryPatientId\">\n" + - " <rim:ValueList>\n" + - " <rim:Value>'1234'</rim:Value>\n" + - " </rim:ValueList>\n" + - " </rim:Slot>\n" + - " </rim:AdhocQuery>\n" + - " </wsnt:Filter>\n" + - " <wsnt:InitialTerminationTime>2014-05-19T16:16:02.7686801+01:00</wsnt:InitialTerminationTime>\n" + - " </wsnt:Subscribe>\n" + - " </s:Body>"); - analyzerBean.setDisplayedMessagePart(); - analyzerBean.executeOnEditedPart(); - + public void executeWithStringTest() { + analyzerBean.reset(); + setOriginalMessagePart(); AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject(); assertEquals("XML", analyzedObject.getParentAnalyzedObjectPart().getChildList().get(0).getChildList().get(0).getDocType()); diff --git a/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml b/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml index 4273b399a11ac3cb0f6b1f633a6ea0a73484e713..b9cde3e2901cc52ab4bf49d490664213d86a1e79 100644 --- a/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml +++ b/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml @@ -48,7 +48,8 @@ <rich:treeNode expanded="#{true}"> <s:span title="#{messages['net.ihe.gazelle.mca.NoNamespaceIsDefinedForThisTagSoWeCouldntLinkItT']}" - rendered="#{node.data.noDefinedNamespace}" styleClass="gzl-icon-exclamation-triangle"/> + rendered="#{node.data.noDefinedNamespace}" + styleClass="gzl-icon-exclamation-triangle"/> <a4j:commandLink title="#{messages['net.ihe.gazelle.evs.ViewPart']}" @@ -63,15 +64,17 @@ value="#{analyzerBean.getValidationPermanentLinkFromDb(node.data.messageContentAnalyzerOid)}" target="_blank" rendered="#{analyzerBean.getValidationPermanentLinkFromDb(node.data.messageContentAnalyzerOid)!='not performed'}"> - <s:span title="#{messages['gazelle.evs.ClickToViewValidationOutcome']}" styleClass="#{analyzerBean.getIconForNode(node.data)}"/> + <s:span title="#{messages['gazelle.evs.ClickToViewValidationOutcome']}" + styleClass="#{analyzerBean.getIconForNode(node.data)}"/> </h:outputLink> <!--XVal result--> <h:outputLink value="#{analyzerBean.getCrossValidationPermanentLink(node.data.messageContentAnalyzerOid)}" target="_blank" - rendered="#{node.data.xValidationResultOid != null and not empty node.data.xValidationResultOid}"> - <s:span title="#{messages['net.ihe.gazelle.mca.ClickToViewCrossValidationOutcome']}" styleClass="#{analyzerBean.getIconForXNode(node.data.messageContentAnalyzerOid)}"/> + rendered="#{analyzerBean.hasValidationResultOid(node.data)}"> + <s:span title="#{messages['net.ihe.gazelle.mca.ClickToViewCrossValidationOutcome']}" + styleClass="#{analyzerBean.getIconForXNode(node.data.messageContentAnalyzerOid)}"/> </h:outputLink> @@ -79,35 +82,42 @@ action="#{analyzerBean.validate(analyzerBean.getFilePath(),node.data)}" target="_blank" execute="resultFormTokenId" - rendered="#{node.data.validationType!=null and not empty node.data.validationType}"> - <s:span title="#{messages['net.ihe.gazelle.xval.Validate']}" styleClass="gzl-icon-play"/> + rendered="#{analyzerBean.hasValidationType(node.data)}"> + <s:span title="#{messages['net.ihe.gazelle.xval.Validate']}" + styleClass="gzl-icon-play"/> </a4j:commandLink> <a4j:commandLink action="#{analyzerBean.validate(analyzerBean.getFilePath(),node.data)}" target="_blank" execute="resultFormTokenId" - rendered="#{empty node.data.validationType}"> + rendered="#{analyzerBean.shouldRenderValidationIcon(node.data)}"> <span class="gzl-icon-stack" title="#{messages['net.ihe.gazelle.xval.Validate']}"> <em class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/> <em class="gzl-icon-question-circle gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/> </span> + </a4j:commandLink> + <h:commandLink actionListener="#{analyzerBean.sendToXValidation(node.data)}" - rendered="#{node.data.xValidatorOid != null and not empty node.data.xValidatorOid and + rendered="#{analyzerBean.hasXValidatorOid(node.data) and analyzerBean.crossValidatorAvailable(node.data.xValidatorOid)}"> - <span class="gzl-icon-stack" title="#{messages['net.ihe.gazelle.mca.SendToCrossValidation']}"> + <span class="gzl-icon-stack" + title="#{messages['net.ihe.gazelle.mca.SendToCrossValidation']}"> <em class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/> <em class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/> </span> </h:commandLink> - <s:span styleClass="gzl-icon-stack" title="#{messages['net.ihe.gazelle.mca.CrossValidatorNotAvailable']}" - rendered="#{node.data.xValidatorOid != null and not empty node.data.xValidatorOid and + <s:span styleClass="gzl-icon-stack" + title="#{messages['net.ihe.gazelle.mca.CrossValidatorNotAvailable']}" + rendered="#{analyzerBean.hasXValidatorOid(node.data) and not analyzerBean.crossValidatorAvailable(node.data.xValidatorOid)}"> - <em style="color:C6C6C6" class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/> - <em style="color:C6C6C6" class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/> + <em style="color:C6C6C6" + class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/> + <em style="color:C6C6C6" + class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/> </s:span> <h:commandLink @@ -115,14 +125,17 @@ ignoreDupResponses="true" action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath,node.data, false)}" rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart == null}"> - <s:span title="#{messages['net.ihe.gazelle.xval.Download']}" styleClass="gzl-icon-download"/> + <s:span title="#{messages['net.ihe.gazelle.xval.Download']}" + styleClass="gzl-icon-download"/> </h:commandLink> - <s:div rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart != null}" style="display: inline"> + <s:div rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart != null}" + style="display: inline"> <a title="#{messages['net.ihe.gazelle.evs.DownloadPart']}" onclick="jq162('#downloadPopup#{node.data.id}').modal('show');"> - <s:span title="#{messages['net.ihe.gazelle.evs.DownloadPart']}" styleClass="gzl-icon-download"/> + <s:span title="#{messages['net.ihe.gazelle.evs.DownloadPart']}" + styleClass="gzl-icon-download"/> </a> <ui:decorate template="/layout/popup/_popup_title_footer.xhtml"> @@ -130,22 +143,28 @@ <ui:param name="bodyStyleClass" value="bg-warning"/> <ui:define name="popup_title"> <s:span styleClass="gzl-icon-exclamation-triangle"/> - <h:outputText value="#{messages['net.ihe.gazelle.mca.DownloadAnalysisSubpart']}"/> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.DownloadAnalysisSubpart']}"/> </ui:define> - <p>#{messages['net.ihe.gazelle.mca.YouAreAboutToDownloadTheContentOfASubpartFromThe']}</p> - <p>#{messages['net.ihe.gazelle.mca.NamespacesFromPreviousPartsMayBeReportedBeforeTh']}</p> - <p>#{messages['net.ihe.gazelle.mca.DoYouWantToDownloadTheOriginalContentOrTheAdjust']}</p> + <p> + #{messages['net.ihe.gazelle.mca.YouAreAboutToDownloadTheContentOfASubpartFromThe']}</p> + <p> + #{messages['net.ihe.gazelle.mca.NamespacesFromPreviousPartsMayBeReportedBeforeTh']}</p> + <p> + #{messages['net.ihe.gazelle.mca.DoYouWantToDownloadTheOriginalContentOrTheAdjust']}</p> <ui:define name="popup_footer"> - <h:commandButton value="#{messages['net.ihe.gazelle.mca.DownloadOriginalContent']}" - action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, false)}" - oncomplete="jq162('#downloadPopup').modal('hide');" - styleClass="gzl-btn-blue"/> - <h:commandButton value="#{messages['net.ihe.gazelle.mca.DownloadAdjustedContent']}" - action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, true)}" - styleClass="gzl-btn-blue" - oncomplete="jq162('#downloadPopup').modal('hide');"/> + <h:commandButton + value="#{messages['net.ihe.gazelle.mca.DownloadOriginalContent']}" + action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, false)}" + oncomplete="jq162('#downloadPopup').modal('hide');" + styleClass="gzl-btn-blue"/> + <h:commandButton + value="#{messages['net.ihe.gazelle.mca.DownloadAdjustedContent']}" + action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, true)}" + styleClass="gzl-btn-blue" + oncomplete="jq162('#downloadPopup').modal('hide');"/> </ui:define> </ui:decorate> </s:div> @@ -158,67 +177,79 @@ <a4j:region> <div class="col-md-8"> <div class="row"> - <div class="col-md-12"> - <s:decorate template="/layout/form/_checkbox.xhtml" rendered="#{analyzerBean.isDisplayedPartXml}"> + <div class="col-md-12"> + <s:decorate template="/layout/form/_checkbox.xhtml" + rendered="#{analyzerBean.isDisplayedPartXml}"> <ui:param name="id" value="cb2"/> - <ui:define name="label"><h:outputText value="#{messages['net.ihe.gazelle.mca.IndentContent']}"/></ui:define> + <ui:define name="label"> + <h:outputText value="#{messages['net.ihe.gazelle.mca.IndentContent']}"/> + </ui:define> <h:selectBooleanCheckbox id="cb2" value="#{analyzerBean.indentMessageInGUI}"> <a4j:ajax event="change" render="panelPartArea"/> </h:selectBooleanCheckbox> </s:decorate> - <h:outputText value="#{messages['net.ihe.gazelle.mca.TheContentOfThisPartMayReferToNamespacesDefinedI']}" - rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}"/><br /> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.TheContentOfThisPartMayReferToNamespacesDefinedI']}" + rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}"/> + <br/> <s:decorate template="/layout/form/_checkbox.xhtml" rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}"> <ui:param name="id" value="cb3"/> <ui:define name="label"> - <h:outputText value="#{messages['net.ihe.gazelle.mca.ShowReportedNamespacesFromOriginalMessage']}"/> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.ShowReportedNamespacesFromOriginalMessage']}"/> </ui:define> - <h:selectBooleanCheckbox id="cb3" value="#{analyzerBean.showAddedNamespacesInGUI}"> + <h:selectBooleanCheckbox id="cb3" + value="#{analyzerBean.showAddedNamespacesInGUI}"> <a4j:ajax event="change" render="panelPartArea"/> </h:selectBooleanCheckbox> </s:decorate> <s:div id="indentedMessage" rendered="#{analyzerBean.indentMessageInGUI}"> <s:span styleClass="gzl-icon-info-circle"/> - <h:outputText value="#{messages['net.ihe.gazelle.mca.TheFollowingContentHasBeenModifiedindentedForBet']}"/> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.TheFollowingContentHasBeenModifiedindentedForBet']}"/> </s:div> #{analyzerBean.setDisplayedMessagePart()} <s:div id="namespaceMessages"> - <s:div id="namespacesActuallyAdded" rendered="#{analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}"> + <s:div id="namespacesActuallyAdded" + rendered="#{analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}"> <s:span styleClass="gzl-icon-info-circle"/> - <h:outputText value="#{messages['net.ihe.gazelle.mca.NamespacesHaveBeenReportedFromPreviousXMLSubpart']}"/> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.NamespacesHaveBeenReportedFromPreviousXMLSubpart']}"/> </s:div> - <s:div id="noNamespacesAdded" rendered="#{!analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}"> + <s:div id="noNamespacesAdded" + rendered="#{!analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}"> <s:span styleClass="gzl-icon-info-circle"/> - <h:outputText value="#{messages['net.ihe.gazelle.mca.NoNamespacesWereFoundMissingThePartWillBeSendToT']}"/> + <h:outputText + value="#{messages['net.ihe.gazelle.mca.NoNamespacesWereFoundMissingThePartWillBeSendToT']}"/> </s:div> </s:div> </div> </div> <div class="row"> - <div class="col-md-8"> - <h:inputTextarea id="messagearea3" readonly="false" style="width: 100%" - styleClass="#{(analyzerBean.indentMessageInGUI and !analyzerBean.showAddedNamespacesInGUI)?'xml-indented ':''} + <div class="col-md-8"> + <h:inputTextarea id="messagearea3" readonly="false" style="width: 100%" + styleClass="#{(analyzerBean.indentMessageInGUI and !analyzerBean.showAddedNamespacesInGUI)?'xml-indented ':''} #{(analyzerBean.indentMessageInGUI and analyzerBean.showAddedNamespacesInGUI)?'xml-indented-modified ':''} #{(analyzerBean.showAddedNamespacesInGUI and !analyzerBean.indentMessageInGUI)?'xml-modified ':''}" - value="#{analyzerBean.displayedMessagePart}" - rows="20" maxlength="2048"> - <a4j:ajax event="keyup" render="buttdiv" - listener="#{analyzerBean.setSelectedMessagePartEdited(true)}"/> - </h:inputTextarea> - </div> - - <div class="col-md-4"> - <h:inputTextarea id="logarea" readonly="true" style="width: 100%" - styleClass="greyed-logs" - value="#{analyzerBean.getMessagePartLog()}" - rows="20" maxlength="2048"> - </h:inputTextarea> - </div> + value="#{analyzerBean.displayedMessagePart}" + rows="20" maxlength="2048"> + <a4j:ajax event="keyup" render="buttdiv" + listener="#{analyzerBean.setSelectedMessagePartEdited(true)}"/> + </h:inputTextarea> + </div> + + <div class="col-md-4"> + <h:inputTextarea id="logarea" readonly="true" style="width: 100%" + styleClass="greyed-logs" + value="#{analyzerBean.getMessagePartLog()}" + rows="20" maxlength="2048"> + </h:inputTextarea> + </div> </div> <s:div id="buttdiv"> diff --git a/pom.xml b/pom.xml index b8527923ba76b19ea0264723564da6ee110269cd..60284620ec8742e7ece2e85b9c32b291aee8729a 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,9 @@ <properties> <git.user.name>gitlab-ci</git.user.name> <git.user.token>changeit</git.user.token> - <git.project.url>https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer</git.project.url> + <git.project.url> + https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer + </git.project.url> <gazelle.model.version>4.0.36</gazelle.model.version> <powermock.version>1.7.1</powermock.version> @@ -57,6 +59,11 @@ <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin> <sonar.jacoco.reportPaths>target/jacoco.exec</sonar.jacoco.reportPaths> <sonar.maven.plugin>3.5.0.1254</sonar.maven.plugin> + <git.user.name>gitlab-ci</git.user.name> + <git.user.token>changeit</git.user.token> + <git.project.url> + https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer + </git.project.url> </properties> <modules>