Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-core-lib / openecomp-zusammen-lib / openecomp-zusammen-plugin / src / main / java / org / openecomp / core / zusammen / plugin / ZusammenPluginUtil.java
index 59afa70..a973590 100644 (file)
@@ -19,13 +19,30 @@ package org.openecomp.core.zusammen.plugin;
 import com.amdocs.zusammen.datatypes.Id;
 import com.amdocs.zusammen.datatypes.SessionContext;
 import com.amdocs.zusammen.datatypes.Space;
-import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
+import com.amdocs.zusammen.datatypes.item.Action;
+import com.amdocs.zusammen.datatypes.item.ElementContext;
+import com.amdocs.zusammen.datatypes.item.ItemVersion;
+import com.amdocs.zusammen.datatypes.item.ItemVersionChange;
+import com.amdocs.zusammen.datatypes.item.ItemVersionData;
+import com.amdocs.zusammen.datatypes.item.ItemVersionDataConflict;
 import com.amdocs.zusammen.sdk.collaboration.types.CollaborationElement;
+import com.amdocs.zusammen.sdk.collaboration.types.CollaborationElementChange;
+import com.amdocs.zusammen.sdk.collaboration.types.CollaborationElementConflict;
+import com.amdocs.zusammen.sdk.state.types.StateElement;
+import com.amdocs.zusammen.sdk.types.ElementDescriptor;
 import com.amdocs.zusammen.utils.fileutils.FileUtils;
+import com.amdocs.zusammen.utils.fileutils.json.JsonUtil;
 import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
+import org.openecomp.core.zusammen.plugin.dao.types.VersionEntity;
 
 import java.io.ByteArrayInputStream;
 import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.Date;
