001package org.hl7.fhir.r5.utils;
002
003import org.hl7.fhir.r5.model.Base;
004import org.hl7.fhir.r5.model.Element;
005import org.hl7.fhir.r5.model.Property;
006import org.hl7.fhir.r5.model.Resource;
007import org.hl7.fhir.r5.utils.ElementVisitor.ElementVisitorInstruction;
008import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
009
010@MarkedToMoveToAdjunctPackage
011public class ElementVisitor {
012
013  public enum ElementVisitorInstruction {
014    VISIT_CHILDREN, NO_VISIT_CHILDREN;
015  }
016
017  public interface IElementVisitor {
018    public ElementVisitorInstruction visit(Object context, Resource resource);
019    public ElementVisitorInstruction visit(Object context, Element element);
020  }
021
022  private IElementVisitor visitor;
023  
024  public ElementVisitor(IElementVisitor visitor) {
025    this.visitor = visitor;
026  }
027
028  private void visitBase(Object context, Base base) {
029    for (Property p : base.children()) {
030      if (p.hasValues()) {
031        for (Base b : p.getValues()) {
032          if (b instanceof Resource) {
033            visit(context, (Resource) b);
034          } else {
035            visit(context, (Element) b);
036          }
037        }
038      }
039    }
040  }
041
042  public void visit(Object context, Resource res) {
043    ElementVisitorInstruction c = visitor.visit(context, res);
044    if (c == ElementVisitorInstruction.VISIT_CHILDREN) {
045      visitBase(context, res);
046    }
047  }
048
049  public void visit(Object context, Element e) {
050    ElementVisitorInstruction c = visitor.visit(context, e);
051    if (c == ElementVisitorInstruction.VISIT_CHILDREN) {
052      visitBase(context, e);
053    }
054  }
055
056}