diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextImporter.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextImporter.java new file mode 100644 index 00000000..af922ae8 --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextImporter.java @@ -0,0 +1,125 @@ +package eu.dnetlib.is.context; + +import java.io.IOException; +import java.io.StringReader; + +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import eu.dnetlib.is.context.model.Category; +import eu.dnetlib.is.context.model.ConceptLevel0; +import eu.dnetlib.is.context.model.ConceptLevel1; +import eu.dnetlib.is.context.model.ConceptLevel2; +import eu.dnetlib.is.context.model.Context; +import eu.dnetlib.is.context.model.CtxInfo; +import eu.dnetlib.is.context.model.CtxInfoWithClaim; +import eu.dnetlib.is.context.model.Parameter; +import eu.dnetlib.is.context.model.repository.CategoryRepository; +import eu.dnetlib.is.context.model.repository.ConceptLevel0Repository; +import eu.dnetlib.is.context.model.repository.ConceptLevel1Repository; +import eu.dnetlib.is.context.model.repository.ConceptLevel2Repository; +import eu.dnetlib.is.context.model.repository.ContextRepository; + +@Component +public class ContextImporter { + + @Autowired + private ContextRepository contextRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private ConceptLevel0Repository conceptLevel0Repository; + @Autowired + private ConceptLevel1Repository conceptLevel1Repository; + @Autowired + private ConceptLevel2Repository conceptLevel2Repository; + + private static final Log log = LogFactory.getLog(ContextImporter.class); + + public void loadFromOldProfile(final String xml) throws DocumentException, IOException { + final SAXReader reader = new SAXReader(); + final Document doc = reader.read(new StringReader(xml)); + doc.selectNodes("//context").forEach(this::saveContext); + } + + private void saveContext(final Node node) { + final Context ctx = new Context(); + setCommonInfo(ctx, node); + ctx.setType(node.valueOf("@type")); + contextRepository.save(ctx); + + log.info("Saved context: " + ctx.getId()); + + node.selectNodes("./category").forEach(n -> saveCategory(n, ctx.getId())); + } + + private void saveCategory(final Node node, final String ctxId) { + final Category cat = new Category(); + setCommonInfo(cat, node); + cat.setContextId(ctxId); + + categoryRepository.save(cat); + + log.info("- Saved category: " + cat.getId()); + + node.selectNodes("./concept").forEach(n -> saveConceptLvl0(n, ctxId, cat.getId())); + } + + private void saveConceptLvl0(final Node node, final String ctxId, final String catId) { + final ConceptLevel0 c0 = new ConceptLevel0(); + setCommonInfo(c0, node); + c0.setContextId(ctxId); + c0.setCategoryId(catId); + conceptLevel0Repository.save(c0); + + log.info("-- Saved concept 0: " + c0.getId()); + + node.selectNodes("./concept").forEach(n -> saveConceptLvl1(n, ctxId, catId, c0.getId())); + } + + private void saveConceptLvl1(final Node node, final String ctxId, final String catId, final String c0) { + final ConceptLevel1 c1 = new ConceptLevel1(); + setCommonInfo(c1, node); + c1.setContextId(ctxId); + c1.setCategoryId(catId); + c1.setConceptLevel0Id(c0); + conceptLevel1Repository.save(c1); + + log.info("--- Saved concept 1: " + c1.getId()); + + node.selectNodes("./concept").forEach(n -> saveConceptLvl2(n, ctxId, catId, c0, c1.getId())); + } + + private void saveConceptLvl2(final Node node, final String ctxId, final String catId, final String c0, final String c1) { + final ConceptLevel2 c2 = new ConceptLevel2(); + setCommonInfo(c2, node); + c2.setContextId(ctxId); + c2.setCategoryId(catId); + c2.setConceptLevel0Id(c0); + c2.setConceptLevel1Id(c1); + conceptLevel2Repository.save(c2); + + log.info("---- Saved concept 2: " + c2.getId()); + } + + private void setCommonInfo(final CtxInfo o, final Node n) { + o.setId(n.valueOf("@id")); + o.setLabel(n.valueOf("@label")); + if (o instanceof CtxInfoWithClaim) { + ((CtxInfoWithClaim) o).setClaim(BooleanUtils.toBoolean(n.valueOf("@claim"))); + } + o.setParameters(n.selectNodes("./param") + .stream() + .map(np -> new Parameter(np.valueOf("@name"), np.getText())) + .sorted() + .toArray(Parameter[]::new)); + + } +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextRestController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextRestController.java new file mode 100644 index 00000000..2300605a --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextRestController.java @@ -0,0 +1,79 @@ +package eu.dnetlib.is.context; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.DocumentException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import eu.dnetlib.is.context.model.Category; +import eu.dnetlib.is.context.model.Context; +import eu.dnetlib.is.context.model.repository.CategoryRepository; +import eu.dnetlib.is.context.model.repository.ConceptLevel0Repository; +import eu.dnetlib.is.context.model.repository.ConceptLevel1Repository; +import eu.dnetlib.is.context.model.repository.ConceptLevel2Repository; +import eu.dnetlib.is.context.model.repository.ContextRepository; + +@RestController +@RequestMapping("/api/contexts") +public class ContextRestController { + + @Autowired + private ContextRepository contextRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private ConceptLevel0Repository conceptLevel0Repository; + @Autowired + private ConceptLevel1Repository conceptLevel1Repository; + @Autowired + private ConceptLevel2Repository conceptLevel2Repository; + + @Autowired + private ContextImporter contextImporter; + + private static final Log log = LogFactory.getLog(ContextRestController.class); + + @GetMapping("/") + public List listContexts() { + return contextRepository.findAll() + .stream() + .sorted((v1, v2) -> StringUtils.compareIgnoreCase(v1.getId(), v2.getId())) + .collect(Collectors.toList()); + } + + @GetMapping("/{ctxId}") + public Context getContext(@PathVariable final String ctxId) { + return contextRepository.getById(ctxId); + } + + @GetMapping("/{ctxId}/categories") + public Iterable listCategories(@PathVariable final String ctxId) { + return categoryRepository.findByContextIdOrderById(ctxId); + } + + @PostMapping(value = "/load", consumes = "text/plain") + public List loadFromOldProfile(final HttpServletRequest request) throws DocumentException, IOException { + + final String xml = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); + + contextImporter.loadFromOldProfile(xml); + + return Arrays.asList("Done."); + } + +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextUIController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextUIController.java new file mode 100644 index 00000000..1a788ae3 --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/context/ContextUIController.java @@ -0,0 +1,32 @@ +package eu.dnetlib.is.context; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import eu.dnetlib.is.context.model.Context; +import eu.dnetlib.is.context.model.repository.ContextRepository; + +@Controller +public class ContextUIController { + + @Autowired + private ContextRepository contextRepository; + + @GetMapping("/contextEditor") + public void vocabularyEditor(@RequestParam final String id, final ModelMap map) { + final Context ctx = contextRepository.getById(id); + + map.put("ctxId", ctx.getId()); + map.put("ctxLabel", ctx.getLabel()); + map.put("ctxType", ctx.getType()); + map.put("ctxParams", ctx.getParameters()); + } + + @GetMapping("/contexts") + public void contexts(final ModelMap map) { + + } +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/vocabulary/VocabularyRestController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/vocabulary/VocabularyRestController.java index 2e864885..9f6479a1 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/vocabulary/VocabularyRestController.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/vocabulary/VocabularyRestController.java @@ -77,8 +77,6 @@ public class VocabularyRestController extends AbstractDnetController { final String xml = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); - System.out.println(xml); - final SAXReader reader = new SAXReader(); final Document doc = reader.read(new StringReader(xml)); diff --git a/apps/dnet-is-application/src/main/resources/static/js/contexts.js b/apps/dnet-is-application/src/main/resources/static/js/contexts.js new file mode 100644 index 00000000..671d219c --- /dev/null +++ b/apps/dnet-is-application/src/main/resources/static/js/contexts.js @@ -0,0 +1,66 @@ +var app = angular.module('contextsApp', []); + +app.controller('contextsController', function($scope, $http) { + $scope.contexts = []; + $scope.tmpCtx = {}; + $scope.mode = ''; + + $scope.reload = function() { + $http.get('./api/contexts/?' + $.now()).then(function successCallback(res) { + $scope.contexts = res.data; + }, function errorCallback(res) { + alert('ERROR: ' + res.data.message); + }); + }; + + $scope.prepareNewCtx = function() { + $scope.mode = 'new'; + $scope.tmpCtx = { + 'id' : '', + 'label' : '', + 'type' : '', + 'parameters' : [] + }; + } + + $scope.prepareEditCtx = function(ctx) { + $scope.mode = 'edit'; + $scope.tmpCtx = angular.copy(ctx); + } + + $scope.saveContext = function(ctx) { + if ($scope.mode == 'new') { + var found = false; + + angular.forEach($scope.contexts, function(v) { + if (ctx.id == ctx.id) { found = true; }; + }); + + if (found) { + alert("Insertion failed: context already exists !"); + return; + } + } + + $http.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"; + $http.post('./api/contexts/?' + $.now(), ctx).then(function successCallback(res) { + $scope.contexts = res.data; + alert("Context saved"); + }, function errorCallback(res) { + alert('ERROR: ' + res.data.message); + }); + }; + + $scope.deleteContext = function(id) { + if (confirm("Are you sure ?")) { + $http.delete('./api/contexts/' + encodeURIComponent(id) + '?' + $.now()).then(function successCallback(res) { + $scope.contexts = res.data; + alert("Context deleted"); + }, function errorCallback(res) { + alert('ERROR: ' + res.data.message); + }); + } + }; + + $scope.reload(); +}); diff --git a/apps/dnet-is-application/src/main/resources/templates/contexts.html b/apps/dnet-is-application/src/main/resources/templates/contexts.html new file mode 100644 index 00000000..0cf8797d --- /dev/null +++ b/apps/dnet-is-application/src/main/resources/templates/contexts.html @@ -0,0 +1,126 @@ + + + + + + + + + +
+
+
+ +

+ +

+

+ +

+

+ Number of contexts: {{(contexts | filter:ctxFilter).length}} +

+ + + + + + + + + + + + + + + + + + + + +
IDLabelType
no contexts
{{ctx.id}}{{ctx.label}}{{ctx.type}} + + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html b/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html index b2d81062..fa8a8039 100644 --- a/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html +++ b/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html @@ -7,7 +7,7 @@