import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
}
}
+ @Override
+ @Transactional
+ public void storeSchemaSetFromModules(final String dataspaceName, final String schemaSetName,
+ final Map<String, String> newYangResourcesModuleNameToContentMap,
+ final List<ModuleReference> moduleReferenceList) {
+ storeSchemaSet(dataspaceName, schemaSetName, newYangResourcesModuleNameToContentMap);
+ final var dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
+ final var schemaSetEntity =
+ schemaSetRepository.getByDataspaceAndName(dataspaceEntity, schemaSetName);
+ final List<Long> listOfYangResourceIds = new ArrayList<>();
+ moduleReferenceList.forEach(moduleReference ->
+ listOfYangResourceIds.add(yangResourceRepository.getIdByModuleNameAndRevision(
+ moduleReference.getName(), moduleReference.getRevision())));
+ yangResourceRepository.insertSchemaSetIdYangResourceId(schemaSetEntity.getId(), listOfYangResourceIds);
+ }
+
@Override
@Transactional
public void deleteSchemaSet(final String dataspaceName, final String schemaSetName,
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.onap.cps.spi.repository;
+
+import java.util.List;
+
+public interface SchemaSetYangResourceRepository {
+
+ void insertSchemaSetIdYangResourceId(final Integer schemaSetId, final List<Long> yangResourceId);
+
+}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.onap.cps.spi.repository;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class SchemaSetYangResourceRepositoryImpl implements SchemaSetYangResourceRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Override
+ public void insertSchemaSetIdYangResourceId(final Integer schemaSetId, final List<Long> yangResourceId) {
+ final var query = "INSERT INTO SCHEMA_SET_YANG_RESOURCES (SCHEMA_SET_ID, YANG_RESOURCE_ID) "
+ + "VALUES ( :schemaSetId, :yangResourceId)";
+ yangResourceId.forEach(id ->
+ entityManager.createNativeQuery(query)
+ .setParameter("schemaSetId", schemaSetId)
+ .setParameter("yangResourceId", id)
+ .executeUpdate()
+ );
+ }
+}
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
-public interface YangResourceRepository extends JpaRepository<YangResourceEntity, Long> {
+public interface YangResourceRepository extends JpaRepository<YangResourceEntity, Long>,
+ SchemaSetYangResourceRepository {
List<YangResourceEntity> findAllByChecksumIn(@NotNull Set<String> checksum);
@Query(value = "SELECT module_name, revision FROM yang_resource", nativeQuery = true)
List<YangResourceModuleReference> findAllModuleNameAndRevision();
+ @Query(value = "SELECT id FROM yang_resource WHERE module_name=:name and revision=:revision", nativeQuery = true)
+ Long getIdByModuleNameAndRevision(@Param("name") String moduleName, @Param("revision") String revision);
+
@Modifying
@Query(value = "DELETE FROM yang_resource yr WHERE NOT EXISTS "
+ "(SELECT 1 FROM schema_set_yang_resources ssyr WHERE ssyr.yang_resource_id = yr.id)", nativeQuery = true)
@Autowired
CpsAdminPersistenceService objectUnderTest
+
static final String SET_DATA = '/data/anchor.sql'
static final String EMPTY_DATASPACE_NAME = 'DATASPACE-002'
static final Integer DELETED_ANCHOR_ID = 3001
static final String SCHEMA_SET_NAME_WITH_ANCHORS_AND_DATA = 'SCHEMA-SET-101'
static final String SCHEMA_SET_NAME_NEW = 'SCHEMA-SET-NEW'
- static final Long NEW_RESOURCE_ABSTRACT_ID = 0L
static final String NEW_RESOURCE_NAME = 'some new resource'
static final String NEW_RESOURCE_CONTENT = 'module stores {\n' +
' yang-version 1.1;\n' +
when: 'a new schemaset is stored'
objectUnderTest.storeSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_NEW, newYangResourcesNameToContentMap)
then: 'the schema set is persisted correctly'
- assertSchemaSetPersisted(DATASPACE_NAME, SCHEMA_SET_NAME_NEW, NEW_RESOURCE_ABSTRACT_ID, NEW_RESOURCE_NAME,
+ assertSchemaSetPersisted(DATASPACE_NAME, SCHEMA_SET_NAME_NEW, NEW_RESOURCE_NAME,
NEW_RESOURCE_CONTENT, NEW_RESOURCE_CHECKSUM, NEW_RESOURCE_MODULE_NAME, NEW_RESOURCE_REVISION)
}
+ @Sql([CLEAR_DATA, SET_DATA])
+ def 'Store and retrieve new schema set from new modules and existing modules.'() {
+ given: 'map of new modules, a list of existing modules, module reference'
+ def mapOfNewModules = [newModule1: 'module newmodule { yang-version 1.1; revision "2021-10-12" { } }']
+ def moduleReferenceForExistingModule = new ModuleReference("test","test.org","2021-10-12")
+ def listOfExistingModulesModuleReference = [moduleReferenceForExistingModule]
+ def mapOfExistingModule = [test: 'module test { yang-version 1.1; revision "2021-10-12" { } }']
+ objectUnderTest.storeSchemaSet(DATASPACE_NAME, "someSchemaSetName", mapOfExistingModule)
+ when: 'a new schema set is created from these new modules and existing modules'
+ objectUnderTest.storeSchemaSetFromModules(DATASPACE_NAME, "newSchemaSetName" , mapOfNewModules, listOfExistingModulesModuleReference)
+ then: 'the schema set can be retrieved'
+ def expectedYangResourcesMapAfterSchemaSetHasBeenCreated = mapOfNewModules + mapOfExistingModule
+ def actualYangResourcesMapAfterSchemaSetHasBeenCreated =
+ objectUnderTest.getYangSchemaResources(DATASPACE_NAME, "newSchemaSetName")
+ actualYangResourcesMapAfterSchemaSetHasBeenCreated == expectedYangResourcesMapAfterSchemaSetHasBeenCreated
+ }
+
@Sql([CLEAR_DATA, SET_DATA])
def 'Retrieving schema set (resources) by anchor.'() {
given: 'a new schema set is stored'
def newYangResourcesNameToContentMap = [(NEW_RESOURCE_NAME):existingResourceContent]
when: 'the schema set with duplicate resource is stored'
objectUnderTest.storeSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_NEW, newYangResourcesNameToContentMap)
- then: 'the schema persisted (re)uses the existing id, name and has the same checksum'
- def existingResourceId = 9L
+ then: 'the schema persisted (re)uses the existing name and has the same checksum'
def existingResourceName = 'module1@2020-02-02.yang'
def existingResourceChecksum = 'bea1afcc3d1517e7bf8cae151b3b6bfbd46db77a81754acdcb776a50368efa0a'
def existingResourceModelName = 'test'
def existingResourceRevision = '2020-09-15'
- assertSchemaSetPersisted(DATASPACE_NAME, SCHEMA_SET_NAME_NEW,
- existingResourceId, existingResourceName, existingResourceContent, existingResourceChecksum,
+ assertSchemaSetPersisted(DATASPACE_NAME, SCHEMA_SET_NAME_NEW, existingResourceName,
+ existingResourceContent, existingResourceChecksum,
existingResourceModelName, existingResourceRevision)
}
def assertSchemaSetPersisted(expectedDataspaceName,
expectedSchemaSetName,
- expectedYangResourceId,
expectedYangResourceName,
expectedYangResourceContent,
expectedYangResourceChecksum,
// assert the attached yang resource content
YangResourceEntity yangResourceEntity = yangResourceEntities.iterator().next()
assert yangResourceEntity.id != null
- if (expectedYangResourceId != NEW_RESOURCE_ABSTRACT_ID) {
- // existing resource with known id
- assert yangResourceEntity.id == expectedYangResourceId
- }
yangResourceEntity.name == expectedYangResourceName
yangResourceEntity.content == expectedYangResourceContent
yangResourceEntity.checksum == expectedYangResourceChecksum
void createSchemaSet(@NonNull String dataspaceName, @NonNull String schemaSetName,
@NonNull Map<String, String> yangResourcesNameToContentMap);
+ /**
+ * Create a schema set from new modules and existing modules.
+ *
+ * @param dataspaceName Dataspace name
+ * @param schemaSetName schema set name
+ * @param newYangResourcesModuleNameToContentMap YANG resources map where key is a module name and value is content
+ * @param moduleReferenceList List of YANG resources module references
+ */
+ void createSchemaSetFromModules(@NonNull String dataspaceName, @NonNull String schemaSetName,
+ @NonNull Map<String, String> newYangResourcesModuleNameToContentMap,
+ @NonNull List<ModuleReference> moduleReferenceList);
+
/**
* Read schema set in the given dataspace.
*
yangTextSchemaSourceSetCache.updateCache(dataspaceName, schemaSetName, yangTextSchemaSourceSet);
}
+ @Override
+ public void createSchemaSetFromModules(final String dataspaceName, final String schemaSetName,
+ final Map<String, String> newYangResourcesModuleNameToContentMap,
+ final List<ModuleReference> moduleReferenceList) {
+ cpsModulePersistenceService.storeSchemaSetFromModules(dataspaceName, schemaSetName,
+ newYangResourcesModuleNameToContentMap, moduleReferenceList);
+
+ }
+
@Override
public SchemaSet getSchemaSet(final String dataspaceName, final String schemaSetName) {
final var yangTextSchemaSourceSet = yangTextSchemaSourceSetCache
*/
void createAnchor(@NonNull String dataspaceName, @NonNull String schemaSetName, @NonNull String anchorName);
-
/**
* Read all anchors in the given a dataspace.
*
void storeSchemaSet(@NonNull String dataspaceName, @NonNull String schemaSetName,
@NonNull Map<String, String> yangResourcesNameToContentMap);
+ /**
+ * Stores a schema set from new modules and existing modules.
+ *
+ * @param dataspaceName Dataspace name
+ * @param schemaSetName Schema set name
+ * @param newYangResourcesModuleNameToContentMap YANG resources map where key is a module name and value is content
+ * @param moduleReferenceList List of YANG resources module references
+ */
+ void storeSchemaSetFromModules(@NonNull String dataspaceName, @NonNull String schemaSetName,
+ @NonNull Map<String, String> newYangResourcesModuleNameToContentMap,
+ @NonNull List<ModuleReference> moduleReferenceList);
+
/**
* Deletes Schema Set.
*
@Autowired
CpsModuleServiceImpl objectUnderTest
- def 'Create schema set'() {
+ def 'Create schema set.'() {
given: 'Valid yang resource as name-to-content map'
def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('bookstore.yang')
when: 'Create schema set method is invoked'
1 * mockModuleStoreService.storeSchemaSet('someDataspace', 'someSchemaSet', yangResourcesNameToContentMap)
}
+ def 'Create schema set from new modules and existing modules.'() {
+ given: 'a list of existing modules module reference'
+ def moduleReferenceForExistingModule = new ModuleReference("test", "test.org", "2021-10-12")
+ def listOfExistingModulesModuleReference = [moduleReferenceForExistingModule]
+ when: 'create schema set from modules method is invoked'
+ objectUnderTest.createSchemaSetFromModules("someDataspaceName", "someSchemaSetName", [newModule: "newContent"], listOfExistingModulesModuleReference)
+ then: 'processing is delegated to persistence service'
+ 1 * mockModuleStoreService.storeSchemaSetFromModules("someDataspaceName", "someSchemaSetName", [newModule: "newContent"], listOfExistingModulesModuleReference)
+
+ }
+
def 'Create schema set from invalid resources'() {
given: 'Invalid yang resource as name-to-content map'
def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('invalid.yang')