package gov.nasa.jpl.mbee.mdk.mms.validation; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.Project; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element; import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters; import gov.nasa.jpl.mbee.mdk.http.ServerException; import gov.nasa.jpl.mbee.mdk.json.JacksonUtils; import gov.nasa.jpl.mbee.mdk.mms.MMSUtils; import gov.nasa.jpl.mbee.mdk.mms.actions.ExportImage; import gov.nasa.jpl.mbee.mdk.validation.ValidationRule; import gov.nasa.jpl.mbee.mdk.validation.ValidationRuleViolation; import gov.nasa.jpl.mbee.mdk.validation.ValidationSuite; import gov.nasa.jpl.mbee.mdk.validation.ViolationSeverity; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; public class ImageValidator { private Map<String, ObjectNode> images; private ValidationSuite suite = new ValidationSuite("images"); private ValidationRule rule = new ValidationRule("Image Outdated", "Diagram is outdated", ViolationSeverity.ERROR); private Map<String, ObjectNode> allImages; public ImageValidator(Map<String, ObjectNode> images, Map<String, ObjectNode> allImages) { this.images = images; this.allImages = allImages; if (allImages == null) { this.allImages = new HashMap<>(); } this.allImages.putAll(images); suite.addValidationRule(rule); } public void validate(Project project) { for (String key : images.keySet()) { // customize request URIBuilder requestUri = MMSUtils.getServiceProjectsRefsElementsUri(project); if (requestUri == null) { return; } Element e = Converters.getIdToElementConverter().apply(key, project); String id = key.replace(".", "%2E"); requestUri.setPath(requestUri.getPath() + "/" + id); JsonNode value; String cs = ""; if ((value = images.get(key).get("cs")) != null && value.isTextual()) { cs = value.asText(); } requestUri.setParameter("cs", cs); String extension = "svg"; if ((value = images.get(key).get("extension")) != null && value.isTextual()) { extension = value.asText(); } requestUri.setParameter("extension", extension); File responseFile; ObjectNode response; // do request try { HttpRequestBase request = MMSUtils.buildRequest(MMSUtils.HttpRequestType.GET, requestUri); request.setHeader("Accept", "image/" + extension); responseFile = MMSUtils.sendMMSRequest(project, request); try (JsonParser responseParser = JacksonUtils.getJsonFactory().createParser(responseFile)) { response = JacksonUtils.parseJsonObject(responseParser); if (((value = response.get("message")) == null || !value.isTextual() || value.asText().contains("not found")) || ((value = response.get("cs")) == null || !value.isTextual() || !value.asText().equals(cs))) { ValidationRuleViolation v = new ValidationRuleViolation(e, "[IMAGE] This image is outdated on the web."); v.addAction(new ExportImage(e, allImages)); rule.addViolation(v); } } } catch (ServerException | IOException | URISyntaxException e1) { Application.getInstance().getGUILog().log("[ERROR] Exception occurred while validating image " + key + ". Image validation cancelled. Reason: " + e1.getMessage()); e1.printStackTrace(); continue; } } } public ValidationSuite getSuite() { return suite; } public ValidationRule getRule() { return rule; } }