TEIV: Implement generic Entity & Relationship naming/ID generation 55/15155/4
authorKrupaNagabhushan <krupa.nagabhushan@est.tech>
Thu, 9 Oct 2025 09:55:52 +0000 (10:55 +0100)
committerKrupaNagabhushan <krupa.nagabhushan@est.tech>
Tue, 28 Oct 2025 18:58:35 +0000 (18:58 +0000)
Issue-ID: SMO-197
Change-Id: I5d27da0564d4300dd8fca9cf8f78dfe59e04b47c
Signed-off-by: KrupaNagabhushan <krupa.nagabhushan@est.tech>
34 files changed:
adapters/common-utils/pom.xml [new file with mode: 0644]
adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/Constants.java [new file with mode: 0644]
adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilder.java [new file with mode: 0644]
adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/YangModelService.java [new file with mode: 0644]
adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilderTest.java [new file with mode: 0644]
adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/YangModelServiceTest.java [new file with mode: 0644]
adapters/ncmp-to-teiv-adapter/pom.xml
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/Application.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/Application.java with 95% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/CloudEventFactory.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/CloudEventFactory.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/KafkaEventProducer.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaEventProducer.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/KafkaProducerConfig.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaProducerConfig.java with 97% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/KafkaSecurityConfig.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaSecurityConfig.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/NcmpPollingClient.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpPollingClient.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/ResourceReader.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/ResourceReader.java with 97% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/SmoPayloadBuilder.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/SmoPayloadBuilder.java with 91% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/AbstractEntity.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractEntity.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/AbstractFunction.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractFunction.java with 95% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/Attributes.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Attributes.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/GNBCUCPAttributes.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPAttributes.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java with 63% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/GNBDUAttributes.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUAttributes.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/GNBDUFunction.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUFunction.java with 64% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/ManagedElement.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java with 82% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/ManagedElementWrapper.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElementWrapper.java with 84% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/NRCellCU.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCU.java with 71% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/NRCellCUAttributes.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCUAttributes.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/NRCellDU.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDU.java with 71% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/NRCellDUAttributes.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDUAttributes.java with 96% similarity]
adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/teiv/adapters/ncmp_to_teiv_adapter/models/Plmnid.java [moved from adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Plmnid.java with 94% similarity]
adapters/pom.xml
yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/JsonParserExample.java
yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangModelExtractor.java [new file with mode: 0644]
yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangParserExample.java

