blob: 86d11c5663de875ca850f93b439a616c41e80cd5 [file] [log] [blame]
margaretha563aabe2018-09-13 20:39:45 +02001package de.ids_mannheim.korap.rewrite;
2
3import org.springframework.beans.factory.annotation.Autowired;
4import org.springframework.stereotype.Component;
5
6import com.fasterxml.jackson.databind.JsonNode;
7import com.fasterxml.jackson.databind.node.ObjectNode;
8
9import de.ids_mannheim.korap.config.KustvaktConfiguration;
10import de.ids_mannheim.korap.entity.VirtualCorpus;
11import de.ids_mannheim.korap.exceptions.KustvaktException;
12import de.ids_mannheim.korap.resource.rewrite.KoralNode;
13import de.ids_mannheim.korap.resource.rewrite.KoralNode.RewriteIdentifier;
14import de.ids_mannheim.korap.resource.rewrite.RewriteTask;
15import de.ids_mannheim.korap.service.VirtualCorpusService;
16import de.ids_mannheim.korap.user.User;
margaretha9e53bb22018-09-14 19:39:15 +020017import de.ids_mannheim.korap.util.StatusCodes;
margaretha563aabe2018-09-13 20:39:45 +020018import de.ids_mannheim.korap.utils.JsonUtils;
19
20@Component
21public class VirtualCorpusRewrite implements RewriteTask.RewriteQuery {
22
23 @Autowired
24 private VirtualCorpusService vcService;
25
26 @Override
27 public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
28 User user) throws KustvaktException {
29 if (node.has("collection")) {
30 findVCRef(user.getUsername(), node.at("/collection"));
31 }
32 return node.rawNode();
33 }
34
35 private void findVCRef (String username, KoralNode koralNode)
36 throws KustvaktException {
37 if (koralNode.has("@type")
38 && koralNode.get("@type").equals("koral:docGroupRef")) {
39 if (!koralNode.has("ref")) {
margaretha9e53bb22018-09-14 19:39:15 +020040 throw new KustvaktException(StatusCodes.MISSING_VC_REFERENCE,
41 "ref is not found");
margaretha563aabe2018-09-13 20:39:45 +020042 }
43 else {
44 String vcName = koralNode.get("ref");
margaretha9e53bb22018-09-14 19:39:15 +020045 String vcOwner = "system";
46 if (vcName.contains("/")) {
47 String[] names = vcName.split("/");
48 if (names.length == 2) {
49 vcOwner = names[0];
50 vcName = names[1];
51 }
52 }
margaretha563aabe2018-09-13 20:39:45 +020053
54 VirtualCorpus vc =
margaretha9e53bb22018-09-14 19:39:15 +020055 vcService.searchVCByName(username, vcName, vcOwner);
margaretha563aabe2018-09-13 20:39:45 +020056 if (!vc.isCached()) {
margaretha9e53bb22018-09-14 19:39:15 +020057 rewriteVC(vc, koralNode);
margaretha563aabe2018-09-13 20:39:45 +020058 }
59 }
60
61 }
62 else if (koralNode.has("operands")) {
63 KoralNode operands = koralNode.at("/operands");
64
65 for (int i = 0; i < operands.size(); i++) {
66 KoralNode operand = operands.get(i);
67 findVCRef(username, operand);
68 operand.buildRewrites();
69 }
70
71 }
72 }
margaretha9e53bb22018-09-14 19:39:15 +020073
74 private void rewriteVC (VirtualCorpus vc, KoralNode koralNode)
75 throws KustvaktException {
76 String koralQuery = vc.getKoralQuery();
77 JsonNode kq = JsonUtils.readTree(koralQuery).at("/collection");
78 JsonNode jsonNode = koralNode.rawNode();
79 // rewrite
80 koralNode.remove("@type",
81 new RewriteIdentifier("@type", jsonNode.at("/@type").asText()));
82 koralNode.remove("ref",
83 new RewriteIdentifier("ref", jsonNode.at("/ref").asText()));
84 koralNode.setAll((ObjectNode) kq);
85 }
margaretha563aabe2018-09-13 20:39:45 +020086}