Introduce find term by name.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 7 Jul 2021 08:56:20 +0000 (10:56 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 7 Jul 2021 08:56:20 +0000 (10:56 +0200)
core/org.argeo.entity.api/src/org/argeo/entity/Typology.java
core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTypology.java

index 43431a0b43bed38f337dd56849c47b67e45aca9a..5be27e3e54b4b93340d9089f648e4232390c38b9 100644 (file)
@@ -11,4 +11,5 @@ public interface Typology {
 
        List<? extends Term> getSubTerms();
 
+       Term findTermByName(String name);
 }
index d192ed7aef14a77509d9651632d8bd82c4f7cdd8..d9d6673c55955e895d4b7c388f537a37e53629d5 100644 (file)
@@ -63,6 +63,28 @@ class SuiteTypology implements Typology {
                }
        }
 
+       public Term findTermByName(String name) {
+               List<SuiteTerm> 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<SuiteTerm> collected) {
+               if (term.getName().equals(name)) {
+                       collected.add(term);
+               }
+               for (SuiteTerm subTerm : term.getSubTerms()) {
+                       collectTermsByName(subTerm, name, collected);
+               }
+       }
+
        private void collectSubTerms(List<SuiteTerm> terms, SuiteTerm term) {
                for (SuiteTerm subTerm : term.getSubTerms()) {
                        terms.add(subTerm);