diff --git a/adapters/common-utils/pom.xml b/adapters/common-utils/pom.xml
new file mode 100644 (file)
index 0000000..f7e80e7
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.oran.smo.teiv.adapters</groupId>
+        <artifactId>adapters</artifactId>
+        <version>0.3.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>common-utils</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+    </licenses>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+            <version>${version.logback}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.oran.smo.yangtools.parser</groupId>
+            <artifactId>yang-parser-jar</artifactId>
+            <version>1.2.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.oran.smo.yangtools.parser.simple.example</groupId>
+            <artifactId>parser-example</artifactId>
+            <version>0.0.2-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/Constants.java b/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/Constants.java
new file mode 100644 (file)
index 0000000..fb54877
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.adapters.common.utils;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class Constants {
+    public static final String ORAN_SMO_TEIV_URN_PREFIX = "urn:oran:smo:teiv";
+    public static final String SMO_TEIV_RAN_PREFIX = "o-ran-smo-teiv-ran";
+    public static final String SMO_TEIV_REL_OAM_RAN_PREFIX = "o-ran-smo-teiv-rel-oam-ran";
+    public static final String _3GPP_GNBDUFUNTION_PREFIX = "_3gpp-nr-nrm-gnbdufunction";
+    public static final String _3GPP_GNBCUCPFUNTION_PREFIX = "_3gpp-nr-nrm-gnbcucpfunction";
+    public static final String SMO_TEIV_OAM_PREFIX = "o-ran-smo-teiv-oam";
+
+    //relationshipType
+    public static final String MANAGES = "MANAGES";
+    public static final String O1LINK = "O1LINK";
+    public static final String PROVIDES = "PROVIDES";
+
+    //relationshipTypeNames (NCMP)
+    public static final String OCUCPFUNCTION_PROVIDES_NRCELLCU = "OCUCPFUNCTION_PROVIDES_NRCELLCU";
+    public static final String ODUFUNCTION_PROVIDES_NRCELLDU = "ODUFUNCTION_PROVIDES_NRCELLDU";
+    public static final String ODUFUNCTION_O1LINK_SMO = "ODUFUNCTION_O1LINK_SMO";
+    public static final String OCUCPFUNCTION_O1LINK_SMO = "OCUCPFUNCTION_O1LINK_SMO";
+    public static final String MANAGEDELEMENT_MANAGES_OCUCPFUNCTION = "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION";
+    public static final String MANAGEDELEMENT_MANAGES_ODUFUNCTION = "MANAGEDELEMENT_MANAGES_ODUFUNCTION";
+}
diff --git a/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilder.java b/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilder.java
new file mode 100644 (file)
index 0000000..f279218
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.adapters.common.utils;
+
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ORAN_SMO_TEIV_URN_PREFIX;
+
+public class TeivIdBuilder {
+
+    /**
+     * Builds a fully qualified function FDN using the given ID.
+     *
+     * @param id
+     *     the identifier
+     * @return the fully qualified FDN string
+     */
+    public static String buildFunctionFdn(String id) {
+        return ORAN_SMO_TEIV_URN_PREFIX + ":" + id;
+    }
+
+    /**
+     * Builds relationshipType name with the given prefix model, relationship type, sourceId, and destinationId.
+     *
+     * @param type
+     *     the relationship type
+     * @param sourceId
+     *     the first identifier
+     * @param destinationId
+     *     the second identifier
+     * @return a relationshipTypeName
+     */
+    public static String buildRelationshipTypeName(String prefix, String type, String sourceId, String destinationId) {
+        return prefix + ":" + sourceId + "_" + type + "_" + destinationId;
+    }
+
+    public static String buildTeivRelationshipTypeName(String type, String sourceId, String destinationId) {
+        return buildRelationshipTypeName(ORAN_SMO_TEIV_URN_PREFIX, type, sourceId, destinationId);
+    }
+
+    /**
+     * Builds a entityTypeName with given prefix and entityType.
+     *
+     * @param prefix
+     *     the string prefix
+     * @param entityType
+     *     the entity type
+     * @return a combined prefix and type string
+     */
+    public static String buildEntityTypeName(String prefix, String entityType) {
+        return prefix + ":" + entityType;
+    }
+}
diff --git a/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/YangModelService.java b/adapters/common-utils/src/main/java/org/oran/smo/teiv/adapters/common/utils/YangModelService.java
new file mode 100644 (file)
index 0000000..d7f9fd9
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.adapters.common.utils;
+
+import org.oran.smo.yangtools.parser.model.statements.yang.YModule;
+import org.oran.smo.yangtools.parser.simple.example.YangModelExtractor;
+
+import static org.oran.smo.teiv.adapters.common.utils.Constants.OCUCPFUNCTION_PROVIDES_NRCELLCU;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ODUFUNCTION_PROVIDES_NRCELLDU;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ODUFUNCTION_O1LINK_SMO;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.OCUCPFUNCTION_O1LINK_SMO;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGEDELEMENT_MANAGES_OCUCPFUNCTION;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGEDELEMENT_MANAGES_ODUFUNCTION;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_REL_OAM_RAN_PREFIX;
+
+public class YangModelService {
+
+    /**
+     * Parse the yang models, validate and extract the relationshipTypeName/EntityTypeName directly from the yan models.
+     *
+     * @param typeName
+     *     the relationshipTypeName/EntityTypeName
+     * @return validated typeName.
+     */
+    public static String validateAndExtractFromYangModel(String typeName) {
+        if (typeName == null || typeName.isBlank()) {
+            throw new IllegalArgumentException("Type name cannot be null or blank.");
+        }
+
+        String yangModelNameSpace = getYangModelNamespace(typeName);
+        if (yangModelNameSpace == null || yangModelNameSpace.isBlank()) {
+            throw new IllegalStateException("Failed to derive from YANG model for type: " + typeName);
+        }
+
+        YModule yModule = YangModelExtractor.parseAndExtractYModule(yangModelNameSpace);
+        if (yModule == null) {
+            throw new IllegalStateException("Unable to parse YANG module for namespace: " + yangModelNameSpace);
+        }
+        return YangModelExtractor.validateNameSpaceValue(yModule, typeName);
+    }
+
+    private static String getYangModelNamespace(String typeName) {
+        switch (typeName) {
+            case OCUCPFUNCTION_PROVIDES_NRCELLCU:
+            case ODUFUNCTION_PROVIDES_NRCELLDU:
+            case ODUFUNCTION_O1LINK_SMO:
+            case OCUCPFUNCTION_O1LINK_SMO:
+                return SMO_TEIV_RAN_PREFIX;
+
+            case MANAGEDELEMENT_MANAGES_OCUCPFUNCTION:
+            case MANAGEDELEMENT_MANAGES_ODUFUNCTION:
+                return SMO_TEIV_REL_OAM_RAN_PREFIX;
+
+            default:
+                return null;
+        }
+    }
+}
diff --git a/adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilderTest.java b/adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/TeivIdBuilderTest.java
new file mode 100644 (file)
index 0000000..69a1550
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.adapters.common.utils;
+
+import org.junit.Test;
+
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ORAN_SMO_TEIV_URN_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.PROVIDES;
+import static org.springframework.test.util.AssertionErrors.assertEquals;
+
+public class TeivIdBuilderTest {
+
+    @Test
+    public void testBuildFunctionFdn() {
+        String id = "SMO";
+        String expected = ORAN_SMO_TEIV_URN_PREFIX + ":" + id;
+        String actual = TeivIdBuilder.buildFunctionFdn(id);
+        assertEquals("Function FDN should be correctly built", expected, actual);
+    }
+
+    @Test
+    public void testBuildRelationshipTypeName() {
+        String sourceId = "OCUCPFUNCTION";
+        String destinationId = "NRCellCU";
+
+        String relTypeExpected = ORAN_SMO_TEIV_URN_PREFIX + ":" + sourceId + "_" + PROVIDES + "_" + destinationId;
+        String relType = TeivIdBuilder.buildTeivRelationshipTypeName(PROVIDES, sourceId, destinationId);
+        assertEquals("Relationship type name should be correctly formatted", relTypeExpected, relType);
+    }
+
+    @Test
+    public void testBuildEntityTypeName() {
+        String entityType = "NRCellCU";
+        String expected = ORAN_SMO_TEIV_URN_PREFIX + ":" + entityType;
+        String actual = TeivIdBuilder.buildEntityTypeName(ORAN_SMO_TEIV_URN_PREFIX, entityType);
+        assertEquals("Entity type name should be correctly formatted", expected, actual);
+    }
+}
diff --git a/adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/YangModelServiceTest.java b/adapters/common-utils/src/test/java/org/oran/smo/teiv/adapters/common/utils/YangModelServiceTest.java
new file mode 100644 (file)
index 0000000..e07319b
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.adapters.common.utils;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.oran.smo.yangtools.parser.model.statements.yang.YModule;
+import org.oran.smo.yangtools.parser.simple.example.YangModelExtractor;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGEDELEMENT_MANAGES_OCUCPFUNCTION;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_REL_OAM_RAN_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.OCUCPFUNCTION_PROVIDES_NRCELLCU;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+
+public class YangModelServiceTest {
+
+    private MockedStatic<YangModelExtractor> yangModelExtractorMock;
+
+    @BeforeEach
+    void setup() {
+        // Mock static methods in YangModelExtractor
+        yangModelExtractorMock = mockStatic(YangModelExtractor.class);
+    }
+
+    @Test
+    void testValidateAndExtractFromYangModel_withRanPrefix() {
+        // Arrange
+        String typeName = OCUCPFUNCTION_PROVIDES_NRCELLCU;
+        YModule yModuleMock = mock(YModule.class);
+
+        yangModelExtractorMock.when(() -> YangModelExtractor.parseAndExtractYModule(SMO_TEIV_RAN_PREFIX)).thenReturn(
+                yModuleMock);
+
+        yangModelExtractorMock.when(() -> YangModelExtractor.validateNameSpaceValue(yModuleMock, typeName)).thenReturn(
+                typeName);
+
+        // Act
+        String result = YangModelService.validateAndExtractFromYangModel(typeName);
+
+        // Assert
+        assertEquals(typeName, result);
+        yangModelExtractorMock.verify(() -> YangModelExtractor.parseAndExtractYModule(SMO_TEIV_RAN_PREFIX));
+        yangModelExtractorMock.verify(() -> YangModelExtractor.validateNameSpaceValue(yModuleMock, typeName));
+    }
+
+    @Test
+    void testValidateAndExtractFromYangModel_withOamRanPrefix() {
+        String typeName = MANAGEDELEMENT_MANAGES_OCUCPFUNCTION;
+        YModule yModuleMock = mock(YModule.class);
+
+        yangModelExtractorMock.when(() -> YangModelExtractor.parseAndExtractYModule(SMO_TEIV_REL_OAM_RAN_PREFIX))
+                .thenReturn(yModuleMock);
+
+        yangModelExtractorMock.when(() -> YangModelExtractor.validateNameSpaceValue(yModuleMock, typeName)).thenReturn(
+                typeName);
+
+        String result = YangModelService.validateAndExtractFromYangModel(typeName);
+
+        assertEquals(typeName, result);
+    }
+
+    @AfterEach
+    void teardown() {
+        yangModelExtractorMock.close();
+    }
+
+}
index 6eb346a..54dc133 100644 (file)
@@ -26,7 +26,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <groupId>org.oran.smo</groupId>
+        <groupId>org.oran.smo.teiv.adapters</groupId>
         <artifactId>adapters</artifactId>
         <version>0.3.0-SNAPSHOT</version>
     </parent>
             <artifactId>okhttp</artifactId>
             <version>4.9.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.oran.smo.teiv.adapters</groupId>
