]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.core/src/org/argeo/app/core/SuiteTermsManager.java
Adapt to changes in Argeo Commons.
[gpl/argeo-suite.git] / org.argeo.app.core / src / org / argeo / app / core / SuiteTermsManager.java
1 package org.argeo.app.core;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import javax.jcr.Node;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12
13 import org.argeo.api.cms.CmsConstants;
14 import org.argeo.app.api.EntityNames;
15 import org.argeo.app.api.EntityType;
16 import org.argeo.app.api.Term;
17 import org.argeo.app.api.TermsManager;
18 import org.argeo.cms.jcr.CmsJcrUtils;
19 import org.argeo.jcr.Jcr;
20 import org.argeo.jcr.JcrException;
21
22 /** Argeo Suite implementation of terms manager. */
23 public class SuiteTermsManager implements TermsManager {
24 private final Map<String, SuiteTerm> terms = new HashMap<>();
25 private final Map<String, SuiteTypology> typologies = new HashMap<>();
26
27 // JCR
28 private Repository repository;
29 private Session adminSession;
30
31 public void init() {
32 adminSession = CmsJcrUtils.openDataAdminSession(repository, CmsConstants.SYS_WORKSPACE);
33 }
34
35 @Override
36 public List<Term> listAllTerms(String typology) {
37 List<Term> res = new ArrayList<>();
38 SuiteTypology t = getTypology(typology);
39 for (SuiteTerm term : t.getAllTerms()) {
40 res.add(term);
41 }
42 return res;
43 }
44
45 @Override
46 public SuiteTerm getTerm(String termId) {
47 return terms.get(termId);
48 }
49
50 @Override
51 public SuiteTypology getTypology(String typology) {
52 SuiteTypology t = typologies.get(typology);
53 if (t == null) {
54 Node termsNode = Jcr.getNode(adminSession, "SELECT * FROM [{0}] WHERE NAME()=\"{1}\"",
55 EntityType.terms.get(), typology);
56 if (termsNode == null)
57 throw new IllegalArgumentException("Typology " + typology + " not found.");
58 t = loadTypology(termsNode);
59 }
60 return t;
61 }
62
63 SuiteTypology loadTypology(Node termsNode) {
64 try {
65 SuiteTypology typology = new SuiteTypology(termsNode);
66 for (Node termNode : Jcr.iterate(termsNode.getNodes())) {
67 if (termNode.isNodeType(EntityType.term.get())) {
68 SuiteTerm term = loadTerm(typology, termNode, null);
69 if (!term.getSubTerms().isEmpty())
70 typology.markNotFlat();
71 typology.getSubTerms().add(term);
72 }
73 }
74 typologies.put(typology.getName(), typology);
75 return typology;
76 } catch (RepositoryException e) {
77 throw new JcrException("Cannot load typology from " + termsNode, e);
78 }
79 }
80
81 SuiteTerm loadTerm(SuiteTypology typology, Node termNode, SuiteTerm parentTerm) throws RepositoryException {
82 String name = termNode.getProperty(EntityNames.NAME).getString();
83 String relativePath = parentTerm == null ? name : parentTerm.getRelativePath() + '/' + name;
84 SuiteTerm term = new SuiteTerm(typology, relativePath, parentTerm);
85 terms.put(term.getId(), term);
86 for (Node subTermNode : Jcr.iterate(termNode.getNodes())) {
87 if (termNode.isNodeType(EntityType.term.get())) {
88 SuiteTerm subTerm = loadTerm(typology, subTermNode, term);
89 term.getSubTerms().add(subTerm);
90 }
91 }
92 return term;
93 }
94
95 public void destroy() {
96 Jcr.logout(adminSession);
97 }
98
99 public void setRepository(Repository repository) {
100 this.repository = repository;
101 }
102
103 }