Skip to content

Commit

Permalink
Feature: VSDSPUB-349: Add ParentUpdaterImpl
Browse files Browse the repository at this point in the history
  • Loading branch information
WLefever-Cegeka committed Nov 17, 2022
1 parent c920d5f commit 558c8d6
Show file tree
Hide file tree
Showing 12 changed files with 143 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ public void setSoftDeleted(boolean softDeleted) {
this.fragmentInfo.setSoftDeleted(softDeleted);
}

public void setSoftDeleted(boolean softDeleted) {
this.fragmentInfo.setSoftDeleted(softDeleted);
}

public boolean isImmutable() {
return this.fragmentInfo.getImmutable();
}
Expand All @@ -72,4 +68,7 @@ public LdesFragment createChild(FragmentPair fragmentPair) {
return new LdesFragment(fragmentInfo.createChild(fragmentPair));
}

public void removeRelation(TreeRelation treeRelation) {
relations.remove(treeRelation);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@ public interface LdesFragmentRepository {
Optional<LdesFragment> retrieveOpenChildFragment(String viewName,
List<FragmentPair> fragmentPairList);

Optional<LdesFragment> retrieveOpenFragment(String viewName,
Optional<LdesFragment> retrieveMutableFragment(String viewName,
List<FragmentPair> fragmentPairList);

Optional<LdesFragment> retrieveRootFragment(String viewName);

Stream<LdesFragment> retrieveImmutableFragmentsOfView(String viewName);

Optional<LdesFragment> retrieveNonDeletedChildFragment(String viewName,
List<FragmentPair> fragmentPairList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services;

import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.entities.LdesFragment;

public interface ParentUpdater {

void updateParent(LdesFragment currentChild);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services;

import be.vlaanderen.informatievlaanderen.ldes.server.domain.exceptions.MissingFragmentException;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.entities.LdesFragment;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.repository.LdesFragmentRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.valueobjects.FragmentInfo;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.valueobjects.TreeRelation;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragmentrequest.valueobjects.FragmentPair;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static be.vlaanderen.informatievlaanderen.ldes.server.domain.constants.RdfConstants.GENERIC_TREE_RELATION;

@Component
public class ParentUpdaterImpl implements ParentUpdater {
private final LdesFragmentRepository ldesFragmentRepository;

public ParentUpdaterImpl(LdesFragmentRepository ldesFragmentRepository) {
this.ldesFragmentRepository = ldesFragmentRepository;
}

public void updateParent(LdesFragment currentChild) {
List<FragmentPair> parentPairs = new ArrayList<>(currentChild.getFragmentInfo().getFragmentPairs());
parentPairs.remove(parentPairs.size() - 1);
LdesFragment parent = ldesFragmentRepository
.retrieveMutableFragment(currentChild.getFragmentInfo().getViewName(), parentPairs)
.orElseThrow(() -> new MissingFragmentException(
new FragmentInfo(currentChild.getFragmentInfo().getViewName(), parentPairs)
.generateFragmentId()));
Optional<TreeRelation> optionalOldTreeRelation = parent.getRelations().stream()
.filter(treeRelation -> treeRelation.treeNode().equals(currentChild.getFragmentId())).findFirst();
if (optionalOldTreeRelation.isPresent()) {
TreeRelation oldTreeRelation = optionalOldTreeRelation.get();
LdesFragment newChild = ldesFragmentRepository
.retrieveNonDeletedChildFragment(parent.getFragmentInfo().getViewName(), parentPairs)
.orElseThrow(() -> new RuntimeException("No non-deleted child"));
parent.removeRelation(oldTreeRelation);
parent.addRelation(new TreeRelation("", newChild.getFragmentId(), "", "", GENERIC_TREE_RELATION));
ldesFragmentRepository.saveFragment(parent);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@ public class TreeNodeRemoverImpl implements TreeNodeRemover {
private final Map<String, List<RetentionPolicy>> retentionPolicyMap;
private final MemberReferencesRepository memberReferencesRepository;
private final TreeMemberRemover treeMemberRemover;
private final ParentUpdater parentUpdater;

public TreeNodeRemoverImpl(LdesFragmentRepository ldesFragmentRepository,
Map<String, List<RetentionPolicy>> retentionPolicyMap,
MemberReferencesRepository memberReferencesRepository, TreeMemberRemover treeMemberRemover) {
MemberReferencesRepository memberReferencesRepository, TreeMemberRemover treeMemberRemover,
ParentUpdater parentUpdater) {
this.ldesFragmentRepository = ldesFragmentRepository;
this.retentionPolicyMap = retentionPolicyMap;
this.memberReferencesRepository = memberReferencesRepository;
this.treeMemberRemover = treeMemberRemover;
this.parentUpdater = parentUpdater;
}

@Scheduled(fixedDelay = 10000)
Expand All @@ -40,6 +43,7 @@ public void removeTreeNodes() {
ldesFragments.forEach(ldesFragment -> {
ldesFragment.setSoftDeleted(true);
ldesFragmentRepository.saveFragment(ldesFragment);
parentUpdater.updateParent(ldesFragment);
ldesFragment
.getMemberIds()
.forEach(memberId -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,6 @@ public void setSoftDeleted(Boolean softDeleted) {
this.softDeleted = softDeleted;
}

public Boolean getSoftDeleted() {
return softDeleted;
}

public void setSoftDeleted(Boolean softDeleted) {
this.softDeleted = softDeleted;
}

public FragmentInfo createChild(FragmentPair fragmentPair) {
ArrayList<FragmentPair> childFragmentPairs = new ArrayList<>(this.fragmentPairs.stream().toList());
childFragmentPairs.add(fragmentPair);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services;

import be.vlaanderen.informatievlaanderen.ldes.server.domain.exceptions.MissingFragmentException;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.entities.LdesFragment;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.repository.LdesFragmentRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.valueobjects.FragmentInfo;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.valueobjects.TreeRelation;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragmentrequest.valueobjects.FragmentPair;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.*;

class ParentUpdaterImplTest {

private final LdesFragmentRepository ldesFragmentRepository = mock(LdesFragmentRepository.class);
private ParentUpdater parentUpdater;
private static final String VIEW = "view";
private static final LdesFragment DELETED_CHILD = new LdesFragment(
new FragmentInfo(VIEW, List.of(new FragmentPair("key", "value"))));
private static final LdesFragment NON_DELETED_CHILD = new LdesFragment(
new FragmentInfo(VIEW, List.of(new FragmentPair("key", "value2"))));
private static final LdesFragment PARENT = new LdesFragment(new FragmentInfo(VIEW, List.of()));

@BeforeEach
void setUp() {
parentUpdater = new ParentUpdaterImpl(ldesFragmentRepository);

}

@Test
void when_ParentIsPointingToDeletedChild_RelationIsRemovedAndNewRelationToNonDeletedChildIsAdded() {
PARENT.addRelation(new TreeRelation("", DELETED_CHILD.getFragmentId(), "", "", ""));
when(ldesFragmentRepository.retrieveMutableFragment(VIEW, List.of())).thenReturn(Optional.of(PARENT));
when(ldesFragmentRepository.retrieveNonDeletedChildFragment(VIEW, List.of()))
.thenReturn(Optional.of(NON_DELETED_CHILD));

parentUpdater.updateParent(DELETED_CHILD);

verify(ldesFragmentRepository, times(1)).saveFragment(PARENT);
assertEquals(NON_DELETED_CHILD.getFragmentId(), PARENT.getRelations().get(0).treeNode());
}

@Test
void when_ParentDoesNotExist_ExceptionIsThrown() {
when(ldesFragmentRepository.retrieveMutableFragment(VIEW, List.of())).thenReturn(Optional.empty());

MissingFragmentException missingFragmentException = assertThrows(MissingFragmentException.class,
() -> parentUpdater.updateParent(DELETED_CHILD));
assertEquals("No fragment exists with fragment identifier: /view", missingFragmentException.getMessage());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ class TreeNodeRemoverImplTest {
List.of(new TimeBasedRetentionPolicy(0)));
private final MemberReferencesRepository referencesRepository = mock(MemberReferencesRepository.class);
private final TreeMemberRemover treeMemberRemover = mock(TreeMemberRemover.class);
private final ParentUpdater parentUpdater = mock(ParentUpdater.class);
private final TreeNodeRemover treeNodeRemover = new TreeNodeRemoverImpl(fragmentRepository, retentionPolicyMap,
referencesRepository, treeMemberRemover);
referencesRepository, treeMemberRemover, parentUpdater);

@Test
void when_NodeIsImmutableAndSatisfiesRetentionPoliciesOfView_NodeCanBeSoftDeleted() {
Expand All @@ -40,6 +41,8 @@ void when_NodeIsImmutableAndSatisfiesRetentionPoliciesOfView_NodeCanBeSoftDelete
verify(fragmentRepository, times(1)).saveFragment(readyToDeleteFragment);
assertTrue(readyToDeleteFragment.getFragmentInfo().getSoftDeleted());
verifyNoMoreInteractions(fragmentRepository);
verify(parentUpdater, times(1)).updateParent(readyToDeleteFragment);
verifyNoMoreInteractions(parentUpdater);
verify(referencesRepository, times(1)).removeMemberReference("memberId", "/view");
verifyNoMoreInteractions(referencesRepository);
verify(treeMemberRemover, times(1)).tryRemovingMember("memberId");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public Optional<LdesFragment> retrieveFragment(LdesFragmentRequest ldesFragmentR
}

@Override
public Optional<LdesFragment> retrieveOpenFragment(String viewName,
public Optional<LdesFragment> retrieveMutableFragment(String viewName,
List<FragmentPair> fragmentPairList) {
return repository
.findAllByImmutableAndViewName(false,
Expand Down Expand Up @@ -76,4 +76,18 @@ public Stream<LdesFragment> retrieveImmutableFragmentsOfView(String viewName) {
.map(LdesFragmentEntity::toLdesFragment);
}

@Override
public Optional<LdesFragment> retrieveNonDeletedChildFragment(String viewName,
List<FragmentPair> fragmentPairList) {
return repository
.findAllBySoftDeletedAndViewName(false,
viewName)
.stream()
.filter(ldesFragmentEntity -> Collections
.indexOfSubList(ldesFragmentEntity.getFragmentInfo().getFragmentPairs(), fragmentPairList) != -1
&& !fragmentPairList.equals(ldesFragmentEntity.getFragmentInfo().getFragmentPairs()))
.map(LdesFragmentEntity::toLdesFragment)
.min(Comparator.comparing(LdesFragment::getFragmentId));
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ Optional<LdesFragmentEntity> findLdesFragmentEntityByRootAndViewName(
List<LdesFragmentEntity> findAllByImmutableAndViewName(
Boolean immutable, String viewName);

List<LdesFragmentEntity> findAllBySoftDeletedAndViewName(Boolean softDeleted, String viewName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ void when_RetrieveOpenFragment_FirstFragmentThatIsOpenAndBelongsToCollectionIsRe
.equals(VIEW_NAME))
.collect(Collectors.toList()));

Optional<LdesFragment> ldesFragment = ldesFragmentMongoRepository.retrieveOpenFragment(
Optional<LdesFragment> ldesFragment = ldesFragmentMongoRepository.retrieveMutableFragment(
VIEW_NAME,
List.of());

Expand Down

0 comments on commit 558c8d6

Please sign in to comment.