+            <artifactId>common-utils</artifactId>
+            <version>0.3.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter;
 
 import io.cloudevents.CloudEvent;
 import io.cloudevents.core.builder.CloudEventBuilder;
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,7 +28,7 @@ import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.RequestBody;
 import okhttp3.Response;
-import org.oran.smo.ncmp_to_teiv_adapter.models.ManagedElementWrapper;
+import org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models.ManagedElementWrapper;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.cloudevents.CloudEvent;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.oran.smo.ncmp_to_teiv_adapter.models.ManagedElementWrapper;
+import org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models.ManagedElementWrapper;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -33,7 +33,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.oran.smo.ncmp_to_teiv_adapter.ResourceReader.readResourceFile;
+import static org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.ResourceReader.readResourceFile;
 
 @Slf4j
 @Component
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
 
 public class SmoPayloadBuilder {
     private static final ObjectMapper objectMapper = new ObjectMapper();
 
     public static String build() {
         ArrayNode sourceIds = objectMapper.createArrayNode();
-        sourceIds.add("urn:oran:smo:teiv:SMO");
+        sourceIds.add(TeivIdBuilder.buildFunctionFdn("SMO"));
         sourceIds.add("http://smo.o-ran-sc.org");
         sourceIds.add("http://gateway.smo.o-ran-sc.org");
         sourceIds.add("http://dentity.smo.o-ran-sc.org");
@@ -44,7 +45,7 @@ public class SmoPayloadBuilder {
         ObjectNode attributes = objectMapper.createObjectNode();
         attributes.put("smoName", "SMO");
         ObjectNode smo = objectMapper.createObjectNode();
-        smo.put("id", "urn:oran:smo:teiv:SMO");
+        smo.put("id", TeivIdBuilder.buildFunctionFdn("SMO"));
         smo.set("sourceIds", sourceIds);
         smo.set("attributes", attributes);
         ArrayNode smoArray = objectMapper.createArrayNode();
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.fasterxml.jackson.annotation.JsonAnySetter;
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.fasterxml.jackson.annotation.JsonAnySetter;
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
+import org.oran.smo.teiv.adapters.common.utils.YangModelService;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.OCUCPFUNCTION_PROVIDES_NRCELLCU;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGES;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGEDELEMENT_MANAGES_OCUCPFUNCTION;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.OCUCPFUNCTION_O1LINK_SMO;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.O1LINK;
+
 public class GNBCUCPFunction extends AbstractFunction {
 
     @Getter
@@ -39,7 +48,7 @@ public class GNBCUCPFunction extends AbstractFunction {
     public Map<String, Object> addTeivEntitiesAndRelationships(Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap, String parentId) {
         createRelationshipWithSmo(relationshipMap);
-        String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + getId();
+        String gnbcucpFunctionFdn = TeivIdBuilder.buildFunctionFdn(getId());
 
         for (NRCellCU nrCellCU : getNrCellCUs()) {
             addNrcellcuEntitiesAndRelationships(nrCellCU, entityMap, relationshipMap);
@@ -47,12 +56,12 @@ public class GNBCUCPFunction extends AbstractFunction {
         }
 
         return Map.of("id", gnbcucpFunctionFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of(
-                gnbcucpFunctionFdn, "urn:oran:smo:teiv:" + parentId));
+                gnbcucpFunctionFdn, TeivIdBuilder.buildFunctionFdn(parentId)));
     }
 
     private void addNrcellcuEntitiesAndRelationships(NRCellCU nrCellCU, Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap) {
-        String type = "o-ran-smo-teiv-ran:NRCellCU";
+        String type = TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "NRCellCU");
         if (!entityMap.containsKey(type)) {
             entityMap.put(type, new ArrayList<>());
         }
@@ -60,7 +69,7 @@ public class GNBCUCPFunction extends AbstractFunction {
     }
 
     private void addRelationshipWithNrcellcu(NRCellCU nrCellCU, Map<String, List<Object>> relationshipMap) {
-        String relType = "o-ran-smo-teiv-ran:OCUCPFUNCTION_PROVIDES_NRCELLCU";
+        String relType = YangModelService.validateAndExtractFromYangModel(OCUCPFUNCTION_PROVIDES_NRCELLCU);
         if (!relationshipMap.containsKey(relType)) {
             relationshipMap.put(relType, new ArrayList<>());
         }
@@ -69,34 +78,34 @@ public class GNBCUCPFunction extends AbstractFunction {
 
     @Override
     public Map<String, Object> createRelationshipWithManagedElement(String managedElementId) {
-        String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + getId();
-        String managedElementFdn = "urn:oran:smo:teiv:" + managedElementId;
-        return Map.of("id", String.format("urn:oran:smo:teiv:%s_MANAGES_%s", managedElementId, getId()), "aSide",
+        String gnbcucpFunctionFdn = TeivIdBuilder.buildFunctionFdn(getId());
+        String managedElementFdn = TeivIdBuilder.buildFunctionFdn(managedElementId);
+        return Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName(MANAGES, managedElementId, getId()), "aSide",
                 managedElementFdn, "bSide", gnbcucpFunctionFdn, "sourceIds", List.of(managedElementFdn,
                         gnbcucpFunctionFdn));
     }
 
     @Override
     public String getTeivEntityType() {
-        return "o-ran-smo-teiv-ran:OCUCPFunction";
+        return TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "OCUCPFunction");
     }
 
     @Override
     public String getTeivRelationshipWithManagedElement() {
-        return "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION";
+        return YangModelService.validateAndExtractFromYangModel(MANAGEDELEMENT_MANAGES_OCUCPFUNCTION);
     }
 
     @Override
     public void createRelationshipWithSmo(Map<String, List<Object>> relationshipMap) {
-        String ranFunctionRelType = "o-ran-smo-teiv-ran:OCUCPFUNCTION_O1LINK_SMO";
+        String ranFunctionRelType = YangModelService.validateAndExtractFromYangModel(OCUCPFUNCTION_O1LINK_SMO);
         if (!relationshipMap.containsKey(ranFunctionRelType)) {
             relationshipMap.put(ranFunctionRelType, new ArrayList<>());
         }
         String gnbcucpFunctionId = getId();
         String smoId = "SMO";
-        Map<String, Object> test = Map.of("id", String.format("urn:oran:smo:teiv:%s_O1LINK_%s", gnbcucpFunctionId, smoId),
-                "bSide", "urn:oran:smo:teiv:" + smoId, "aSide", "urn:oran:smo:teiv:" + gnbcucpFunctionId, "sourceIds", List
-                        .of(smoId, gnbcucpFunctionId));
+        Map<String, Object> test = Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName(O1LINK, gnbcucpFunctionId,
+                smoId), "bSide", TeivIdBuilder.buildFunctionFdn(smoId), "aSide", TeivIdBuilder.buildFunctionFdn(
+                        gnbcucpFunctionId), "sourceIds", List.of(smoId, gnbcucpFunctionId));
         relationshipMap.get(ranFunctionRelType).add(test);
     }
 }
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
+import org.oran.smo.teiv.adapters.common.utils.YangModelService;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ODUFUNCTION_PROVIDES_NRCELLDU;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.MANAGEDELEMENT_MANAGES_ODUFUNCTION;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.ODUFUNCTION_O1LINK_SMO;
+import static org.oran.smo.teiv.adapters.common.utils.Constants.O1LINK;
+
 public class GNBDUFunction extends AbstractFunction {
 
     @Getter
@@ -39,7 +47,7 @@ public class GNBDUFunction extends AbstractFunction {
     public Map<String, Object> addTeivEntitiesAndRelationships(Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap, String parentId) {
         createRelationshipWithSmo(relationshipMap);
-        String gnbduFunctionFdn = "urn:oran:smo:teiv:" + getId();
+        String gnbduFunctionFdn = TeivIdBuilder.buildFunctionFdn(getId());
 
         for (NRCellDU nrCellDU : getNrCellDUs()) {
             addNrcellduEntitiesAndRelationships(nrCellDU, entityMap, relationshipMap);
@@ -47,12 +55,12 @@ public class GNBDUFunction extends AbstractFunction {
         }
 
         return Map.of("id", gnbduFunctionFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of(
-                gnbduFunctionFdn, "urn:oran:smo:teiv:" + parentId));
+                gnbduFunctionFdn, TeivIdBuilder.buildFunctionFdn(parentId)));
     }
 
     private void addNrcellduEntitiesAndRelationships(NRCellDU nrCellDU, Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap) {
-        String type = "o-ran-smo-teiv-ran:NRCellDU";
+        String type = TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "NRCellDU");
         if (!entityMap.containsKey(type)) {
             entityMap.put(type, new ArrayList<>());
         }
@@ -60,7 +68,7 @@ public class GNBDUFunction extends AbstractFunction {
     }
 
     private void addRelationshipWithNrcelldu(NRCellDU nrCellDU, Map<String, List<Object>> relationshipMap) {
-        String relType = "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU";
+        String relType = YangModelService.validateAndExtractFromYangModel(ODUFUNCTION_PROVIDES_NRCELLDU);
         if (!relationshipMap.containsKey(relType)) {
             relationshipMap.put(relType, new ArrayList<>());
         }
@@ -69,33 +77,33 @@ public class GNBDUFunction extends AbstractFunction {
 
     @Override
     public Map<String, Object> createRelationshipWithManagedElement(String managedElementId) {
-        String gnbduFunctionFdn = "urn:oran:smo:teiv:" + getId();
-        String managedElementFdn = "urn:oran:smo:teiv:" + managedElementId;
-        return Map.of("id", String.format("urn:oran:smo:teiv:%s_MANAGES_%s", managedElementId, getId()), "aSide",
+        String gnbduFunctionFdn = TeivIdBuilder.buildFunctionFdn(getId());
+        String managedElementFdn = TeivIdBuilder.buildFunctionFdn(managedElementId);
+        return Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName("MANAGES", gnbduFunctionFdn, getId()), "aSide",
                 managedElementFdn, "bSide", gnbduFunctionFdn, "sourceIds", List.of(managedElementFdn, gnbduFunctionFdn));
     }
 
     @Override
     public String getTeivEntityType() {
-        return "o-ran-smo-teiv-ran:ODUFunction";
+        return TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "ODUFunction");
     }
 
     @Override
     public String getTeivRelationshipWithManagedElement() {
-        return "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION";
+        return YangModelService.validateAndExtractFromYangModel(MANAGEDELEMENT_MANAGES_ODUFUNCTION);
     }
 
     @Override
     public void createRelationshipWithSmo(Map<String, List<Object>> relationshipMap) {
-        String ranFunctionRelType = "o-ran-smo-teiv-ran:ODUFUNCTION_O1LINK_SMO";
+        String ranFunctionRelType = YangModelService.validateAndExtractFromYangModel(ODUFUNCTION_O1LINK_SMO);
         if (!relationshipMap.containsKey(ranFunctionRelType)) {
             relationshipMap.put(ranFunctionRelType, new ArrayList<>());
         }
         String gnbduFunctionId = getId();
         String smoId = "SMO";
-        Map<String, Object> test = Map.of("id", String.format("urn:oran:smo:teiv:%s_O1LINK_%s", gnbduFunctionId, smoId),
-                "bSide", "urn:oran:smo:teiv:" + smoId, "aSide", "urn:oran:smo:teiv:" + gnbduFunctionId, "sourceIds", List
-                        .of(smoId, gnbduFunctionId));
+        Map<String, Object> test = Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName(O1LINK, gnbduFunctionId, smoId),
+                "bSide", TeivIdBuilder.buildFunctionFdn(smoId), "aSide", TeivIdBuilder.buildFunctionFdn(gnbduFunctionId),
+                "sourceIds", List.of(smoId, gnbduFunctionId));
         relationshipMap.get(ranFunctionRelType).add(test);
     }
 }
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonAnySetter;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_OAM_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants._3GPP_GNBDUFUNTION_PREFIX;
+import static org.oran.smo.teiv.adapters.common.utils.Constants._3GPP_GNBCUCPFUNTION_PREFIX;
+
 @Slf4j
 public class ManagedElement extends AbstractEntity {
 
@@ -40,13 +45,13 @@ public class ManagedElement extends AbstractEntity {
         ObjectMapper mapper = new ObjectMapper();
 
         try {
-            if ("_3gpp-nr-nrm-gnbdufunction:GNBDUFunction".equals(name)) {
+            if (TeivIdBuilder.buildEntityTypeName(_3GPP_GNBDUFUNTION_PREFIX, "GNBDUFunction").equals(name)) {
                 List<Object> list = (List<Object>) value;
                 for (Object item : list) {
                     GNBDUFunction du = mapper.convertValue(item, GNBDUFunction.class);
                     ranFunctions.add(du);
                 }
-            } else if ("_3gpp-nr-nrm-gnbcucpfunction:GNBCUCPFunction".equals(name)) {
+            } else if (TeivIdBuilder.buildEntityTypeName(_3GPP_GNBCUCPFUNTION_PREFIX, "GNBCUCPFunction").equals(name)) {
                 List<Object> list = (List<Object>) value;
                 for (Object item : list) {
                     GNBCUCPFunction cu = mapper.convertValue(item, GNBCUCPFunction.class);
@@ -67,7 +72,7 @@ public class ManagedElement extends AbstractEntity {
             addRanFunctionEntitiesAndRelationships(ranFunction, entityMap, relationshipMap);
             addRelationshipWithRanFunction(ranFunction, relationshipMap);
         }
-        String managedElementId = "urn:oran:smo:teiv:" + getId();
+        String managedElementId = TeivIdBuilder.buildFunctionFdn(getId());
         return Map.of("id", managedElementId, "sourceIds", List.of(managedElementId));
     }
 
@@ -91,6 +96,6 @@ public class ManagedElement extends AbstractEntity {
 
     @Override
     public String getTeivEntityType() {
-        return "o-ran-smo-teiv-oam:ManagedElement";
+        return TeivIdBuilder.buildEntityTypeName(SMO_TEIV_OAM_PREFIX, "ManagedElement");
     }
 }
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_OAM_PREFIX;
+
 public class ManagedElementWrapper {
 
     @Getter
@@ -40,7 +43,8 @@ public class ManagedElementWrapper {
         for (ManagedElement managedElement : this.managedElements) {
             managedElements.add(managedElement.addTeivEntitiesAndRelationships(entityMap, relationshipMap, ""));
         }
-        entityMap.put("o-ran-smo-teiv-oam:ManagedElement", new ArrayList<>(managedElements));
+        entityMap.put(TeivIdBuilder.buildEntityTypeName(SMO_TEIV_OAM_PREFIX, "ManagedElement"), new ArrayList<>(
+                managedElements));
         Map<String, Object> finalJson = Map.of("relationships", List.of(relationshipMap), "entities", List.of(entityMap));
         return finalJson;
     }
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
 
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+
 public class NRCellCU extends AbstractEntity {
 
     @Getter
@@ -34,20 +37,20 @@ public class NRCellCU extends AbstractEntity {
     @Override
     public Map<String, Object> addTeivEntitiesAndRelationships(Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap, String parentId) {
-        String nrcellcucpFdn = "urn:oran:smo:teiv:" + getId();
+        String nrcellcucpFdn = TeivIdBuilder.buildFunctionFdn(getId());
         return Map.of("id", nrcellcucpFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of(
-                nrcellcucpFdn, "urn:oran:smo:teiv:" + parentId));
+                nrcellcucpFdn, TeivIdBuilder.buildFunctionFdn(parentId)));
     }
 
     public Map<String, Object> createRelationshipWithGnbcucpFunction(String gnbcucpFunctionId) {
-        String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + gnbcucpFunctionId;
-        String nrcellCuFdn = "urn:oran:smo:teiv:" + getId();
-        return Map.of("id", String.format("urn:oran:smo:teiv:%s_PROVIDES_%s", gnbcucpFunctionId, getId()), "aSide",
+        String gnbcucpFunctionFdn = TeivIdBuilder.buildFunctionFdn(gnbcucpFunctionId);
+        String nrcellCuFdn = TeivIdBuilder.buildFunctionFdn(getId());
+        return Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName("PROVIDES", gnbcucpFunctionId, getId()), "aSide",
                 gnbcucpFunctionFdn, "bSide", nrcellCuFdn, "sourceIds", List.of(gnbcucpFunctionFdn, nrcellCuFdn));
     }
 
     @Override
     public String getTeivEntityType() {
-        return "o-ran-smo-teiv-ran:NRCellCU";
+        return TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "NRCellCU");
     }
 }
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
+import org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder;
 
 import java.util.List;
 import java.util.Map;
 
+import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_RAN_PREFIX;
+
 public class NRCellDU extends AbstractEntity {
 
     @Getter
@@ -34,20 +37,20 @@ public class NRCellDU extends AbstractEntity {
     @Override
     public Map<String, Object> addTeivEntitiesAndRelationships(Map<String, List<Object>> entityMap,
             Map<String, List<Object>> relationshipMap, String parentId) {
-        String nrcellduFdn = "urn:oran:smo:teiv:" + getId();
+        String nrcellduFdn = TeivIdBuilder.buildFunctionFdn(getId());
         return Map.of("id", nrcellduFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of(
-                nrcellduFdn, "urn:oran:smo:teiv:" + parentId));
+                nrcellduFdn, TeivIdBuilder.buildFunctionFdn(parentId)));
     }
 
     public Map<String, Object> createRelationshipWithGnbduFunction(String gnbduFunctionId) {
-        String gnbduFunctionFdn = "urn:oran:smo:teiv:" + gnbduFunctionId;
-        String nrcellduFdn = "urn:oran:smo:teiv:" + getId();
-        return Map.of("id", String.format("urn:oran:smo:teiv:%s_PROVIDES_%s", gnbduFunctionId, getId()), "aSide",
+        String gnbduFunctionFdn = TeivIdBuilder.buildFunctionFdn(gnbduFunctionId);
+        String nrcellduFdn = TeivIdBuilder.buildFunctionFdn(getId());
+        return Map.of("id", TeivIdBuilder.buildTeivRelationshipTypeName("PROVIDES", gnbduFunctionId, getId()), "aSide",
                 gnbduFunctionFdn, "bSide", nrcellduFdn, "sourceIds", List.of(gnbduFunctionFdn, nrcellduFdn));
     }
 
     @Override
     public String getTeivEntityType() {
-        return "o-ran-smo-teiv-ran:NRCellDU";
+        return TeivIdBuilder.buildEntityTypeName(SMO_TEIV_RAN_PREFIX, "NRCellDU");
     }
 }
@@ -17,7 +17,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.ncmp_to_teiv_adapter.models;
+package org.oran.smo.teiv.adapters.ncmp_to_teiv_adapter.models;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
index 425557b..d2d2f0a 100644 (file)
@@ -30,6 +30,7 @@
         <version>0.3.0-SNAPSHOT</version>
     </parent>
 
+    <groupId>org.oran.smo.teiv.adapters</groupId>
     <artifactId>adapters</artifactId>
     <version>0.3.0-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <modules>
         <module>ncmp-to-teiv-adapter</module>
+        <module>common-utils</module>
     </modules>
 
     <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
+        <maven.compiler.source>${java.version}</maven.compiler.source>
+        <maven.compiler.target>${java.version}</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 </project>
index 628407b..5cf331e 100644 (file)
@@ -31,7 +31,7 @@ import java.io.IOException;
 
 public class JsonParserExample {
 
-    private static final String DIR = "yang-parser-example/src/main/resources/json/";
+    private static final String DIR = "yang-parser/parser-example/src/main/resources/json/";
 
     public static JsonValue parseJsonFile(ParserExecutionContext context) {
         final File jsonFile = new File(DIR + "AntennaModule-response.json");
diff --git a/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangModelExtractor.java b/yang-parser/parser-example/src/main/java/org/oran/smo/yangtools/parser/simple/example/YangModelExtractor.java
new file mode 100644 (file)
index 0000000..ae055be
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.oran.smo.yangtools.parser.simple.example;
+
+import org.oran.smo.yangtools.parser.ParserExecutionContext;
+import org.oran.smo.yangtools.parser.YangDeviceModel;
+import org.oran.smo.yangtools.parser.findings.FindingsManager;
+import org.oran.smo.yangtools.parser.findings.ModifyableFindingSeverityCalculator;
+import org.oran.smo.yangtools.parser.findings.ModuleAndFindingTypeAndSchemaNodePathFilterPredicate;
+import org.oran.smo.yangtools.parser.input.FileBasedYangInput;
+import org.oran.smo.yangtools.parser.model.ConformanceType;
+import org.oran.smo.yangtools.parser.model.YangModel;
+import org.oran.smo.yangtools.parser.model.statements.AbstractStatement;
+import org.oran.smo.yangtools.parser.model.statements.ietf.IetfExtensionsClassSupplier;
+import org.oran.smo.yangtools.parser.model.statements.oran.OranExtensionsClassSupplier;
+import org.oran.smo.yangtools.parser.model.statements.threegpp.ThreeGppExtensionsClassSupplier;
+import org.oran.smo.yangtools.parser.model.statements.yang.YModule;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+public class YangModelExtractor {
+
+    private static YangDeviceModel yangDeviceModel;
+    private static ModifyableFindingSeverityCalculator severityCalculator;
+    private static FindingsManager findingsManager;
+    private static ParserExecutionContext context;
+
+    private static final String DIR = "teiv/src/main/resources/models/";
+
+    public static YModule parseAndExtractYModule(String yangModelNameSpace) {
+        setUp();
+        List<YangModel> yangModels = parseYangModels(yangDeviceModel, context);
+        Optional<YangModel> optionalRanModel = yangModels.stream().filter(yangModel -> yangModelNameSpace.equals(yangModel
+                .getModuleIdentity().getModuleName())).findFirst();
+        return optionalRanModel.map(yangModel -> yangModel.getYangModelRoot().getModule()).orElse(null);
+    }
+
+    public static String validateNameSpaceValue(YModule yModule, String nameSpace) {
+        String validNameSpace = null;
+        List<AbstractStatement> children = yModule.getChildStatements();
+        for (AbstractStatement child : children) {
+            if (child.getDomElement().getValue().equalsIgnoreCase(nameSpace)) {
+                validNameSpace = child.getDomElement().getValue();
+                break;
+            }
+        }
+        return validNameSpace;
+    }
+
+    private static List<YangModel> parseYangModels(YangDeviceModel yangDeviceModel, ParserExecutionContext context) {
+
+        List<String> yangImplementFiles = new ArrayList<>();
+        List<String> yangImportFiles = new ArrayList<>();
+
+        //latest revised yang models used
+        yangImplementFiles.add("o-ran-smo-teiv-ran.yang");
+        yangImplementFiles.add("o-ran-smo-teiv-rel-oam-ran.yang");
+
+        final List<YangModel> yangModels = new ArrayList<>();
+
+        for (final String relativeFilePath : yangImplementFiles) {
+            yangModels.add(new YangModel(new FileBasedYangInput(new File(DIR + relativeFilePath)),
+                    ConformanceType.IMPLEMENT));
+        }
+        for (final String relativeFilePath : yangImportFiles) {
+            yangModels.add(new YangModel(new FileBasedYangInput(new File(DIR + "import/" + relativeFilePath)),
+                    ConformanceType.IMPORT));
+        }
+
+        yangDeviceModel.parseIntoYangModels(context, yangModels);
+
+        return yangModels;
+    }
+
+    private static void setUp() {
+        yangDeviceModel = new YangDeviceModel("Yang Parser JAR Test Device Model");
+
+        severityCalculator = new ModifyableFindingSeverityCalculator();
+
+        findingsManager = new FindingsManager(severityCalculator);
+
+        // suppress all findings from ietf and iana
+        findingsManager.addFilterPredicate(ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString(
+                "ietf*,iana*;*;*"));
+
+        final ThreeGppExtensionsClassSupplier threeGppStatementFactory = new ThreeGppExtensionsClassSupplier();
+        final IetfExtensionsClassSupplier ietfStatementFactory = new IetfExtensionsClassSupplier();
+        final OranExtensionsClassSupplier oranStatementFactory = new OranExtensionsClassSupplier();
+
+        context = new ParserExecutionContext(findingsManager, Arrays.asList(threeGppStatementFactory, oranStatementFactory,
+                ietfStatementFactory));
+        context.setFailFast(false);
+        context.setSuppressFindingsOnUnusedSchemaNodes(true);
+    }
+}
index f4810ea..a6498ef 100644 (file)
@@ -32,7 +32,7 @@ import java.util.List;
 
 public class YangParserExample {
 
-    private static final String DIR = "yang-parser-example/src/main/resources/yang/";
+    private static final String DIR = "yang-parser/parser-example/src/main/resources/yang/";
 
     public static List<YangModel> parseYangModels(YangDeviceModel yangDeviceModel, ParserExecutionContext context) {