From 1fdd9427ae6643c582f8ee6d69d7744898f56c5a Mon Sep 17 00:00:00 2001 From: hindujaB Date: Thu, 25 Apr 2024 16:07:55 +0530 Subject: [PATCH 01/18] Add ballerina services API --- .../artifacts-tests/tests/Config.toml | 2 +- .../artifacts-tests/tests/test.bal | 12 +- ballerina/icpService.bal | 27 ++-- ballerina/init.bal | 2 + ballerina/types.bal | 42 +++-- .../lib/wso2/controlplane/ArtifactUtils.java | 133 +++++++++++++++ .../controlplane/ControlPlaneConstants.java | 10 +- .../controlplane/ListenerArtifactHandler.java | 135 ++++++++++++++++ .../controlplane/ServiceArtifactHandler.java | 153 ++++++++++++++++++ .../lib/wso2/controlplane/Utils.java | 111 ++----------- 10 files changed, 505 insertions(+), 122 deletions(-) create mode 100644 native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java create mode 100644 native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java create mode 100644 native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java diff --git a/ballerina-tests/artifacts-tests/tests/Config.toml b/ballerina-tests/artifacts-tests/tests/Config.toml index d79906c..0b9117f 100644 --- a/ballerina-tests/artifacts-tests/tests/Config.toml +++ b/ballerina-tests/artifacts-tests/tests/Config.toml @@ -1,4 +1,4 @@ -testURL = "https://localhost:9165/" +testURL = "https://localhost:9165" testPort = 9090 [ballerinax.wso2.controlplane] diff --git a/ballerina-tests/artifacts-tests/tests/test.bal b/ballerina-tests/artifacts-tests/tests/test.bal index 9f06ce2..05cea30 100644 --- a/ballerina-tests/artifacts-tests/tests/test.bal +++ b/ballerina-tests/artifacts-tests/tests/test.bal @@ -28,7 +28,7 @@ public function testGetBallerinaNode() returns error? { enable: false } ); - cp:Node|error node = icpClient->get("management"); + cp:Node|error node = icpClient->/management(); test:assertTrue(node is cp:Node, "Invalid response received"); } @@ -39,13 +39,21 @@ public function testGetBallerinaArtifacts() returns error? { enable: false } ); - cp:Artifacts|error artifacts = rmClient->get("management/Service"); + cp:Artifacts|error artifacts = rmClient->/management/services(); test:assertTrue(artifacts is cp:Artifacts, "Invalid response received"); test:assertTrue(artifacts.count() == 1, "No services found"); + + cp:ArtifactDetail|error artifact = rmClient->/management/services(name = "service_1"); + test:assertTrue(artifact is cp:ServiceDetail, "Invalid response received"); } service /hello on new http:Listener(testPort) { + resource function get greeting() returns string { return "Hello, World!"; } + + resource function get albums/[string title]/[string user]/[string ...]() returns string|http:NotFound { + return "Hello, World!"; + } } diff --git a/ballerina/icpService.bal b/ballerina/icpService.bal index a55df35..56fd385 100644 --- a/ballerina/icpService.bal +++ b/ballerina/icpService.bal @@ -36,22 +36,29 @@ service /management on securedEP { return check getBallerinaNode(); } - resource function get [string resourceType](string? searchKey) - returns Artifacts|error { - Artifact[] artifacts = check getArtifacts(resourceType, searchKey, Artifact); - return { - count : artifacts.length(), - list : artifacts - }; + resource function get [ArtifactType resourceType](string? name) + returns Artifacts|ArtifactDetail|error { + if (name == ()) { + Artifact[] artifacts = check getArtifacts(resourceType, Artifact); + return { + count: artifacts.length(), + list: artifacts + }; + } + return getDetailedArtifact(resourceType, name, ArtifactDetail); } - } isolated function getBallerinaNode() returns Node|error = @java:Method { 'class: "io.ballerina.lib.wso2.controlplane.Utils" } external; -isolated function getArtifacts(string resourceType, string? searchKey, typedesc t) returns Artifact[]|error = +isolated function getDetailedArtifact(string resourceType, string name, typedesc t) returns ArtifactDetail|error = @java:Method { - 'class: "io.ballerina.lib.wso2.controlplane.Utils" + 'class: "io.ballerina.lib.wso2.controlplane.ArtifactUtils" +} external; + +isolated function getArtifacts(string resourceType, typedesc t) returns Artifact[]|error = +@java:Method { + 'class: "io.ballerina.lib.wso2.controlplane.ArtifactUtils" } external; diff --git a/ballerina/init.bal b/ballerina/init.bal index bfc91b8..3fdaddb 100644 --- a/ballerina/init.bal +++ b/ballerina/init.bal @@ -35,12 +35,14 @@ function registerInDashboardServer() returns error? { enable: false } ); + IntegrationPlaneConnectionRequest connectionRequest = { groupId: dashboard.groupId, nodeId: dashboard.nodeId, interval: dashboard.heartbeatInterval, mgtApiUrl: dashboard.mgtApiUrl }; + boolean isFailed = true; while (true) { http:Response|http:ClientError resp = dsClient->post("/heartbeat", connectionRequest); diff --git a/ballerina/types.bal b/ballerina/types.bal index 97e7363..b14fd2c 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -51,28 +51,52 @@ public type Artifacts record { Artifact[] list; }; -public type Artifact Service; +public enum ArtifactType { + SERVICE = "services", + LISTENER = "listeners" +} + +public type Artifact Service|Listener; + +public type ArtifactDetail ServiceDetail|ListenerDetail; public type Service record { string name; - string? attachPoint; - Metadata metadata; - map annotations; + string? basePath; }; -public type Metadata record { +public type ServiceDetail record { + string package; Listener[] listeners; - map metadata; + Resource[] resources; +}; + +public type Resource record { + string[] methods; + string url; }; public type Listener record { - string 'type; + string name; string? protocol; - map properties; + int port; +}; + +public type RequestsLimit record { + int maxUriLength; + int maxHeaderSize; + int maxEntityBodySize; +}; + +public type ListenerDetail record { + string package; + string httpVersion; + string host; + int timeout; + RequestsLimit requestsLimit; }; public type Node record { - string id; string platformName = "ballerina"; string? platformVersion; string? ballerinaHome; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java new file mode 100644 index 0000000..4416dcd --- /dev/null +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://wso2.com). + * + * Licensed 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.lib.wso2.controlplane; + +import io.ballerina.runtime.api.Artifact; +import io.ballerina.runtime.api.Environment; +import io.ballerina.runtime.api.Module; +import io.ballerina.runtime.api.creators.ErrorCreator; +import io.ballerina.runtime.api.creators.TypeCreator; +import io.ballerina.runtime.api.creators.ValueCreator; +import io.ballerina.runtime.api.types.ArrayType; +import io.ballerina.runtime.api.types.Type; +import io.ballerina.runtime.api.utils.StringUtils; +import io.ballerina.runtime.api.utils.TypeUtils; +import io.ballerina.runtime.api.values.BListInitialValueEntry; +import io.ballerina.runtime.api.values.BObject; +import io.ballerina.runtime.api.values.BString; +import io.ballerina.runtime.api.values.BTypedesc; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICES_RESOURCE; + +/** + * Native function implementations of the wso2 control plane module. + * + * @since 1.0.0 + */ +public class ArtifactUtils { + + static List artifacts; + private static Module currentModule; + + private static ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); + private static ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); + + static final Map serviceNamesMap = new HashMap<>(); + static final Map listenerNamesMap = new HashMap<>(); + + private static int serviceCounter = 1; + private static int listenerCounter = 1; + + private ArtifactUtils() { + } + + public static Object getArtifacts(Environment env, BString resourceType, BTypedesc typedesc) { + artifacts = env.getRepository().getArtifacts(); + currentModule = env.getCurrentModule(); + populateArtifactNamesMap(); + Type artifactType = TypeUtils.getImpliedType(typedesc.getDescribingType()); + List artifactEntries; + if (resourceType.getValue().equals(SERVICES_RESOURCE)) { + artifactEntries = serviceArtifactHandler.getServiceList(currentModule); + } else { + artifactEntries = listenerArtifactHandler.getListenerList(currentModule); + } + ArrayType arrayType = TypeCreator.createArrayType(artifactType, true); + return ValueCreator.createArrayValue(arrayType, artifactEntries.toArray(BListInitialValueEntry[]::new)); + } + + private static void populateArtifactNamesMap() { + for (Artifact artifact : artifacts) { + BObject serviceObj = (BObject) artifact.getDetail("service"); + if (Utils.isControlPlaneService(serviceObj, currentModule)) { + continue; + } + + if (!serviceNamesMap.containsKey(serviceObj)) { + serviceNamesMap.put(serviceObj, "service_" + serviceCounter++); + } + List listeners = (List) artifact.getDetail("listeners"); + for (BObject listener : listeners) { + if (!listenerNamesMap.containsKey(listener)) { + listenerNamesMap.put(listener, "listener_" + listenerCounter++); + } + } + } + } + + public static Object getDetailedArtifact(Environment env, BString resourceType, BString name, + BTypedesc typedesc) { + String value = name.getValue(); + if (resourceType.getValue().equals(SERVICES_RESOURCE)) { + Artifact artifact = getServiceArtifact(value); + if (artifact == null) { + return ErrorCreator.createError(StringUtils.fromString("No service found with the name: " + name)); + } + return serviceArtifactHandler.getDetailedService(artifact, currentModule); + + } else { + BObject listenerObject = getListenerArtifact(value); + if (listenerObject == null) { + return ErrorCreator.createError(StringUtils.fromString("No listener found with the name: " + name)); + } + return listenerArtifactHandler.getDetailedListener(listenerObject, currentModule); + } + } + + private static BObject getListenerArtifact(String name) { + for (Map.Entry entry : listenerNamesMap.entrySet()) { + if (entry.getValue().equals(name)) { + return (BObject) entry.getKey(); + } + } + return null; + } + + private static Artifact getServiceArtifact(String name) { + for (Artifact artifact : artifacts) { + BObject serviceObj = (BObject) artifact.getDetail("service"); + if (name.equals(serviceNamesMap.get(serviceObj))) { + return artifact; + } + } + return null; + } +} diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java index 5279524..626c000 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java @@ -7,7 +7,15 @@ public class ControlPlaneConstants { public static final String BAL_HOME = "balHome"; public static final String BAL_VERSION = "balVersion"; public static final String OS_NAME = "osName"; - public static final String ID = "id"; public static final String PATH_SEPARATOR = "/"; + public static final String SERVICES_RESOURCE = "services"; + public static final String SINGLE_SLASH = "/"; + public static final String PATH_PARAM_IDENTIFIER = "^"; + public static final String OPEN_CURL_IDENTIFIER = "{"; + public static final String CLOSE_CURL_IDENTIFIER = "}"; + public static final String PATH_REST_PARAM_IDENTIFIER = "$^^"; + public static final String STAR_IDENTIFIER = "*"; + public static final String DOT_IDENTIFIER = "."; + public static final String REGEX = "(? getListenerList(Module currentModule) { + List artifactEntries = new ArrayList<>(); + for (Artifact artifact : ArtifactUtils.artifacts) { + BObject serviceObj = (BObject) artifact.getDetail("service"); + Type originalType = serviceObj.getOriginalType(); + Module module = originalType.getPackage(); + if (module != null && module.equals(currentModule)) { + continue; + } + BMap service = ValueCreator.createMapValue(); + service.put(StringUtils.fromString("name"), StringUtils.fromString(originalType.toString())); + service.put(StringUtils.fromString("type"), "Service"); + service.put(StringUtils.fromString("metadata"), getServiceMetadata(artifact, serviceObj, currentModule)); + service.put(StringUtils.fromString("annotations"), getServiceAnnotations(serviceObj)); + artifactEntries.add(ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); + } + return artifactEntries; + } + + public BMap getDetailedListener(BObject listener, Module currentModule) { +// BObject serviceObj = (BObject) artifact.getDetail("service"); +// Type originalType = serviceObj.getOriginalType(); + BMap service = ValueCreator.createMapValue(); +// service.put(StringUtils.fromString("name"), StringUtils.fromString(originalType.toString())); +// service.put(StringUtils.fromString("type"), "Service"); +// service.put(StringUtils.fromString("metadata"), getServiceMetadata(artifact, serviceObj, currentModule)); +// service.put(StringUtils.fromString("annotations"), getServiceAnnotations(serviceObj)); + return ValueCreator.createReadonlyRecordValue(currentModule, "Service", service); + + } + + private static BMap getServiceMetadata(Artifact artifact, BObject serviceObj, Module module) { + BMap metadata = ValueCreator.createRecordValue(module, "Metadata"); + List listeners = (List) artifact.getDetail("listeners"); + BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; + for (int i = 0; i < listeners.size(); i++) { + BObject listener = listeners.get(i); + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString("type"), StringUtils.fromString(listener.getOriginalType().toString())); + // Need to add listener properties according to the listener type + BMap properties = getMapAnydataValue(); + addListenerProperty(listener, "port", properties); + listenerRecord.put(StringUtils.fromString("properties"), properties); + listenerEntries[i] = ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); + } + ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType(ValueCreator.createRecordValue(module, "Listener")), true); + metadata.put(StringUtils.fromString("listeners"), ValueCreator.createArrayValue(arrayType, listenerEntries)); + metadata.put(StringUtils.fromString("metadata"), getMapAnydataValue()); + return metadata; + } + + private static BMap getMapAnydataValue() { + return ValueCreator.createMapValue(TypeCreator.createMapType(PredefinedTypes.TYPE_ANYDATA)); + } + + private static Object getServiceAnnotations(BObject serviceObj) { + BMap mapValue = getMapAnydataValue(); + AnnotatableType serviceType = (AnnotatableType) TypeUtils.getImpliedType(serviceObj.getOriginalType()); + for (Map.Entry entry : serviceType.getAnnotations().entrySet()) { + mapValue.put(entry.getKey(), entry.getValue()); + } + return mapValue; + } + + private static void addListenerProperty(BObject listener, String fieldName, BMap properties) { + try { + Object value = listener.get(StringUtils.fromString(fieldName)); + properties.put(StringUtils.fromString(fieldName), value); + } catch (BError e) { + // this means no such field in the object + } + } + + private static Object getAttachPointString(Artifact artifact) { + Object attachPoint = artifact.getDetail("attachPoint"); + if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { + BArray array = (BArray) attachPoint; + StringBuilder attachPointStr = new StringBuilder(); + for (int i = 0; i < array.size(); i++) { + attachPointStr.append(PATH_SEPARATOR).append(array.getBString(i).getValue()); + } + return StringUtils.fromString(attachPointStr.toString()); + } + return attachPoint; + } +} diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java new file mode 100644 index 0000000..2d6f82c --- /dev/null +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://wso2.com). + * + * Licensed 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.lib.wso2.controlplane; + +import io.ballerina.runtime.api.Artifact; +import io.ballerina.runtime.api.Module; +import io.ballerina.runtime.api.TypeTags; +import io.ballerina.runtime.api.creators.TypeCreator; +import io.ballerina.runtime.api.creators.ValueCreator; +import io.ballerina.runtime.api.types.ArrayType; +import io.ballerina.runtime.api.types.NetworkObjectType; +import io.ballerina.runtime.api.types.ResourceMethodType; +import io.ballerina.runtime.api.types.Type; +import io.ballerina.runtime.api.utils.StringUtils; +import io.ballerina.runtime.api.utils.TypeUtils; +import io.ballerina.runtime.api.values.BArray; +import io.ballerina.runtime.api.values.BListInitialValueEntry; +import io.ballerina.runtime.api.values.BMap; +import io.ballerina.runtime.api.values.BObject; +import io.ballerina.runtime.api.values.BString; + +import java.util.ArrayList; +import java.util.List; + +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.listenerNamesMap; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.serviceNamesMap; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PATH_SEPARATOR; + +/** + * Native function implementations of the wso2 control plane module. + * + * @since 1.0.0 + */ +public class ServiceArtifactHandler { + + public List getServiceList(Module currentModule) { + List artifactEntries = new ArrayList<>(); + for (Artifact artifact : ArtifactUtils.artifacts) { + BObject serviceObj = (BObject) artifact.getDetail("service"); + if (Utils.isControlPlaneService(serviceObj, currentModule)) { + continue; + } + BMap service = ValueCreator.createMapValue(); + service.put(StringUtils.fromString("name"), StringUtils.fromString(serviceNamesMap.get(serviceObj))); + service.put(StringUtils.fromString("basePath"), getAttachPointString(artifact));; + artifactEntries.add(ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); + } + return artifactEntries; + } + public BMap getDetailedService(Artifact artifact, Module currentModule) { + BObject serviceObj = (BObject) artifact.getDetail("service"); + Type originalType = serviceObj.getOriginalType(); + BMap service = ValueCreator.createMapValue(); + service.put(StringUtils.fromString("package"), StringUtils.fromString(originalType.getPackage().toString())); + service.put(StringUtils.fromString("listeners"), getServiceListeners((List) + artifact.getDetail("listeners"), currentModule)); + service.put(StringUtils.fromString("resources"), getServiceResources(serviceObj, currentModule)); + return ValueCreator.createReadonlyRecordValue(currentModule, "ServiceDetail", service); + } + + private static BArray getServiceListeners(List listeners, Module module) { + BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; + for (int i = 0; i < listeners.size(); i++) { + BObject listener = listeners.get(i); + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString("name"), StringUtils.fromString(listenerNamesMap.get(listener))); + listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); + listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); + listenerEntries[i] = ValueCreator.createListInitialValueEntry( + ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); + } + ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( + ValueCreator.createRecordValue(module, "Listener")), true); + return ValueCreator.createArrayValue(arrayType, listenerEntries); + } + + private static BString getListenerProtocol(BObject listener) { + BMap config = (BMap) + listener.get(StringUtils.fromString("inferredConfig")); + Object secureSocket = config.get(StringUtils.fromString("secureSocket")); + return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); + } + + private static Object getServiceResources(BObject serviceObj, Module currentModule) { + ResourceMethodType[] resourceMethods = ((NetworkObjectType) serviceObj.getType()).getResourceMethods(); + BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[resourceMethods.length]; + for (int i = 0; i < resourceMethods.length; i++) { + ResourceMethodType resourceMethod = resourceMethods[i]; + BMap resourceRecord = ValueCreator.createMapValue(); + resourceRecord.put(StringUtils.fromString("methods"), getAccessorArray(resourceMethod)); + resourceRecord.put(StringUtils.fromString("url"), getUrl(resourceMethod)); + listenerEntries[i] = ValueCreator.createListInitialValueEntry( + ValueCreator.createReadonlyRecordValue(currentModule, "Resource", resourceRecord)); + } + ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( + ValueCreator.createRecordValue(currentModule, "Resource")), true); + return ValueCreator.createArrayValue(arrayType, listenerEntries); + } + + private static BString getUrl(ResourceMethodType resourceMethod) { + String[] paths = resourceMethod.getResourcePath(); + StringBuilder resourcePath = new StringBuilder(); + int count = 0; + for (String segment : paths) { + resourcePath.append(ControlPlaneConstants.SINGLE_SLASH); + if (ControlPlaneConstants.PATH_PARAM_IDENTIFIER.equals(segment)) { + String pathSegment = resourceMethod.getParamNames()[count++]; + resourcePath.append(ControlPlaneConstants.OPEN_CURL_IDENTIFIER) + .append(pathSegment).append(ControlPlaneConstants.CLOSE_CURL_IDENTIFIER); + } else if (ControlPlaneConstants.PATH_REST_PARAM_IDENTIFIER.equals(segment)) { + resourcePath.append(ControlPlaneConstants.STAR_IDENTIFIER); + } else if (ControlPlaneConstants.DOT_IDENTIFIER.equals(segment)) { + break; + } else { + resourcePath.append(segment); + } + } + return StringUtils.fromString(resourcePath.toString().replaceAll(ControlPlaneConstants.REGEX, + ControlPlaneConstants.SINGLE_SLASH)); + } + + private static BArray getAccessorArray(ResourceMethodType resourceMethod) { + return ValueCreator.createReadonlyArrayValue(new BString[] + {StringUtils.fromString(resourceMethod.getAccessor())}); + } + + private static Object getAttachPointString(Artifact artifact) { + Object attachPoint = artifact.getDetail("attachPoint"); + if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { + BArray array = (BArray) attachPoint; + StringBuilder attachPointStr = new StringBuilder(); + for (int i = 0; i < array.size(); i++) { + attachPointStr.append(PATH_SEPARATOR).append(array.getBString(i).getValue()); + } + return StringUtils.fromString(attachPointStr.toString()); + } + return attachPoint; + } +} diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java index 3e04922..2a11c98 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java @@ -16,39 +16,22 @@ package io.ballerina.lib.wso2.controlplane; -import io.ballerina.runtime.api.Artifact; import io.ballerina.runtime.api.Environment; import io.ballerina.runtime.api.Module; import io.ballerina.runtime.api.Node; -import io.ballerina.runtime.api.PredefinedTypes; -import io.ballerina.runtime.api.TypeTags; -import io.ballerina.runtime.api.creators.TypeCreator; import io.ballerina.runtime.api.creators.ValueCreator; -import io.ballerina.runtime.api.types.AnnotatableType; -import io.ballerina.runtime.api.types.ArrayType; import io.ballerina.runtime.api.types.Type; import io.ballerina.runtime.api.utils.StringUtils; -import io.ballerina.runtime.api.utils.TypeUtils; -import io.ballerina.runtime.api.values.BArray; -import io.ballerina.runtime.api.values.BError; -import io.ballerina.runtime.api.values.BListInitialValueEntry; import io.ballerina.runtime.api.values.BMap; import io.ballerina.runtime.api.values.BObject; import io.ballerina.runtime.api.values.BString; -import io.ballerina.runtime.api.values.BTypedesc; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA_HOME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PLATFORM_VERSION; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_HOME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ID; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_NAME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PATH_SEPARATOR; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PLATFORM_VERSION; /** * Native function implementations of the wso2 control plane module. @@ -61,98 +44,28 @@ public static Object getBallerinaNode(Environment env) { Module currentModule = env.getCurrentModule(); Node node = env.getRepository().getNode(); BMap nodeEntries = ValueCreator.createMapValue(); - nodeEntries.put(StringUtils.fromString(ID), StringUtils.fromString(node.nodeId)); nodeEntries.put(StringUtils.fromString(PLATFORM_VERSION), - StringUtils.fromString((String) node.getDetail(BAL_VERSION))); + StringUtils.fromString(getBallerinaVersionString((String) node.getDetail(BAL_VERSION)))); nodeEntries.put(StringUtils.fromString(BALLERINA_HOME), StringUtils.fromString((String) node.getDetail(BAL_HOME))); nodeEntries.put(StringUtils.fromString(ControlPlaneConstants.OS_NAME), StringUtils.fromString((String) node.getDetail(OS_NAME))); - nodeEntries.put(StringUtils.fromString(OS_VERSION), - StringUtils.fromString((String) node.getDetail(OS_VERSION))); + nodeEntries.put(StringUtils.fromString(OS_VERSION), StringUtils.fromString((String) node.getDetail(OS_VERSION))); return ValueCreator.createReadonlyRecordValue(currentModule, "Node", nodeEntries); } - public static Object getArtifacts(Environment env, BString resourceType, Object searchKey, BTypedesc typedesc) { - Module currentModule = env.getCurrentModule(); - Type artifactType = TypeUtils.getImpliedType(typedesc.getDescribingType()); - List artifacts = env.getRepository().getArtifacts(); - List artifactEntries = new ArrayList<>(); - for (Artifact artifact : artifacts) { - BObject serviceObj = (BObject) artifact.getDetail("service"); - Type originalType = serviceObj.getOriginalType(); - Module module = originalType.getPackage(); - if (module != null && module.equals(currentModule)) { - continue; - } - BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString("name"), StringUtils.fromString(originalType.toString())); - service.put(StringUtils.fromString("attachPoint"), getAttachPointString(artifact)); - service.put(StringUtils.fromString("metadata"), getServiceMetadata(artifact, serviceObj, currentModule)); - service.put(StringUtils.fromString("annotations"), getServiceAnnotations(serviceObj)); - artifactEntries.add(ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); - } - ArrayType arrayType = TypeCreator.createArrayType(artifactType, true); - return ValueCreator.createArrayValue(arrayType, artifactEntries.toArray(BListInitialValueEntry[]::new)); - } - - private static BMap getServiceMetadata(Artifact artifact, BObject serviceObj, Module module) { - BMap metadata = ValueCreator.createRecordValue(module, "Metadata"); - List listeners = (List) artifact.getDetail("listeners"); - BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; - for (int i = 0; i < listeners.size(); i++) { - BObject listener = listeners.get(i); - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("type"), StringUtils.fromString(listener.getOriginalType() - .toString())); - // Need to add listener properties according to the listener type - BMap properties = getMapAnydataValue(); - addListenerProperty(listener, "port", properties); - listenerRecord.put(StringUtils.fromString("properties"), properties); - listenerEntries[i] = ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(module, - "Listener", listenerRecord)); - } - ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( - ValueCreator.createRecordValue(module, "Listener")), true); - metadata.put(StringUtils.fromString("listeners"), - ValueCreator.createArrayValue(arrayType, listenerEntries)); - metadata.put(StringUtils.fromString("metadata"), getMapAnydataValue()); - return metadata; + private static String getBallerinaVersionString(String detail) { + String version = detail.split("-")[0]; + int minorVersion = Integer.parseInt(version.split("\\.")[1]); + String updateVersionText = minorVersion > 0 ? " Update " + minorVersion : ""; + return "Ballerina " + version + " (Swan Lake Update " + updateVersionText + ")"; } - private static BMap getMapAnydataValue() { - return ValueCreator.createMapValue(TypeCreator.createMapType(PredefinedTypes.TYPE_ANYDATA)); + public static boolean isControlPlaneService(BObject serviceObj, Module currentModule) { + Type originalType = serviceObj.getOriginalType(); + Module module = originalType.getPackage(); + return module != null && module.equals(currentModule); } - private static Object getServiceAnnotations(BObject serviceObj) { - BMap mapValue = getMapAnydataValue(); - AnnotatableType serviceType = (AnnotatableType) TypeUtils.getImpliedType(serviceObj.getOriginalType()); - for (Map.Entry entry : serviceType.getAnnotations().entrySet()) { - mapValue.put(entry.getKey(), entry.getValue()); - } - return mapValue; - } - private static void addListenerProperty(BObject listener, String fieldName, BMap properties) { - try { - Object value = listener.get(StringUtils.fromString(fieldName)); - properties.put(StringUtils.fromString(fieldName), value); - } catch (BError e) { - // this means no such field in the object - } - } - - private static Object getAttachPointString(Artifact artifact) { - Object attachPoint = artifact.getDetail("attachPoint"); - if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { - BArray array = (BArray) attachPoint; - StringBuilder attachPointStr = new StringBuilder(); - for (int i = 0; i < array.size(); i++) { - attachPointStr.append(PATH_SEPARATOR).append(array.getBString(i).getValue()); - } - return StringUtils.fromString(attachPointStr.toString()); - } - return attachPoint; - } } From dfe81824aa7df6db353d17f920689b3b65937bf2 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Thu, 25 Apr 2024 21:00:20 +0530 Subject: [PATCH 02/18] Add ballerina listeners API --- .../artifacts-tests/tests/test.bal | 17 ++- ballerina/icpService.bal | 4 +- ballerina/types.bal | 6 +- .../lib/wso2/controlplane/ArtifactUtils.java | 23 ++- .../controlplane/ListenerArtifactHandler.java | 134 +++++++----------- .../controlplane/ServiceArtifactHandler.java | 57 ++++---- .../lib/wso2/controlplane/Utils.java | 5 +- 7 files changed, 119 insertions(+), 127 deletions(-) diff --git a/ballerina-tests/artifacts-tests/tests/test.bal b/ballerina-tests/artifacts-tests/tests/test.bal index 05cea30..a253501 100644 --- a/ballerina-tests/artifacts-tests/tests/test.bal +++ b/ballerina-tests/artifacts-tests/tests/test.bal @@ -33,7 +33,7 @@ public function testGetBallerinaNode() returns error? { } @test:Config {} -public function testGetBallerinaArtifacts() returns error? { +public function testGetBallerinaServiceArtifacts() returns error? { http:Client rmClient = check new (testURL, secureSocket = { enable: false @@ -47,6 +47,21 @@ public function testGetBallerinaArtifacts() returns error? { test:assertTrue(artifact is cp:ServiceDetail, "Invalid response received"); } +@test:Config {} +public function testGetBallerinaListenerArtifacts() returns error? { + http:Client rmClient = check new (testURL, + secureSocket = { + enable: false + } + ); + cp:Artifacts|error artifacts = rmClient->/management/listeners(); + test:assertTrue(artifacts is cp:Artifacts, "Invalid response received"); + test:assertTrue(artifacts.count() == 1, "No services found"); + + cp:ArtifactDetail|error artifact = rmClient->/management/listeners(name = "listener_1"); + test:assertTrue(artifact is cp:ListenerDetail, "Invalid response received"); +} + service /hello on new http:Listener(testPort) { resource function get greeting() returns string { diff --git a/ballerina/icpService.bal b/ballerina/icpService.bal index 56fd385..bd0f1b7 100644 --- a/ballerina/icpService.bal +++ b/ballerina/icpService.bal @@ -45,7 +45,7 @@ service /management on securedEP { list: artifacts }; } - return getDetailedArtifact(resourceType, name, ArtifactDetail); + return getDetailedArtifact(resourceType, name); } } @@ -53,7 +53,7 @@ isolated function getBallerinaNode() returns Node|error = @java:Method { 'class: "io.ballerina.lib.wso2.controlplane.Utils" } external; -isolated function getDetailedArtifact(string resourceType, string name, typedesc t) returns ArtifactDetail|error = +isolated function getDetailedArtifact(string resourceType, string name) returns ArtifactDetail|error = @java:Method { 'class: "io.ballerina.lib.wso2.controlplane.ArtifactUtils" } external; diff --git a/ballerina/types.bal b/ballerina/types.bal index b14fd2c..6dd9d9f 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -82,7 +82,7 @@ public type Listener record { int port; }; -public type RequestsLimit record { +public type RequestLimit record { int maxUriLength; int maxHeaderSize; int maxEntityBodySize; @@ -92,8 +92,8 @@ public type ListenerDetail record { string package; string httpVersion; string host; - int timeout; - RequestsLimit requestsLimit; + decimal timeout; + RequestLimit requestLimit; }; public type Node record { diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index 4416dcd..4bf0d83 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -47,11 +47,11 @@ public class ArtifactUtils { static List artifacts; private static Module currentModule; - private static ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); - private static ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); + private static final ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); + private static final ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); - static final Map serviceNamesMap = new HashMap<>(); - static final Map listenerNamesMap = new HashMap<>(); + static final Map SERVICE_NAMES_MAP = new HashMap<>(); + static final Map LISTENER_NAMES_MAP = new HashMap<>(); private static int serviceCounter = 1; private static int listenerCounter = 1; @@ -81,20 +81,19 @@ private static void populateArtifactNamesMap() { continue; } - if (!serviceNamesMap.containsKey(serviceObj)) { - serviceNamesMap.put(serviceObj, "service_" + serviceCounter++); + if (!SERVICE_NAMES_MAP.containsKey(serviceObj)) { + SERVICE_NAMES_MAP.put(serviceObj, "service_" + serviceCounter++); } List listeners = (List) artifact.getDetail("listeners"); for (BObject listener : listeners) { - if (!listenerNamesMap.containsKey(listener)) { - listenerNamesMap.put(listener, "listener_" + listenerCounter++); + if (!LISTENER_NAMES_MAP.containsKey(listener)) { + LISTENER_NAMES_MAP.put(listener, "listener_" + listenerCounter++); } } } } - public static Object getDetailedArtifact(Environment env, BString resourceType, BString name, - BTypedesc typedesc) { + public static Object getDetailedArtifact(BString resourceType, BString name) { String value = name.getValue(); if (resourceType.getValue().equals(SERVICES_RESOURCE)) { Artifact artifact = getServiceArtifact(value); @@ -113,7 +112,7 @@ public static Object getDetailedArtifact(Environment env, BString resourceType, } private static BObject getListenerArtifact(String name) { - for (Map.Entry entry : listenerNamesMap.entrySet()) { + for (Map.Entry entry : LISTENER_NAMES_MAP.entrySet()) { if (entry.getValue().equals(name)) { return (BObject) entry.getKey(); } @@ -124,7 +123,7 @@ private static BObject getListenerArtifact(String name) { private static Artifact getServiceArtifact(String name) { for (Artifact artifact : artifacts) { BObject serviceObj = (BObject) artifact.getDetail("service"); - if (name.equals(serviceNamesMap.get(serviceObj))) { + if (name.equals(SERVICE_NAMES_MAP.get(serviceObj))) { return artifact; } } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java index 11e7aa1..423dda4 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java @@ -18,27 +18,20 @@ import io.ballerina.runtime.api.Artifact; import io.ballerina.runtime.api.Module; -import io.ballerina.runtime.api.PredefinedTypes; -import io.ballerina.runtime.api.TypeTags; -import io.ballerina.runtime.api.creators.TypeCreator; import io.ballerina.runtime.api.creators.ValueCreator; -import io.ballerina.runtime.api.types.AnnotatableType; -import io.ballerina.runtime.api.types.ArrayType; import io.ballerina.runtime.api.types.Type; import io.ballerina.runtime.api.utils.StringUtils; -import io.ballerina.runtime.api.utils.TypeUtils; -import io.ballerina.runtime.api.values.BArray; -import io.ballerina.runtime.api.values.BError; import io.ballerina.runtime.api.values.BListInitialValueEntry; import io.ballerina.runtime.api.values.BMap; import io.ballerina.runtime.api.values.BObject; import io.ballerina.runtime.api.values.BString; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Set; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PATH_SEPARATOR; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; /** * Native function implementations of the wso2 control plane module. @@ -49,87 +42,70 @@ public class ListenerArtifactHandler { public List getListenerList(Module currentModule) { List artifactEntries = new ArrayList<>(); - for (Artifact artifact : ArtifactUtils.artifacts) { - BObject serviceObj = (BObject) artifact.getDetail("service"); - Type originalType = serviceObj.getOriginalType(); - Module module = originalType.getPackage(); - if (module != null && module.equals(currentModule)) { - continue; - } - BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString("name"), StringUtils.fromString(originalType.toString())); - service.put(StringUtils.fromString("type"), "Service"); - service.put(StringUtils.fromString("metadata"), getServiceMetadata(artifact, serviceObj, currentModule)); - service.put(StringUtils.fromString("annotations"), getServiceAnnotations(serviceObj)); - artifactEntries.add(ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); + Set listeners = getNonDuplicatedListeners(ArtifactUtils.artifacts, currentModule); + for (BObject listener : listeners) { + artifactEntries.add(ValueCreator.createListInitialValueEntry(getServiceListener(listener, currentModule))); } return artifactEntries; } - public BMap getDetailedListener(BObject listener, Module currentModule) { -// BObject serviceObj = (BObject) artifact.getDetail("service"); -// Type originalType = serviceObj.getOriginalType(); - BMap service = ValueCreator.createMapValue(); -// service.put(StringUtils.fromString("name"), StringUtils.fromString(originalType.toString())); -// service.put(StringUtils.fromString("type"), "Service"); -// service.put(StringUtils.fromString("metadata"), getServiceMetadata(artifact, serviceObj, currentModule)); -// service.put(StringUtils.fromString("annotations"), getServiceAnnotations(serviceObj)); - return ValueCreator.createReadonlyRecordValue(currentModule, "Service", service); - - } - - private static BMap getServiceMetadata(Artifact artifact, BObject serviceObj, Module module) { - BMap metadata = ValueCreator.createRecordValue(module, "Metadata"); - List listeners = (List) artifact.getDetail("listeners"); - BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; - for (int i = 0; i < listeners.size(); i++) { - BObject listener = listeners.get(i); - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("type"), StringUtils.fromString(listener.getOriginalType().toString())); - // Need to add listener properties according to the listener type - BMap properties = getMapAnydataValue(); - addListenerProperty(listener, "port", properties); - listenerRecord.put(StringUtils.fromString("properties"), properties); - listenerEntries[i] = ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); + private Set getNonDuplicatedListeners(List artifacts, Module currentModule) { + Set listeners = new HashSet<>(); + for (Artifact artifact : artifacts) { + if (Utils.isControlPlaneService((BObject) artifact.getDetail("service"), currentModule)) { + continue; + } + listeners.addAll((List) artifact.getDetail("listeners")); } - ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType(ValueCreator.createRecordValue(module, "Listener")), true); - metadata.put(StringUtils.fromString("listeners"), ValueCreator.createArrayValue(arrayType, listenerEntries)); - metadata.put(StringUtils.fromString("metadata"), getMapAnydataValue()); - return metadata; + return listeners; } - private static BMap getMapAnydataValue() { - return ValueCreator.createMapValue(TypeCreator.createMapType(PredefinedTypes.TYPE_ANYDATA)); + public BMap getDetailedListener(BObject listener, Module currentModule) { + // { + // "package": "testOrg/artifacts_tests:1", + // "httpVersion": "1.1", + // "host": "localhost", + // "timeout": "30000", + // "requestsLimit": { + // "maxUriLength": "32768", + // "maxHeaderSize": "8192", + // "maxEntityBodySize": "5242880" + // } + //} + Type originalType = listener.getOriginalType(); + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString("package"), + StringUtils.fromString(originalType.getPackage().toString())); + BMap config = (BMap) + listener.get(StringUtils.fromString("inferredConfig")); + listenerRecord.put(StringUtils.fromString("httpVersion"), + StringUtils.fromString(config.get(StringUtils.fromString("httpVersion")).toString())); + listenerRecord.put(StringUtils.fromString("host"), + StringUtils.fromString(config.get(StringUtils.fromString("host")).toString())); + listenerRecord.put(StringUtils.fromString("timeout"), + config.get(StringUtils.fromString("timeout"))); + listenerRecord.put(StringUtils.fromString("requestLimit"), getRequestLimit(config, currentModule)); + return ValueCreator.createReadonlyRecordValue(currentModule, "ListenerDetail", listenerRecord); } - private static Object getServiceAnnotations(BObject serviceObj) { - BMap mapValue = getMapAnydataValue(); - AnnotatableType serviceType = (AnnotatableType) TypeUtils.getImpliedType(serviceObj.getOriginalType()); - for (Map.Entry entry : serviceType.getAnnotations().entrySet()) { - mapValue.put(entry.getKey(), entry.getValue()); - } - return mapValue; + private static BMap getRequestLimit(BMap config, Module module) { + return ValueCreator.createReadonlyRecordValue(module, "RequestLimit", + (BMap) config.getMapValue(StringUtils.fromString("requestLimits"))); } - private static void addListenerProperty(BObject listener, String fieldName, BMap properties) { - try { - Object value = listener.get(StringUtils.fromString(fieldName)); - properties.put(StringUtils.fromString(fieldName), value); - } catch (BError e) { - // this means no such field in the object - } + public static BMap getServiceListener(BObject listener, Module module) { + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString("name"), StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); + listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); + listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); + return ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord); } - private static Object getAttachPointString(Artifact artifact) { - Object attachPoint = artifact.getDetail("attachPoint"); - if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { - BArray array = (BArray) attachPoint; - StringBuilder attachPointStr = new StringBuilder(); - for (int i = 0; i < array.size(); i++) { - attachPointStr.append(PATH_SEPARATOR).append(array.getBString(i).getValue()); - } - return StringUtils.fromString(attachPointStr.toString()); - } - return attachPoint; + private static BString getListenerProtocol(BObject listener) { + BMap config = (BMap) + listener.get(StringUtils.fromString("inferredConfig")); + Object secureSocket = config.get(StringUtils.fromString("secureSocket")); + return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); } + } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java index 2d6f82c..51620b2 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -36,8 +36,8 @@ import java.util.ArrayList; import java.util.List; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.listenerNamesMap; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.serviceNamesMap; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.SERVICE_NAMES_MAP; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PATH_SEPARATOR; /** @@ -55,9 +55,10 @@ public List getServiceList(Module currentModule) { continue; } BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString("name"), StringUtils.fromString(serviceNamesMap.get(serviceObj))); + service.put(StringUtils.fromString("name"), StringUtils.fromString(SERVICE_NAMES_MAP.get(serviceObj))); service.put(StringUtils.fromString("basePath"), getAttachPointString(artifact));; - artifactEntries.add(ValueCreator.createListInitialValueEntry(ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); + artifactEntries.add(ValueCreator.createListInitialValueEntry( + ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); } return artifactEntries; } @@ -72,29 +73,6 @@ public BMap getDetailedService(Artifact artifact, Module curren return ValueCreator.createReadonlyRecordValue(currentModule, "ServiceDetail", service); } - private static BArray getServiceListeners(List listeners, Module module) { - BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; - for (int i = 0; i < listeners.size(); i++) { - BObject listener = listeners.get(i); - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("name"), StringUtils.fromString(listenerNamesMap.get(listener))); - listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); - listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); - listenerEntries[i] = ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); - } - ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( - ValueCreator.createRecordValue(module, "Listener")), true); - return ValueCreator.createArrayValue(arrayType, listenerEntries); - } - - private static BString getListenerProtocol(BObject listener) { - BMap config = (BMap) - listener.get(StringUtils.fromString("inferredConfig")); - Object secureSocket = config.get(StringUtils.fromString("secureSocket")); - return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); - } - private static Object getServiceResources(BObject serviceObj, Module currentModule) { ResourceMethodType[] resourceMethods = ((NetworkObjectType) serviceObj.getType()).getResourceMethods(); BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[resourceMethods.length]; @@ -150,4 +128,29 @@ private static Object getAttachPointString(Artifact artifact) { } return attachPoint; } + + private BArray getServiceListeners(List listeners, Module module) { + BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; + for (int i = 0; i < listeners.size(); i++) { + BObject listener = listeners.get(i); + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString("name"), + StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); + listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); + listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); + listenerEntries[i] = ValueCreator.createListInitialValueEntry( + ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); + } + ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( + ValueCreator.createRecordValue(module, "Listener")), true); + return ValueCreator.createArrayValue(arrayType, listenerEntries); + } + + private BString getListenerProtocol(BObject listener) { + BMap config = (BMap) + listener.get(StringUtils.fromString("inferredConfig")); + Object secureSocket = config.get(StringUtils.fromString("secureSocket")); + return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); + } + } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java index 2a11c98..cca74ce 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java @@ -50,7 +50,8 @@ public static Object getBallerinaNode(Environment env) { StringUtils.fromString((String) node.getDetail(BAL_HOME))); nodeEntries.put(StringUtils.fromString(ControlPlaneConstants.OS_NAME), StringUtils.fromString((String) node.getDetail(OS_NAME))); - nodeEntries.put(StringUtils.fromString(OS_VERSION), StringUtils.fromString((String) node.getDetail(OS_VERSION))); + nodeEntries.put(StringUtils.fromString(OS_VERSION), + StringUtils.fromString((String) node.getDetail(OS_VERSION))); return ValueCreator.createReadonlyRecordValue(currentModule, "Node", nodeEntries); } @@ -66,6 +67,4 @@ public static boolean isControlPlaneService(BObject serviceObj, Module currentMo Module module = originalType.getPackage(); return module != null && module.equals(currentModule); } - - } From e521093cfde720311880cba7a1870279674e73f2 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Thu, 25 Apr 2024 21:53:13 +0530 Subject: [PATCH 03/18] Refactor added APIs --- ballerina/types.bal | 2 +- .../lib/wso2/controlplane/ArtifactUtils.java | 15 +++-- .../controlplane/ControlPlaneConstants.java | 28 +++++++- .../controlplane/ListenerArtifactHandler.java | 66 +++++++------------ .../controlplane/ServiceArtifactHandler.java | 65 +++++++++--------- .../lib/wso2/controlplane/Utils.java | 27 +++++++- 6 files changed, 119 insertions(+), 84 deletions(-) diff --git a/ballerina/types.bal b/ballerina/types.bal index 6dd9d9f..1b47def 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -93,7 +93,7 @@ public type ListenerDetail record { string httpVersion; string host; decimal timeout; - RequestLimit requestLimit; + RequestLimit requestLimits; }; public type Node record { diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index 4bf0d83..bc767f1 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -35,7 +35,9 @@ import java.util.List; import java.util.Map; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICES_RESOURCE; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; /** * Native function implementations of the wso2 control plane module. @@ -43,7 +45,8 @@ * @since 1.0.0 */ public class ArtifactUtils { - + private static final String SERVICE_PREFIX = "service_"; + private static final String LISTENER_PREFIX = "listener_"; static List artifacts; private static Module currentModule; @@ -76,18 +79,18 @@ public static Object getArtifacts(Environment env, BString resourceType, BTypede private static void populateArtifactNamesMap() { for (Artifact artifact : artifacts) { - BObject serviceObj = (BObject) artifact.getDetail("service"); + BObject serviceObj = (BObject) artifact.getDetail(SERVICE); if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; } if (!SERVICE_NAMES_MAP.containsKey(serviceObj)) { - SERVICE_NAMES_MAP.put(serviceObj, "service_" + serviceCounter++); + SERVICE_NAMES_MAP.put(serviceObj, SERVICE_PREFIX + serviceCounter++); } - List listeners = (List) artifact.getDetail("listeners"); + List listeners = (List) artifact.getDetail(LISTENERS); for (BObject listener : listeners) { if (!LISTENER_NAMES_MAP.containsKey(listener)) { - LISTENER_NAMES_MAP.put(listener, "listener_" + listenerCounter++); + LISTENER_NAMES_MAP.put(listener, LISTENER_PREFIX + listenerCounter++); } } } @@ -122,7 +125,7 @@ private static BObject getListenerArtifact(String name) { private static Artifact getServiceArtifact(String name) { for (Artifact artifact : artifacts) { - BObject serviceObj = (BObject) artifact.getDetail("service"); + BObject serviceObj = (BObject) artifact.getDetail(SERVICE); if (name.equals(SERVICE_NAMES_MAP.get(serviceObj))) { return artifact; } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java index 626c000..e11ac6e 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java @@ -7,9 +7,7 @@ public class ControlPlaneConstants { public static final String BAL_HOME = "balHome"; public static final String BAL_VERSION = "balVersion"; public static final String OS_NAME = "osName"; - public static final String PATH_SEPARATOR = "/"; public static final String SERVICES_RESOURCE = "services"; - public static final String SINGLE_SLASH = "/"; public static final String PATH_PARAM_IDENTIFIER = "^"; public static final String OPEN_CURL_IDENTIFIER = "{"; @@ -18,4 +16,30 @@ public class ControlPlaneConstants { public static final String STAR_IDENTIFIER = "*"; public static final String DOT_IDENTIFIER = "."; public static final String REGEX = "(? getListenerList(Module currentModule) { private Set getNonDuplicatedListeners(List artifacts, Module currentModule) { Set listeners = new HashSet<>(); for (Artifact artifact : artifacts) { - if (Utils.isControlPlaneService((BObject) artifact.getDetail("service"), currentModule)) { + if (Utils.isControlPlaneService((BObject) artifact.getDetail(SERVICE), currentModule)) { continue; } - listeners.addAll((List) artifact.getDetail("listeners")); + listeners.addAll((List) artifact.getDetail(LISTENERS)); } return listeners; } public BMap getDetailedListener(BObject listener, Module currentModule) { - // { - // "package": "testOrg/artifacts_tests:1", - // "httpVersion": "1.1", - // "host": "localhost", - // "timeout": "30000", - // "requestsLimit": { - // "maxUriLength": "32768", - // "maxHeaderSize": "8192", - // "maxEntityBodySize": "5242880" - // } - //} Type originalType = listener.getOriginalType(); BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("package"), + listenerRecord.put(StringUtils.fromString(PACKAGE), StringUtils.fromString(originalType.getPackage().toString())); BMap config = (BMap) - listener.get(StringUtils.fromString("inferredConfig")); - listenerRecord.put(StringUtils.fromString("httpVersion"), - StringUtils.fromString(config.get(StringUtils.fromString("httpVersion")).toString())); - listenerRecord.put(StringUtils.fromString("host"), - StringUtils.fromString(config.get(StringUtils.fromString("host")).toString())); - listenerRecord.put(StringUtils.fromString("timeout"), - config.get(StringUtils.fromString("timeout"))); - listenerRecord.put(StringUtils.fromString("requestLimit"), getRequestLimit(config, currentModule)); - return ValueCreator.createReadonlyRecordValue(currentModule, "ListenerDetail", listenerRecord); + listener.get(StringUtils.fromString(INFERRED_CONFIG)); + listenerRecord.put(StringUtils.fromString(HTTP_VERSION), + StringUtils.fromString(config.get(StringUtils.fromString(HTTP_VERSION)).toString())); + listenerRecord.put(StringUtils.fromString(HOST), + StringUtils.fromString(config.get(StringUtils.fromString(HOST)).toString())); + listenerRecord.put(StringUtils.fromString(TIMEOUT), + config.get(StringUtils.fromString(TIMEOUT))); + listenerRecord.put(StringUtils.fromString(REQUEST_LIMITS), getRequestLimit(config, currentModule)); + return ValueCreator.createReadonlyRecordValue(currentModule, LISTENER_DETAIL, listenerRecord); } private static BMap getRequestLimit(BMap config, Module module) { - return ValueCreator.createReadonlyRecordValue(module, "RequestLimit", - (BMap) config.getMapValue(StringUtils.fromString("requestLimits"))); - } - - public static BMap getServiceListener(BObject listener, Module module) { - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("name"), StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); - listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); - listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); - return ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord); - } - - private static BString getListenerProtocol(BObject listener) { - BMap config = (BMap) - listener.get(StringUtils.fromString("inferredConfig")); - Object secureSocket = config.get(StringUtils.fromString("secureSocket")); - return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); + return ValueCreator.createReadonlyRecordValue(module, REQUEST_LIMIT, + (BMap) config.getMapValue(StringUtils.fromString(REQUEST_LIMITS))); } } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java index 51620b2..fa721eb 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -36,9 +36,21 @@ import java.util.ArrayList; import java.util.List; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.SERVICE_NAMES_MAP; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PATH_SEPARATOR; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ATTACH_POINT; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BASE_PATH; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.METHODS; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PACKAGE; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.RESOURCE; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.RESOURCES; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE_DETAIL; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE_RECORD; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SINGLE_SLASH; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.URL; /** * Native function implementations of the wso2 control plane module. @@ -50,27 +62,27 @@ public class ServiceArtifactHandler { public List getServiceList(Module currentModule) { List artifactEntries = new ArrayList<>(); for (Artifact artifact : ArtifactUtils.artifacts) { - BObject serviceObj = (BObject) artifact.getDetail("service"); + BObject serviceObj = (BObject) artifact.getDetail(SERVICE); if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; } BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString("name"), StringUtils.fromString(SERVICE_NAMES_MAP.get(serviceObj))); - service.put(StringUtils.fromString("basePath"), getAttachPointString(artifact));; + service.put(StringUtils.fromString(NAME), StringUtils.fromString(SERVICE_NAMES_MAP.get(serviceObj))); + service.put(StringUtils.fromString(BASE_PATH), getAttachPointString(artifact)); artifactEntries.add(ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(currentModule, "Service", service))); + ValueCreator.createReadonlyRecordValue(currentModule, SERVICE_RECORD, service))); } return artifactEntries; } public BMap getDetailedService(Artifact artifact, Module currentModule) { - BObject serviceObj = (BObject) artifact.getDetail("service"); + BObject serviceObj = (BObject) artifact.getDetail(SERVICE); Type originalType = serviceObj.getOriginalType(); BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString("package"), StringUtils.fromString(originalType.getPackage().toString())); - service.put(StringUtils.fromString("listeners"), getServiceListeners((List) - artifact.getDetail("listeners"), currentModule)); - service.put(StringUtils.fromString("resources"), getServiceResources(serviceObj, currentModule)); - return ValueCreator.createReadonlyRecordValue(currentModule, "ServiceDetail", service); + service.put(StringUtils.fromString(PACKAGE), StringUtils.fromString(originalType.getPackage().toString())); + service.put(StringUtils.fromString(LISTENERS), getServiceListeners((List) + artifact.getDetail(LISTENERS), currentModule)); + service.put(StringUtils.fromString(RESOURCES), getServiceResources(serviceObj, currentModule)); + return ValueCreator.createReadonlyRecordValue(currentModule, SERVICE_DETAIL, service); } private static Object getServiceResources(BObject serviceObj, Module currentModule) { @@ -79,13 +91,13 @@ private static Object getServiceResources(BObject serviceObj, Module currentModu for (int i = 0; i < resourceMethods.length; i++) { ResourceMethodType resourceMethod = resourceMethods[i]; BMap resourceRecord = ValueCreator.createMapValue(); - resourceRecord.put(StringUtils.fromString("methods"), getAccessorArray(resourceMethod)); - resourceRecord.put(StringUtils.fromString("url"), getUrl(resourceMethod)); + resourceRecord.put(StringUtils.fromString(METHODS), getAccessorArray(resourceMethod)); + resourceRecord.put(StringUtils.fromString(URL), getUrl(resourceMethod)); listenerEntries[i] = ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(currentModule, "Resource", resourceRecord)); + ValueCreator.createReadonlyRecordValue(currentModule, RESOURCE, resourceRecord)); } ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( - ValueCreator.createRecordValue(currentModule, "Resource")), true); + ValueCreator.createRecordValue(currentModule, RESOURCE)), true); return ValueCreator.createArrayValue(arrayType, listenerEntries); } @@ -117,12 +129,12 @@ private static BArray getAccessorArray(ResourceMethodType resourceMethod) { } private static Object getAttachPointString(Artifact artifact) { - Object attachPoint = artifact.getDetail("attachPoint"); + Object attachPoint = artifact.getDetail(ATTACH_POINT); if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { BArray array = (BArray) attachPoint; StringBuilder attachPointStr = new StringBuilder(); for (int i = 0; i < array.size(); i++) { - attachPointStr.append(PATH_SEPARATOR).append(array.getBString(i).getValue()); + attachPointStr.append(SINGLE_SLASH).append(array.getBString(i).getValue()); } return StringUtils.fromString(attachPointStr.toString()); } @@ -133,24 +145,11 @@ private BArray getServiceListeners(List listeners, Module module) { BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; for (int i = 0; i < listeners.size(); i++) { BObject listener = listeners.get(i); - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString("name"), - StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); - listenerRecord.put(StringUtils.fromString("protocol"), getListenerProtocol(listener)); - listenerRecord.put(StringUtils.fromString("port"), listener.get(StringUtils.fromString("port"))); - listenerEntries[i] = ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(module, "Listener", listenerRecord)); + listenerEntries[i] = ValueCreator.createListInitialValueEntry(Utils.getServiceListener(listener, module)); } ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( - ValueCreator.createRecordValue(module, "Listener")), true); + ValueCreator.createRecordValue(module, LISTENER)), true); return ValueCreator.createArrayValue(arrayType, listenerEntries); } - private BString getListenerProtocol(BObject listener) { - BMap config = (BMap) - listener.get(StringUtils.fromString("inferredConfig")); - Object secureSocket = config.get(StringUtils.fromString("secureSocket")); - return StringUtils.fromString(secureSocket == null ? "HTTP" : "HTTPS"); - } - } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java index cca74ce..c88d3cf 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java @@ -26,12 +26,22 @@ import io.ballerina.runtime.api.values.BObject; import io.ballerina.runtime.api.values.BString; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA_HOME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_HOME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_VERSION; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTPS; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.INFERRED_CONFIG; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NODE; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_NAME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_VERSION; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PLATFORM_VERSION; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PORT; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PROTOCOL; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SECURE_SOCKET; /** * Native function implementations of the wso2 control plane module. @@ -52,7 +62,7 @@ public static Object getBallerinaNode(Environment env) { StringUtils.fromString((String) node.getDetail(OS_NAME))); nodeEntries.put(StringUtils.fromString(OS_VERSION), StringUtils.fromString((String) node.getDetail(OS_VERSION))); - return ValueCreator.createReadonlyRecordValue(currentModule, "Node", nodeEntries); + return ValueCreator.createReadonlyRecordValue(currentModule, NODE, nodeEntries); } private static String getBallerinaVersionString(String detail) { @@ -67,4 +77,19 @@ public static boolean isControlPlaneService(BObject serviceObj, Module currentMo Module module = originalType.getPackage(); return module != null && module.equals(currentModule); } + + public static BMap getServiceListener(BObject listener, Module module) { + BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString(NAME), StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); + listenerRecord.put(StringUtils.fromString(PROTOCOL), getListenerProtocol(listener)); + listenerRecord.put(StringUtils.fromString(PORT), listener.get(StringUtils.fromString(PORT))); + return ValueCreator.createReadonlyRecordValue(module, LISTENER, listenerRecord); + } + + private static BString getListenerProtocol(BObject listener) { + BMap config = (BMap) + listener.get(StringUtils.fromString(INFERRED_CONFIG)); + Object secureSocket = config.get(StringUtils.fromString(SECURE_SOCKET)); + return StringUtils.fromString(secureSocket == null ? HTTP : HTTPS); + } } From 6efca3f1eca8eb5ef355724a64d1de0253342107 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 08:10:34 +0530 Subject: [PATCH 04/18] Filter HTTP artifacts --- gradle.properties | 2 +- .../lib/wso2/controlplane/ArtifactUtils.java | 26 ++++++++++++++++++- .../controlplane/ControlPlaneConstants.java | 1 + .../controlplane/ListenerArtifactHandler.java | 4 ++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 52df996..f69cab6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ version=1.0.0-SNAPSHOT puppycrawlCheckstyleVersion=10.12.0 jacocoVersion=0.8.10 testngVersion=7.6.1 -ballerinaLangVersion=2201.9.0-20240408-101100-fa2ff301 +ballerinaLangVersion=2201.9.0-20240425-195200-d5ce8c72 ballerinaTomlParserVersion=1.2.2 stdlibIoVersion=1.6.0 diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index bc767f1..0f170e0 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -31,10 +31,13 @@ import io.ballerina.runtime.api.values.BString; import io.ballerina.runtime.api.values.BTypedesc; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICES_RESOURCE; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; @@ -63,7 +66,7 @@ private ArtifactUtils() { } public static Object getArtifacts(Environment env, BString resourceType, BTypedesc typedesc) { - artifacts = env.getRepository().getArtifacts(); + artifacts = filterHttpArtifacts(env.getRepository().getArtifacts()); currentModule = env.getCurrentModule(); populateArtifactNamesMap(); Type artifactType = TypeUtils.getImpliedType(typedesc.getDescribingType()); @@ -77,6 +80,27 @@ public static Object getArtifacts(Environment env, BString resourceType, BTypede return ValueCreator.createArrayValue(arrayType, artifactEntries.toArray(BListInitialValueEntry[]::new)); } + private static List filterHttpArtifacts(List artifacts) { + List httpArtifacts = new ArrayList<>(); + for (Artifact artifact : artifacts) { + BObject serviceObj = (BObject) artifact.getDetail(SERVICE); + if (Utils.isControlPlaneService(serviceObj, currentModule)) { + continue; + } + List listeners = (List) artifact.getDetail(LISTENERS); + for (BObject listener : listeners) { + Type listenerType = TypeUtils.getImpliedType(listener.getOriginalType()); + Module typePackage = listenerType.getPackage(); + if (listenerType.getName().equals(LISTENER) && typePackage.getOrg().equals(BALLERINA) + && typePackage.getName().equals("http")) { + httpArtifacts.add(artifact); + break; + } + } + } + return httpArtifacts; + } + private static void populateArtifactNamesMap() { for (Artifact artifact : artifacts) { BObject serviceObj = (BObject) artifact.getDetail(SERVICE); diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java index e11ac6e..0050f6b 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java @@ -35,6 +35,7 @@ public class ControlPlaneConstants { public static final String HOST = "host"; public static final String TIMEOUT = "timeout"; public static final String REQUEST_LIMITS = "requestLimits"; + public static final String BALLERINA = "ballerina"; public static final String LISTENER = "Listener"; public static final String RESOURCE = "Resource"; public static final String SERVICE_RECORD = "Service"; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java index cedbca5..c25b961 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java @@ -49,7 +49,9 @@ * @since 1.0.0 */ public class ListenerArtifactHandler { - + //TODO: HTTP Validation + //TODO: BASIC Auth Validation + //TODO: NODE ID Generation public List getListenerList(Module currentModule) { List artifactEntries = new ArrayList<>(); Set listeners = getNonDuplicatedListeners(ArtifactUtils.artifacts, currentModule); From 64b4cc800e2cd9d83efc046dcd822bfa467c75aa Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 11:55:56 +0530 Subject: [PATCH 05/18] Add node ID generation --- ballerina/types.bal | 9 +++++---- .../lib/wso2/controlplane/ListenerArtifactHandler.java | 3 --- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ballerina/types.bal b/ballerina/types.bal index 1b47def..f15467f 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -13,6 +13,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. +import ballerina/uuid; type IntegrationPlaneConnectionRequest record { string product = "bal"; @@ -38,12 +39,12 @@ type AccessTokenResponse record {| |}; type DashBoard record { - string url = ""; + string url; int heartbeatInterval = 10; decimal waitTimeForServicesInSeconds = 5; - string groupId = ""; - string nodeId = ""; - string mgtApiUrl = ""; + string groupId; + string nodeId = uuid:createType4AsString(); + string mgtApiUrl; }; public type Artifacts record { diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java index c25b961..c13c600 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java @@ -49,9 +49,6 @@ * @since 1.0.0 */ public class ListenerArtifactHandler { - //TODO: HTTP Validation - //TODO: BASIC Auth Validation - //TODO: NODE ID Generation public List getListenerList(Module currentModule) { List artifactEntries = new ArrayList<>(); Set listeners = getNonDuplicatedListeners(ArtifactUtils.artifacts, currentModule); From b013654293a34f78455e5f4bb0153d7b558a6360 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 11:56:13 +0530 Subject: [PATCH 06/18] Update library versions --- build.gradle | 1 + gradle.properties | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index ca7f545..f1dc64e 100644 --- a/build.gradle +++ b/build.gradle @@ -95,6 +95,7 @@ subprojects { ballerinaStdLibs "io.ballerina.stdlib:cache-ballerina:${stdlibCacheVersion}" ballerinaStdLibs "io.ballerina.stdlib:observe-ballerina:${observeVersion}" ballerinaStdLibs "io.ballerina:observe-ballerina:${observeInternalVersion}" + ballerinaStdLibs "io.ballerina.stdlib:uuid-ballerina:${stdlibUuidVersion}" } } diff --git a/gradle.properties b/gradle.properties index f69cab6..3ad0903 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,21 +9,22 @@ ballerinaLangVersion=2201.9.0-20240425-195200-d5ce8c72 ballerinaTomlParserVersion=1.2.2 stdlibIoVersion=1.6.0 -stdlibHttpVersion=2.10.0-20230911-204400-1c092fe -stdlibLogVersion=2.9.0-20230911-150900-2f32c1a -stdlibFileVersion=1.9.0-20230911-153400-738b25e -stdlibCryptoVersion=2.5.0-20230911-142900-8807d07 -stdlibAuthVersion=2.10.0-20230911-153500-8c3c5cb -stdlibMimeVersion=2.9.0-20230911-153200-3add04c -stdlibJwtVersion=2.10.0-20230911-153400-b5de47b -stdlibOAuth2Version=2.10.0-20230911-153600-6710ec0 -stdlibConstraintVersion=1.4.0 +stdlibHttpVersion=2.11.0-20240426-002300-b3aa664 +stdlibLogVersion=2.9.0 +stdlibFileVersion=1.9.0 +stdlibCryptoVersion=2.7.0-20240425-223800-f7ac719 +stdlibAuthVersion=2.11.0-20240425-233400-61e1e89 +stdlibMimeVersion=2.9.0 +stdlibJwtVersion=2.11.0-20240425-233500-e9ed894 +stdlibOAuth2Version=2.11.0-20240425-233800-d8e20a5 +stdlibConstraintVersion=1.5.0 stdlibOsVersion=1.8.0 stdlibTaskVersion=2.5.0 stdlibTimeVersion=2.4.0 -stdlibCacheVersion=3.7.0 -stdlibUrlVersion=2.4.0-20230911-140700-36451a2 -observeVersion=1.2.0-20230911-133500-b3d8db3 -observeInternalVersion=1.2.0-20230911-141700-4c0454a +stdlibCacheVersion=3.8.0-20240409-101100-e2d7f4e +stdlibUrlVersion=2.4.0 +observeVersion=1.2.3-20240408-194900-a0e331f +observeInternalVersion=1.2.2-20240408-195500-1436319 +stdlibUuidVersion=1.8.0-20240425-232900-d1eb5d2 ballerinaGradlePluginVersion=2.2.4 From 20654bd0a5145a0a212e7b7fbf3a3ed3a846c083 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 12:34:20 +0530 Subject: [PATCH 07/18] [Automated] Update the native jar versions --- ballerina/Dependencies.toml | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 3c45933..8d8eab3 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -5,7 +5,7 @@ [ballerina] dependencies-toml-version = "2" -distribution-version = "2201.9.0-20240408-101100-fa2ff301" +distribution-version = "2201.9.0-20240425-195200-d5ce8c72" [[package]] org = "ballerina" @@ -41,7 +41,7 @@ dependencies = [ [[package]] org = "ballerina" name = "crypto" -version = "2.5.0" +version = "2.7.0" dependencies = [ {org = "ballerina", name = "jballerina.java"}, {org = "ballerina", name = "time"} @@ -244,7 +244,7 @@ dependencies = [ [[package]] org = "ballerina" name = "observe" -version = "1.2.2" +version = "1.2.3" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] @@ -286,6 +286,20 @@ dependencies = [ {org = "ballerina", name = "jballerina.java"} ] +[[package]] +org = "ballerina" +name = "uuid" +version = "1.8.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "uuid", moduleName = "uuid"} +] + [[package]] org = "ballerinax" name = "wso2.controlplane" @@ -297,7 +311,8 @@ dependencies = [ {org = "ballerina", name = "jwt"}, {org = "ballerina", name = "lang.runtime"}, {org = "ballerina", name = "log"}, - {org = "ballerina", name = "os"} + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "uuid"} ] modules = [ {org = "ballerinax", packageName = "wso2.controlplane", moduleName = "wso2.controlplane"} From 6a067f1a029beec132b56dd43f2e4985020e6e9e Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 15:13:32 +0530 Subject: [PATCH 08/18] Remove HTTP specific fields --- ballerina/types.bal | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ballerina/types.bal b/ballerina/types.bal index f15467f..816d969 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -80,7 +80,6 @@ public type Resource record { public type Listener record { string name; string? protocol; - int port; }; public type RequestLimit record { @@ -91,10 +90,6 @@ public type RequestLimit record { public type ListenerDetail record { string package; - string httpVersion; - string host; - decimal timeout; - RequestLimit requestLimits; }; public type Node record { From 8a61ac364b7763ffea9b9d09a286db4b18122d21 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 15:38:32 +0530 Subject: [PATCH 09/18] [Automated] Update the native jar versions --- ballerina/Dependencies.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 8d8eab3..5dcdd45 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -10,7 +10,7 @@ distribution-version = "2201.9.0-20240425-195200-d5ce8c72" [[package]] org = "ballerina" name = "auth" -version = "2.10.0" +version = "2.11.0" dependencies = [ {org = "ballerina", name = "crypto"}, {org = "ballerina", name = "jballerina.java"}, @@ -22,7 +22,7 @@ dependencies = [ [[package]] org = "ballerina" name = "cache" -version = "3.7.1" +version = "3.8.0" dependencies = [ {org = "ballerina", name = "constraint"}, {org = "ballerina", name = "jballerina.java"}, @@ -33,7 +33,7 @@ dependencies = [ [[package]] org = "ballerina" name = "constraint" -version = "1.4.0" +version = "1.5.0" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] @@ -64,7 +64,7 @@ modules = [ [[package]] org = "ballerina" name = "http" -version = "2.10.12" +version = "2.11.0" dependencies = [ {org = "ballerina", name = "auth"}, {org = "ballerina", name = "cache"}, @@ -113,7 +113,7 @@ modules = [ [[package]] org = "ballerina" name = "jwt" -version = "2.10.0" +version = "2.11.0" dependencies = [ {org = "ballerina", name = "cache"}, {org = "ballerina", name = "crypto"}, @@ -231,7 +231,7 @@ dependencies = [ [[package]] org = "ballerina" name = "oauth2" -version = "2.10.0" +version = "2.11.0" dependencies = [ {org = "ballerina", name = "cache"}, {org = "ballerina", name = "crypto"}, From c38d102230b1fab18e9263f01e68891ec9a620fc Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 17:02:42 +0530 Subject: [PATCH 10/18] Update API details --- ballerina/types.bal | 20 ++++++--------- .../controlplane/ControlPlaneConstants.java | 2 +- .../controlplane/ListenerArtifactHandler.java | 22 ++++++++++++++-- .../controlplane/ServiceArtifactHandler.java | 17 +++++++------ .../lib/wso2/controlplane/Utils.java | 25 ++++--------------- 5 files changed, 43 insertions(+), 43 deletions(-) diff --git a/ballerina/types.bal b/ballerina/types.bal index 816d969..a0e4265 100644 --- a/ballerina/types.bal +++ b/ballerina/types.bal @@ -57,18 +57,17 @@ public enum ArtifactType { LISTENER = "listeners" } -public type Artifact Service|Listener; - -public type ArtifactDetail ServiceDetail|ListenerDetail; - -public type Service record { +public type Artifact record { string name; - string? basePath; }; +public type ArtifactDetail ServiceDetail|ListenerDetail; + public type ServiceDetail record { + *Artifact; + string? basePath; string package; - Listener[] listeners; + Artifact[] listeners; Resource[] resources; }; @@ -77,11 +76,6 @@ public type Resource record { string url; }; -public type Listener record { - string name; - string? protocol; -}; - public type RequestLimit record { int maxUriLength; int maxHeaderSize; @@ -89,6 +83,8 @@ public type RequestLimit record { }; public type ListenerDetail record { + *Artifact; + string? protocol; string package; }; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java index 0050f6b..549f919 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java @@ -38,7 +38,7 @@ public class ControlPlaneConstants { public static final String BALLERINA = "ballerina"; public static final String LISTENER = "Listener"; public static final String RESOURCE = "Resource"; - public static final String SERVICE_RECORD = "Service"; + public static final String ARTIFACT = "Artifact"; public static final String SERVICE_DETAIL = "ServiceDetail"; public static final String LISTENER_DETAIL = "ListenerDetail"; public static final String REQUEST_LIMIT = "RequestLimit"; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java index c13c600..27e61c9 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java @@ -31,17 +31,24 @@ import java.util.List; import java.util.Set; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HOST; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTPS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP_VERSION; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.INFERRED_CONFIG; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER_DETAIL; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PACKAGE; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PORT; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PROTOCOL; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.REQUEST_LIMIT; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.REQUEST_LIMITS; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SECURE_SOCKET; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.TIMEOUT; -import static io.ballerina.lib.wso2.controlplane.Utils.getServiceListener; +import static io.ballerina.lib.wso2.controlplane.Utils.getArtifact; /** * Native function implementations of the wso2 control plane module. @@ -53,7 +60,8 @@ public List getListenerList(Module currentModule) { List artifactEntries = new ArrayList<>(); Set listeners = getNonDuplicatedListeners(ArtifactUtils.artifacts, currentModule); for (BObject listener : listeners) { - artifactEntries.add(ValueCreator.createListInitialValueEntry(getServiceListener(listener, currentModule))); + artifactEntries.add(ValueCreator.createListInitialValueEntry( + getArtifact(LISTENER_NAMES_MAP.get(listener), currentModule))); } return artifactEntries; } @@ -72,6 +80,9 @@ private Set getNonDuplicatedListeners(List artifacts, Module public BMap getDetailedListener(BObject listener, Module currentModule) { Type originalType = listener.getOriginalType(); BMap listenerRecord = ValueCreator.createMapValue(); + listenerRecord.put(StringUtils.fromString(NAME), StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); + listenerRecord.put(StringUtils.fromString(PROTOCOL), getListenerProtocol(listener)); + listenerRecord.put(StringUtils.fromString(PORT), listener.get(StringUtils.fromString(PORT))); listenerRecord.put(StringUtils.fromString(PACKAGE), StringUtils.fromString(originalType.getPackage().toString())); BMap config = (BMap) @@ -91,4 +102,11 @@ private static BMap getRequestLimit(BMap confi (BMap) config.getMapValue(StringUtils.fromString(REQUEST_LIMITS))); } + private static BString getListenerProtocol(BObject listener) { + BMap config = (BMap) + listener.get(StringUtils.fromString(INFERRED_CONFIG)); + Object secureSocket = config.get(StringUtils.fromString(SECURE_SOCKET)); + return StringUtils.fromString(secureSocket == null ? HTTP : HTTPS); + } + } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java index fa721eb..140dfff 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -36,10 +36,11 @@ import java.util.ArrayList; import java.util.List; +import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.SERVICE_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ARTIFACT; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ATTACH_POINT; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BASE_PATH; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.METHODS; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; @@ -48,9 +49,9 @@ import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.RESOURCES; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE_DETAIL; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE_RECORD; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SINGLE_SLASH; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.URL; +import static io.ballerina.lib.wso2.controlplane.Utils.getArtifact; /** * Native function implementations of the wso2 control plane module. @@ -66,11 +67,8 @@ public List getServiceList(Module currentModule) { if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; } - BMap service = ValueCreator.createMapValue(); - service.put(StringUtils.fromString(NAME), StringUtils.fromString(SERVICE_NAMES_MAP.get(serviceObj))); - service.put(StringUtils.fromString(BASE_PATH), getAttachPointString(artifact)); artifactEntries.add(ValueCreator.createListInitialValueEntry( - ValueCreator.createReadonlyRecordValue(currentModule, SERVICE_RECORD, service))); + getArtifact(SERVICE_NAMES_MAP.get(serviceObj), currentModule))); } return artifactEntries; } @@ -78,6 +76,8 @@ public BMap getDetailedService(Artifact artifact, Module curren BObject serviceObj = (BObject) artifact.getDetail(SERVICE); Type originalType = serviceObj.getOriginalType(); BMap service = ValueCreator.createMapValue(); + service.put(StringUtils.fromString(NAME), StringUtils.fromString(SERVICE_NAMES_MAP.get(serviceObj))); + service.put(StringUtils.fromString(BASE_PATH), getAttachPointString(artifact)); service.put(StringUtils.fromString(PACKAGE), StringUtils.fromString(originalType.getPackage().toString())); service.put(StringUtils.fromString(LISTENERS), getServiceListeners((List) artifact.getDetail(LISTENERS), currentModule)); @@ -145,10 +145,11 @@ private BArray getServiceListeners(List listeners, Module module) { BListInitialValueEntry[] listenerEntries = new BListInitialValueEntry[listeners.size()]; for (int i = 0; i < listeners.size(); i++) { BObject listener = listeners.get(i); - listenerEntries[i] = ValueCreator.createListInitialValueEntry(Utils.getServiceListener(listener, module)); + listenerEntries[i] = ValueCreator.createListInitialValueEntry( + Utils.getArtifact(LISTENER_NAMES_MAP.get(listener), module)); } ArrayType arrayType = TypeCreator.createArrayType(TypeUtils.getType( - ValueCreator.createRecordValue(module, LISTENER)), true); + ValueCreator.createRecordValue(module, ARTIFACT)), true); return ValueCreator.createArrayValue(arrayType, listenerEntries); } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java index c88d3cf..d577815 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java @@ -26,22 +26,15 @@ import io.ballerina.runtime.api.values.BObject; import io.ballerina.runtime.api.values.BString; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ARTIFACT; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA_HOME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_HOME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTPS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.INFERRED_CONFIG; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NODE; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_NAME; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_VERSION; import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PLATFORM_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PORT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PROTOCOL; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SECURE_SOCKET; /** * Native function implementations of the wso2 control plane module. @@ -78,18 +71,10 @@ public static boolean isControlPlaneService(BObject serviceObj, Module currentMo return module != null && module.equals(currentModule); } - public static BMap getServiceListener(BObject listener, Module module) { - BMap listenerRecord = ValueCreator.createMapValue(); - listenerRecord.put(StringUtils.fromString(NAME), StringUtils.fromString(LISTENER_NAMES_MAP.get(listener))); - listenerRecord.put(StringUtils.fromString(PROTOCOL), getListenerProtocol(listener)); - listenerRecord.put(StringUtils.fromString(PORT), listener.get(StringUtils.fromString(PORT))); - return ValueCreator.createReadonlyRecordValue(module, LISTENER, listenerRecord); + public static BMap getArtifact(String name, Module module) { + BMap artifact = ValueCreator.createMapValue(); + artifact.put(StringUtils.fromString(NAME), StringUtils.fromString(name)); + return ValueCreator.createReadonlyRecordValue(module, ARTIFACT, artifact); } - private static BString getListenerProtocol(BObject listener) { - BMap config = (BMap) - listener.get(StringUtils.fromString(INFERRED_CONFIG)); - Object secureSocket = config.get(StringUtils.fromString(SECURE_SOCKET)); - return StringUtils.fromString(secureSocket == null ? HTTP : HTTPS); - } } From 6bca8fba706c5dd7623975796ac3136a45984142 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 17:10:32 +0530 Subject: [PATCH 11/18] Remove new lines --- .../io/ballerina/lib/wso2/controlplane/ArtifactUtils.java | 5 ----- .../lib/wso2/controlplane/ServiceArtifactHandler.java | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index 0f170e0..ac006f5 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -52,13 +52,10 @@ public class ArtifactUtils { private static final String LISTENER_PREFIX = "listener_"; static List artifacts; private static Module currentModule; - private static final ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); private static final ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); - static final Map SERVICE_NAMES_MAP = new HashMap<>(); static final Map LISTENER_NAMES_MAP = new HashMap<>(); - private static int serviceCounter = 1; private static int listenerCounter = 1; @@ -107,7 +104,6 @@ private static void populateArtifactNamesMap() { if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; } - if (!SERVICE_NAMES_MAP.containsKey(serviceObj)) { SERVICE_NAMES_MAP.put(serviceObj, SERVICE_PREFIX + serviceCounter++); } @@ -128,7 +124,6 @@ public static Object getDetailedArtifact(BString resourceType, BString name) { return ErrorCreator.createError(StringUtils.fromString("No service found with the name: " + name)); } return serviceArtifactHandler.getDetailedService(artifact, currentModule); - } else { BObject listenerObject = getListenerArtifact(value); if (listenerObject == null) { diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java index 140dfff..c16a7bd 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -72,6 +72,7 @@ public List getServiceList(Module currentModule) { } return artifactEntries; } + public BMap getDetailedService(Artifact artifact, Module currentModule) { BObject serviceObj = (BObject) artifact.getDetail(SERVICE); Type originalType = serviceObj.getOriginalType(); From a5e9287ccfe50d4a60f5e3e897adb8e13a7c824a Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 19:12:00 +0530 Subject: [PATCH 12/18] [Automated] Update the native jar versions --- ballerina/Ballerina.toml | 4 ++-- ballerina/Dependencies.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index 14b1f49..7900806 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,7 +1,7 @@ [package] org = "ballerinax" name = "wso2.controlplane" -version = "1.0.0" +version = "0.0.0" distribution = "2201.9.0" repository = "https://github.com/ballerina-platform/module-ballerinax-wso2.controlplane" license = ["Apache-2.0"] @@ -10,4 +10,4 @@ license = ["Apache-2.0"] graalvmCompatible = true [[platform.java17.dependency]] -path = "../native/build/libs/wso2.controlplane-native-1.0.0-SNAPSHOT.jar" +path = "../native/build/libs/wso2.controlplane-native-0.0.0-SNAPSHOT.jar" diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 5dcdd45..63cd810 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -303,7 +303,7 @@ modules = [ [[package]] org = "ballerinax" name = "wso2.controlplane" -version = "1.0.0" +version = "0.0.0" dependencies = [ {org = "ballerina", name = "file"}, {org = "ballerina", name = "http"}, From 5c1b8cd9843deaa913e39b419be5b01606a52a90 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Fri, 26 Apr 2024 19:47:20 +0530 Subject: [PATCH 13/18] Update version 0.0.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3ad0903..d112635 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.caching=true group=org.ballerinalang -version=1.0.0-SNAPSHOT +version=0.0.0-SNAPSHOT puppycrawlCheckstyleVersion=10.12.0 jacocoVersion=0.8.10 From 448397468d993e56703d761241495b63bec9107a Mon Sep 17 00:00:00 2001 From: hindujaB Date: Sat, 27 Apr 2024 08:53:13 +0530 Subject: [PATCH 14/18] Fix returning null for `.` services --- .../io/ballerina/lib/wso2/controlplane/ArtifactUtils.java | 7 ++++++- .../lib/wso2/controlplane/ServiceArtifactHandler.java | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index ac006f5..7345cc6 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -116,7 +116,12 @@ private static void populateArtifactNamesMap() { } } - public static Object getDetailedArtifact(BString resourceType, BString name) { + public static Object getDetailedArtifact(Environment env, BString resourceType, BString name) { + if (artifacts == null) { + artifacts = filterHttpArtifacts(env.getRepository().getArtifacts()); + currentModule = env.getCurrentModule(); + populateArtifactNamesMap(); + } String value = name.getValue(); if (resourceType.getValue().equals(SERVICES_RESOURCE)) { Artifact artifact = getServiceArtifact(value); diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java index c16a7bd..5156d3f 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java @@ -131,6 +131,9 @@ private static BArray getAccessorArray(ResourceMethodType resourceMethod) { private static Object getAttachPointString(Artifact artifact) { Object attachPoint = artifact.getDetail(ATTACH_POINT); + if (attachPoint == null) { + return StringUtils.fromString(SINGLE_SLASH); + } if (TypeUtils.getType(attachPoint).getTag() == TypeTags.ARRAY_TAG) { BArray array = (BArray) attachPoint; StringBuilder attachPointStr = new StringBuilder(); From c459fb98cf3a820063f37dfe105e9fc2b40081f4 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Sat, 27 Apr 2024 09:41:17 +0530 Subject: [PATCH 15/18] Fix spotbugs error --- .../java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java index 7345cc6..f0193a6 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java @@ -50,7 +50,7 @@ public class ArtifactUtils { private static final String SERVICE_PREFIX = "service_"; private static final String LISTENER_PREFIX = "listener_"; - static List artifacts; + static volatile List artifacts; private static Module currentModule; private static final ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); private static final ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); From 6a6b2b63166f18dedac2d2f475490aa42073939a Mon Sep 17 00:00:00 2001 From: hindujaB Date: Mon, 29 Apr 2024 08:07:36 +0530 Subject: [PATCH 16/18] [Automated] Update the native jar versions --- ballerina/Ballerina.toml | 4 ++-- ballerina/Dependencies.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index 7900806..6214487 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,7 +1,7 @@ [package] org = "ballerinax" name = "wso2.controlplane" -version = "0.0.0" +version = "0.1.0" distribution = "2201.9.0" repository = "https://github.com/ballerina-platform/module-ballerinax-wso2.controlplane" license = ["Apache-2.0"] @@ -10,4 +10,4 @@ license = ["Apache-2.0"] graalvmCompatible = true [[platform.java17.dependency]] -path = "../native/build/libs/wso2.controlplane-native-0.0.0-SNAPSHOT.jar" +path = "../native/build/libs/wso2.controlplane-native-0.1.0-SNAPSHOT.jar" diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 63cd810..a28182c 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -303,7 +303,7 @@ modules = [ [[package]] org = "ballerinax" name = "wso2.controlplane" -version = "0.0.0" +version = "0.1.0" dependencies = [ {org = "ballerina", name = "file"}, {org = "ballerina", name = "http"}, From a2ed030125bf29ac8a45ff720ba23cbb6c833c91 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Mon, 29 Apr 2024 08:09:21 +0530 Subject: [PATCH 17/18] Update version to 0.1.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d112635..ca29b02 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.caching=true group=org.ballerinalang -version=0.0.0-SNAPSHOT +version=0.1.0-SNAPSHOT puppycrawlCheckstyleVersion=10.12.0 jacocoVersion=0.8.10 From 9c0faa79850421b9f9959466740967be2b8caeb1 Mon Sep 17 00:00:00 2001 From: hindujaB Date: Mon, 29 Apr 2024 08:14:23 +0530 Subject: [PATCH 18/18] Rename Java classes --- ballerina/icpService.bal | 4 +- .../{ArtifactUtils.java => Artifacts.java} | 29 +++++------ ...trolPlaneConstants.java => Constants.java} | 2 +- ...nerArtifactHandler.java => Listeners.java} | 38 +++++++------- ...viceArtifactHandler.java => Services.java} | 52 +++++++++---------- .../lib/wso2/controlplane/Utils.java | 20 +++---- 6 files changed, 72 insertions(+), 73 deletions(-) rename native/src/main/java/io/ballerina/lib/wso2/controlplane/{ArtifactUtils.java => Artifacts.java} (84%) rename native/src/main/java/io/ballerina/lib/wso2/controlplane/{ControlPlaneConstants.java => Constants.java} (98%) rename native/src/main/java/io/ballerina/lib/wso2/controlplane/{ListenerArtifactHandler.java => Listeners.java} (75%) rename native/src/main/java/io/ballerina/lib/wso2/controlplane/{ServiceArtifactHandler.java => Services.java} (76%) diff --git a/ballerina/icpService.bal b/ballerina/icpService.bal index bd0f1b7..68eaf64 100644 --- a/ballerina/icpService.bal +++ b/ballerina/icpService.bal @@ -55,10 +55,10 @@ isolated function getBallerinaNode() returns Node|error = @java:Method { isolated function getDetailedArtifact(string resourceType, string name) returns ArtifactDetail|error = @java:Method { - 'class: "io.ballerina.lib.wso2.controlplane.ArtifactUtils" + 'class: "io.ballerina.lib.wso2.controlplane.Artifacts" } external; isolated function getArtifacts(string resourceType, typedesc t) returns Artifact[]|error = @java:Method { - 'class: "io.ballerina.lib.wso2.controlplane.ArtifactUtils" + 'class: "io.ballerina.lib.wso2.controlplane.Artifacts" } external; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Artifacts.java similarity index 84% rename from native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java rename to native/src/main/java/io/ballerina/lib/wso2/controlplane/Artifacts.java index f0193a6..7e8ebee 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ArtifactUtils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Artifacts.java @@ -36,30 +36,29 @@ import java.util.List; import java.util.Map; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICES_RESOURCE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; +import static io.ballerina.lib.wso2.controlplane.Constants.BALLERINA; +import static io.ballerina.lib.wso2.controlplane.Constants.LISTENER; +import static io.ballerina.lib.wso2.controlplane.Constants.SERVICES_RESOURCE; +import static io.ballerina.lib.wso2.controlplane.Constants.SERVICE; /** * Native function implementations of the wso2 control plane module. * * @since 1.0.0 */ -public class ArtifactUtils { +public class Artifacts { private static final String SERVICE_PREFIX = "service_"; private static final String LISTENER_PREFIX = "listener_"; static volatile List artifacts; private static Module currentModule; - private static final ServiceArtifactHandler serviceArtifactHandler = new ServiceArtifactHandler(); - private static final ListenerArtifactHandler listenerArtifactHandler = new ListenerArtifactHandler(); + private static final Services SERVICES = new Services(); + private static final Listeners LISTENERS = new Listeners(); static final Map SERVICE_NAMES_MAP = new HashMap<>(); static final Map LISTENER_NAMES_MAP = new HashMap<>(); private static int serviceCounter = 1; private static int listenerCounter = 1; - private ArtifactUtils() { + private Artifacts() { } public static Object getArtifacts(Environment env, BString resourceType, BTypedesc typedesc) { @@ -69,9 +68,9 @@ public static Object getArtifacts(Environment env, BString resourceType, BTypede Type artifactType = TypeUtils.getImpliedType(typedesc.getDescribingType()); List artifactEntries; if (resourceType.getValue().equals(SERVICES_RESOURCE)) { - artifactEntries = serviceArtifactHandler.getServiceList(currentModule); + artifactEntries = SERVICES.getServiceList(currentModule); } else { - artifactEntries = listenerArtifactHandler.getListenerList(currentModule); + artifactEntries = LISTENERS.getListenerList(currentModule); } ArrayType arrayType = TypeCreator.createArrayType(artifactType, true); return ValueCreator.createArrayValue(arrayType, artifactEntries.toArray(BListInitialValueEntry[]::new)); @@ -84,7 +83,7 @@ private static List filterHttpArtifacts(List artifacts) { if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; } - List listeners = (List) artifact.getDetail(LISTENERS); + List listeners = (List) artifact.getDetail(Constants.LISTENERS); for (BObject listener : listeners) { Type listenerType = TypeUtils.getImpliedType(listener.getOriginalType()); Module typePackage = listenerType.getPackage(); @@ -107,7 +106,7 @@ private static void populateArtifactNamesMap() { if (!SERVICE_NAMES_MAP.containsKey(serviceObj)) { SERVICE_NAMES_MAP.put(serviceObj, SERVICE_PREFIX + serviceCounter++); } - List listeners = (List) artifact.getDetail(LISTENERS); + List listeners = (List) artifact.getDetail(Constants.LISTENERS); for (BObject listener : listeners) { if (!LISTENER_NAMES_MAP.containsKey(listener)) { LISTENER_NAMES_MAP.put(listener, LISTENER_PREFIX + listenerCounter++); @@ -128,13 +127,13 @@ public static Object getDetailedArtifact(Environment env, BString resourceType, if (artifact == null) { return ErrorCreator.createError(StringUtils.fromString("No service found with the name: " + name)); } - return serviceArtifactHandler.getDetailedService(artifact, currentModule); + return SERVICES.getDetailedService(artifact, currentModule); } else { BObject listenerObject = getListenerArtifact(value); if (listenerObject == null) { return ErrorCreator.createError(StringUtils.fromString("No listener found with the name: " + name)); } - return listenerArtifactHandler.getDetailedListener(listenerObject, currentModule); + return LISTENERS.getDetailedListener(listenerObject, currentModule); } } diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Constants.java similarity index 98% rename from native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java rename to native/src/main/java/io/ballerina/lib/wso2/controlplane/Constants.java index 549f919..2c1bb95 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ControlPlaneConstants.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Constants.java @@ -1,6 +1,6 @@ package io.ballerina.lib.wso2.controlplane; -public class ControlPlaneConstants { +public class Constants { public static final String BALLERINA_HOME = "ballerinaHome"; public static final String PLATFORM_VERSION = "platformVersion"; public static final String OS_VERSION = "osVersion"; diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Listeners.java similarity index 75% rename from native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java rename to native/src/main/java/io/ballerina/lib/wso2/controlplane/Listeners.java index 27e61c9..167a6fb 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ListenerArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Listeners.java @@ -31,23 +31,23 @@ import java.util.List; import java.util.Set; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HOST; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTPS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.HTTP_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.INFERRED_CONFIG; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENER_DETAIL; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PACKAGE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PORT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PROTOCOL; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.REQUEST_LIMIT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.REQUEST_LIMITS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SECURE_SOCKET; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.TIMEOUT; +import static io.ballerina.lib.wso2.controlplane.Artifacts.LISTENER_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.Constants.HOST; +import static io.ballerina.lib.wso2.controlplane.Constants.HTTP; +import static io.ballerina.lib.wso2.controlplane.Constants.HTTPS; +import static io.ballerina.lib.wso2.controlplane.Constants.HTTP_VERSION; +import static io.ballerina.lib.wso2.controlplane.Constants.INFERRED_CONFIG; +import static io.ballerina.lib.wso2.controlplane.Constants.LISTENERS; +import static io.ballerina.lib.wso2.controlplane.Constants.LISTENER_DETAIL; +import static io.ballerina.lib.wso2.controlplane.Constants.NAME; +import static io.ballerina.lib.wso2.controlplane.Constants.PACKAGE; +import static io.ballerina.lib.wso2.controlplane.Constants.PORT; +import static io.ballerina.lib.wso2.controlplane.Constants.PROTOCOL; +import static io.ballerina.lib.wso2.controlplane.Constants.REQUEST_LIMIT; +import static io.ballerina.lib.wso2.controlplane.Constants.REQUEST_LIMITS; +import static io.ballerina.lib.wso2.controlplane.Constants.SECURE_SOCKET; +import static io.ballerina.lib.wso2.controlplane.Constants.SERVICE; +import static io.ballerina.lib.wso2.controlplane.Constants.TIMEOUT; import static io.ballerina.lib.wso2.controlplane.Utils.getArtifact; /** @@ -55,10 +55,10 @@ * * @since 1.0.0 */ -public class ListenerArtifactHandler { +public class Listeners { public List getListenerList(Module currentModule) { List artifactEntries = new ArrayList<>(); - Set listeners = getNonDuplicatedListeners(ArtifactUtils.artifacts, currentModule); + Set listeners = getNonDuplicatedListeners(Artifacts.artifacts, currentModule); for (BObject listener : listeners) { artifactEntries.add(ValueCreator.createListInitialValueEntry( getArtifact(LISTENER_NAMES_MAP.get(listener), currentModule))); diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Services.java similarity index 76% rename from native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java rename to native/src/main/java/io/ballerina/lib/wso2/controlplane/Services.java index 5156d3f..41a163c 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/ServiceArtifactHandler.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Services.java @@ -36,21 +36,21 @@ import java.util.ArrayList; import java.util.List; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.LISTENER_NAMES_MAP; -import static io.ballerina.lib.wso2.controlplane.ArtifactUtils.SERVICE_NAMES_MAP; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ARTIFACT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ATTACH_POINT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BASE_PATH; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.LISTENERS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.METHODS; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PACKAGE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.RESOURCE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.RESOURCES; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SERVICE_DETAIL; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.SINGLE_SLASH; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.URL; +import static io.ballerina.lib.wso2.controlplane.Artifacts.LISTENER_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.Artifacts.SERVICE_NAMES_MAP; +import static io.ballerina.lib.wso2.controlplane.Constants.ARTIFACT; +import static io.ballerina.lib.wso2.controlplane.Constants.ATTACH_POINT; +import static io.ballerina.lib.wso2.controlplane.Constants.BASE_PATH; +import static io.ballerina.lib.wso2.controlplane.Constants.LISTENERS; +import static io.ballerina.lib.wso2.controlplane.Constants.METHODS; +import static io.ballerina.lib.wso2.controlplane.Constants.NAME; +import static io.ballerina.lib.wso2.controlplane.Constants.PACKAGE; +import static io.ballerina.lib.wso2.controlplane.Constants.RESOURCE; +import static io.ballerina.lib.wso2.controlplane.Constants.RESOURCES; +import static io.ballerina.lib.wso2.controlplane.Constants.SERVICE; +import static io.ballerina.lib.wso2.controlplane.Constants.SERVICE_DETAIL; +import static io.ballerina.lib.wso2.controlplane.Constants.SINGLE_SLASH; +import static io.ballerina.lib.wso2.controlplane.Constants.URL; import static io.ballerina.lib.wso2.controlplane.Utils.getArtifact; /** @@ -58,11 +58,11 @@ * * @since 1.0.0 */ -public class ServiceArtifactHandler { +public class Services { public List getServiceList(Module currentModule) { List artifactEntries = new ArrayList<>(); - for (Artifact artifact : ArtifactUtils.artifacts) { + for (Artifact artifact : Artifacts.artifacts) { BObject serviceObj = (BObject) artifact.getDetail(SERVICE); if (Utils.isControlPlaneService(serviceObj, currentModule)) { continue; @@ -107,21 +107,21 @@ private static BString getUrl(ResourceMethodType resourceMethod) { StringBuilder resourcePath = new StringBuilder(); int count = 0; for (String segment : paths) { - resourcePath.append(ControlPlaneConstants.SINGLE_SLASH); - if (ControlPlaneConstants.PATH_PARAM_IDENTIFIER.equals(segment)) { + resourcePath.append(Constants.SINGLE_SLASH); + if (Constants.PATH_PARAM_IDENTIFIER.equals(segment)) { String pathSegment = resourceMethod.getParamNames()[count++]; - resourcePath.append(ControlPlaneConstants.OPEN_CURL_IDENTIFIER) - .append(pathSegment).append(ControlPlaneConstants.CLOSE_CURL_IDENTIFIER); - } else if (ControlPlaneConstants.PATH_REST_PARAM_IDENTIFIER.equals(segment)) { - resourcePath.append(ControlPlaneConstants.STAR_IDENTIFIER); - } else if (ControlPlaneConstants.DOT_IDENTIFIER.equals(segment)) { + resourcePath.append(Constants.OPEN_CURL_IDENTIFIER) + .append(pathSegment).append(Constants.CLOSE_CURL_IDENTIFIER); + } else if (Constants.PATH_REST_PARAM_IDENTIFIER.equals(segment)) { + resourcePath.append(Constants.STAR_IDENTIFIER); + } else if (Constants.DOT_IDENTIFIER.equals(segment)) { break; } else { resourcePath.append(segment); } } - return StringUtils.fromString(resourcePath.toString().replaceAll(ControlPlaneConstants.REGEX, - ControlPlaneConstants.SINGLE_SLASH)); + return StringUtils.fromString(resourcePath.toString().replaceAll(Constants.REGEX, + Constants.SINGLE_SLASH)); } private static BArray getAccessorArray(ResourceMethodType resourceMethod) { diff --git a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java index d577815..16d1755 100644 --- a/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java +++ b/native/src/main/java/io/ballerina/lib/wso2/controlplane/Utils.java @@ -26,15 +26,15 @@ import io.ballerina.runtime.api.values.BObject; import io.ballerina.runtime.api.values.BString; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.ARTIFACT; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BALLERINA_HOME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_HOME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.BAL_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NAME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.NODE; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_NAME; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.OS_VERSION; -import static io.ballerina.lib.wso2.controlplane.ControlPlaneConstants.PLATFORM_VERSION; +import static io.ballerina.lib.wso2.controlplane.Constants.ARTIFACT; +import static io.ballerina.lib.wso2.controlplane.Constants.BALLERINA_HOME; +import static io.ballerina.lib.wso2.controlplane.Constants.BAL_HOME; +import static io.ballerina.lib.wso2.controlplane.Constants.BAL_VERSION; +import static io.ballerina.lib.wso2.controlplane.Constants.NAME; +import static io.ballerina.lib.wso2.controlplane.Constants.NODE; +import static io.ballerina.lib.wso2.controlplane.Constants.OS_NAME; +import static io.ballerina.lib.wso2.controlplane.Constants.OS_VERSION; +import static io.ballerina.lib.wso2.controlplane.Constants.PLATFORM_VERSION; /** * Native function implementations of the wso2 control plane module. @@ -51,7 +51,7 @@ public static Object getBallerinaNode(Environment env) { StringUtils.fromString(getBallerinaVersionString((String) node.getDetail(BAL_VERSION)))); nodeEntries.put(StringUtils.fromString(BALLERINA_HOME), StringUtils.fromString((String) node.getDetail(BAL_HOME))); - nodeEntries.put(StringUtils.fromString(ControlPlaneConstants.OS_NAME), + nodeEntries.put(StringUtils.fromString(Constants.OS_NAME), StringUtils.fromString((String) node.getDetail(OS_NAME))); nodeEntries.put(StringUtils.fromString(OS_VERSION), StringUtils.fromString((String) node.getDetail(OS_VERSION)));