OntologyAlgorithm { public static Set<TermId> getDescendents( Ontology ontology, TermId parentTermId) { ImmutableSet.Builder<TermId> descset = new ImmutableSet.Builder<>(); Deque<TermId> stack = new ArrayDeque<>(); stack.push(parentTermId); while (!stack.isEmpty()) { TermId tid = stack.pop(); descset.add(tid); Set<TermId> directChildrenSet = getChildTerms(ontology, tid, false); directChildrenSet.forEach(stack::push); } return descset.build(); } private  OntologyAlgorithm(); static boolean existsPath(
      Ontology ontology,
      final TermId sourceID,
      TermId destID); static Set<TermId> getChildTerms(
    Ontology ontology, TermId parentTermId); static Set<TermId> getChildTerms(
      Ontology ontology,
      TermId parentTermId,
      boolean includeOriginalTerm); static Set<TermId> getChildTerms(
    Ontology ontology, Set<TermId> parentTermIdSet); static Set<TermId> getParentTerms(
    Ontology ontology, Set<TermId> childTermIdSet); static Set<TermId> getParentTerms(
      Ontology ontology,
      Set<TermId> childTermIdSet,
      boolean includeOriginalTerm); static Set<TermId> getDescendents(
    Ontology ontology, TermId parentTermId); static Set<TermId> getParentTerms(
      Ontology ontology,
      TermId childTermId,
      boolean includeOriginalTerm); static Set<TermId> getAncestorTerms(
      Ontology ontology,
      TermId rootTerm,
      Set<TermId> children,
      boolean includeOriginalTerm); static Set<TermId> getAncestorTerms(
      Ontology ontology,
      TermId rootTerm,
      TermId child,
      boolean includeOriginalTerm); static Set<TermId> getAncestorTerms(
      Ontology ontology,
      Set<TermId> children,
      boolean includeOriginalTerm); static Set<TermId> getAncestorTerms(
      Ontology ontology,
      TermId child,
      boolean includeOriginalTerm); static Set<TermId> getParentTerms(
    Ontology ontology, TermId childTermId); static Set<TermId> getAncestorTerms(
    Ontology ontology, TermId childTermId); static boolean isSubclass(
    Ontology ontology, TermId source, TermId dest); static boolean termsAreSiblings(
    Ontology ontology, TermId t1, TermId t2); static boolean termsAreRelated(
    Ontology ontology, TermId t1, TermId t2); static boolean termsAreUnrelated(
    Ontology ontology, TermId t1, TermId t2);  }
@Test public void testGetDescendents() { Set<TermId> expected = ImmutableSet.of(id1, id2, id3, id4, id5); assertEquals(expected, getDescendents(ontology, id5)); }