1 package org.openecomp.core.zusammen.plugin.collaboration.impl;
 
   3 import com.amdocs.zusammen.datatypes.SessionContext;
 
   4 import com.amdocs.zusammen.datatypes.item.Action;
 
   5 import com.amdocs.zusammen.datatypes.item.ElementContext;
 
   6 import com.amdocs.zusammen.datatypes.item.Resolution;
 
   7 import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
 
   8 import org.openecomp.core.zusammen.plugin.collaboration.ElementStageStore;
 
   9 import org.openecomp.core.zusammen.plugin.dao.ElementStageRepository;
 
  10 import org.openecomp.core.zusammen.plugin.dao.ElementStageRepositoryFactory;
 
  11 import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
 
  12 import org.openecomp.core.zusammen.plugin.dao.types.StageEntity;
 
  14 import java.util.Collection;
 
  15 import java.util.Optional;
 
  16 import java.util.stream.Collectors;
 
  18 import static org.openecomp.core.zusammen.plugin.ZusammenPluginUtil.getPrivateElementContext;
 
  19 import static org.openecomp.core.zusammen.plugin.ZusammenPluginUtil.getPrivateSpaceName;
 
  21 public class ElementStageStoreImpl implements ElementStageStore {
 
  24   public Collection<ElementEntity> listIds(SessionContext context, ElementContext elementContext) {
 
  25     return getElementStageRepository(context)
 
  26         .listIds(context, new ElementEntityContext(getPrivateSpaceName(context),
 
  27             getPrivateElementContext(elementContext)));
 
  31   public Optional<StageEntity<ElementEntity>> get(SessionContext context,
 
  32                                                   ElementContext elementContext,
 
  33                                                   ElementEntity element) {
 
  34     return getElementStageRepository(context).get(context,
 
  35         new ElementEntityContext(getPrivateSpaceName(context),
 
  36             getPrivateElementContext(elementContext)),
 
  41   public Optional<StageEntity<ElementEntity>> getConflicted(SessionContext context,
 
  42                                                             ElementContext elementContext,
 
  43                                                             ElementEntity element) {
 
  44     return get(context, elementContext, element).filter(StageEntity::isConflicted);
 
  48   public boolean hasConflicts(SessionContext context, ElementContext elementContext) {
 
  49     return !getElementStageRepository(context).listConflictedIds(context,
 
  50         new ElementEntityContext(getPrivateSpaceName(context), getPrivateElementContext(elementContext))).isEmpty();
 
  54   public Collection<StageEntity<ElementEntity>> listConflictedDescriptors(SessionContext context,
 
  55                                                                           ElementContext elementContext) {
 
  56     ElementEntityContext privateContext =
 
  57         new ElementEntityContext(getPrivateSpaceName(context), getPrivateElementContext
 
  59     ElementStageRepository elementStageRepository = getElementStageRepository(context);
 
  61     return elementStageRepository.listConflictedIds(context, privateContext).stream()
 
  62         .map(conflictedElement -> elementStageRepository
 
  63             .getDescriptor(context, privateContext, conflictedElement).get())
 
  64         .collect(Collectors.toList());
 
  68   public void create(SessionContext context, ElementContext elementContext,
 
  69                      StageEntity<ElementEntity> elementStage) {
 
  70     getElementStageRepository(context)
 
  72             new ElementEntityContext(getPrivateSpaceName(context), getPrivateElementContext(elementContext)),
 
  77   public void delete(SessionContext context, ElementContext elementContext, ElementEntity element) {
 
  78     getElementStageRepository(context)
 
  80             new ElementEntityContext(getPrivateSpaceName(context), getPrivateElementContext(elementContext)),
 
  86   public void resolveConflict(SessionContext context, ElementContext elementContext,
 
  87                               ElementEntity element, Resolution resolution) {
 
  88     Optional<StageEntity<ElementEntity>> stagedElement =
 
  89         getConflicted(context, elementContext, element);
 
  90     if (!stagedElement.isPresent()) {
 
  94     ElementEntityContext privateContext =
 
  95         new ElementEntityContext(getPrivateSpaceName(context), getPrivateElementContext
 
 100         resolveConflictByYours(context, privateContext, stagedElement.get());
 
 103         resolveConflictByTheirs(context, privateContext, stagedElement.get());
 
 105       case OTHER: // other = data updates only? no data deletions? if so, then:
 
 106         // conflicted = false
 
 107         // element = the input of resolve
 
 109         throw new UnsupportedOperationException("'Other' conflict resolution is not yet supported");
 
 115   private void resolveConflictByYours(SessionContext context, ElementEntityContext privateContext,
 
 116                                       StageEntity<ElementEntity> stagedElement) {
 
 117     getElementStageRepository(context)
 
 118         .markAsNotConflicted(context, privateContext, stagedElement.getEntity(), Action.IGNORE);
 
 119     stagedElement.getConflictDependents().forEach(conflictDependant ->
 
 120         getElementStageRepository(context)
 
 121             .markAsNotConflicted(context, privateContext, conflictDependant, Action.IGNORE));
 
 124   private void resolveConflictByTheirs(SessionContext context, ElementEntityContext privateContext,
 
 125                                        StageEntity<ElementEntity> stagedElement) {
 
 126     getElementStageRepository(context)
 
 127         .markAsNotConflicted(context, privateContext, stagedElement.getEntity());
 
 130   protected ElementStageRepository getElementStageRepository(SessionContext context) {
 
 131     return ElementStageRepositoryFactory.getInstance().createInterface(context);