package org.molgenis.fair.controller; import org.eclipse.rdf4j.model.Model; import org.molgenis.data.DataService; import org.molgenis.data.Entity; import org.molgenis.data.support.QueryImpl; import org.molgenis.security.core.runas.RunAsSystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import javax.servlet.http.HttpServletRequest; import static java.util.Objects.requireNonNull; import static org.molgenis.fair.controller.FairController.BASE_URI; import static org.molgenis.ui.converter.RDFMediaType.TEXT_TURTLE_VALUE; import static org.springframework.web.bind.annotation.RequestMethod.GET; /** * Serves metadata for the molgenis FAIR DataPoint. */ @Controller @RequestMapping(BASE_URI) public class FairController { static final String BASE_URI = "/fdp"; private final DataService dataService; private final EntityModelWriter entityModelWriter; @Autowired public FairController(DataService dataService, EntityModelWriter entityModelWriter) { this.dataService = requireNonNull(dataService); this.entityModelWriter = requireNonNull(entityModelWriter); } private static String getBaseUri(HttpServletRequest request) { String apiUrl; if (StringUtils.isEmpty(request.getHeader("X-Forwarded-Host"))) { apiUrl = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(BASE_URI).toUriString(); } else { String scheme = request.getHeader("X-Forwarded-Proto"); if (scheme == null) scheme = request.getScheme(); apiUrl = scheme + "://" + request.getHeader("X-Forwarded-Host") + BASE_URI; } return apiUrl; } @RequestMapping(method = GET, produces = TEXT_TURTLE_VALUE) @ResponseBody @RunAsSystem public Model getMetadata(HttpServletRequest request) { String subjectIRI = getBaseUri(request); Entity subjectEntity = dataService.findOne("fdp_Metadata", new QueryImpl<>()); return entityModelWriter.createRdfModel(subjectIRI, subjectEntity); } @RequestMapping(method = GET, produces = TEXT_TURTLE_VALUE, value = "/{catalogID}") @ResponseBody @RunAsSystem public Model getCatalog(@PathVariable("catalogID") String catalogID, HttpServletRequest request) { String subjectIRI = getBaseUri(request) + '/' + catalogID; Entity subjectEntity = dataService.findOneById("fdp_Catalog", catalogID); return entityModelWriter.createRdfModel(subjectIRI, subjectEntity); } @RequestMapping(method = GET, produces = TEXT_TURTLE_VALUE, value = "/{catalogID}/{datasetID}") @ResponseBody @RunAsSystem public Model getDataset(@PathVariable("catalogID") String catalogID, @PathVariable("datasetID") String datasetID, HttpServletRequest request) { String subjectIRI = getBaseUri(request) + '/' + catalogID + '/' + datasetID; Entity subjectEntity = dataService.findOneById("fdp_Dataset", datasetID); return entityModelWriter.createRdfModel(subjectIRI, subjectEntity); } @RequestMapping(method = GET, produces = TEXT_TURTLE_VALUE, value = "/{catalogID}/{datasetID}/{distributionID}") @ResponseBody @RunAsSystem public Model getDistribution(@PathVariable("catalogID") String catalogID, @PathVariable("datasetID") String datasetID, @PathVariable("distributionID") String distributionID, HttpServletRequest request) { String subjectIRI = getBaseUri(request) + '/' + catalogID + '/' + datasetID + '/' + distributionID; Entity subjectEntity = dataService.findOneById("fdp_Distribution", distributionID); return entityModelWriter.createRdfModel(subjectIRI, subjectEntity); } }