package org.argeo.app.core; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import org.argeo.app.api.Term; import org.argeo.app.api.Typology; import org.argeo.jcr.Jcr; /** A typology. Helper to optimise {@link SuiteTermsManager} implementation. */ class SuiteTypology implements Typology { private final String name; private final Node node; private boolean isFlat = true; private final List subTerms = new ArrayList<>(); public SuiteTypology(Node node) { this.node = node; this.name = Jcr.getName(this.node); } @Override public String getId() { return name; } public String getName() { return name; } public Node getNode() { return node; } void markNotFlat() { if (isFlat) isFlat = false; } @Override public boolean isFlat() { return isFlat; } @Override public List getSubTerms() { return subTerms; } public List getAllTerms() { if (isFlat) return subTerms; else { List terms = new ArrayList<>(); for (SuiteTerm subTerm : subTerms) { terms.add(subTerm); collectSubTerms(terms, subTerm); } return terms; } } public Term findTermByName(String name) { List collected = new ArrayList<>(); for (SuiteTerm subTerm : subTerms) { collectTermsByName(subTerm, name, collected); } if (collected.isEmpty()) return null; if (collected.size() == 1) return collected.get(0); throw new IllegalArgumentException( "There are " + collected.size() + " terms with name " + name + " in typology " + getId()); } private void collectTermsByName(SuiteTerm term, String name, List collected) { if (term.getName().equals(name)) { collected.add(term); } for (SuiteTerm subTerm : term.getSubTerms()) { collectTermsByName(subTerm, name, collected); } } private void collectSubTerms(List terms, SuiteTerm term) { for (SuiteTerm subTerm : term.getSubTerms()) { terms.add(subTerm); collectSubTerms(terms, subTerm); } } }