All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.fhir.model.util.CollectingVisitor Maven / Gradle / Ivy

/*
 * (C) Copyright IBM Corp. 2019
 *
 * SPDX-License-Identifier: Apache-2.0
 */

package com.ibm.fhir.model.util;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Year;
import java.time.YearMonth;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.ibm.fhir.model.visitor.DefaultVisitor;
import com.ibm.fhir.model.visitor.Visitable;

/**
 * Visits a Resource or Element and collects all of its descendants of a given type into a single list
 * 
 * @param  The type of object to collect
 * @implNote The order of the list will be consistent with a depth-first traversal of the visited object
 */
public class CollectingVisitor extends DefaultVisitor {
    protected final List result = new ArrayList<>();
    protected final Class type;

    public CollectingVisitor(Class type) {
        super(true);
        this.type = type;
    }

    protected void collect(Object object) {
        if (type.isInstance(object)) {
            result.add(type.cast(object));
        }
    }

    public List getResult() {
        return Collections.unmodifiableList(result);
    }

    @Override
    public boolean visit(java.lang.String elementName, int elementIndex, Visitable visitable) {
        collect(visitable);
        return true;
    }

    @Override
    public void visit(java.lang.String elementName, byte[] value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, BigDecimal value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, java.lang.Boolean value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, java.lang.Integer value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, LocalDate value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, LocalTime value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, java.lang.String value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, Year value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, YearMonth value) {
        collect(value);
    }

    @Override
    public void visit(java.lang.String elementName, ZonedDateTime value) {
        collect(value);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy