summaryrefslogtreecommitdiffstats
path: root/cps-ri/src/main
diff options
context:
space:
mode:
authorniamhcore <niamh.core@est.tech>2021-01-11 17:14:08 +0000
committerniamhcore <niamh.core@est.tech>2021-01-18 09:45:16 +0000
commit6bd247357a3112be96b94d52532aa09231ed520c (patch)
tree51f651cd44dc57f52842efa519296225dbb9ff1a /cps-ri/src/main
parenta16c3fb5f7f0bbe7bda9e4f21f71a3e958ed523f (diff)
Persisting data nodes (fragments tree structure)
Issue-ID: CPS-136 Signed-off-by: niamhcore <niamh.core@est.tech> Change-Id: I559afad41bf0eab1cc98c777a418b348c9c1b81c
Diffstat (limited to 'cps-ri/src/main')
-rwxr-xr-xcps-ri/src/main/java/org/onap/cps/spi/entities/FragmentEntity.java11
-rw-r--r--cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java88
2 files changed, 97 insertions, 2 deletions
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 d1557489c..677652899 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<FragmentEntity> 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 000000000..283d64682
--- /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<FragmentEntity> 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;
+ }
+}