Skip to content

Commit

Permalink
Feature: VSDSPUB-349: Add reference from member to fragment
Browse files Browse the repository at this point in the history
  • Loading branch information
WLefever-Cegeka committed Nov 16, 2022
1 parent 24fffa7 commit 41d43b9
Show file tree
Hide file tree
Showing 16 changed files with 264 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.valueobjects.TreeRelation;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragmentrequest.valueobjects.FragmentPair;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.member.entities.Member;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.member.repository.MemberRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.fragmentisers.timebased.config.TimebasedFragmentationConfig;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
Expand All @@ -15,7 +14,6 @@
import org.junit.jupiter.api.Test;

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

import static be.vlaanderen.informatievlaanderen.ldes.server.domain.constants.RdfConstants.*;
import static be.vlaanderen.informatievlaanderen.ldes.server.fragmentisers.timebased.services.TimeBasedFragmentCreator.DATE_TIME_TYPE;
Expand All @@ -27,14 +25,12 @@ class TimeBasedFragmentCreatorTest {

private static final String VIEW = "view";
private TimeBasedFragmentCreator fragmentCreator;
private MemberRepository memberRepository;
private LdesFragmentRepository ldesFragmentRepository;

@BeforeEach
void setUp() {
TimebasedFragmentationConfig timeBasedConfig = createSequentialFragmentationConfig();
ldesFragmentRepository = mock(LdesFragmentRepository.class);
memberRepository = mock(MemberRepository.class);
fragmentCreator = new TimeBasedFragmentCreator(timeBasedConfig,
ldesFragmentRepository);
}
Expand Down Expand Up @@ -62,8 +58,6 @@ void when_AFragmentAlreadyExists_thenNewFragmentIsCreatedAndRelationsAreUpdated(
new FragmentInfo(VIEW, List.of(new FragmentPair(GENERATED_AT_TIME,
"2020-12-28T09:36:37.127Z"))));
existingLdesFragment.addMember(memberOfFragment.getLdesMemberId());
when(memberRepository.getLdesMemberById(memberOfFragment.getLdesMemberId()))
.thenReturn(Optional.of(memberOfFragment));

LdesFragment newFragment = fragmentCreator.createNewFragment(existingLdesFragment, parentFragment);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@
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.tree.member.entities.Member;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities.MemberReferencesRepository;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;

public class FragmentationStrategyImpl implements FragmentationStrategy {
private final LdesFragmentRepository ldesFragmentRepository;
private final MemberReferencesRepository memberReferencesRepository;
private final Tracer tracer;

public FragmentationStrategyImpl(LdesFragmentRepository ldesFragmentRepository,
Tracer tracer) {
MemberReferencesRepository memberReferencesRepository, Tracer tracer) {
this.ldesFragmentRepository = ldesFragmentRepository;
this.memberReferencesRepository = memberReferencesRepository;
this.tracer = tracer;
}

Expand All @@ -21,6 +24,7 @@ public void addMemberToFragment(LdesFragment ldesFragment, Member member, Span p
Span finalSpan = tracer.nextSpan(parentSpan).name("add member to fragment").start();
ldesFragment.addMember(member.getLdesMemberId());
ldesFragmentRepository.saveFragment(ldesFragment);
memberReferencesRepository.saveMemberReference(member.getLdesMemberId(), ldesFragment.getFragmentId());
finalSpan.end();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities;

public interface MemberReferencesRepository {

void saveMemberReference(final String memberId, final String treeNodeId);

void removeMemberReference(final String memberId, final String treeNodeId);

boolean hasMemberReferences(final String memberId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.FragmentationStrategy;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.FragmentationStrategyImpl;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.RootFragmentCreator;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities.MemberReferencesRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.viewcreation.valueobjects.FragmentationConfig;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.viewcreation.valueobjects.ViewSpecification;
import org.springframework.cloud.sleuth.Tracer;
Expand All @@ -16,20 +17,25 @@
public class FragmentationStrategyCreatorImpl implements FragmentationStrategyCreator {
private final ApplicationContext applicationContext;
private final LdesFragmentRepository ldesFragmentRepository;
private final MemberReferencesRepository memberReferencesRepository;
private final RootFragmentCreator rootFragmentCreator;
private final Tracer tracer;

public FragmentationStrategyCreatorImpl(ApplicationContext applicationContext,
LdesFragmentRepository ldesFragmentRepository, RootFragmentCreator rootFragmentCreator, Tracer tracer) {
LdesFragmentRepository ldesFragmentRepository,
MemberReferencesRepository memberReferencesRepository, RootFragmentCreator rootFragmentCreator,
Tracer tracer) {
this.applicationContext = applicationContext;
this.ldesFragmentRepository = ldesFragmentRepository;
this.memberReferencesRepository = memberReferencesRepository;
this.rootFragmentCreator = rootFragmentCreator;
this.tracer = tracer;
}

public FragmentationStrategy createFragmentationStrategyForView(ViewSpecification viewSpecification) {
rootFragmentCreator.createRootFragmentForView(viewSpecification.getName());
FragmentationStrategy fragmentationStrategy = new FragmentationStrategyImpl(ldesFragmentRepository, tracer);
FragmentationStrategy fragmentationStrategy = new FragmentationStrategyImpl(ldesFragmentRepository,
memberReferencesRepository, tracer);
if (viewSpecification.getFragmentations() != null) {
fragmentationStrategy = wrapFragmentationStrategy(viewSpecification.getFragmentations(),
fragmentationStrategy);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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.tree.member.entities.Member;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities.MemberReferencesRepository;
import org.junit.jupiter.api.Test;
import org.springframework.cloud.sleuth.Tracer;

Expand All @@ -15,11 +16,12 @@

class FragmentationStrategyImplTest {
private final LdesFragmentRepository ldesFragmentRepository = mock(LdesFragmentRepository.class);
private final MemberReferencesRepository memberReferencesRepository = mock(MemberReferencesRepository.class);
private final Tracer tracer = mockTracer();

private final FragmentationStrategyImpl fragmentationStrategy = new FragmentationStrategyImpl(
ldesFragmentRepository,
tracer);
memberReferencesRepository, tracer);

@Test
void when_memberIsAddedToFragment_FragmentationStrategyImplSavesUpdatedFragment() {
Expand All @@ -30,6 +32,7 @@ void when_memberIsAddedToFragment_FragmentationStrategyImplSavesUpdatedFragment(
fragmentationStrategy.addMemberToFragment(ldesFragment, member, any());

verify(ldesFragmentRepository, times(1)).saveFragment(ldesFragment);
verify(memberReferencesRepository, times(1)).saveMemberReference("memberId", "/view");
assertEquals(List.of("memberId"), ldesFragment.getMemberIds());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.member.entities;

import org.apache.commons.io.FileUtils;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFParserBuilder;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.util.ResourceUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

import static be.vlaanderen.informatievlaanderen.ldes.server.domain.constants.RdfConstants.TREE_MEMBER;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

class MemberTest {

@Test
@DisplayName("Test correct replacing of TreeMember statement")
void when_TreeMemberStatementIsReplaced_TreeMemberStatementHasADifferentSubject() throws IOException {
String ldesMemberString = FileUtils.readFileToString(ResourceUtils.getFile("classpath:example-ldes-member.nq"),
StandardCharsets.UTF_8);
Member member = new Member(
"https://private-api.gipod.beta-vlaanderen.be/api/v1/mobility-hindrances/10810464/1",
createModel(ldesMemberString, Lang.NQUADS));

member.removeTreeMember();
Statement statement = member.getModel().listStatements(null, TREE_MEMBER, (Resource) null).nextOptional()
.orElse(null);

assertNull(statement);
}

@Test
@DisplayName("Verify retrieving of member id from LdesMember")
void when_TreeMemberStatementIsAvailableInModel_LdesMemberId() throws IOException {
String ldesMemberString = FileUtils.readFileToString(ResourceUtils.getFile("classpath:example-ldes-member.nq"),
StandardCharsets.UTF_8);
Member member = new Member(
"https://private-api.gipod.beta-vlaanderen.be/api/v1/mobility-hindrances/10810464/1",
createModel(ldesMemberString, Lang.NQUADS));
assertEquals("https://private-api.gipod.beta-vlaanderen.be/api/v1/mobility-hindrances/10810464/1",
member.getLdesMemberId());
}

@Test
void when_getFragmentationObjects_returnCorrespondingStatements() throws IOException {
String ldesMemberString = FileUtils.readFileToString(
ResourceUtils.getFile("classpath:example-ldes-member-multiple-properties-same-predicate.nq"),
StandardCharsets.UTF_8);

Member member = new Member(
"http://localhost:8080/member/1",
createModel(ldesMemberString, Lang.NQUADS));

assertEquals(4, member.getFragmentationObjects(".*",
"http://www.w3.org/2004/02/skos/core#prefLabel").size());
assertEquals(1, member.getFragmentationObjects(".*/member/.*",
"http://www.w3.org/2004/02/skos/core#prefLabel").size());
}

private Model createModel(final String ldesMember, final Lang lang) {
return RDFParserBuilder.create().fromString(ldesMember).lang(lang).toModel();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.FragmentationStrategy;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.FragmentationStrategyImpl;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.ldesfragment.services.RootFragmentCreator;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities.MemberReferencesRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.viewcreation.valueobjects.FragmentationConfig;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.viewcreation.valueobjects.FragmentationProperties;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.viewcreation.valueobjects.ViewSpecification;
Expand All @@ -29,13 +30,14 @@ class FragmentationStrategyCreatorImplTest {
private final ApplicationContext applicationContext = mock(ApplicationContext.class);
private final LdesFragmentRepository ldesFragmentRepository = mock(LdesFragmentRepository.class);
private final RootFragmentCreator rootFragmentCreator = mock(RootFragmentCreator.class);
private final MemberReferencesRepository memberReferencesRepository = mock(MemberReferencesRepository.class);
private final Tracer tracer = mock(Tracer.class);
private FragmentationStrategyCreatorImpl fragmentationStrategyCreator;

@BeforeEach
void setUp() {
fragmentationStrategyCreator = new FragmentationStrategyCreatorImpl(
applicationContext, ldesFragmentRepository, rootFragmentCreator, tracer);
applicationContext, ldesFragmentRepository, memberReferencesRepository, rootFragmentCreator, tracer);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,4 @@ public Stream<Member> getLdesMembersByIds(List<String> ids) {
return StreamSupport.stream(repository.findAllById(ids).spliterator(), false)
.map(LdesMemberEntity::toLdesMember);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo;

import be.vlaanderen.informatievlaanderen.ldes.server.domain.exceptions.MemberNotFoundException;
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.memberreferences.entities.MemberReferencesRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.entities.MemberReferencesEntity;
import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.repositories.MemberReferencesEntityRepository;

import java.util.ArrayList;

public class MemberReferencesMongoRepository implements MemberReferencesRepository {

private final MemberReferencesEntityRepository repository;

public MemberReferencesMongoRepository(MemberReferencesEntityRepository repository) {
this.repository = repository;
}

@Override
public synchronized void saveMemberReference(String memberId, String treeNodeId) {
MemberReferencesEntity memberReferencesEntity = repository.findById(memberId)
.orElseGet(() -> new MemberReferencesEntity(memberId, new ArrayList<>()));
memberReferencesEntity.addMemberReference(treeNodeId);
repository.save(memberReferencesEntity);
}

@Override
public synchronized void removeMemberReference(String memberId, String treeNodeId) {
MemberReferencesEntity memberReferencesEntity = repository
.findById(memberId)
.orElseThrow(() -> new MemberNotFoundException(memberId));
memberReferencesEntity.removeMemberReference(treeNodeId);
repository.save(memberReferencesEntity);
}

@Override
public synchronized boolean hasMemberReferences(String memberId) {
return repository
.findById(memberId)
.map(MemberReferencesEntity::hasMemberReferences)
.orElseThrow(() -> new MemberNotFoundException(memberId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import be.vlaanderen.informatievlaanderen.ldes.server.domain.tree.member.repository.MemberRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.repositories.LdesFragmentEntityRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.repositories.LdesMemberEntityRepository;
import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.repositories.MemberReferencesEntityRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
Expand All @@ -29,4 +30,11 @@ public LdesFragmentRepository ldesFragmentMongoRepository(
final LdesFragmentEntityRepository ldesFragmentEntityRepository) {
return new LdesFragmentMongoRepository(ldesFragmentEntityRepository);
}

@Bean
@ConditionalOnMissingBean
public MemberReferencesMongoRepository memberReferencesMongoRepository(
final MemberReferencesEntityRepository memberReferencesEntityRepository) {
return new MemberReferencesMongoRepository(memberReferencesEntityRepository);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,15 @@ public class LdesMemberEntity {

@Id
private final String id;
private final String model;

private final String ldesMember;

public LdesMemberEntity(String id, final String ldesMember) {
public LdesMemberEntity(String id, final String model) {
this.id = id;
this.ldesMember = ldesMember;
this.model = model;
}

public String getLdesMember() {
return this.ldesMember;
public String getModel() {
return this.model;
}

public static LdesMemberEntity fromLdesMember(Member member) {
Expand All @@ -35,7 +34,7 @@ public static LdesMemberEntity fromLdesMember(Member member) {
}

public Member toLdesMember() {
Model ldesMemberModel = RDFParserBuilder.create().fromString(this.ldesMember).lang(Lang.NQUADS).toModel();
Model ldesMemberModel = RDFParserBuilder.create().fromString(this.model).lang(Lang.NQUADS).toModel();
return new Member(this.id, ldesMemberModel);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.entities;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.List;

@Document("memberreferences")
public class MemberReferencesEntity {
@Id
private final String id;
private final List<String> treeNodesRefences;

public MemberReferencesEntity(String id, List<String> treeNodesRefences) {
this.id = id;
this.treeNodesRefences = treeNodesRefences;
}

public void addMemberReference(String treeNodeId) {
treeNodesRefences.add(treeNodeId);
}

public boolean hasMemberReferences() {
return !treeNodesRefences.isEmpty();
}

public void removeMemberReference(String treeNodeId) {
treeNodesRefences.remove(treeNodeId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.repositories;

import be.vlaanderen.informatievlaanderen.ldes.server.infra.mongo.entities.MemberReferencesEntity;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface MemberReferencesEntityRepository extends MongoRepository<MemberReferencesEntity, String> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ public void init() throws IOException, URISyntaxException {
void toEntity() {
LdesMemberEntity actualLdesMemberEntity = LdesMemberEntity.fromLdesMember(member);

Model actualLdesMemberEntityModel = RDFParserBuilder.create().fromString(actualLdesMemberEntity.getLdesMember())
Model actualLdesMemberEntityModel = RDFParserBuilder.create().fromString(actualLdesMemberEntity.getModel())
.lang(Lang.NQUADS).toModel();

Model ldesMemberEntityModel = RDFParserBuilder.create().fromString(ldesMemberEntity.getLdesMember())
Model ldesMemberEntityModel = RDFParserBuilder.create().fromString(ldesMemberEntity.getModel())
.lang(Lang.NQUADS).toModel();

assertTrue(ldesMemberEntityModel.isIsomorphicWith(actualLdesMemberEntityModel));
Expand Down
Loading

0 comments on commit 41d43b9

Please sign in to comment.