Skip to content

Commit

Permalink
feat: rdf-endpoints for geonorge administrative enheter
Browse files Browse the repository at this point in the history
  • Loading branch information
NilsOveTen committed Dec 18, 2023
1 parent 73e4726 commit 005f5a6
Show file tree
Hide file tree
Showing 16 changed files with 247 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.fdk.referencedata.geonorge.administrativeenheter.fylke;

import lombok.extern.slf4j.Slf4j;
import org.apache.jena.riot.RDFFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -41,4 +42,10 @@ public ResponseEntity<Void> updateFylker() {
public ResponseEntity<Fylke> getKommune(@PathVariable("fylkesnummer") final String fylkesnummer) {
return ResponseEntity.of(fylkeRepository.findByFylkesnummer(fylkesnummer));
}

@CrossOrigin
@GetMapping(produces = "text/turtle")
public ResponseEntity<String> getFylkerRDF() {
return ResponseEntity.ok(fylkeService.getRdf(RDFFormat.TURTLE));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
package no.fdk.referencedata.geonorge.administrativeenheter.fylke;

import lombok.extern.slf4j.Slf4j;
import no.fdk.referencedata.geonorge.administrativeenheter.kommune.KommuneHarvester;
import no.fdk.referencedata.geonorge.administrativeenheter.kommune.KommuneRepository;
import no.fdk.referencedata.rdf.RDFSource;
import no.fdk.referencedata.rdf.RDFSourceRepository;
import no.fdk.referencedata.rdf.RDFUtils;
import no.fdk.referencedata.settings.HarvestSettings;
import no.fdk.referencedata.settings.HarvestSettingsRepository;
import no.fdk.referencedata.settings.Settings;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.vocabulary.DCTerms;
import org.apache.jena.vocabulary.RDF;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -16,26 +24,51 @@
@Service
@Slf4j
public class FylkeService {
private final String rdfSourceID = "fylke-source";

private final FylkeHarvester fylkeHarvester;

private final FylkeRepository fylkeRepository;

private final HarvestSettingsRepository harvestSettingsRepository;

private final RDFSourceRepository rdfSourceRepository;

@Autowired
public FylkeService(FylkeHarvester fylkeHarvester,
FylkeRepository fylkeRepository,
RDFSourceRepository rdfSourceRepository,
HarvestSettingsRepository harvestSettingsRepository) {
this.fylkeHarvester = fylkeHarvester;
this.fylkeRepository = fylkeRepository;
this.harvestSettingsRepository = harvestSettingsRepository;
this.rdfSourceRepository = rdfSourceRepository;
}

public boolean firstTime() {
return fylkeRepository.count() == 0;
}

public String getRdf(RDFFormat rdfFormat) {
String source = rdfSourceRepository.findById(rdfSourceID).orElse(new RDFSource()).getTurtle();
if (rdfFormat == RDFFormat.TURTLE) {
return source;
} else {
return RDFUtils.modelToResponse(ModelFactory.createDefaultModel().read(source, Lang.TURTLE.getName()), rdfFormat);
}
}

private void addFylkeToModel(Fylke fylke, Model model) {
Resource resource = model.createResource(fylke.getUri());
resource.addProperty(RDF.type, DCTerms.Location);
if (fylke.fylkesnavn != null) {
resource.addProperty(DCTerms.title, fylke.fylkesnavn);
}
if (fylke.fylkesnummer != null) {
resource.addProperty(DCTerms.identifier, fylke.fylkesnummer);
}
}

@Transactional
public void harvestAndSave() {
try {
Expand All @@ -53,6 +86,15 @@ public void harvestAndSave() {
log.info("Harvest and saving {} GeoNorge fylker", counter.get());
fylkeRepository.saveAll(iterable);

Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("dct", DCTerms.NS);
iterable.forEach(item -> addFylkeToModel(item, model));

RDFSource rdfSource = new RDFSource();
rdfSource.setId(rdfSourceID);
rdfSource.setTurtle(RDFUtils.modelToResponse(model, RDFFormat.TURTLE));
rdfSourceRepository.save(rdfSource);

settings.setLatestHarvestDate(LocalDateTime.now());
harvestSettingsRepository.save(settings);
} catch(Exception e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.fdk.referencedata.geonorge.administrativeenheter.kommune;

import lombok.extern.slf4j.Slf4j;
import org.apache.jena.riot.RDFFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -41,4 +42,10 @@ public ResponseEntity<Void> updateKommuner() {
public ResponseEntity<Kommune> getKommune(@PathVariable("kommunenummer") final String kommunenummer) {
return ResponseEntity.of(kommuneRepository.findByKommunenummer(kommunenummer));
}

@CrossOrigin
@GetMapping(produces = "text/turtle")
public ResponseEntity<String> getKommunerRDF() {
return ResponseEntity.ok(kommuneService.getRdf(RDFFormat.TURTLE));
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
package no.fdk.referencedata.geonorge.administrativeenheter.kommune;

import lombok.extern.slf4j.Slf4j;
import no.fdk.referencedata.rdf.RDFSource;
import no.fdk.referencedata.rdf.RDFSourceRepository;
import no.fdk.referencedata.rdf.RDFUtils;
import no.fdk.referencedata.settings.HarvestSettings;
import no.fdk.referencedata.settings.HarvestSettingsRepository;
import no.fdk.referencedata.settings.Settings;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.vocabulary.DCTerms;
import org.apache.jena.vocabulary.RDF;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -14,26 +24,54 @@
@Service
@Slf4j
public class KommuneService {
private final String rdfSourceID = "kommune-source";

private final KommuneHarvester kommuneHarvester;

private final KommuneRepository kommuneRepository;

private final HarvestSettingsRepository harvestSettingsRepository;

private final RDFSourceRepository rdfSourceRepository;

@Autowired
public KommuneService(KommuneHarvester kommuneHarvester,
KommuneRepository kommuneRepository,
RDFSourceRepository rdfSourceRepository,
HarvestSettingsRepository harvestSettingsRepository) {
this.kommuneHarvester = kommuneHarvester;
this.kommuneRepository = kommuneRepository;
this.harvestSettingsRepository = harvestSettingsRepository;
this.rdfSourceRepository = rdfSourceRepository;
}

public boolean firstTime() {
return kommuneRepository.count() == 0;
}

public String getRdf(RDFFormat rdfFormat) {
String source = rdfSourceRepository.findById(rdfSourceID).orElse(new RDFSource()).getTurtle();
if (rdfFormat == RDFFormat.TURTLE) {
return source;
} else {
return RDFUtils.modelToResponse(ModelFactory.createDefaultModel().read(source, Lang.TURTLE.getName()), rdfFormat);
}
}

private void addKommuneToModel(Kommune kommune, Model model) {
Resource resource = model.createResource(kommune.getUri());
resource.addProperty(RDF.type, DCTerms.Location);
if (kommune.kommunenavn != null) {
resource.addProperty(DCTerms.title, kommune.kommunenavn);
}
if (kommune.kommunenavnNorsk != null) {
resource.addProperty(DCTerms.title, kommune.kommunenavnNorsk, "nb");
}
if (kommune.kommunenummer != null) {
resource.addProperty(DCTerms.identifier, kommune.kommunenummer);
}
}

@Transactional
public void harvestAndSave() {
try {
Expand All @@ -51,6 +89,15 @@ public void harvestAndSave() {
log.info("Harvest and saving {} GeoNorge kommuner", counter.get());
kommuneRepository.saveAll(iterable);

Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("dct", DCTerms.NS);
iterable.forEach(item -> addKommuneToModel(item, model));

RDFSource rdfSource = new RDFSource();
rdfSource.setId(rdfSourceID);
rdfSource.setTurtle(RDFUtils.modelToResponse(model, RDFFormat.TURTLE));
rdfSourceRepository.save(rdfSource);

settings.setLatestHarvestDate(LocalDateTime.now());
harvestSettingsRepository.save(settings);
} catch(Exception e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.fdk.referencedata.geonorge.administrativeenheter.nasjon;

import lombok.extern.slf4j.Slf4j;
import org.apache.jena.riot.RDFFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -30,4 +31,10 @@ public ResponseEntity<Nasjoner> getNasjoner() {
public ResponseEntity<Nasjon> getNasjon(@PathVariable("nasjonsnummer") String nasjonsnummer) {
return ResponseEntity.of(nasjonService.getNasjonByNasjonsnummer(nasjonsnummer));
}

@CrossOrigin
@GetMapping(produces = "text/turtle")
public ResponseEntity<String> getNasjonerRDF() {
return ResponseEntity.ok(nasjonService.getRdf(RDFFormat.TURTLE));
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package no.fdk.referencedata.geonorge.administrativeenheter.nasjon;

import lombok.extern.slf4j.Slf4j;
import no.fdk.referencedata.geonorge.administrativeenheter.kommune.Kommune;
import no.fdk.referencedata.geonorge.administrativeenheter.kommune.KommuneHarvester;
import no.fdk.referencedata.geonorge.administrativeenheter.kommune.KommuneRepository;
import no.fdk.referencedata.settings.HarvestSettings;
import no.fdk.referencedata.settings.HarvestSettingsRepository;
import no.fdk.referencedata.settings.Settings;
import org.springframework.beans.factory.annotation.Autowired;
import no.fdk.referencedata.rdf.RDFUtils;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.vocabulary.DCTerms;
import org.apache.jena.vocabulary.RDF;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;

@Service
@Slf4j
Expand All @@ -34,4 +32,14 @@ public Optional<Nasjon> getNasjonByNasjonsnummer(String nasjonsnummer) {
.filter(nasjon -> nasjon.getNasjonsnummer().equals(nasjonsnummer))
.findFirst();
}

public String getRdf(RDFFormat rdfFormat) {
Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("dct", DCTerms.NS);
Resource norge = model.createResource(NORGE.uri);
norge.addProperty(RDF.type, DCTerms.Location);
norge.addProperty(DCTerms.title, NORGE.nasjonsnavn);
norge.addProperty(DCTerms.identifier, NORGE.nasjonsnummer);
return RDFUtils.modelToResponse(model, rdfFormat);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@

import no.fdk.referencedata.LocalHarvesterConfiguration;
import no.fdk.referencedata.container.AbstractContainerTest;
import no.fdk.referencedata.rdf.RDFSourceRepository;
import no.fdk.referencedata.settings.HarvestSettings;
import no.fdk.referencedata.settings.HarvestSettingsRepository;
import no.fdk.referencedata.settings.Settings;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -40,6 +45,9 @@ public class FylkeControllerIntegrationTest extends AbstractContainerTest {
@Autowired
private HarvestSettingsRepository harvestSettingsRepository;

@Autowired
private RDFSourceRepository rdfSourceRepository;

@Autowired
private TestRestTemplate restTemplate;

Expand All @@ -54,6 +62,7 @@ public void setup() {
FylkeService fylkeService = new FylkeService(
new LocalFylkeHarvester(wiremockHost, wiremockPort),
fylkeRepository,
rdfSourceRepository,
harvestSettingsRepository);

fylkeService.harvestAndSave();
Expand Down Expand Up @@ -124,4 +133,12 @@ public void test_if_post_fylker_executes_an_update() {
assertEquals("0", harvestSettingsAfter.getLatestVersion());
assertTrue(harvestSettingsAfter.getLatestHarvestDate().isAfter(harvestSettingsBefore.getLatestHarvestDate()));
}

@Test
public void test_fylker_rdf_response() {
Model rdfResponse = RDFDataMgr.loadModel("http://localhost:" + port + "/geonorge/administrative-enheter/fylker", Lang.TURTLE);
Model expectedResponse = ModelFactory.createDefaultModel().read(String.valueOf(FylkeControllerIntegrationTest.class.getClassLoader().getResource("fylker.ttl")));

assertTrue(rdfResponse.isIsomorphicWith(expectedResponse));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import no.fdk.referencedata.geonorge.administrativeenheter.fylke.Fylke;
import no.fdk.referencedata.geonorge.administrativeenheter.fylke.FylkeRepository;
import no.fdk.referencedata.geonorge.administrativeenheter.fylke.FylkeService;
import no.fdk.referencedata.rdf.RDFSourceRepository;
import no.fdk.referencedata.settings.HarvestSettingsRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -16,6 +17,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyIterable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

Expand All @@ -30,6 +32,8 @@ public class FylkeServiceIntegrationTest extends AbstractContainerTest {
@Autowired
private HarvestSettingsRepository harvestSettingsRepository;

private final RDFSourceRepository rdfSourceRepository = mock(RDFSourceRepository.class);

@Value("${wiremock.host}")
private String wiremockHost;

Expand All @@ -41,6 +45,7 @@ public void test_if_harvest_persists_fylker() {
FylkeService fylkeService = new FylkeService(
new LocalFylkeHarvester(wiremockHost, wiremockPort),
fylkeRepository,
rdfSourceRepository,
harvestSettingsRepository);

fylkeService.harvestAndSave();
Expand Down Expand Up @@ -75,6 +80,7 @@ public void test_if_harvest_rollsback_transaction_when_save_fails() {
FylkeService fylkeService = new FylkeService(
new LocalFylkeHarvester(wiremockHost, wiremockPort),
fylkeRepositorySpy,
rdfSourceRepository,
harvestSettingsRepository);

assertEquals(count, fylkeRepositorySpy.count());
Expand Down
Loading

0 comments on commit 005f5a6

Please sign in to comment.