diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/DataMapperService.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/DataMapperService.java index a75306fa7c..8f8cabb03a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/DataMapperService.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/DataMapperService.java @@ -37,6 +37,7 @@ import io.ballerina.flowmodelgenerator.extension.request.DataMapperTypesRequest; import io.ballerina.flowmodelgenerator.extension.request.DataMapperVisualizeRequest; import io.ballerina.flowmodelgenerator.extension.request.DataMappingDeleteRequest; +import io.ballerina.flowmodelgenerator.extension.response.DataMapperClearCacheResponse; import io.ballerina.flowmodelgenerator.extension.response.DataMapperFieldPositionResponse; import io.ballerina.flowmodelgenerator.extension.response.DataMapperModelResponse; import io.ballerina.flowmodelgenerator.extension.response.DataMapperNodePositionResponse; @@ -47,6 +48,7 @@ import io.ballerina.flowmodelgenerator.extension.response.DataMappingDeleteResponse; import io.ballerina.projects.Document; import org.ballerinalang.annotation.JavaSPIService; +import org.ballerinalang.diagramutil.connector.models.connector.ReferenceType; import org.ballerinalang.langserver.commons.LanguageServerContext; import org.ballerinalang.langserver.commons.service.spi.ExtendedLanguageServerService; import org.ballerinalang.langserver.commons.workspace.WorkspaceManager; @@ -442,6 +444,28 @@ public CompletableFuture transformationFunction( }); } + /** + * Clears the visited type map cache in ReferenceType. + * This API can be used to reset the type cache when needed. + * + * @return Response indicating whether the cache was successfully cleared + * @since 1.2.0 + */ + @JsonRequest + public CompletableFuture clearTypeCache() { + return CompletableFuture.supplyAsync(() -> { + DataMapperClearCacheResponse response = new DataMapperClearCacheResponse(); + try { + ReferenceType.clearVisitedTypeMap(); + response.setSuccess(true); + } catch (Throwable e) { + response.setError(e); + response.setSuccess(false); + } + return response; + }); + } + private Optional getDocumentFromFile(Path projectPath, String fileName) { try { return this.workspaceManagerProxy.get().document(projectPath.resolve(fileName)); diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/response/DataMapperClearCacheResponse.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/response/DataMapperClearCacheResponse.java new file mode 100644 index 0000000000..75bdd4bbfd --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/java/io/ballerina/flowmodelgenerator/extension/response/DataMapperClearCacheResponse.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025, WSO2 LLC. (http://www.wso2.com) + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.ballerina.flowmodelgenerator.extension.response; + +/** + * Represents the response for clearing the data mapper type cache. + * + * @since 1.2.0 + */ +public class DataMapperClearCacheResponse extends AbstractFlowModelResponse { + + private boolean success; + + public DataMapperClearCacheResponse() { + this.success = false; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java index 40e8acba2e..5ca65a51be 100644 --- a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java +++ b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java @@ -48,9 +48,10 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; public class ReferenceType { - private static final Map visitedTypeMap = new HashMap<>(); + private static final Map visitedTypeMap = new ConcurrentHashMap<>(); public record Field(String fieldName, RefType type, boolean optional, String defaultValue) { } @@ -469,4 +470,8 @@ private static void validateDependentTypes(RefType type, List typeDefSym } } + public static void clearVisitedTypeMap() { + visitedTypeMap.clear(); + } + }