+
+import static org.openecomp.core.zusammen.plugin.ZusammenPluginConstants.ROOT_ELEMENTS_PARENT_ID;
 
 public class ZusammenPluginUtil {
 
@@ -34,7 +51,7 @@ public class ZusammenPluginUtil {
       case PUBLIC:
         return ZusammenPluginConstants.PUBLIC_SPACE;
       case PRIVATE:
-        return ZusammenPluginUtil.getPrivateSpaceName(context);
+        return getPrivateSpaceName(context);
       default:
         throw new IllegalArgumentException(String.format("Space %s is not supported.", space));
     }
@@ -44,14 +61,54 @@ public class ZusammenPluginUtil {
     return context.getUser().getUserName();
   }
 
-  public static ElementEntity getElementEntity(CollaborationElement element) {
+  public static ElementContext getPrivateElementContext(ElementContext elementContext) {
+    return new ElementContext(elementContext.getItemId(),elementContext.getVersionId(),Id.ZERO);
+  }
+
+
+  public static VersionEntity convertToVersionEntity(Id versionId, Id baseVersionId,
+                                                     Date creationTime,
+                                                     Date modificationTime) {
+
+    return convertToVersionEntity(versionId, null, baseVersionId,
+        creationTime, modificationTime);
+  }
+
+  public static VersionEntity convertToVersionEntity(Id versionId, Id revisionId, Id baseVersionId,
+                                                     Date creationTime,
+                                                     Date modificationTime) {
+    VersionEntity version = new VersionEntity(versionId);
+    version.setBaseId(baseVersionId);
+    version.setCreationTime(creationTime);
+    version.setModificationTime(modificationTime);
+    return version;
+  }
+
+  public static ItemVersion convertToItemVersion(VersionEntity versionEntity,
+                                                 ItemVersionData itemVersionData) {
+    ItemVersion itemVersion = new ItemVersion();
+    itemVersion.setId(versionEntity.getId());
+
+    itemVersion.setBaseId(versionEntity.getBaseId());
+    itemVersion.setCreationTime(versionEntity.getCreationTime());
+    itemVersion.setModificationTime(versionEntity.getModificationTime());
+    itemVersion.setData(itemVersionData);
+    return itemVersion;
+  }
+
+  public static ElementEntity convertToElementEntity(CollaborationElement element) {
+
     ElementEntity elementEntity = new ElementEntity(element.getId());
     elementEntity.setNamespace(element.getNamespace());
     elementEntity.setParentId(element.getParentId() == null
-        ? ZusammenPluginConstants.ROOT_ELEMENTS_PARENT_ID
+        ? ROOT_ELEMENTS_PARENT_ID
         : element.getParentId());
+
+
     elementEntity.setInfo(element.getInfo());
+
     elementEntity.setRelations(element.getRelations());
+
     if (element.getData() != null) {
       elementEntity.setData(ByteBuffer.wrap(FileUtils.toByteArray(element.getData())));
     }
@@ -63,21 +120,29 @@ public class ZusammenPluginUtil {
       elementEntity.setVisualization(
           ByteBuffer.wrap(FileUtils.toByteArray(element.getVisualization())));
     }
+    elementEntity.setElementHash(new Id(calculateElementHash(elementEntity)));
+
     return elementEntity;
   }
 
-  public static CollaborationElement getCollaborationElement(
-      ElementEntityContext elementEntityContext, ElementEntity elementEntity) {
-    Id parentId =
-        ZusammenPluginConstants.ROOT_ELEMENTS_PARENT_ID.equals(elementEntity.getParentId())
-            ? null
-            : elementEntity.getParentId();
-    CollaborationElement element = new CollaborationElement(elementEntityContext.getItemId(),
-        elementEntityContext.getVersionId(), elementEntity.getNamespace(), elementEntity.getId());
+  public static ElementDescriptor convertToElementDescriptor(
+      ElementContext elementContext, ElementEntity elementEntity) {
+    if (elementEntity == null) {
+      return null;
+    }
+    ElementDescriptor element = new ElementDescriptor(elementContext.getItemId(),
+        elementContext.getVersionId(), elementEntity.getNamespace(), elementEntity.getId());
 
-    element.setParentId(parentId);
-    element.setInfo(elementEntity.getInfo());
-    element.setRelations(elementEntity.getRelations());
+    mapElementEntityToDescriptor(elementEntity, element);
+    return element;
+  }
+
+  public static CollaborationElement convertToCollaborationElement(
+      ElementContext elementContext, ElementEntity elementEntity) {
+    CollaborationElement element = new CollaborationElement(elementContext.getItemId(),
+        elementContext.getVersionId(), elementEntity.getNamespace(), elementEntity.getId());
+
+    mapElementEntityToDescriptor(elementEntity, element);
 
     if (elementEntity.getData() != null) {
       element.setData(new ByteArrayInputStream(elementEntity.getData().array()));
@@ -89,7 +154,134 @@ public class ZusammenPluginUtil {
     if (elementEntity.getVisualization() != null) {
       element.setVisualization(new ByteArrayInputStream(elementEntity.getVisualization().array()));
     }
+    return element;
+  }
+
+  public static CollaborationElementChange convertToElementChange(
+      ElementContext changedElementContext, ElementEntity changedElement, Action action) {
+    CollaborationElementChange elementChange = new CollaborationElementChange();
+    elementChange.setElement(convertToCollaborationElement(changedElementContext, changedElement));
+    elementChange.setAction(action);
+    return elementChange;
+  }
+
+  public static ItemVersionChange convertToVersionChange(ElementContext elementContext,
+                                                         ElementEntity versionDataElement,
+                                                         Action action) {
+    ItemVersionChange versionChange = new ItemVersionChange();
+
+    ItemVersion itemVersion = new ItemVersion();
+    itemVersion.setId(elementContext.getVersionId());
+
+    itemVersion.setData(convertToVersionData(versionDataElement));
+
+    versionChange.setItemVersion(itemVersion);
+    versionChange.setAction(action);
+    return versionChange;
+  }
+
+  public static ItemVersionDataConflict getVersionConflict(ElementEntity localVesionData,
+                                                           ElementEntity remoteVersionData) {
+    ItemVersionDataConflict versionConflict = new ItemVersionDataConflict();
+    versionConflict.setLocalData(convertToVersionData(localVesionData));
+    versionConflict.setRemoteData(convertToVersionData(remoteVersionData));
+    return versionConflict;
+  }
+
+  public static CollaborationElementConflict getElementConflict(ElementContext elementContext,
+                                                                ElementEntity localElement,
+                                                                ElementEntity remoteElement) {
+    CollaborationElementConflict elementConflict = new CollaborationElementConflict();
+    elementConflict
+        .setLocalElement(convertToCollaborationElement(elementContext, localElement));
+    elementConflict.setRemoteElement(
+        convertToCollaborationElement(elementContext, remoteElement));
+    return elementConflict;
+  }
+
+  public static ItemVersionData convertToVersionData(ElementEntity versionDataElement) {
+    ItemVersionData versionData = new ItemVersionData();
+    versionData.setInfo(versionDataElement.getInfo());
+    versionData.setRelations(versionDataElement.getRelations());
+    return versionData;
+  }
+
+  private static void mapElementEntityToDescriptor(ElementEntity elementEntity,
+                                                   ElementDescriptor elementDescriptor) {
+    Id parentId = ROOT_ELEMENTS_PARENT_ID.equals(elementEntity.getParentId())
+        ? null
+        : elementEntity.getParentId();
+
+    elementDescriptor.setParentId(parentId);
+    elementDescriptor.setInfo(elementEntity.getInfo());
+    elementDescriptor.setRelations(elementEntity.getRelations());
+    elementDescriptor.setSubElements(elementEntity.getSubElementIds());
+  }
+
+  public static String calculateElementHash(ElementEntity elementEntity) {
+    StringBuffer elementHash = new StringBuffer();
+    if (elementEntity.getData() != null) {
+      elementHash.append(calculateSHA1(elementEntity.getData().array()));
+    } else {
+      elementHash.append("0");
+    }
+    elementHash.append("_");
+    if (elementEntity.getVisualization() != null) {
+      elementHash.append(calculateSHA1(elementEntity.getVisualization().array()));
+    } else {
+      elementHash.append("0");
+    }
+    elementHash.append("_");
+
+    if (elementEntity.getSearchableData() != null) {
+      elementHash.append(calculateSHA1(elementEntity.getSearchableData().array()));
+    } else {
+      elementHash.append("0");
+    }
+    elementHash.append("_");
+
+    if (elementEntity.getInfo() != null) {
+      elementHash.append(calculateSHA1(JsonUtil.object2Json(elementEntity.getInfo()).getBytes()));
+    } else {
+      elementHash.append("0");
+    }
+    elementHash.append("_");
+
+    if (elementEntity.getRelations() != null) {
+      elementHash
+          .append(calculateSHA1(JsonUtil.object2Json(elementEntity.getRelations()).getBytes()));
+    } else {
+      elementHash.append("0");
+    }
+
+    return elementHash.toString();
+  }
+
+  private static String calculateSHA1(byte[] content2Convert) {
+    MessageDigest md = null;
+    try {
+      md = MessageDigest.getInstance("SHA-1");
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException(e);
+    }
+    return Base64.getEncoder().encodeToString(md.digest(content2Convert));
+  }
+
+
+  public static StateElement getStateElement(ElementContext elementContext, ElementEntity
+      elementEntity) {
+    Id parentId = ROOT_ELEMENTS_PARENT_ID.equals(elementEntity.getParentId())
+        ? null
+        : elementEntity.getParentId();
+    StateElement element = new StateElement(elementContext.getItemId(),
+        elementContext.getVersionId(), elementEntity.getNamespace(), elementEntity.getId());
+
+    element.setParentId(parentId);
+    element.setInfo(elementEntity.getInfo());
+    element.setRelations(elementEntity.getRelations());
     element.setSubElements(elementEntity.getSubElementIds());
     return element;
   }
+
+
 }