aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao
diff options
context:
space:
mode:
authortalig <talig@amdocs.com>2017-12-20 14:30:43 +0200
committerVitaly Emporopulo <Vitaliy.Emporopulo@amdocs.com>2017-12-21 11:12:33 +0000
commit8e9c0653dd6c6862123c9609ae34e1206d86456e (patch)
tree5eeef00ec0677133baa439ca8d7ffd7aca4804b6 /openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao
parent785ebcc95de3e064e843bec04ba7a209d854fc7c (diff)
Add collaboration feature
Issue-ID: SDC-767 Change-Id: I14fb4c1f54086ed03a56a7ff7fab9ecd40381795 Signed-off-by: talig <talig@amdocs.com>
Diffstat (limited to 'openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao')
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementRepository.java29
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepository.java34
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepositoryFactory.java14
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepository.java21
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepositoryFactory.java14
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/StageRepository.java15
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/SynchronizationStateRepository.java16
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDao.java29
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDaoFactory.java13
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepository.java9
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepositoryFactory.java13
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepository.java18
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepositoryFactory.java14
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepository.java375
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/CassandraDaoUtils.java (renamed from openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraDaoUtils.java)4
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryFactoryImpl.java (renamed from openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepositoryFactory.java)6
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryImpl.java565
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryFactoryImpl.java31
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryImpl.java423
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryFactoryImpl.java33
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryImpl.java209
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoFactoryImpl.java15
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoImpl.java185
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryFactoryImpl.java15
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryImpl.java82
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryFactoryImpl.java33
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryImpl.java137
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/ElementEntity.java22
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/StageEntity.java60
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/SynchronizationStateEntity.java116
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionContext.java23
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionDataElement.java21
-rw-r--r--openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionEntity.java45
33 files changed, 2248 insertions, 391 deletions
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementRepository.java
index 967814c4d8..7681327e40 100644
--- a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementRepository.java
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementRepository.java
@@ -1,15 +1,18 @@
package org.openecomp.core.zusammen.plugin.dao;
+import com.amdocs.zusammen.datatypes.Id;
import com.amdocs.zusammen.datatypes.SessionContext;
import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
-import java.util.Collection;
+import java.util.Map;
import java.util.Optional;
public interface ElementRepository {
- Collection<ElementEntity> list(SessionContext context, ElementEntityContext elementContext);
+ Map<Id,Id> listIds(SessionContext context, ElementEntityContext elementContext);
+
+/* void createVersionData(SessionContext context, ElementEntityContext elementContext, VersionDataElement element);*/
void create(SessionContext context, ElementEntityContext elementContext, ElementEntity element);
@@ -20,8 +23,28 @@ public interface ElementRepository {
Optional<ElementEntity> get(SessionContext context, ElementEntityContext elementContext,
ElementEntity element);
+ Optional<ElementEntity> getDescriptor(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element);
+
void createNamespace(SessionContext context, ElementEntityContext elementContext,
ElementEntity element);
- boolean checkHealth(SessionContext context);
+ Optional<Id> getHash(SessionContext context, ElementEntityContext elementEntityContext,
+ ElementEntity element);
+
+
+
+
+/* Collection<SynchronizationStateEntity> listSynchronizationStates(SessionContext context,
+ ElementEntityContext elementContext);
+
+ void updateSynchronizationState(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState);
+
+ void markAsDirty(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState);
+
+ Optional<SynchronizationStateEntity> getSynchronizationState(SessionContext context,
+ ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState);*/
}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepository.java
new file mode 100644
index 0000000000..ac3dc4e4bf
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepository.java
@@ -0,0 +1,34 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.datatypes.item.Action;
+import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
+
+import java.util.Collection;
+import java.util.Optional;
+
+public interface ElementStageRepository
+ extends StageRepository<ElementEntityContext, ElementEntity> {
+
+ Optional<StageEntity<ElementEntity>> getDescriptor(SessionContext context,
+ ElementEntityContext elementContext,
+ ElementEntity element);
+
+ Collection<ElementEntity> listIds(SessionContext context,
+ ElementEntityContext elementContext);
+
+ Collection<ElementEntity> listConflictedIds(SessionContext context,
+ ElementEntityContext elementContext);
+
+ void markAsNotConflicted(SessionContext context, ElementEntityContext entityContext,
+ ElementEntity entity, Action action);
+
+ void markAsNotConflicted(SessionContext context, ElementEntityContext entityContext,
+ ElementEntity entity);
+
+ void update(SessionContext context, ElementEntityContext entityContext, ElementEntity entity,
+ Action action, boolean conflicted);
+
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepositoryFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepositoryFactory.java
new file mode 100644
index 0000000000..1e41308ff2
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementStageRepositoryFactory.java
@@ -0,0 +1,14 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.utils.facade.api.AbstractComponentFactory;
+import com.amdocs.zusammen.utils.facade.api.AbstractFactory;
+
+public abstract class ElementStageRepositoryFactory
+ extends AbstractComponentFactory<ElementStageRepository> {
+ public static ElementStageRepositoryFactory getInstance() {
+ return AbstractFactory.getInstance(ElementStageRepositoryFactory.class);
+ }
+
+ public abstract ElementStageRepository createInterface(SessionContext context);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepository.java
new file mode 100644
index 0000000000..53c029bb6f
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepository.java
@@ -0,0 +1,21 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
+
+import java.util.Collection;
+
+public interface ElementSynchronizationStateRepository
+ extends SynchronizationStateRepository<ElementEntityContext> {
+
+ Collection<SynchronizationStateEntity> list(SessionContext context,
+ ElementEntityContext elementContext);
+
+ void update(SessionContext context, ElementEntityContext entityContext,
+ SynchronizationStateEntity syncStateEntity);
+
+ void markAsDirty(SessionContext context, ElementEntityContext entityContext,
+ SynchronizationStateEntity syncStateEntity);
+
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepositoryFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepositoryFactory.java
new file mode 100644
index 0000000000..26f3bb4f56
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/ElementSynchronizationStateRepositoryFactory.java
@@ -0,0 +1,14 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.utils.facade.api.AbstractComponentFactory;
+import com.amdocs.zusammen.utils.facade.api.AbstractFactory;
+
+public abstract class ElementSynchronizationStateRepositoryFactory
+ extends AbstractComponentFactory<ElementSynchronizationStateRepository> {
+ public static ElementSynchronizationStateRepositoryFactory getInstance() {
+ return AbstractFactory.getInstance(ElementSynchronizationStateRepositoryFactory.class);
+ }
+
+ public abstract ElementSynchronizationStateRepository createInterface(SessionContext context);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/StageRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/StageRepository.java
new file mode 100644
index 0000000000..98b0d8242c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/StageRepository.java
@@ -0,0 +1,15 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
+
+import java.util.Optional;
+
+public interface StageRepository<C, E> {
+
+ Optional<StageEntity<E>> get(SessionContext context, C entityContext, E entity);
+
+ void create(SessionContext context, C entityContext, StageEntity<E> stageEntity);
+
+ void delete(SessionContext context, C entityContext, E entity);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/SynchronizationStateRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/SynchronizationStateRepository.java
new file mode 100644
index 0000000000..f227b0c925
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/SynchronizationStateRepository.java
@@ -0,0 +1,16 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
+
+import java.util.Optional;
+
+public interface SynchronizationStateRepository<C> {
+
+ void create(SessionContext context, C entityContext, SynchronizationStateEntity syncStateEntity);
+
+ void delete(SessionContext context, C entityContext, SynchronizationStateEntity syncStateEntity);
+
+ Optional<SynchronizationStateEntity> get(SessionContext context, C entityContext,
+ SynchronizationStateEntity syncStateEntity);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDao.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDao.java
new file mode 100644
index 0000000000..f8ad0405b2
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDao.java
@@ -0,0 +1,29 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Optional;
+
+public interface VersionDao {
+ Collection<VersionEntity> list(SessionContext context, String space, Id itemId);
+
+ Optional<VersionEntity> get(SessionContext context, String space, Id itemId, Id versionId);
+
+ void create(SessionContext context, String space, Id itemId, VersionEntity version);
+
+ void updateModificationTime(SessionContext context, String space, Id itemId, Id versionId, Date modificationTime);
+
+ void delete(SessionContext context, String space, Id itemId, Id versionId);
+
+ boolean checkHealth(SessionContext context);
+
+ void createVersionElements(SessionContext context, String publicSpace, Id itemId, Id versionId,
+ Id revisionId, Map<Id, Id> versionElementIds, Date publishTime,
+ String message);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDaoFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDaoFactory.java
new file mode 100644
index 0000000000..2847959f8f
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionDaoFactory.java
@@ -0,0 +1,13 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.utils.facade.api.AbstractComponentFactory;
+import com.amdocs.zusammen.utils.facade.api.AbstractFactory;
+
+public abstract class VersionDaoFactory extends AbstractComponentFactory<VersionDao> {
+ public static VersionDaoFactory getInstance() {
+ return AbstractFactory.getInstance(VersionDaoFactory.class);
+ }
+
+ public abstract VersionDao createInterface(SessionContext context);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepository.java
new file mode 100644
index 0000000000..568e0c9d2b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepository.java
@@ -0,0 +1,9 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+
+import org.openecomp.core.zusammen.plugin.dao.types.VersionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+public interface VersionStageRepository extends StageRepository<VersionContext, VersionEntity> {
+
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepositoryFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepositoryFactory.java
new file mode 100644
index 0000000000..fc9e7725eb
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionStageRepositoryFactory.java
@@ -0,0 +1,13 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.utils.facade.api.AbstractComponentFactory;
+import com.amdocs.zusammen.utils.facade.api.AbstractFactory;
+
+public abstract class VersionStageRepositoryFactory extends AbstractComponentFactory<VersionStageRepository> {
+ public static VersionStageRepositoryFactory getInstance() {
+ return AbstractFactory.getInstance(VersionStageRepositoryFactory.class);
+ }
+
+ public abstract VersionStageRepository createInterface(SessionContext context);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepository.java
new file mode 100644
index 0000000000..9134392d3b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepository.java
@@ -0,0 +1,18 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+import java.util.List;
+
+public interface VersionSynchronizationStateRepository
+ extends SynchronizationStateRepository<VersionContext> {
+
+ void updatePublishTime(SessionContext context, VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity);
+
+ List<SynchronizationStateEntity> list(SessionContext context, VersionContext entityContext,
+ VersionEntity versionEntity);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepositoryFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepositoryFactory.java
new file mode 100644
index 0000000000..dfedb5897b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/VersionSynchronizationStateRepositoryFactory.java
@@ -0,0 +1,14 @@
+package org.openecomp.core.zusammen.plugin.dao;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.utils.facade.api.AbstractComponentFactory;
+import com.amdocs.zusammen.utils.facade.api.AbstractFactory;
+
+public abstract class VersionSynchronizationStateRepositoryFactory
+ extends AbstractComponentFactory<VersionSynchronizationStateRepository> {
+ public static VersionSynchronizationStateRepositoryFactory getInstance() {
+ return AbstractFactory.getInstance(VersionSynchronizationStateRepositoryFactory.class);
+ }
+
+ public abstract VersionSynchronizationStateRepository createInterface(SessionContext context);
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepository.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepository.java
deleted file mode 100644
index 6cc1350444..0000000000
--- a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepository.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright © 2016-2017 European Support Limited
- *
- * 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 org.openecomp.core.zusammen.plugin.dao.impl;
-
-import com.amdocs.zusammen.datatypes.Id;
-import com.amdocs.zusammen.datatypes.Namespace;
-import com.amdocs.zusammen.datatypes.SessionContext;
-import com.amdocs.zusammen.datatypes.item.Info;
-import com.amdocs.zusammen.datatypes.item.Relation;
-import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
-import com.amdocs.zusammen.utils.fileutils.json.JsonUtil;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.mapping.annotations.Accessor;
-import com.datastax.driver.mapping.annotations.Param;
-import com.datastax.driver.mapping.annotations.Query;
-import com.google.gson.reflect.TypeToken;
-import org.openecomp.core.zusammen.plugin.dao.ElementRepository;
-import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
-
-import java.lang.reflect.Type;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-public class CassandraElementRepository implements ElementRepository {
-
- private static final String VERSION_ELEMENT_NOT_EXIST_ERROR_MSG =
- "List version elements error: " +
- "element %s, which appears as an element of item %s version %s, does not exist";
-
- @Override
- public Collection<ElementEntity> list(SessionContext context,
- ElementEntityContext elementContext) {
- Set<String> elementIds = getVersionElementIds(context, elementContext);
-
- Collection<ElementEntity> elements = new ArrayList<>();
- for (String elementId : elementIds) {
- elements.add(get(context, elementContext, new ElementEntity(new Id(elementId)))
- .orElseThrow(
- () -> new IllegalStateException(String.format(VERSION_ELEMENT_NOT_EXIST_ERROR_MSG,
- elementId, elementContext.getItemId().getValue(),
- getVersionId(elementContext)))));
- }
- return elements;
- }
-
- @Override
- public void create(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- createElement(context, elementContext, element);
- addElementToParent(context, elementContext, element);
- }
-
- @Override
- public void update(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- updateElement(context, elementContext, element);
- }
-
- @Override
- public void delete(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- removeElementFromParent(context, elementContext, element);
- deleteElement(context, elementContext, element);
- }
-
- @Override
- public Optional<ElementEntity> get(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- Row row = getElementAccessor(context).get(
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- getVersionId(elementContext),
- element.getId().toString()).one();
-
- return row == null ? Optional.empty() : Optional.of(getElementEntity(element, row));
- }
-
- @Override
- public void createNamespace(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- getElementNamespaceAccessor(context).create(
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- element.getId().toString(),
- element.getNamespace().toString());
- }
-
- @Override
- public boolean checkHealth(SessionContext context) {
- ResultSet resultSet = getVersionElementsAccessor(context).checkHealth();
- return resultSet.getColumnDefinitions().contains("element_ids");
- }
-
- private String getVersionId(ElementEntityContext elementContext) {
- return elementContext.getChangeRef() == null
- ? elementContext.getVersionId().toString()
- : elementContext.getChangeRef();
- }
-
- private ElementNamespaceAccessor getElementNamespaceAccessor(SessionContext context) {
- return CassandraDaoUtils.getAccessor(context, ElementNamespaceAccessor.class);
- }
-
- private ElementAccessor getElementAccessor(SessionContext context) {
- return CassandraDaoUtils.getAccessor(context, ElementAccessor.class);
- }
-
- private VersionElementsAccessor getVersionElementsAccessor(SessionContext context) {
- return CassandraDaoUtils.getAccessor(context, VersionElementsAccessor.class);
- }
-
- private void createElement(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- Set<String> subElementIds =
- element.getSubElementIds().stream().map(Id::toString).collect(Collectors.toSet());
- String versionId = getVersionId(elementContext);
-
- getElementAccessor(context).create(
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- versionId,
- element.getId().toString(),
- element.getParentId().toString(),
- element.getNamespace().toString(),
- JsonUtil.object2Json(element.getInfo()),
- JsonUtil.object2Json(element.getRelations()),
- element.getData(),
- element.getSearchableData(),
- element.getVisualization(),
- subElementIds);
-
- getVersionElementsAccessor(context).addElements(
- Collections.singleton(element.getId().toString()),
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- versionId);
- }
-
- private void updateElement(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- getElementAccessor(context).update(
- JsonUtil.object2Json(element.getInfo()),
- JsonUtil.object2Json(element.getRelations()),
- element.getData(),
- element.getSearchableData(),
- element.getVisualization(),
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- elementContext.getVersionId().toString(),
- element.getId().toString());
- }
-
- private void deleteElement(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- String versionId = getVersionId(elementContext);
-
- getElementAccessor(context).delete(
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- versionId,
- element.getId().toString());
-
- getVersionElementsAccessor(context).removeElements(
- Collections.singleton(element.getId().toString()),
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- versionId);
- }
-
- private void addElementToParent(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- getElementAccessor(context).addSubElements(
- Collections.singleton(element.getId().toString()),
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- getVersionId(elementContext),
- element.getParentId().toString());
- }
-
- private void removeElementFromParent(SessionContext context, ElementEntityContext elementContext,
- ElementEntity element) {
- if (element.getParentId() == null) {
- return;
- }
- getElementAccessor(context).removeSubElements(
- Collections.singleton(element.getId().toString()),
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- getVersionId(elementContext),
- element.getParentId().toString());
- }
-
- private ElementEntity getElementEntity(ElementEntity element, Row row) {
- element.setNamespace(getNamespace(row.getString(ElementField.NAMESPACE)));
- element.setParentId(new Id(row.getString(ElementField.PARENT_ID)));
- element.setInfo(json2Object(row.getString(ElementField.INFO), Info.class));
- element.setRelations(
- json2Object(row.getString(ElementField.RELATIONS), new TypeToken<ArrayList<Relation>>() {
- }.getType()));
- element.setData(row.getBytes(ElementField.DATA));
- element.setSearchableData(row.getBytes(ElementField.SEARCHABLE_DATA));
- element.setVisualization(row.getBytes(ElementField.VISUALIZATION));
- element.setSubElementIds(row.getSet(ElementField.SUB_ELEMENT_IDS, String.class)
- .stream().map(Id::new).collect(Collectors.toSet()));
- return element;
- }
-
- private Namespace getNamespace(String namespaceStr) {
- Namespace namespace = new Namespace();
- if (namespaceStr != null) {
- namespace.setValue(namespaceStr);
- }
- return namespace;
- }
-
- private static <T> T json2Object(String json, Type typeOfT) {
- return json == null ? null : JsonUtil.json2Object(json, typeOfT);
- }
-
- private Set<String> getVersionElementIds(SessionContext context,
- ElementEntityContext elementContext) {
- Row row = getVersionElementsAccessor(context).get(
- elementContext.getSpace(),
- elementContext.getItemId().toString(),
- getVersionId(elementContext)).one();
- return row == null
- ? new HashSet<>()
- : row.getSet(CassandraElementRepository.VersionElementsField.ELEMENT_IDS, String.class);
- }
-
- /*
-CREATE TABLE IF NOT EXISTS element_namespace (
- space text,
- item_id text,
- element_id text,
- namespace text,
- PRIMARY KEY (( space, item_id, element_id ))
-);
- */
- @Accessor
- interface ElementNamespaceAccessor {
- @Query(
- "UPDATE element_namespace SET namespace=:ns " +
- "WHERE space=:space AND item_id=:item AND element_id=:id ")
- void create(@Param("space") String space,
- @Param("item") String itemId,
- @Param("id") String elementId,
- @Param("ns") String namespace);
- }
-
- /*
-CREATE TABLE IF NOT EXISTS element (
- space text,
- item_id text,
- version_id text,
- element_id text,
- parent_id text,
- namespace text,
- info text,
- relations text,
- data blob,
- searchable_data blob,
- visualization blob,
- sub_element_ids set<text>,
- PRIMARY KEY (( space, item_id, version_id, element_id ))
-);
- */
- @Accessor
- interface ElementAccessor {
- @Query(
- "UPDATE element SET parent_id=:parentId, namespace=:ns, info=:info, relations=:rels, " +
- "data=:data, searchable_data=:searchableData, visualization=:visualization, " +
- "sub_element_ids=sub_element_ids+:subs " +
- "WHERE space=:space AND item_id=:item AND version_id=:ver AND element_id=:id ")
- void create(@Param("space") String space,
- @Param("item") String itemId,
- @Param("ver") String versionId,
- @Param("id") String elementId,
- @Param("parentId") String parentElementId,
- @Param("ns") String namespace,
- @Param("info") String info,
- @Param("rels") String relations,
- @Param("data") ByteBuffer data,
- @Param("searchableData") ByteBuffer searchableData,
- @Param("visualization") ByteBuffer visualization,
- @Param("subs") Set<String> subElementIds);
-
- @Query("UPDATE element SET info=?, relations=?, data=?, searchable_data=?, visualization=?" +
- " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
- void update(String info, String relations, ByteBuffer data, ByteBuffer searchableData,
- ByteBuffer visualization, String space, String itemId, String versionId,
- String elementId);
-
- @Query("DELETE FROM element WHERE space=? AND item_id=? AND version_id=? AND element_id=?")
- void delete(String space, String itemId, String versionId, String elementId);
-
- @Query("SELECT parent_id, namespace, info, relations, data, searchable_data, visualization, " +
- "sub_element_ids FROM element " +
- "WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
- ResultSet get(String space, String itemId, String versionId, String elementId);
-
- @Query("UPDATE element SET sub_element_ids=sub_element_ids+? " +
- " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
- void addSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
- String elementId);
-
- @Query("UPDATE element SET sub_element_ids=sub_element_ids-? " +
- " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
- void removeSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
- String elementId);
- }
-
- private static final class ElementField {
- private static final String NAMESPACE = "namespace";
- private static final String PARENT_ID = "parent_id";
- private static final String INFO = "info";
- private static final String RELATIONS = "relations";
- private static final String DATA = "data";
- private static final String SEARCHABLE_DATA = "searchable_data";
- private static final String VISUALIZATION = "visualization";
- private static final String SUB_ELEMENT_IDS = "sub_element_ids";
- }
-
- /*
- CREATE TABLE IF NOT EXISTS version_elements (
- space text,
- item_id text,
- version_id text,
- element_ids set<text>,
- PRIMARY KEY (( space, item_id, version_id ))
- );
- */
- @Accessor
- interface VersionElementsAccessor {
-
- @Query("UPDATE version_elements SET element_ids=element_ids+? " +
- "WHERE space=? AND item_id=? AND version_id=?")
- void addElements(Set<String> elementIds, String space, String itemId, String versionId);
-
- @Query("UPDATE version_elements SET element_ids=element_ids-? " +
- "WHERE space=? AND item_id=? AND version_id=?")
- void removeElements(Set<String> elementIds, String space, String itemId, String versionId);
-
- @Query("SELECT element_ids FROM version_elements WHERE space=? AND item_id=? AND version_id=?")
- ResultSet get(String space, String itemId, String versionId);
-
- @Query("SELECT element_ids FROM version_elements LIMIT 1")
- ResultSet checkHealth();
- }
-
- private static final class VersionElementsField {
- private static final String ELEMENT_IDS = "element_ids";
- }
-}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraDaoUtils.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/CassandraDaoUtils.java
index 20a1e1803f..b6cb9e4070 100644
--- a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraDaoUtils.java
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/CassandraDaoUtils.java
@@ -1,9 +1,9 @@
-package org.openecomp.core.zusammen.plugin.dao.impl;
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
-import com.datastax.driver.core.Session;
import com.amdocs.zusammen.commons.db.api.cassandra.CassandraConnectorFactory;
import com.amdocs.zusammen.commons.db.api.cassandra.types.CassandraContext;
import com.amdocs.zusammen.datatypes.SessionContext;
+import com.datastax.driver.core.Session;
class CassandraDaoUtils {
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepositoryFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryFactoryImpl.java
index f3072a6502..8540816f00 100644
--- a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/CassandraElementRepositoryFactory.java
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryFactoryImpl.java
@@ -14,15 +14,15 @@
* limitations under the License.
*/
-package org.openecomp.core.zusammen.plugin.dao.impl;
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
import com.amdocs.zusammen.datatypes.SessionContext;
import org.openecomp.core.zusammen.plugin.dao.ElementRepository;
import org.openecomp.core.zusammen.plugin.dao.ElementRepositoryFactory;
-public class CassandraElementRepositoryFactory extends ElementRepositoryFactory {
+public class ElementRepositoryFactoryImpl extends ElementRepositoryFactory {
- private static final ElementRepository INSTANCE = new CassandraElementRepository();
+ private static final ElementRepository INSTANCE = new ElementRepositoryImpl();
@Override
public ElementRepository createInterface(SessionContext context) {
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryImpl.java
new file mode 100644
index 0000000000..bb3b1cfa7c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementRepositoryImpl.java
@@ -0,0 +1,565 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.Namespace;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.datatypes.item.Info;
+import com.amdocs.zusammen.datatypes.item.Relation;
+import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import com.amdocs.zusammen.utils.fileutils.json.JsonUtil;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Param;
+import com.datastax.driver.mapping.annotations.Query;
+import com.google.gson.reflect.TypeToken;
+import org.openecomp.core.zusammen.plugin.ZusammenPluginConstants;
+import org.openecomp.core.zusammen.plugin.dao.ElementRepository;
+import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
+
+import java.lang.reflect.Type;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+public class ElementRepositoryImpl implements ElementRepository {
+
+ @Override
+ public Map<Id, Id> listIds(SessionContext context, ElementEntityContext elementContext) {
+
+ if (elementContext.getRevisionId() == null) {
+ String revisionId = calculateLastRevisionId(context, elementContext);
+ if (revisionId == null) {
+ return new HashMap<>();
+ }
+
+ elementContext.setRevisionId(new Id(revisionId));
+ }
+ return getVersionElementIds(context, elementContext).entrySet().stream().collect(Collectors
+ .toMap(entry -> new Id(entry.getKey()), entry -> new Id(entry.getValue())));
+
+ /* return getVersionElementIds(context, elementContext).stream()
+ .map(Id::new)
+ .collect(Collectors.toList());*/
+
+ }
+
+ @Override
+ public void create(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ createElement(context, elementContext, element);
+ addElementToParent(context, elementContext, element);
+ }
+
+ @Override
+ public void update(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+
+ Id elementRevisionId = getElementRevision(context, elementContext, element.getId());
+ if (elementRevisionId.equals(elementContext.getRevisionId())) {
+ updateElement(context, elementContext, element);
+ } else {
+ createElement(context, elementContext, element);
+ }
+ }
+
+ @Override
+ public void delete(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ removeElementFromParent(context, elementContext, element);
+ deleteElement(context, elementContext, element);
+ }
+
+ @Override
+ public Optional<ElementEntity> get(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ String revisionId = calculateElementRevisionId(context, elementContext, element);
+ if (revisionId == null) {
+ return Optional.empty();
+ }
+
+ Row row = getElementAccessor(context).get(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString(),
+ revisionId).one();
+
+ return row == null ? Optional.empty() : Optional.of(getElementEntity(element, row));
+ }
+
+ @Override
+ public Optional<ElementEntity> getDescriptor(SessionContext context,
+ ElementEntityContext elementContext,
+ ElementEntity element) {
+ String revisionId = calculateElementRevisionId(context, elementContext, element);
+ if (revisionId == null) {
+ return Optional.empty();
+ }
+
+ Row row = getElementAccessor(context).getDescriptor(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString(),
+ revisionId).one();
+
+ return row == null ? Optional.empty() : Optional.of(getElementEntityDescriptor(element, row));
+ }
+
+ @Override
+ public void createNamespace(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ getElementNamespaceAccessor(context).create(elementContext.getItemId().toString(),
+ element.getId().toString(),
+ element.getNamespace().toString());
+ }
+
+ @Override
+ public Optional<Id> getHash(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ String revisionId = calculateElementRevisionId(context, elementContext, element);
+ if (revisionId == null) {
+ return Optional.empty();
+ }
+
+ Row row = getElementAccessor(context).getHash(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString(),
+ revisionId).one();
+
+ return row == null ? Optional.empty() : Optional.of(getElementHash(row));
+ }
+
+ private String calculateElementRevisionId(SessionContext context,
+ ElementEntityContext elementContext,
+ ElementEntity element) {
+
+ if (elementContext.getSpace().equals(ZusammenPluginConstants.PUBLIC_SPACE)) {
+
+ String versionRevision;
+ if (elementContext.getRevisionId() == null) {
+ versionRevision = calculateLastRevisionId(context, elementContext);
+ } else {
+ versionRevision = elementContext.getRevisionId().getValue();
+ }
+
+ elementContext.setRevisionId(new Id(versionRevision));
+ Map<String, String> elementIds = getVersionElementIds(context, elementContext);
+ if (elementIds.containsKey(element.getId().getValue())) {
+ return elementIds.get(element.getId().getValue());
+ } else {
+ return null;
+ }
+
+ } else {
+ return Id.ZERO.getValue();
+ }
+ }
+
+ private String calculateLastRevisionId(SessionContext context, ElementEntityContext
+ elementContext) {
+ List<Row> rows = getVersionElementsAccessor(context).listRevisions(elementContext.getSpace(),
+ elementContext
+ .getItemId().toString(), elementContext.getVersionId().toString()).all();
+ if (rows == null || rows.size() == 0) {
+ return null;
+ }
+ rows.sort((o1, o2) -> o1.getDate(VersionElementsField.PUBLISH_TIME)
+ .after(o2.getDate(VersionElementsField.PUBLISH_TIME)) ? -1 : 1);
+ return rows.get(0).getString(VersionElementsField.REVISION_ID);
+ }
+
+ /*private static String getVersionId(ElementEntityContext elementContext) {
+ return elementContext.getRevisionId() == null
+ ? elementContext.getVersionId().toString()
+ : elementContext.getRevisionId().getValue();
+ }*/
+
+ private ElementNamespaceAccessor getElementNamespaceAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, ElementNamespaceAccessor.class);
+ }
+
+ private ElementAccessor getElementAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, ElementAccessor.class);
+ }
+
+ private VersionElementsAccessor getVersionElementsAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionElementsAccessor.class);
+ }
+
+ private void createElement(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ createElementRow(context, elementContext, element);
+
+ Map<String, String> elementIds = new TreeMap<>();
+ elementIds.put(element.getId().toString(), elementContext.getRevisionId().getValue());
+ getVersionElementsAccessor(context).addElements(
+ elementIds,
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ private void createElementRow(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ Set<String> subElementIds =
+ element.getSubElementIds().stream().map(Id::toString).collect(Collectors.toSet());
+
+ getElementAccessor(context).create(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString(),
+ elementContext.getRevisionId().getValue(),
+ element.getParentId() == null ? null : element.getParentId().toString(),
+ element.getNamespace() == null ? null : element.getNamespace().toString(),
+ JsonUtil.object2Json(element.getInfo()),
+ JsonUtil.object2Json(element.getRelations()),
+ element.getData(),
+ element.getSearchableData(),
+ element.getVisualization(),
+ subElementIds,
+ element.getElementHash().getValue());
+ }
+
+ private void updateElement(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+
+
+ if (element.getParentId() == null) {
+ getElementAccessor(context).update(
+ JsonUtil.object2Json(element.getInfo()),
+ JsonUtil.object2Json(element.getRelations()),
+ element.getData(),
+ element.getSearchableData(),
+ element.getVisualization(),
+ element.getElementHash().getValue(),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString(),
+ elementContext.getRevisionId().getValue());
+ } else {
+ getElementAccessor(context).update(
+ JsonUtil.object2Json(element.getInfo()),
+ JsonUtil.object2Json(element.getRelations()),
+ element.getData(),
+ element.getSearchableData(),
+ element.getVisualization(),
+ element.getElementHash().getValue(),
+ element.getParentId().getValue(),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ Map<String, String> elementIds = new TreeMap<>();
+ elementIds.put(element.getId().getValue(), elementContext.getRevisionId().getValue());
+ getVersionElementsAccessor(context).addElements(
+ elementIds,
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ private void deleteElement(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+
+
+ getElementAccessor(context).delete(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString(),
+ elementContext.getRevisionId().getValue());
+
+ getVersionElementsAccessor(context).removeElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ private void addElementToParent(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ if (element.getParentId() == null) {
+ return;
+ }
+
+
+ getElementAccessor(context).addSubElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getParentId().toString(),
+ elementContext.getRevisionId().getValue());
+
+ Map<String, String> elementIds = new TreeMap<>();
+ elementIds.put(element.getParentId().toString(), elementContext.getRevisionId().getValue());
+ getVersionElementsAccessor(context).addElements(elementIds, elementContext.getSpace(),
+ elementContext.getItemId().getValue(), elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ private void removeElementFromParent(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+
+ if (element.getParentId() == null) {
+ return;
+ }
+
+ Optional<ElementEntity> parentElement =
+ get(context, elementContext, new ElementEntity(element.getParentId()));
+ if (!parentElement.isPresent()) {
+ return;
+ }
+ getElementAccessor(context).removeSubElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getParentId().toString(),
+ elementContext.getRevisionId().getValue());
+
+ getVersionElementsAccessor(context)
+ .removeElements(Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().getValue(), elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+
+ Map<String, String> elementIds = new TreeMap<>();
+ elementIds.put(element.getParentId().toString(), elementContext.getRevisionId().getValue());
+ getVersionElementsAccessor(context).addElements(elementIds, elementContext.getSpace(),
+ elementContext.getItemId().getValue(), elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ static ElementEntity getElementEntityDescriptor(ElementEntity element, Row row) {
+ element.setNamespace(getNamespace(row.getString(ElementField.NAMESPACE)));
+ element.setParentId(getParentId(row.getString(ElementField.PARENT_ID)));
+ element.setInfo(json2Object(row.getString(ElementField.INFO), Info.class));
+ element.setRelations(
+ json2Object(row.getString(ElementField.RELATIONS), new TypeToken<ArrayList<Relation>>() {
+ }.getType()));
+
+ element.setSubElementIds(row.getSet(ElementField.SUB_ELEMENT_IDS, String.class)
+ .stream().map(Id::new).collect(Collectors.toSet()));
+ return element;
+ }
+
+ static ElementEntity getElementEntity(ElementEntity element, Row row) {
+ getElementEntityDescriptor(element, row);
+
+ element.setData(row.getBytes(ElementField.DATA));
+ element.setSearchableData(row.getBytes(ElementField.SEARCHABLE_DATA));
+ element.setVisualization(row.getBytes(ElementField.VISUALIZATION));
+ element.setElementHash(new Id(row.getString(ElementField.ELEMENT_HASH)));
+ return element;
+ }
+
+ private Id getElementHash(Row row) {
+ return new Id(row.getString(ElementField.ELEMENT_HASH));
+ }
+
+ private static Id getParentId(String parentIdStr) {
+ return parentIdStr == null ? null : new Id(parentIdStr);
+ }
+
+ private static Namespace getNamespace(String namespaceStr) {
+ Namespace namespace = new Namespace();
+ if (namespaceStr != null) {
+ namespace.setValue(namespaceStr);
+ }
+ return namespace;
+ }
+
+ private static <T> T json2Object(String json, Type typeOfT) {
+ return json == null ? null : JsonUtil.json2Object(json, typeOfT);
+ }
+
+ private Map<String, String> getVersionElementIds(SessionContext context,
+ ElementEntityContext elementContext) {
+ Row row = getVersionElementsAccessor(context).get(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue()).one();
+ return row == null
+ ? new HashMap<>()
+ : row.getMap(ElementRepositoryImpl.VersionElementsField.ELEMENT_IDS, String.class, String
+ .class);
+ }
+
+ private Id getElementRevision(SessionContext context, ElementEntityContext elementContext
+ , Id elementId) {
+ Map<Id, Id> versionElementIds =
+ listIds(context, new ElementEntityContext
+ (elementContext.getSpace(), elementContext.getItemId(), elementContext.getVersionId(),
+ elementContext.getRevisionId()));
+ return versionElementIds.get(elementId);
+
+ }
+
+
+ /*
+CREATE TABLE IF NOT EXISTS element_namespace (
+ item_id text,
+ element_id text,
+ namespace text,
+ PRIMARY KEY (( item_id, element_id ))
+);
+ */
+ @Accessor
+ interface ElementNamespaceAccessor {
+ @Query("UPDATE element_namespace SET namespace=:ns " +
+ "WHERE item_id=:item AND element_id=:id ")
+ void create(@Param("item") String itemId,
+ @Param("id") String elementId,
+ @Param("ns") String namespace);
+ }
+
+ @Accessor
+ interface ElementAccessor {
+ @Query(
+ "UPDATE element SET parent_id=:parentId, namespace=:ns, info=:info, relations=:rels, " +
+ "data=:data, searchable_data=:searchableData, visualization=:visualization, " +
+ "sub_element_ids=sub_element_ids+:subs , element_hash=:elementHash " +
+ " WHERE space=:space AND item_id=:item AND version_id=:ver AND element_id=:id AND " +
+ "revision_id=:rev ")
+ void create(@Param("space") String space,
+ @Param("item") String itemId,
+ @Param("ver") String versionId,
+ @Param("id") String elementId,
+ @Param("rev") String revisionId,
+ @Param("parentId") String parentElementId,
+ @Param("ns") String namespace,
+ @Param("info") String info,
+ @Param("rels") String relations,
+ @Param("data") ByteBuffer data,
+ @Param("searchableData") ByteBuffer searchableData,
+ @Param("visualization") ByteBuffer visualization,
+ @Param("subs") Set<String> subElementIds,
+ @Param("elementHash") String elementHash);
+
+
+ @Query("UPDATE element SET info=?, relations=?, data=?, searchable_data=?, visualization=? ," +
+ "element_hash=? , parent_id=? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ void update(String info, String relations, ByteBuffer data, ByteBuffer searchableData,
+ ByteBuffer visualization, String elementHash, String parentId, String space, String
+ itemId, String
+ versionId, String elementId, String revisionId);
+
+ @Query("UPDATE element SET info=?, relations=?, data=?, searchable_data=?, visualization=? ," +
+ "element_hash=? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ void update(String info, String relations, ByteBuffer data, ByteBuffer searchableData,
+ ByteBuffer visualization, String elementHash, String space, String
+ itemId, String
+ versionId, String elementId, String revisionId);
+
+ @Query(
+ "DELETE FROM element WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ void delete(String space, String itemId, String versionId, String elementId, String revisionId);
+
+ @Query("SELECT parent_id, namespace, info, relations, data, searchable_data, visualization, " +
+ "sub_element_ids,element_hash FROM element " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ ResultSet get(String space, String itemId, String versionId, String elementId, String
+ revisionId);
+
+ @Query("SELECT parent_id, namespace, info, relations, sub_element_ids FROM element " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ ResultSet getDescriptor(String space, String itemId, String versionId, String elementId,
+ String revisionId);
+
+ @Query("UPDATE element SET sub_element_ids=sub_element_ids+? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ void addSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
+ String elementId, String revisionId);
+
+ @Query("UPDATE element SET sub_element_ids=sub_element_ids-? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ void removeSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
+ String elementId, String revisionId);
+
+ @Query("SELECT element_hash FROM element " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id=? ")
+ ResultSet getHash(String space, String itemId, String versionId, String elementId, String
+ revisionId);
+ }
+
+ private static final class ElementField {
+ private static final String NAMESPACE = "namespace";
+ private static final String PARENT_ID = "parent_id";
+ private static final String INFO = "info";
+ private static final String RELATIONS = "relations";
+ private static final String DATA = "data";
+ private static final String SEARCHABLE_DATA = "searchable_data";
+ private static final String VISUALIZATION = "visualization";
+ private static final String SUB_ELEMENT_IDS = "sub_element_ids";
+ private static final String ELEMENT_HASH = "element_hash";
+ }
+
+ @Accessor
+ interface VersionElementsAccessor {
+
+ @Query("UPDATE version_elements SET element_ids=element_ids+ ? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void addElements(Map<String, String> elementIds, String space, String itemId, String versionId,
+ String versionRevisionId);
+
+ @Query("UPDATE version_elements SET element_ids=element_ids-? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=?")
+ void removeElements(Set<String> elementIds, String space, String itemId, String versionId,
+ String revisionId);
+
+ @Query(
+ "SELECT element_ids FROM version_elements WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ ResultSet get(String space, String itemId, String versionId, String revisionId);
+
+ @Query(
+ "SELECT revision_id,publish_time FROM version_elements WHERE space=? AND item_id=? AND " +
+ "version_id=? ")
+ ResultSet listRevisions(String space, String itemId, String versionId);
+
+ }
+
+ private static final class VersionElementsField {
+ private static final String ELEMENT_IDS = "element_ids";
+ private static final String REVISION_ID = "revision_id";
+ private static final String PUBLISH_TIME = "publish_time";
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryFactoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryFactoryImpl.java
new file mode 100644
index 0000000000..02bec12302
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryFactoryImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.ElementStageRepository;
+import org.openecomp.core.zusammen.plugin.dao.ElementStageRepositoryFactory;
+
+public class ElementStageRepositoryFactoryImpl extends ElementStageRepositoryFactory {
+
+ private static final ElementStageRepository INSTANCE = new ElementStageRepositoryImpl();
+
+ @Override
+ public ElementStageRepository createInterface(SessionContext context) {
+ return INSTANCE;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryImpl.java
new file mode 100644
index 0000000000..c215f825a6
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementStageRepositoryImpl.java
@@ -0,0 +1,423 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.datatypes.item.Action;
+import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import com.amdocs.zusammen.utils.fileutils.json.JsonUtil;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Param;
+import com.datastax.driver.mapping.annotations.Query;
+import org.openecomp.core.zusammen.plugin.dao.ElementStageRepository;
+import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class ElementStageRepositoryImpl implements ElementStageRepository {
+
+ @Override
+ public Collection<ElementEntity> listIds(SessionContext context,
+ ElementEntityContext elementContext) {
+ return getElements(getStageElementIds(context, elementContext));
+ }
+
+ @Override
+ public Collection<ElementEntity> listConflictedIds(SessionContext context,
+ ElementEntityContext elementContext) {
+ return getElements(getConflictedElementIds(context, elementContext));
+ }
+
+ @Override
+ public void create(SessionContext context, ElementEntityContext elementContext,
+ StageEntity<ElementEntity> elementStage) {
+ createElement(context, elementContext, elementStage);
+ addElementToParent(context, elementContext, elementStage.getEntity());
+ }
+
+ @Override
+ public void markAsNotConflicted(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element, Action action) {
+ getElementStageAccessor(context).updateState(action, false,
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString());
+
+ getStageElementsAccessor(context).removeConflictElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ @Override
+ public void markAsNotConflicted(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ getElementStageAccessor(context).markAsNotConflicted(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString());
+
+ getStageElementsAccessor(context).removeConflictElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ @Override
+ public void update(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element, Action action, boolean conflicted) {
+ getElementStageAccessor(context).update(
+ JsonUtil.object2Json(element.getInfo()),
+ JsonUtil.object2Json(element.getRelations()),
+ element.getData(),
+ element.getSearchableData(),
+ element.getVisualization(),
+ element.getElementHash().getValue(),
+ action,
+ conflicted,
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ element.getId().toString());
+
+ if (!conflicted) {
+ getStageElementsAccessor(context).removeConflictElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+ }
+
+ @Override
+ public void delete(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ removeElementFromParent(context, elementContext, element);
+ deleteElement(context, elementContext, element);
+ }
+
+ @Override
+ public Optional<StageEntity<ElementEntity>> get(SessionContext context,
+ ElementEntityContext elementContext,
+ ElementEntity element) {
+ Row row = getElementStageAccessor(context).get(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString()).one();
+
+ return row == null ? Optional.empty() : Optional.of(getStageElement(row));
+ }
+
+ @Override
+ public Optional<StageEntity<ElementEntity>> getDescriptor(SessionContext context,
+ ElementEntityContext elementContext,
+ ElementEntity element) {
+ Row row = getElementStageAccessor(context).getDescriptor(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString()).one();
+
+ return row == null ? Optional.empty() : Optional.of(getStageElementDescriptor(row));
+ }
+
+
+
+ private Collection<ElementEntity> getElements(Set<String> elementIds) {
+ return elementIds.stream()
+ .map(id -> new ElementEntity(new Id(id)))
+ .collect(Collectors.toList());
+ }
+
+ private void createElement(SessionContext context, ElementEntityContext elementContext,
+ StageEntity<ElementEntity> elementStage) {
+
+
+ ElementEntity element = elementStage.getEntity();
+ Set<String> subElementIds =
+ element.getSubElementIds().stream().map(Id::toString).collect(Collectors.toSet());
+ Set<String> conflictDependents = elementStage.getConflictDependents().stream()
+ .map(conflictDependent -> conflictDependent.getId().getValue())
+ .collect(Collectors.toSet());
+
+ getElementStageAccessor(context).create(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString(),
+ element.getParentId() == null ? null : element.getParentId().toString(),
+ element.getNamespace() == null ? null : element.getNamespace().toString(),
+ JsonUtil.object2Json(element.getInfo()),
+ JsonUtil.object2Json(element.getRelations()),
+ element.getData(),
+ element.getSearchableData(),
+ element.getVisualization(),
+ subElementIds,
+ element.getElementHash() == null ? null : element.getElementHash().getValue(),
+ elementStage.getPublishTime(),
+ elementStage.getAction(),
+ elementStage.isConflicted(),
+ conflictDependents);
+
+ getStageElementsAccessor(context).add(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+
+ if (elementStage.isConflicted()) {
+ getStageElementsAccessor(context).addConflictElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+ }
+
+ private void deleteElement(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+
+
+ getElementStageAccessor(context).delete(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getId().toString());
+
+ getStageElementsAccessor(context).remove(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ private void addElementToParent(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ if (element.getParentId() == null) {
+ return;
+ }
+ getElementStageAccessor(context).addSubElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getParentId().toString());
+ }
+
+ private void removeElementFromParent(SessionContext context, ElementEntityContext elementContext,
+ ElementEntity element) {
+ if (element.getParentId() == null) {
+ return;
+ }
+ getElementStageAccessor(context).removeSubElements(
+ Collections.singleton(element.getId().toString()),
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ element.getParentId().toString());
+ }
+
+ private StageEntity<ElementEntity> getStageElementDescriptor(Row row) {
+ return buildStageElement(ElementRepositoryImpl.getElementEntityDescriptor(
+ new ElementEntity(new Id(row.getString(ElementStageField.ID))), row), row);
+ }
+
+ private StageEntity<ElementEntity> getStageElement(Row row) {
+ return buildStageElement(ElementRepositoryImpl.getElementEntity(
+ new ElementEntity(new Id(row.getString(ElementStageField.ID))), row), row);
+ }
+
+
+ private StageEntity<ElementEntity> buildStageElement(ElementEntity element, Row row) {
+ StageEntity<ElementEntity> elementStage =
+ new StageEntity<>(element, row.getDate(ElementStageField.PUBLISH_TIME));
+ elementStage.setAction(Action.valueOf(row.getString(ElementStageField.ACTION)));
+ elementStage.setConflicted(row.getBool(ElementStageField.CONFLICTED));
+ elementStage.setConflictDependents(
+ row.getSet(ElementStageField.CONFLICT_DEPENDENTS, String.class).stream()
+ .map(conflictDependentId -> new ElementEntity(new Id(conflictDependentId)))
+ .collect(Collectors.toSet()));
+ return elementStage;
+ }
+
+ private Set<String> getStageElementIds(SessionContext context,
+ ElementEntityContext elementContext) {
+ Row row = getStageElementsAccessor(context).get(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue()).one();
+ return row == null ? new HashSet<>()
+ : row.getSet(StageElementsField.STAGE_ELEMENT_IDS, String.class);
+ }
+
+ private Set<String> getConflictedElementIds(SessionContext context,
+ ElementEntityContext elementContext) {
+ Row row = getStageElementsAccessor(context).getConflicted(
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().getValue(),
+ elementContext.getRevisionId().getValue()).one();
+ return row == null ? new HashSet<>()
+ : row.getSet(StageElementsField.CONFLICT_ELEMENT_IDS, String.class);
+ }
+
+ private ElementStageAccessor getElementStageAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, ElementStageAccessor.class);
+ }
+
+ private StageElementsAccessor getStageElementsAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, StageElementsAccessor.class);
+ }
+
+ @Accessor
+ interface ElementStageAccessor {
+ @Query(
+ "UPDATE element_stage SET parent_id=:parentId, namespace=:ns, info=:info, relations=:rels, " +
+ "data=:data, searchable_data=:searchableData, visualization=:visualization, " +
+ "publish_time=:publishTime, action=:action, " +
+ "conflicted=:conflicted, conflict_dependent_ids=:conflictDependents, " +
+ "sub_element_ids=sub_element_ids+:subs, element_hash=:elementHash " +
+ "WHERE space=:space AND item_id=:item AND version_id=:ver AND element_id=:id ")
+ void create(@Param("space") String space,
+ @Param("item") String itemId,
+ @Param("ver") String versionId,
+ @Param("id") String elementId,
+ @Param("parentId") String parentElementId,
+ @Param("ns") String namespace,
+ @Param("info") String info,
+ @Param("rels") String relations,
+ @Param("data") ByteBuffer data,
+ @Param("searchableData") ByteBuffer searchableData,
+ @Param("visualization") ByteBuffer visualization,
+ @Param("subs") Set<String> subElementIds,
+ @Param("elementHash") String elementHash,
+ @Param("publishTime") Date publishTime,
+ @Param("action") Action action,
+ @Param("conflicted") boolean conflicted,
+ @Param("conflictDependents") Set<String> conflictDependents);
+
+ @Query("UPDATE element_stage SET info=?, relations=?, data=?, searchable_data=?, " +
+ "visualization=?,element_hash=?, action=?, conflicted=? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ void update(String info, String relations, ByteBuffer data, ByteBuffer searchableData,
+ ByteBuffer visualization, String elementHash, Action action, boolean conflicted,
+ String space,
+ String itemId, String versionId, String elementId);
+
+ @Query("UPDATE element_stage SET action=?, conflicted=? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ void updateState(Action action, boolean conflicted, String space, String itemId,
+ String versionId, String elementId);
+
+ @Query("UPDATE element_stage SET conflicted=false " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ void markAsNotConflicted(String space, String itemId, String versionId, String elementId);
+
+ @Query(
+ "DELETE FROM element_stage WHERE space=? AND item_id=? AND version_id=? AND element_id=?")
+ void delete(String space, String itemId, String versionId, String elementId);
+
+ @Query("SELECT element_id, parent_id, namespace, info, relations, data, searchable_data, " +
+ "visualization, sub_element_ids,element_hash, publish_time, action, " +
+ "conflicted, conflict_dependent_ids FROM element_stage " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ ResultSet get(String space, String itemId, String versionId, String elementId);
+
+ @Query("SELECT element_id, parent_id, namespace, info, relations, " +
+ "sub_element_ids, publish_time, action, conflicted, conflict_dependent_ids " +
+ "FROM element_stage WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ ResultSet getDescriptor(String space, String itemId, String versionId, String elementId);
+
+ @Query("UPDATE element_stage SET sub_element_ids=sub_element_ids+? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ void addSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
+ String elementId);
+
+ @Query("UPDATE element_stage SET sub_element_ids=sub_element_ids-? " +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
+ void removeSubElements(Set<String> subElementIds, String space, String itemId, String versionId,
+ String elementId);
+ }
+
+ private static final class ElementStageField {
+ private static final String ID = "element_id";
+ private static final String PUBLISH_TIME = "publish_time";
+ private static final String ACTION = "action";
+ private static final String CONFLICTED = "conflicted";
+ private static final String CONFLICT_DEPENDENTS = "conflict_dependent_ids";
+ }
+
+ @Accessor
+ interface StageElementsAccessor {
+
+ @Query("UPDATE version_elements SET stage_element_ids=stage_element_ids+? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void add(Set<String> elementIds, String space, String itemId, String versionId, String
+ revisionId);
+
+ @Query("UPDATE version_elements SET stage_element_ids=stage_element_ids-? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void remove(Set<String> elementIds, String space, String itemId, String versionId, String
+ revisionId);
+
+ @Query("SELECT stage_element_ids FROM version_elements " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=?")
+ ResultSet get(String space, String itemId, String versionId, String revisionId);
+
+ @Query("UPDATE version_elements SET conflict_element_ids=conflict_element_ids+? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void addConflictElements(Set<String> elementIds, String space, String itemId, String
+ versionId, String revisionId);
+
+ @Query("UPDATE version_elements SET conflict_element_ids=conflict_element_ids-? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void removeConflictElements(Set<String> elementIds, String space, String itemId,
+ String versionId, String revisionId);
+
+ @Query("SELECT conflict_element_ids FROM version_elements " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ ResultSet getConflicted(String space, String itemId, String versionId, String revisionId);
+ }
+
+ private static final class StageElementsField {
+ private static final String STAGE_ELEMENT_IDS = "stage_element_ids";
+ private static final String CONFLICT_ELEMENT_IDS = "conflict_element_ids";
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryFactoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryFactoryImpl.java
new file mode 100644
index 0000000000..ec7e1c30ae
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryFactoryImpl.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.ElementSynchronizationStateRepository;
+import org.openecomp.core.zusammen.plugin.dao.ElementSynchronizationStateRepositoryFactory;
+
+public class ElementSynchronizationStateRepositoryFactoryImpl
+ extends ElementSynchronizationStateRepositoryFactory {
+
+ private static final ElementSynchronizationStateRepository INSTANCE =
+ new ElementSynchronizationStateRepositoryImpl();
+
+ @Override
+ public ElementSynchronizationStateRepository createInterface(SessionContext context) {
+ return INSTANCE;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryImpl.java
new file mode 100644
index 0000000000..d41d3d73b1
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/ElementSynchronizationStateRepositoryImpl.java
@@ -0,0 +1,209 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Query;
+import org.openecomp.core.zusammen.plugin.dao.ElementSynchronizationStateRepository;
+import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class ElementSynchronizationStateRepositoryImpl
+ implements ElementSynchronizationStateRepository {
+
+ @Override
+ public Collection<SynchronizationStateEntity> list(SessionContext context,
+ ElementEntityContext elementContext) {
+ List<Row> rows = getAccessor(context)
+ .list(elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString()).all();
+ return rows == null ? new HashSet<>()
+ : rows.stream().map(this::getSynchronizationStateEntity).collect(Collectors.toSet());
+
+ }
+
+ @Override
+ public void create(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState) {
+ update(context, elementContext.getSpace(),
+ elementContext.getItemId(),
+ elementContext.getVersionId(),
+ elementContext.getRevisionId(),
+ elementSyncState.getRevisionId(),
+ elementSyncState.getId(),
+ elementSyncState.getPublishTime(),
+ elementSyncState.isDirty()
+
+ );
+ }
+
+ @Override
+ public void update(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState) {
+ update(context, elementContext.getSpace(),
+ elementContext.getItemId(),
+ elementContext.getVersionId(),
+ elementContext.getRevisionId(),
+ elementSyncState.getRevisionId(),
+ elementSyncState.getId(),
+ elementSyncState.getPublishTime(),
+ elementSyncState.isDirty()
+
+ );
+ }
+
+ @Override
+ public void markAsDirty(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState) {
+
+
+ getAccessor(context).updateDirty(true,
+ elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementSyncState.getId().toString(),
+ elementContext.getRevisionId().getValue());
+
+ getVersionElementsAccessor(context).addDirtyElements(
+ Collections.singleton(elementSyncState.getId().toString()), elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ @Override
+ public void delete(SessionContext context, ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState) {
+ getAccessor(context).delete(elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementSyncState.getId().toString(),
+ elementContext.getRevisionId().getValue());
+
+ getVersionElementsAccessor(context).removeDirtyElements(
+ Collections.singleton(elementSyncState.getId().toString()), elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementContext.getRevisionId().getValue());
+ }
+
+ @Override
+ public Optional<SynchronizationStateEntity> get(SessionContext context,
+ ElementEntityContext elementContext,
+ SynchronizationStateEntity elementSyncState) {
+
+ Row row = getAccessor(context)
+ .get(elementContext.getSpace(),
+ elementContext.getItemId().toString(),
+ elementContext.getVersionId().toString(),
+ elementSyncState.getId().toString(),
+ elementSyncState.getRevisionId().getValue()).one();
+
+ return row == null ? Optional.empty() : Optional.of(getSynchronizationStateEntity(row));
+ }
+
+ private void update(SessionContext context, String space, Id itemId, Id versionId, Id
+ versionRevisionId,Id elementRevisionId,Id elementId, Date publishTime, boolean isDirty) {
+ getAccessor(context).update(publishTime,
+ isDirty,
+ space,
+ itemId.toString(),
+ versionId.toString(),
+ elementId.toString(),
+ elementRevisionId.getValue());
+
+ if (isDirty) {
+ getVersionElementsAccessor(context).addDirtyElements(
+ Collections.singleton(elementId.toString()), space,
+ itemId.toString(),
+ versionId.toString(),
+ versionRevisionId.getValue());
+ } else {
+ getVersionElementsAccessor(context).removeDirtyElements(
+ Collections.singleton(elementId.toString()), space,
+ itemId.toString(),
+ versionId.toString(),
+ versionRevisionId.getValue());
+ }
+ }
+
+
+ private SynchronizationStateEntity getSynchronizationStateEntity(Row row) {
+ SynchronizationStateEntity entity =
+ new SynchronizationStateEntity(new Id(row.getString(SynchronizationStateField.ID)),
+ new Id(row.getString(SynchronizationStateField.REVISION_ID)),
+ row.getDate(SynchronizationStateField.PUBLISH_TIME),
+ row.getBool(SynchronizationStateField.DIRTY));
+ entity.setRevisionId(new Id(row.getString(SynchronizationStateField.REVISION_ID)));
+
+ return entity;
+
+ }
+
+ private ElementSynchronizationStateAccessor getAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, ElementSynchronizationStateAccessor.class);
+ }
+
+ private VersionElementsAccessor getVersionElementsAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionElementsAccessor.class);
+ }
+
+ @Accessor
+ interface ElementSynchronizationStateAccessor {
+ @Query("UPDATE element_synchronization_state SET publish_time=?, dirty=? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
+ void update(Date publishTime, boolean dirty, String space, String itemId, String versionId,
+ String elementId, String revisionId);
+
+ @Query("UPDATE element_synchronization_state SET dirty=? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
+ void updateDirty(boolean dirty, String space, String itemId, String versionId,
+ String elementId, String revisionId);
+
+ @Query("DELETE FROM element_synchronization_state " +
+ "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
+ void delete(String space, String itemId, String versionId, String elementId, String revisionId);
+
+ @Query("SELECT element_id,revision_id, publish_time, dirty FROM element_synchronization_state" +
+ " WHERE space=? AND item_id=? AND version_id=?")
+ ResultSet list(String space, String itemId, String versionId);
+
+ @Query("SELECT element_id,revision_id, publish_time, dirty FROM element_synchronization_state" +
+ " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
+ ResultSet get(String space, String itemId, String versionId, String elementId, String
+ revisionId);
+ }
+
+ private static final class SynchronizationStateField {
+ private static final String ID = "element_id";
+ private static final String PUBLISH_TIME = "publish_time";
+ private static final String DIRTY = "dirty";
+ private static final String REVISION_ID = "revision_id";
+ }
+
+ @Accessor
+ interface VersionElementsAccessor {
+
+ @Query("UPDATE version_elements SET dirty_element_ids=dirty_element_ids+? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=?")
+ void addDirtyElements(Set<String> elementIds, String space, String itemId, String versionId,
+ String revisionId);
+
+ @Query("UPDATE version_elements SET dirty_element_ids=dirty_element_ids-? " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ void removeDirtyElements(Set<String> elementIds, String space, String itemId, String
+ versionId, String revisionId);
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoFactoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoFactoryImpl.java
new file mode 100644
index 0000000000..60dc9d1765
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoFactoryImpl.java
@@ -0,0 +1,15 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.VersionDao;
+import org.openecomp.core.zusammen.plugin.dao.VersionDaoFactory;
+
+public class VersionDaoFactoryImpl extends VersionDaoFactory {
+
+ private static final VersionDao INSTANCE = new VersionDaoImpl();
+
+ @Override
+ public VersionDao createInterface(SessionContext context) {
+ return INSTANCE;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoImpl.java
new file mode 100644
index 0000000000..bba2ddf267
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionDaoImpl.java
@@ -0,0 +1,185 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Query;
+import org.openecomp.core.zusammen.plugin.dao.VersionDao;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static java.util.stream.Collectors.toMap;
+
+public class VersionDaoImpl implements VersionDao {
+
+ @Override
+ public void create(SessionContext context, String space, Id itemId, VersionEntity version) {
+ String baseVersion = version.getBaseId() != null ? version.getBaseId().toString() : null;
+
+ getAccessor(context)
+ .create(space, itemId.toString(), version.getId().toString(),
+ baseVersion,
+ version.getCreationTime(), version.getModificationTime());
+
+ }
+
+ @Override
+ public void delete(SessionContext context, String space, Id itemId, Id versionId) {
+
+ getAccessor(context).delete(space, itemId.toString(), versionId.toString());
+ }
+
+ @Override
+ public void updateModificationTime(SessionContext context, String space, Id itemId,
+ Id versionId, Date modificationTime) {
+ getAccessor(context)
+ .updateModificationTime(modificationTime, space, itemId.toString(), versionId.toString());
+ }
+
+
+ @Override
+ public Collection<VersionEntity> list(SessionContext context, String space, Id itemId) {
+ List<Row> rows = getAccessor(context).list(space, itemId.toString()).all();
+ return rows == null ? new ArrayList<>() :
+ rows.stream().map(VersionDaoImpl::convertToVersionEntity).collect(Collectors.toList());
+ }
+
+
+ @Override
+ public Optional<VersionEntity> get(SessionContext context, String space, Id itemId,
+ Id versionId) {
+ Row row;
+
+ row = getAccessor(context).get(space, itemId.toString(), versionId.toString()).one();
+
+
+ return row == null ? Optional.empty() : Optional.of(convertToVersionEntity(row));
+ }
+
+ @Override
+ public boolean checkHealth(SessionContext context) {
+ return getAccessor(context).checkHealth().getColumnDefinitions()
+ .contains(VersionField.VERSION_ID);
+ }
+
+ @Override
+ public void createVersionElements(SessionContext context, String space, Id itemId,
+ Id versionId, Id revisionId, Map<Id, Id> versionElementIds,
+ Date publishTime, String message) {
+ Map<String, String> elementIds = versionElementIds==null?null:versionElementIds.
+ entrySet().
+ stream().
+ collect(toMap((Map.Entry<Id, Id>entry)->entry.getKey().getValue(),
+ (Map.Entry<Id, Id>entry)->entry.getValue().getValue()));
+
+ getVersionElementsAccessor(context).create(space,itemId.toString(),versionId.toString(),
+ revisionId.getValue(),elementIds,publishTime,message,context.getUser().getUserName());
+ }
+
+
+ private static VersionEntity convertToVersionEntity(Row row) {
+
+ /*Id revisionId = row.getColumnDefinitions().contains("revision_id")?new Id(row.getString
+ (VersionField.REVISION_ID)):null;*/
+
+ VersionEntity version = new VersionEntity(new Id(row.getString(VersionField.VERSION_ID)));
+ return enrichVersionEntity(version, row);
+ }
+
+ static VersionEntity enrichVersionEntity(VersionEntity version, Row row) {
+ version.setBaseId(new Id(row.getString(VersionField.BASE_VERSION_ID)));
+ version.setCreationTime(row.getDate(VersionField.CREATION_TIME));
+ version.setModificationTime(row.getDate(VersionField.MODIFICATION_TIME));
+ return version;
+ }
+
+ private VersionAccessor getAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionAccessor.class);
+ }
+
+ private VersionElementsAccessor getVersionElementsAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionElementsAccessor.class);
+ }
+
+ @Accessor
+ interface VersionAccessor {
+
+ @Query(
+ "INSERT INTO version (space, item_id, version_id, base_version_id, " +
+ "creation_time, " +
+ "modification_time) " +
+ "VALUES (?, ?, ?, ?, ?, ?)")
+ void create(String space, String itemId, String versionId, String baseVersionId,
+ Date creationTime, Date modificationTime);
+
+ @Query("UPDATE version SET modification_time=? WHERE space=? AND item_id=? AND version_id=? ")
+ void updateModificationTime(Date modificationTime, String space, String itemId,
+ String versionId);
+
+ @Query("DELETE FROM version WHERE space=? AND item_id=? AND version_id=? ")
+ void delete(String space, String itemId, String versionId);
+
+ @Query("SELECT version_id, base_version_id, creation_time, modification_time " +
+ "FROM version WHERE space=? AND item_id=? AND version_id=? ")
+ ResultSet get(String space, String itemId, String versionId);
+
+ /*@Query("SELECT version_id, base_version_id, creation_time, modification_time " +
+ "FROM version WHERE space=? AND item_id=? AND version_id=? ")
+ ResultSet get(String space, String itemId, String versionId);*/
+
+
+ @Query("SELECT version_id, base_version_id, creation_time, modification_time " +
+ "FROM version WHERE space=? AND item_id=?")
+ ResultSet list(String space, String itemId);
+
+ @Query("SELECT version_id FROM version LIMIT 1")
+ ResultSet checkHealth();
+ }
+
+ private static final class VersionField {
+ private static final String VERSION_ID = "version_id";
+ private static final String BASE_VERSION_ID = "base_version_id";
+ private static final String CREATION_TIME = "creation_time";
+ private static final String MODIFICATION_TIME = "modification_time";
+ //private static final String REVISION_ID = "revision_id";
+ }
+
+ @Accessor
+ interface VersionElementsAccessor {
+
+ @Query("INSERT INTO version_elements (space,item_id,version_id,revision_id,element_ids," +
+ "publish_time,message,user) " +
+ "VALUES (?,?,?,?,?,?,?,?)")
+ void create(String space,
+ String itemId,
+ String versionId,
+ String versionRevisionId,
+ Map<String,String> elementIds,
+ Date publishTime,
+ String message,
+ String user);
+
+
+
+ }
+
+ /* public static final class VersionElementsField {
+ private static final String SPACE = "space";
+ private static final String ITEM_ID = "item_id";
+ private static final String VERSION_ID = "version_id";
+ private static final String ELEMENT_IDS = "element_ids";
+ private static final String REVISION_ID = "revision_id";
+
+ }*/
+
+
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryFactoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryFactoryImpl.java
new file mode 100644
index 0000000000..547bf6a06c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryFactoryImpl.java
@@ -0,0 +1,15 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.VersionStageRepository;
+import org.openecomp.core.zusammen.plugin.dao.VersionStageRepositoryFactory;
+
+public class VersionStageRepositoryFactoryImpl extends VersionStageRepositoryFactory {
+
+ private static final VersionStageRepository INSTANCE = new VersionStageRepositoryImpl();
+
+ @Override
+ public VersionStageRepository createInterface(SessionContext context) {
+ return INSTANCE;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryImpl.java
new file mode 100644
index 0000000000..353f37b91b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionStageRepositoryImpl.java
@@ -0,0 +1,82 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.datatypes.item.Action;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Query;
+import org.openecomp.core.zusammen.plugin.dao.VersionStageRepository;
+import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+import java.util.Date;
+import java.util.Optional;
+
+public class VersionStageRepositoryImpl implements VersionStageRepository {
+
+ @Override
+ public Optional<StageEntity<VersionEntity>> get(SessionContext context,
+ VersionContext entityContext,
+ VersionEntity entity) {
+ Row row = getAccessor(context)
+ .get(entityContext.getSpace(), entityContext.getItemId().toString(),
+ entity.getId().toString()).one();
+ return row == null ? Optional.empty() : Optional.of(convertToVersionStage(entity, row));
+ }
+
+ @Override
+ public void create(SessionContext context, VersionContext entityContext,
+ StageEntity<VersionEntity> stageEntity) {
+ VersionEntity entity = stageEntity.getEntity();
+ getAccessor(context).create(entityContext.getSpace(),
+ entityContext.getItemId().toString(),
+ entity.getId().toString(),
+ entity.getBaseId() == null ? null : entity.getBaseId().toString(),
+ entity.getCreationTime() == null ? null : entity.getCreationTime(),
+ entity.getModificationTime() == null ? null : entity.getModificationTime(),
+ stageEntity.getPublishTime(),
+ stageEntity.getAction());
+ }
+
+ @Override
+ public void delete(SessionContext context, VersionContext entityContext, VersionEntity entity) {
+ getAccessor(context).delete(entityContext.getSpace(), entityContext.getItemId().toString(),
+ entity.getId().toString());
+ }
+
+ private StageEntity<VersionEntity> convertToVersionStage(VersionEntity version, Row row) {
+ StageEntity<VersionEntity> versionStage =
+ new StageEntity<>(VersionDaoImpl.enrichVersionEntity(version, row),
+ row.getDate(VersionStageField.PUBLISH_TIME));
+ versionStage.setAction(Action.valueOf(row.getString(VersionStageField.ACTION)));
+ return versionStage;
+ }
+
+ private VersionStageAccessor getAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionStageAccessor.class);
+ }
+
+ @Accessor
+ interface VersionStageAccessor {
+
+ @Query("INSERT INTO version_stage (space, item_id, version_id, base_version_id, " +
+ "creation_time, modification_time, publish_time, action) " +
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
+ void create(String space, String itemId, String versionId, String baseVersionId,
+ Date creationTime, Date modificationTime, Date publishTime, Action action);
+
+ @Query("DELETE FROM version_stage WHERE space=? AND item_id=? AND version_id=?")
+ void delete(String space, String itemId, String versionId);
+
+ @Query("SELECT base_version_id, creation_time, modification_time, publish_time, action " +
+ "FROM version_stage WHERE space=? AND item_id=? AND version_id=?")
+ ResultSet get(String space, String itemId, String versionId);
+ }
+
+ private static final class VersionStageField {
+ private static final String PUBLISH_TIME = "publish_time";
+ private static final String ACTION = "action";
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryFactoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryFactoryImpl.java
new file mode 100644
index 0000000000..95c3ec2730
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryFactoryImpl.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.SessionContext;
+import org.openecomp.core.zusammen.plugin.dao.VersionSynchronizationStateRepository;
+import org.openecomp.core.zusammen.plugin.dao.VersionSynchronizationStateRepositoryFactory;
+
+public class VersionSynchronizationStateRepositoryFactoryImpl
+ extends VersionSynchronizationStateRepositoryFactory {
+
+ private static final VersionSynchronizationStateRepository INSTANCE =
+ new VersionSynchronizationStateRepositoryImpl();
+
+ @Override
+ public VersionSynchronizationStateRepository createInterface(SessionContext context) {
+ return INSTANCE;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryImpl.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryImpl.java
new file mode 100644
index 0000000000..5fb9779bc2
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/impl/cassandra/VersionSynchronizationStateRepositoryImpl.java
@@ -0,0 +1,137 @@
+package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.mapping.annotations.Accessor;
+import com.datastax.driver.mapping.annotations.Query;
+import org.openecomp.core.zusammen.plugin.dao.VersionSynchronizationStateRepository;
+import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionContext;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class VersionSynchronizationStateRepositoryImpl
+ implements VersionSynchronizationStateRepository {
+
+ @Override
+ public void create(SessionContext context, VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity) {
+ updatePublishTime(context, entityContext, syncStateEntity);
+ }
+
+ @Override
+ public void updatePublishTime(SessionContext context, VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity) {
+ getAccessor(context)
+ .updatePublishTime(syncStateEntity.getPublishTime(), entityContext.getSpace(),
+ entityContext.getItemId().toString(), syncStateEntity.getId().toString(),
+ syncStateEntity.getRevisionId().getValue());
+ }
+
+ @Override
+ public List<SynchronizationStateEntity> list(SessionContext context, VersionContext
+ entityContext, VersionEntity versionEntity) {
+
+ List<Row> rows = getAccessor(context).list(entityContext.getSpace(), entityContext.getItemId().toString
+ (),versionEntity.getId().toString()).all();
+ return rows == null ? new ArrayList<>():
+ rows.stream().map(VersionSynchronizationStateRepositoryImpl::getSynchronizationStateEntity).collect(Collectors.toList());
+ }
+
+
+
+ /*@Override
+ public List<SynchronizationStateEntity> listRevisions(SessionContext context,
+ VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity) {
+ List<Row> rows = getAccessor(context).list(entityContext.getSpace(), entityContext.getItemId()
+ .toString(), syncStateEntity.getId().toString()).all();
+ return rows == null ? new ArrayList<>() :rows.stream()
+ .map(VersionSynchronizationStateRepositoryImpl::getSynchronizationStateEntity)
+ .collect(Collectors.toList());
+
+
+
+
+ //forEach(row -> getSynchronizationStateEntity(syncStateEntity.getId(), row));
+
+
+ }*/
+
+
+ @Override
+ public void delete(SessionContext context, VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity) {
+ // done by version dao
+ }
+
+ @Override
+ public Optional<SynchronizationStateEntity> get(SessionContext context,
+ VersionContext entityContext,
+ SynchronizationStateEntity syncStateEntity) {
+ Row row =
+ getAccessor(context).get(entityContext.getSpace(), entityContext.getItemId().toString(),
+ syncStateEntity.getId().toString(), syncStateEntity.getRevisionId().getValue()).one();
+
+ return row == null ? Optional.empty()
+ : Optional.of(getSynchronizationStateEntity(syncStateEntity.getId(), row));
+ }
+
+ private SynchronizationStateEntity getSynchronizationStateEntity(Id entityId, Row row) {
+ SynchronizationStateEntity syncStateEntity = new SynchronizationStateEntity(entityId,
+ new Id(row.getString(REVISION_ID_FIELD)));
+ syncStateEntity.setPublishTime(row.getDate(PUBLISH_TIME_FIELD));
+ syncStateEntity.setDirty(!row.getSet(DIRTY_ELEMENT_FIELD, String.class).isEmpty());
+ return syncStateEntity;
+ }
+
+ private static SynchronizationStateEntity getSynchronizationStateEntity(Row row) {
+ Id entityId = new Id(row.getColumnDefinitions().contains("version_id") ? row.getString
+ ("version_id") : row.getString("element_id"));
+ SynchronizationStateEntity syncStateEntity = new SynchronizationStateEntity(entityId,
+ new Id(row.getString(REVISION_ID_FIELD)));
+ syncStateEntity.setPublishTime(row.getDate(PUBLISH_TIME_FIELD));
+ syncStateEntity.setDirty(!row.getSet(DIRTY_ELEMENT_FIELD, String.class).isEmpty());
+ syncStateEntity.setRevisionId(new Id(row.getString(REVISION_ID_FIELD)));
+ syncStateEntity.setUser(row.getString(USER));
+ syncStateEntity.setMessage(row.getString(MESSAGE));
+ return syncStateEntity;
+ }
+
+ private VersionSyncStateAccessor getAccessor(SessionContext context) {
+ return CassandraDaoUtils.getAccessor(context, VersionSyncStateAccessor.class);
+ }
+
+ @Accessor
+ interface VersionSyncStateAccessor {
+ @Query(
+ "UPDATE version_elements SET publish_time=? WHERE space=? AND item_id=? AND version_id=? " +
+ "AND revision_id=? ")
+ void updatePublishTime(Date publishTime, String space, String itemId, String versionId, String
+ revisionId);
+
+ @Query("SELECT version_id,revision_id,publish_time, dirty_element_ids FROM version_elements " +
+ "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
+ ResultSet get(String space, String itemId, String versionId, String revisionId);
+
+ @Query("SELECT version_id,revision_id,publish_time,user,message, dirty_element_ids FROM " +
+ "version_elements " +
+ "WHERE space=? AND item_id=? AND version_id=? ")
+ ResultSet list(String space, String itemId, String versionId);
+
+ }
+
+
+ private static final String PUBLISH_TIME_FIELD = "publish_time";
+ private static final String DIRTY_ELEMENT_FIELD = "dirty_element_ids";
+ private static final String REVISION_ID_FIELD = "revision_id";
+ private static final String USER = "user";
+ private static final String MESSAGE = "message";
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/ElementEntity.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/ElementEntity.java
index 1663d83427..1cd15102f2 100644
--- a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/ElementEntity.java
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/ElementEntity.java
@@ -30,6 +30,7 @@ public class ElementEntity {
private Id id;
private Id parentId;
private Namespace namespace;
+ private Id elementHash;
private Info info;
private Collection<Relation> relations = Collections.emptyList();
private ByteBuffer data;
@@ -41,6 +42,10 @@ public class ElementEntity {
this.id = id;
}
+ public Id getId() {
+ return id;
+ }
+
public Id getParentId() {
return parentId;
}
@@ -49,14 +54,6 @@ public class ElementEntity {
this.parentId = parentId;
}
- public Id getId() {
- return id;
- }
-
- public void setId(Id id) {
- this.id = id;
- }
-
public Namespace getNamespace() {
return namespace;
}
@@ -127,8 +124,17 @@ public class ElementEntity {
return id.equals(that.id);
}
+ public Id getElementHash() {
+ return elementHash;
+ }
+
+ public void setElementHash(Id elementHash) {
+ this.elementHash = elementHash;
+ }
+
@Override
public int hashCode() {
return id.hashCode();
}
+
}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/StageEntity.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/StageEntity.java
new file mode 100644
index 0000000000..58ac0a918a
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/StageEntity.java
@@ -0,0 +1,60 @@
+package org.openecomp.core.zusammen.plugin.dao.types;
+
+import com.amdocs.zusammen.datatypes.item.Action;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.Set;
+
+public class StageEntity<E> {
+ private E entity;
+ private Date publishTime;
+ private Action action = Action.IGNORE;
+ private boolean conflicted;
+ private Set<E> conflictDependents = Collections.emptySet();
+
+ // used by sync on stage creation
+ public StageEntity(E entity, Date publishTime) {
+ this.entity = entity;
+ this.publishTime = publishTime;
+ }
+
+ public StageEntity(E entity, Date publishTime, Action action, boolean conflicted) {
+ this.entity = entity;
+ this.publishTime = publishTime;
+ this.action = action;
+ this.conflicted = conflicted;
+ }
+
+ public E getEntity() {
+ return entity;
+ }
+
+ public Date getPublishTime() {
+ return publishTime;
+ }
+
+ public Action getAction() {
+ return action;
+ }
+
+ public void setAction(Action action) {
+ this.action = action;
+ }
+
+ public boolean isConflicted() {
+ return conflicted;
+ }
+
+ public void setConflicted(boolean conflicted) {
+ this.conflicted = conflicted;
+ }
+
+ public Set<E> getConflictDependents() {
+ return conflictDependents;
+ }
+
+ public void setConflictDependents(Set<E> conflictDependents) {
+ this.conflictDependents = conflictDependents;
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/SynchronizationStateEntity.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/SynchronizationStateEntity.java
new file mode 100644
index 0000000000..510cef820b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/SynchronizationStateEntity.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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 org.openecomp.core.zusammen.plugin.dao.types;
+
+import com.amdocs.zusammen.datatypes.Id;
+
+import java.util.Date;
+
+/**
+ * Synchronization state of an entity:
+ * <ul>
+ * <li>On private entity edit (create/update/delete): marked as dirty</li>
+ * <li>On entity publication:
+ * <ul>
+ * <li>if the private entity exists - updated with the publish time, marked as not dirty</li>
+ * <li>Otherwise - deleted</li>
+ * </ul>
+ * </li>
+ * </ul>
+ */
+public class SynchronizationStateEntity {
+ private Id id;
+ private Id revisionId;
+ private Date publishTime;
+ private boolean dirty;
+ private String user;
+ private String message;
+
+ public SynchronizationStateEntity(Id id,Id revisionId) {
+ this.id = id;
+ this.revisionId = revisionId;
+ }
+
+ public SynchronizationStateEntity(Id id,Id revisionId, Date publishTime, boolean dirty) {
+ this(id,revisionId);
+ this.publishTime = publishTime;
+ this.dirty = dirty;
+ }
+
+ public Id getId() {
+ return id;
+ }
+
+ public Date getPublishTime() {
+ return publishTime;
+ }
+
+ public void setPublishTime(Date publishTime) {
+ this.publishTime = publishTime;
+ }
+
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ public void setDirty(boolean dirty) {
+ this.dirty = dirty;
+ }
+
+ public Id getRevisionId() {
+ return revisionId;
+ }
+
+ public void setRevisionId(Id revisionId) {
+ this.revisionId = revisionId;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ SynchronizationStateEntity that = (SynchronizationStateEntity) o;
+
+ return id.equals(that.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionContext.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionContext.java
new file mode 100644
index 0000000000..41a3e66e0e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionContext.java
@@ -0,0 +1,23 @@
+package org.openecomp.core.zusammen.plugin.dao.types;
+
+import com.amdocs.zusammen.datatypes.Id;
+
+public class VersionContext {
+ private String space;
+ private Id itemId;
+
+
+ public VersionContext(String space, Id itemId) {
+ this.space = space;
+ this.itemId = itemId;
+ }
+
+ public String getSpace() {
+ return space;
+ }
+
+ public Id getItemId() {
+ return itemId;
+ }
+
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionDataElement.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionDataElement.java
new file mode 100644
index 0000000000..48a52c0d85
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionDataElement.java
@@ -0,0 +1,21 @@
+package org.openecomp.core.zusammen.plugin.dao.types;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.item.ItemVersionData;
+import org.openecomp.core.zusammen.plugin.ZusammenPluginConstants;
+
+import static org.openecomp.core.zusammen.plugin.ZusammenPluginUtil.calculateElementHash;
+
+public class VersionDataElement extends ElementEntity {
+
+ public VersionDataElement() {
+ super(ZusammenPluginConstants.ROOT_ELEMENTS_PARENT_ID);
+ }
+
+ public VersionDataElement(ItemVersionData itemVersionData) {
+ this();
+ setInfo(itemVersionData.getInfo());
+ setRelations(itemVersionData.getRelations());
+ setElementHash(new Id(calculateElementHash(this)));
+ }
+}
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionEntity.java b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionEntity.java
new file mode 100644
index 0000000000..aeed998d96
--- /dev/null
+++ b/openecomp-be/lib/openecomp-core-lib/openecomp-zusammen-lib/openecomp-zusammen-plugin/src/main/java/org/openecomp/core/zusammen/plugin/dao/types/VersionEntity.java
@@ -0,0 +1,45 @@
+package org.openecomp.core.zusammen.plugin.dao.types;
+
+import com.amdocs.zusammen.datatypes.Id;
+
+import java.util.Date;
+
+public class VersionEntity {
+ private Id id;
+ private Id baseId;
+ private Date creationTime;
+ private Date modificationTime;
+
+ public VersionEntity(Id id) {
+ this.id = id;
+ }
+
+ public Id getId() {
+ return id;
+ }
+
+ public Id getBaseId() {
+ return baseId;
+ }
+
+ public void setBaseId(Id baseId) {
+ this.baseId = baseId;
+ }
+
+ public Date getCreationTime() {
+ return creationTime;
+ }
+
+ public void setCreationTime(Date creationTime) {
+ this.creationTime = creationTime;
+ }
+
+ public Date getModificationTime() {
+ return modificationTime;
+ }
+
+ public void setModificationTime(Date modificationTime) {
+ this.modificationTime = modificationTime;
+ }
+
+}