From 6bd247357a3112be96b94d52532aa09231ed520c Mon Sep 17 00:00:00 2001 From: niamhcore Date: Mon, 11 Jan 2021 17:14:08 +0000 Subject: Persisting data nodes (fragments tree structure) Issue-ID: CPS-136 Signed-off-by: niamhcore Change-Id: I559afad41bf0eab1cc98c777a418b348c9c1b81c --- .../org/onap/cps/spi/entities/FragmentEntity.java | 11 ++- .../spi/impl/CpsDataPersistenceServiceImpl.java | 88 ++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java (limited to 'cps-ri/src/main/java/org/onap') diff --git a/cps-ri/src/main/java/org/onap/cps/spi/entities/FragmentEntity.java b/cps-ri/src/main/java/org/onap/cps/spi/entities/FragmentEntity.java index d1557489c3..677652899d 100755 --- a/cps-ri/src/main/java/org/onap/cps/spi/entities/FragmentEntity.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/entities/FragmentEntity.java @@ -22,6 +22,8 @@ package org.onap.cps.spi.entities; import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import java.io.Serializable; +import java.util.Set; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -30,10 +32,13 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.OneToOne; +import javax.persistence.Table; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -44,12 +49,14 @@ import org.hibernate.annotations.TypeDefs; /** * Entity to store a fragment. */ +@Data @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder @Entity +@Table(name = "fragment") @TypeDefs({@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)}) public class FragmentEntity implements Serializable { @@ -76,7 +83,7 @@ public class FragmentEntity implements Serializable { @JoinColumn(name = "anchor_id") private AnchorEntity anchor; - @OneToOne(fetch = FetchType.LAZY) + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") - private FragmentEntity parentFragment; + private Set childFragments; } diff --git a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java new file mode 100644 index 0000000000..283d646825 --- /dev/null +++ b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java @@ -0,0 +1,88 @@ +/* + * ============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.impl; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.onap.cps.spi.CpsDataPersistenceService; +import org.onap.cps.spi.entities.AnchorEntity; +import org.onap.cps.spi.entities.DataspaceEntity; +import org.onap.cps.spi.entities.FragmentEntity; +import org.onap.cps.spi.model.DataNode; +import org.onap.cps.spi.repository.AnchorRepository; +import org.onap.cps.spi.repository.DataspaceRepository; +import org.onap.cps.spi.repository.FragmentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService { + + @Autowired + private DataspaceRepository dataspaceRepository; + + @Autowired + private AnchorRepository anchorRepository; + + @Autowired + private FragmentRepository fragmentRepository; + + private static Gson GSON = new GsonBuilder().create(); + + @Override + public void storeDataNode(final String dataspaceName, final String anchorName, final DataNode dataNode) { + final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName); + final AnchorEntity anchorEntity = anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName); + final FragmentEntity fragmentEntity = convertToFragmentWithAllDescendants(dataspaceEntity, anchorEntity, + dataNode); + fragmentRepository.save(fragmentEntity); + } + + /** + * Convert DataNode object into Fragment and places the result in the fragments placeholder. Performs same action + * for all DataNode children recursively. + * + * @param dataspaceEntity dataspace + * @param anchorEntity anchorEntity + * @param dataNodeToBeConverted dataNode + * @return a Fragment built from current DataNode + */ + private static FragmentEntity convertToFragmentWithAllDescendants(final DataspaceEntity dataspaceEntity, + final AnchorEntity anchorEntity, final DataNode dataNodeToBeConverted) { + final FragmentEntity parentFragment = FragmentEntity.builder() + .dataspace(dataspaceEntity) + .anchor(anchorEntity) + .xpath(dataNodeToBeConverted.getXpath()) + .attributes(GSON.toJson(dataNodeToBeConverted.getLeaves())) + .build(); + + final Builder fragmentEntityBuilder = ImmutableSet.builder(); + for (final DataNode childDataNode : dataNodeToBeConverted.getChildDataNodes()) { + final FragmentEntity childFragment = + convertToFragmentWithAllDescendants(parentFragment.getDataspace(), parentFragment.getAnchor(), + childDataNode); + fragmentEntityBuilder.add(childFragment); + } + parentFragment.setChildFragments(fragmentEntityBuilder.build()); + return parentFragment; + } +} -- cgit 1.2.3-korg