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.magicdraw.esi.EsiUtils; import gov.nasa.jpl.mbee.mdk.api.incubating.MDKConstants; 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.CommitProjectAction; 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.utils.URIBuilder; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; /** * Created by ablack on 3/20/17. */ public class ProjectValidator { private final Project project; private boolean errors; private ValidationSuite validationSuite = new ValidationSuite("structure"); private ValidationRule projectExistenceValidationRule = new ValidationRule("Project Existence", "The project shall exist in the specified site.", ViolationSeverity.ERROR); public ProjectValidator(Project project) { this.project = project; validationSuite.addValidationRule(projectExistenceValidationRule); } public void validate() { URIBuilder requestUri = MMSUtils.getServiceProjectsUri(project); if (requestUri == null) { Application.getInstance().getGUILog().log("[ERROR] Unable to get MMS URL. Project validation cancelled."); errors = true; return; } requestUri.setPath(requestUri.getPath() + "/" + Converters.getProjectToIdConverter().apply(project)); File responseFile; ObjectNode response; try { responseFile = MMSUtils.sendMMSRequest(project, MMSUtils.buildRequest(MMSUtils.HttpRequestType.GET, requestUri)); try (JsonParser jsonParser = JacksonUtils.getJsonFactory().createParser(responseFile)) { response = JacksonUtils.parseJsonObject(jsonParser); } } catch (IOException | ServerException | URISyntaxException e) { errors = true; e.printStackTrace(); Application.getInstance().getGUILog().log("[ERROR] Exception occurred while getting MMS projects. Project validation cancelled. Reason: " + e.getMessage()); return; } JsonNode projectsJson; if ((projectsJson = response.get("projects")) != null && projectsJson.isArray()) { JsonNode value; for (JsonNode projectJson : projectsJson) { if ((value = projectJson.get(MDKConstants.ID_KEY)) != null && value.isTextual() && value.asText().equals(Converters.getIProjectToIdConverter().apply(project.getPrimaryProject()))) { return; } } } ValidationRuleViolation v; if (!project.isRemote() || EsiUtils.getCurrentBranch(project.getPrimaryProject()).getName().equals("trunk")) { v = new ValidationRuleViolation(project.getPrimaryModel(), "[PROJECT MISSING ON MMS] The project does not exist in the MMS."); v.addAction(new CommitProjectAction(project, true)); } else { v = new ValidationRuleViolation(project.getPrimaryModel(), "[PROJECT MISSING ON MMS] The project does not exist in the MMS. You must initialize the project from the master branch first."); } projectExistenceValidationRule.addViolation(v); } public boolean hasErrors() { return this.errors; } public ValidationSuite getValidationSuite() { return validationSuite; } }