
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}