diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..7c4e86674 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: true diff --git a/gradle.properties b/gradle.properties index f2705bea8..e04e3e25b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=5.1.0 +version=5.1.1 group=org.openmbee.mdk.magic descriptorFile=MDR_Plugin_Model_Development_Kit_91110_descriptor.xml magicdDrawGroupName=gov.nasa.jpl.cae.magicdraw.mdk diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/MDKPluginHelper.java b/src/main/java/gov/nasa/jpl/mbee/mdk/MDKPluginHelper.java index 43257d55f..c30b2c203 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/MDKPluginHelper.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/MDKPluginHelper.java @@ -65,7 +65,7 @@ public void init() { private void configureEnvironmentOptions() { EnvironmentOptions mdkOptions = Application.getInstance().getEnvironmentOptions(); - mdkOptions.addGroup(new MDKEnvironmentOptionsGroup()); + mdkOptions.addGroup(MDKEnvironmentOptionsGroup.getInstance()); } diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/emf/EMFImporter.java b/src/main/java/gov/nasa/jpl/mbee/mdk/emf/EMFImporter.java index 5106e7071..3720eb58f 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/emf/EMFImporter.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/emf/EMFImporter.java @@ -102,6 +102,11 @@ public static class PreProcessor { JsonNode jsonNode = objectNode.get(MDKConstants.DOCUMENTATION_KEY); if (jsonNode != null && jsonNode.isTextual()) { ModelHelper.setComment(element, jsonNode.asText()); + //prevent ownedCommentIds empty array from wiping out documentation later + if (objectNode.get(MDKConstants.OWNED_COMMENT_IDS_KEY) != null + && objectNode.get(MDKConstants.OWNED_COMMENT_IDS_KEY).isEmpty()) { + objectNode.remove(MDKConstants.OWNED_COMMENT_IDS_KEY); + } } return element; } diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/json/JacksonUtils.java b/src/main/java/gov/nasa/jpl/mbee/mdk/json/JacksonUtils.java index 9cb2f18aa..68abaf479 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/json/JacksonUtils.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/json/JacksonUtils.java @@ -122,9 +122,9 @@ public static ObjectNode parseJsonString(String string) throws IOException { return parseJsonObject(parser); } - public static Map> parseResponseIntoObjects(File responseFile, String expectedKey) throws IOException { + public static Map> parseResponseIntoObjects(File responseFile, String expectedKey) throws IOException { JsonToken current; - Map> parsedResponseObjects = new HashMap<>(); + Map> parsedResponseObjects = new HashMap<>(); try(JsonParser jsonParser = JacksonUtils.getJsonFactory().createParser(responseFile)) { current = (jsonParser.getCurrentToken() == null ? jsonParser.nextToken() : jsonParser.getCurrentToken()); if (current != JsonToken.START_OBJECT) { @@ -155,8 +155,8 @@ public static Map> parseResponseIntoObjects(File respons return parsedResponseObjects; } - private static Set parseExpectedArray(JsonParser jsonParser, JsonToken current) throws IOException { - Set parsedObjects = new HashSet<>(); + private static List parseExpectedArray(JsonParser jsonParser, JsonToken current) throws IOException { + List parsedObjects = new ArrayList<>(); if (current != null) { // assumes the calling method has begun initial parsing stages current = jsonParser.nextToken(); if(current.equals(JsonToken.START_ARRAY)) { diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitBranchAction.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitBranchAction.java index 3a5a3f12c..5cbbee3e1 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitBranchAction.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitBranchAction.java @@ -203,8 +203,8 @@ public void run(ProgressStatus progressStatus) { } private ObjectNode findParentBranch(File responseFile, String parentBranchId) throws IOException { - Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.REFS_NODE); - Set refObjects = parsedResponseObjects.get(MDKConstants.REFS_NODE); + Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.REFS_NODE); + List refObjects = parsedResponseObjects.get(MDKConstants.REFS_NODE); if(refObjects != null && !refObjects.isEmpty()) { for(ObjectNode refObjectNode : refObjects) { diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitClientElementAction.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitClientElementAction.java index 04aade71d..2f100ee85 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitClientElementAction.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/actions/CommitClientElementAction.java @@ -111,6 +111,9 @@ public void actionPerformed(@CheckForNull ActionEvent actionEvent) { List elementsToUpdate = new ArrayList<>(1); List elementsToDelete = new ArrayList<>(1); if (elementObjectNode != null) { + if (serverObjectNode != null && serverObjectNode.get(MDKConstants.CONTENTS_KEY) != null && !serverObjectNode.get(MDKConstants.CONTENTS_KEY).isEmpty()) { + elementObjectNode.set(MDKConstants.CONTENTS_KEY, serverObjectNode.get(MDKConstants.CONTENTS_KEY)); + } elementsToUpdate.add(elementObjectNode); } else { diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/manual/ManualSyncRunner.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/manual/ManualSyncRunner.java index 8da154ef7..f176809fa 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/manual/ManualSyncRunner.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/manual/ManualSyncRunner.java @@ -87,7 +87,7 @@ public void run(ProgressStatus progressStatus) { int loopDepth = depth; collectClientElementsRecursively(project, element, loopDepth, clientElements, clientIdsVisited); try { - File searchFile = searchForServerElements(project, element, progressStatus); + File searchFile = searchForServerElements(project, element, loopDepth, progressStatus); if(searchFile != null) { responseFiles.add(searchFile); } @@ -113,7 +113,7 @@ public void run(ProgressStatus progressStatus) { elementValidator.run(progressStatus); } - private File searchForServerElements(Project project, Element element, ProgressStatus progressStatus) + private File searchForServerElements(Project project, Element element, int depth, ProgressStatus progressStatus) throws ServerException, IOException, URISyntaxException, GeneralSecurityException { Collection nodeIds = new HashSet<>(); // this is a collection because the createEntityFile method expects it if(element.equals(project.getPrimaryModel())) { @@ -121,10 +121,19 @@ private File searchForServerElements(Project project, Element element, ProgressS } else { nodeIds.add(element.getLocalID()); } - File sendData = MMSUtils.createEntityFile(this.getClass(), ContentType.APPLICATION_JSON, nodeIds, MMSUtils.JsonBlobType.SEARCH); - HttpRequestBase searchRequest = MMSUtils.prepareEndpointBuilderBasicJsonPostRequest(MMSSearchEndpoint.builder(), project, sendData) - .addParam(MMSEndpointBuilderConstants.URI_PROJECT_SUFFIX, Converters.getIProjectToIdConverter().apply(project.getPrimaryProject())) - .addParam(MMSEndpointBuilderConstants.URI_REF_SUFFIX, MDUtils.getBranchId(project)).build(); + File sendData; + HttpRequestBase searchRequest; + if (depth == 0) { + sendData = MMSUtils.createEntityFile(this.getClass(), ContentType.APPLICATION_JSON, nodeIds, MMSUtils.JsonBlobType.ELEMENT_ID); + searchRequest = MMSUtils.prepareEndpointBuilderBasicJsonPutRequest(MMSElementsEndpoint.builder(), project, sendData) + .addParam(MMSEndpointBuilderConstants.URI_PROJECT_SUFFIX, Converters.getIProjectToIdConverter().apply(project.getPrimaryProject())) + .addParam(MMSEndpointBuilderConstants.URI_REF_SUFFIX, MDUtils.getBranchId(project)).build(); + } else { + sendData = MMSUtils.createEntityFile(this.getClass(), ContentType.APPLICATION_JSON, nodeIds, MMSUtils.JsonBlobType.SEARCH); + searchRequest = MMSUtils.prepareEndpointBuilderBasicJsonPostRequest(MMSSearchEndpoint.builder(), project, sendData) + .addParam(MMSEndpointBuilderConstants.URI_PROJECT_SUFFIX, Converters.getIProjectToIdConverter().apply(project.getPrimaryProject())) + .addParam(MMSEndpointBuilderConstants.URI_REF_SUFFIX, MDUtils.getBranchId(project)).build(); + } // use endpoint to make request return MMSUtils.sendMMSRequest(project, searchRequest, progressStatus); } diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/mms/MMSDeltaProjectEventListenerAdapter.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/mms/MMSDeltaProjectEventListenerAdapter.java index 514705e9c..46049a21b 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/mms/MMSDeltaProjectEventListenerAdapter.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/sync/mms/MMSDeltaProjectEventListenerAdapter.java @@ -43,13 +43,16 @@ public void projectOpened(Project project) { return; } projectClosed(project); + // no need to poll mms when it'll just do the whole thing at commit + /* getProjectMapping(project).setScheduledFuture(TaskRunner.scheduleWithProgressStatus(progressStatus -> { try { getProjectMapping(project).update(); } catch (URISyntaxException | IOException | ServerException | GeneralSecurityException e) { e.printStackTrace(); } - }, "MMS Fetch", false, TaskRunner.ThreadExecutionStrategy.POOLED, false, (r, ses) -> ses.scheduleAtFixedRate(r, 0, 1, TimeUnit.MINUTES))); + }, "MMS Fetch", false, TaskRunner.ThreadExecutionStrategy.POOLED, false, (r, ses) -> ses.scheduleAtFixedRate(r, 0, 60, TimeUnit.MINUTES))); + */ if (MDKProjectOptions.getMbeeEnabled(project)) { MMSLoginAction.loginAction(project); } @@ -177,9 +180,8 @@ public synchronized boolean update() throws URISyntaxException, IOException, Ser return false; } Deque commitIdDeque = new ArrayDeque<>(); - int exponent = 0; - obtainAndParseCommits(commitIdDeque, exponent, project); + obtainAndParseCommits(commitIdDeque, project); if (commitIdDeque.isEmpty()) { return true; @@ -202,25 +204,20 @@ public synchronized boolean update() throws URISyntaxException, IOException, Ser return true; } - private void obtainAndParseCommits(Deque commitIdDeque, int exponent, Project project) + private void obtainAndParseCommits(Deque commitIdDeque, Project project) throws URISyntaxException, IOException, ServerException, GeneralSecurityException { - int limit = 1; - int size = 0; - - while(size < limit) { // setup so condition is true at least once, previously this was a do while loop - commitIdDeque.clear(); - limit = (int) Math.pow(10, exponent++); - + // look at commits until it gets to lastSyncedCommitId + commitIdDeque.clear(); HashMap uriBuilderParams = new HashMap<>(); - uriBuilderParams.put("limit", Integer.toString(limit)); + //uriBuilderParams.put("limit", Integer.toString(limit)); HttpRequestBase commitsRequest = MMSUtils.prepareEndpointBuilderBasicGet(MMSCommitsEndpoint.builder(), project) .addParam(MMSEndpointBuilderConstants.URI_PROJECT_SUFFIX, Converters.getIProjectToIdConverter().apply(project.getPrimaryProject())) .addParam(MMSEndpointBuilderConstants.URI_REF_SUFFIX, MDUtils.getBranchId(project)) .addParam(MMSEndpointBuilderConstants.URI_BUILDER_PARAMETERS, uriBuilderParams).build(); File responseFile = MMSUtils.sendMMSRequest(project, commitsRequest); - Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.COMMITS_NODE); - Set elementObjects = parsedResponseObjects.get(MDKConstants.COMMITS_NODE); + Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.COMMITS_NODE); + List elementObjects = parsedResponseObjects.get(MDKConstants.COMMITS_NODE); if(elementObjects != null && !elementObjects.isEmpty()) { for(ObjectNode jsonObject : elementObjects) { JsonNode idValue = jsonObject.get(MDKConstants.ID_KEY); @@ -234,21 +231,19 @@ private void obtainAndParseCommits(Deque commitIdDeque, int exponent, Pr } commitIdDeque.addFirst(id); } - size++; } } - } } private void determineChangesUsingCommitResponse(File responseFile, Set lockedElementIds, String commitId) throws IOException { // turns out the response still uses commits as the field of interest in terms of parsing - Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.COMMITS_NODE); - Set commitObjects = parsedResponseObjects.get(MDKConstants.COMMITS_NODE); + Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.COMMITS_NODE); + List commitObjects = parsedResponseObjects.get(MDKConstants.COMMITS_NODE); if(commitObjects != null && !commitObjects.isEmpty()) { Map commitSizes = new HashMap<>(); for(ObjectNode jsonObject : commitObjects) { - if(jsonObject.isArray() && jsonObject.size() > 0) { + if(jsonObject.isObject() && jsonObject.size() > 0) { validateJsonElementArray(jsonObject, lockedElementIds, commitSizes); } if (MDUtils.isDeveloperMode()) { @@ -265,8 +260,8 @@ private void determineChangesUsingCommitResponse(File responseFile, Set } } - private void validateJsonElementArray(JsonNode arrayNode, Set lockedElementIds, Map sizes) { - JsonNode sourceField = arrayNode.get(MDKConstants.SOURCE_FIELD); + private void validateJsonElementArray(JsonNode objectNode, Set lockedElementIds, Map sizes) { + JsonNode sourceField = objectNode.get(MDKConstants.SOURCE_FIELD); String commitSyncDirection = ""; int size = 0; boolean isSyncingCommit = sourceField != null && sourceField.isTextual() && MDKConstants.MAGICDRAW_SOURCE_VALUE.equalsIgnoreCase(sourceField.asText()); @@ -279,7 +274,7 @@ private void validateJsonElementArray(JsonNode arrayNode, Set lockedElem size = sizes.get(commitSyncDirection); } for (Map.Entry entry : CHANGE_MAPPING.entrySet()) { - JsonNode changesJsonArray = arrayNode.get(entry.getKey()); + JsonNode changesJsonArray = objectNode.get(entry.getKey()); if (changesJsonArray == null || !changesJsonArray.isArray()) { throw new IllegalStateException(); } diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/validation/ElementValidator.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/validation/ElementValidator.java index f45f988fc..ff55c625f 100644 --- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/validation/ElementValidator.java +++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/validation/ElementValidator.java @@ -143,9 +143,10 @@ public void run(ProgressStatus progressStatus) { private void processServerElements(Map> clientElementMap, Map serverElementMap) throws IOException { // process the parsers against the lists, adding processed keys to processed sets in case of multiple returns for (File responseFile : serverElementFiles) { - Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.ELEMENTS_NODE); - Set elementObjects = parsedResponseObjects.get(MDKConstants.ELEMENTS_NODE); - if(elementObjects != null && !elementObjects.isEmpty()) { + Map> parsedResponseObjects = JacksonUtils.parseResponseIntoObjects(responseFile, MDKConstants.ELEMENTS_NODE); + List elementObjectsList = parsedResponseObjects.get(MDKConstants.ELEMENTS_NODE); + if(elementObjectsList != null && !elementObjectsList.isEmpty()) { + Set elementObjects = new HashSet<>(elementObjectsList); if(serverObjectsOnlyHasBins(elementObjects)) { // solves edge case where first model validation incorrectly removes bins from project removeServerObjectNodeUsingIdPrefix(elementObjects, MDKConstants.HOLDING_BIN_ID_PREFIX);