org.openehr.adl.am.AmObjectFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.openehr.adl.am.AmObjectFactory.java

Source

/*
 * ADL2-core
 * Copyright (c) 2013-2014 Marand d.o.o. (www.marand.com)
 *
 * This file is part of ADL2-core.
 *
 * ADL2-core is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.openehr.adl.am;

import com.google.common.base.CaseFormat;
import org.openehr.rm.RmObject;
import org.openehr.adl.util.AdlUtils;
import org.openehr.adl.rm.RmTypes;
import org.apache.commons.lang.ObjectUtils;
import org.openehr.jaxb.am.*;
import org.openehr.jaxb.rm.*;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import static org.openehr.adl.util.AdlUtils.doubleToFloat;
import static org.openehr.adl.util.AdlUtils.emptyIfNull;

/**
 * @author markopi
 */
public class AmObjectFactory {
    private static final String AM_PACKAGE_NAME = Archetype.class.getPackage().getName();
    private static final String RM_PACKAGE_NAME = Composition.class.getPackage().getName();

    public static CComplexObject newCComplexObject(String type, MultiplicityInterval occurrences, String nodeID,
            List<CAttribute> attributes) {
        CComplexObject result = new CComplexObject();
        result.setNodeId(nodeID);
        result.setOccurrences(occurrences);
        result.setRmTypeName(type);
        result.getAttributes().addAll(emptyIfNull(attributes));
        return result;
    }

    public static ConstraintRef newConstraintRef(String rmType, MultiplicityInterval occurrences, String nodeId,
            String reference) {
        ConstraintRef result = new ConstraintRef();
        result.setRmTypeName(rmType);
        result.setOccurrences(occurrences);
        result.setNodeId(nodeId);
        result.setReference(reference);
        return result;
    }

    public static ArchetypeInternalRef newArchetypeInternalRef(String rmType, MultiplicityInterval occurrences,
            String nodeId, String target) {
        ArchetypeInternalRef result = new ArchetypeInternalRef();
        result.setRmTypeName(rmType);
        result.setOccurrences(occurrences);
        result.setNodeId(nodeId);
        result.setTargetPath(target);
        return result;
    }

    public static ArchetypeSlot newArchetypeSlot(String rmType, MultiplicityInterval occurrences, String nodeID,
            Set<Assertion> includes, Set<Assertion> excludes) {
        ArchetypeSlot result = new ArchetypeSlot();
        result.setNodeId(nodeID);
        result.setOccurrences(occurrences);
        result.setRmTypeName(rmType);
        result.getIncludes().addAll(emptyIfNull(includes));
        result.getExcludes().addAll(emptyIfNull(excludes));
        return result;
    }

    public static CAttribute newCAttribute(String name) {
        return newCAttribute(name, null, null, null);
    }

    public static CAttribute newCAttribute(String name, MultiplicityInterval existence, Cardinality cardinality,
            List<CObject> children) {
        CAttribute result = new CAttribute();
        result.setRmAttributeName(name);
        result.setExistence(existence);
        result.setCardinality(cardinality);
        result.getChildren().addAll(emptyIfNull(children));
        return result;
    }

    public static CodeDefinitionSet newCodeDefinitionSet(String language, List<ArchetypeTerm> terms) {
        CodeDefinitionSet result = new CodeDefinitionSet();
        result.setLanguage(language);
        result.getItems().addAll(emptyIfNull(terms));
        return result;
    }

    public static TermBindingSet newTermBindingSet(String terminology, List<TermBindingItem> bindings) {
        TermBindingSet result = new TermBindingSet();
        result.setTerminology(terminology);
        result.getItems().addAll(emptyIfNull(bindings));
        return result;
    }

    public static TermBindingItem newTermBindingItem(String code, String value) {
        TermBindingItem result = new TermBindingItem();
        result.setCode(code);
        result.setValue(value);
        return result;
    }

    public static ConstraintBindingSet newConstraintBindingSet(String terminology,
            List<ConstraintBindingItem> bindings) {
        ConstraintBindingSet result = new ConstraintBindingSet();
        result.setTerminology(terminology);
        result.getItems().addAll(emptyIfNull(bindings));
        return result;
    }

    public static ConstraintBindingItem newConstraintBindingItem(String code, String value) {
        ConstraintBindingItem result = new ConstraintBindingItem();
        result.setCode(code);
        result.setValue(value);
        return result;
    }

    public static Assertion newAssertion(String tag, ExprItem expression, String stringExpression,
            List<AssertionVariable> variables) {
        Assertion result = new Assertion();
        result.setTag(tag);
        result.setExpression(expression);
        result.setStringExpression(stringExpression);
        result.getVariables().addAll(emptyIfNull(variables));
        return result;
    }

    public static Cardinality newCardinality(boolean ordered, boolean unique, MultiplicityInterval interval) {
        Cardinality result = new Cardinality();
        result.setIsOrdered(ordered);
        result.setIsUnique(unique);
        result.setInterval(interval);
        return result;
    }

    public static CDvOrdinal newCDvOrdinal(MultiplicityInterval occurrences, String nodeId, List<DvOrdinal> list,
            DvOrdinal defaultValue, DvOrdinal assumedValue) {
        CDvOrdinal result = new CDvOrdinal();
        result.setRmTypeName(AdlUtils.getRmTypeName(DvOrdinal.class));
        result.setOccurrences(occurrences);
        result.setNodeId(nodeId);
        result.getList().addAll(emptyIfNull(list));
        result.setAssumedValue(assumedValue);

        return result;
    }

    public static CCodePhrase newCCodePhrase(MultiplicityInterval occurrences, String nodeId,
            TerminologyId terminologyId, List<String> codeList, CodePhrase defaultValue, CodePhrase assumedValue) {
        CCodePhrase result = new CCodePhrase();
        result.setOccurrences(occurrences);
        result.setRmTypeName(AdlUtils.getRmTypeName(CodePhrase.class));
        result.setNodeId(nodeId);
        result.setTerminologyId(terminologyId);
        result.getCodeList().addAll(emptyIfNull(codeList));
        result.setAssumedValue(assumedValue);
        result.setDefaultValue(defaultValue);
        return result;
    }

    public static CDvQuantity newCDvQuantity(MultiplicityInterval occurrences, String nodeId,
            List<CQuantityItem> list, CodePhrase property, DvQuantity defaultValue, DvQuantity assumedValue) {
        CDvQuantity result = new CDvQuantity();
        result.setOccurrences(occurrences);
        result.setRmTypeName(AdlUtils.getRmTypeName(DvQuantity.class));
        result.setNodeId(nodeId);
        result.getList().addAll(emptyIfNull(list));
        result.setProperty(property);
        result.setAssumedValue(assumedValue);
        result.setDefaultValue(defaultValue);
        return result;
    }

    public static CQuantityItem newCQuantityItem(IntervalOfReal magnitude, IntervalOfInteger precision,
            String units) {
        CQuantityItem result = new CQuantityItem();
        result.setUnits(units);
        result.setMagnitude(magnitude);
        result.setPrecision(precision);
        return result;
    }

    public static CInteger newCInteger(IntervalOfInteger interval, @Nullable Collection<Integer> list,
            @Nullable Integer assumedValue) {
        CInteger result = new CInteger();
        result.setAssumedValue(assumedValue);
        result.setRange(interval);
        result.getList().addAll(emptyIfNull(list));
        return result;
    }

    public static CReal newCReal(IntervalOfReal interval, Collection<Double> list, Double assumedValue) {
        List<Float> floatList = null;
        if (list != null) {
            floatList = new ArrayList<>(list.size());
            for (Double d : list) {
                floatList.add(doubleToFloat(d));
            }
        }
        return newCReal(interval, floatList, doubleToFloat(assumedValue));
    }

    public static CReal newCReal(IntervalOfReal interval, @Nullable Collection<Float> list,
            @Nullable Float assumedValue) {
        CReal result = new CReal();
        result.setAssumedValue(assumedValue);
        result.setRange(interval);
        result.getList().addAll(emptyIfNull(list));
        return result;

    }

    public static CDate newCDate(String pattern, IntervalOfDate interval, List<DvDate> list, String assumed) {
        CDate result = new CDate();
        result.setPattern(pattern);
        result.setRange(interval);
        result.setAssumedValue(assumed);
        return result;
    }

    public static CTime newCTime(String pattern, IntervalOfTime interval, List<DvTime> list, String assumed) {
        CTime result = new CTime();
        result.setPattern(pattern);
        result.setRange(interval);
        result.setAssumedValue(assumed);
        return result;
    }

    public static CDateTime newCDateTime(String pattern, IntervalOfDateTime interval, List<DvDateTime> list,
            String assumed) {
        CDateTime result = new CDateTime();
        result.setPattern(pattern);
        result.setRange(interval);
        result.setAssumedValue(assumed);
        return result;
    }

    public static CDuration newCDuration(String pattern, DvDuration value, IntervalOfDuration interval,
            String assumed) {
        CDuration result = new CDuration();
        result.setPattern(pattern);
        result.setRange(interval);
        result.setAssumedValue(assumed);
        return result;
    }

    public static CString newCString(String pattern, List<String> list, String assumed) {
        CString result = new CString();
        result.setPattern(pattern);
        result.getList().addAll(emptyIfNull(list));
        result.setAssumedValue(assumed);
        return result;
    }

    public static CBoolean newCBoolean(boolean trueValid, boolean falseValid, Boolean assumedValue) {
        CBoolean result = new CBoolean();
        result.setTrueValid(trueValid);
        result.setFalseValid(falseValid);
        result.setAssumedValue(assumedValue);
        return result;
    }

    public static ExprLeaf newExprPathConstant(String path) {
        return newExprConstant(RmTypes.RM, path);
    }

    public static ExprLeaf newExprConstant(String rmType, Object value) {
        return newExprLeaf(rmType, RmTypes.ReferenceType.CONSTANT, value);
    }

    public static ExprLeaf newExprConstraint(String rmType, Object value) {
        return newExprLeaf(rmType, RmTypes.ReferenceType.CONSTRAINT, value);
    }

    public static ExprLeaf newExprAttribute(String rmType, Object value) {
        return newExprLeaf(rmType, RmTypes.ReferenceType.ATTRIBUTE, value);
    }

    public static ExprLeaf newExprLeaf(String type, RmTypes.ReferenceType referenceType, Object value) {
        ExprLeaf result = new ExprLeaf();
        result.setType(type);
        result.setReferenceType(ObjectUtils.toString(referenceType));
        result.setItem(value);
        return result;
    }

    public static ExprUnaryOperator newExprUnaryOperator(String type, OperatorKind op, boolean precedenceOverridden,
            ExprItem operand) {
        ExprUnaryOperator result = new ExprUnaryOperator();
        result.setType(type);
        result.setOperator(BigInteger.valueOf(op.getValue()));
        result.setPrecedenceOverridden(precedenceOverridden);
        result.setOperand(operand);
        return result;
    }

    public static ExprBinaryOperator newExprBinaryOperator(String type, OperatorKind op,
            boolean precedenceOverridden, ExprItem left, ExprItem right) {
        ExprBinaryOperator result = new ExprBinaryOperator();
        result.setType(type);
        result.setOperator(BigInteger.valueOf(op.getValue()));
        result.setPrecedenceOverridden(precedenceOverridden);
        result.setLeftOperand(left);
        result.setRightOperand(right);
        return result;
    }

    public static SiblingOrder newSiblingOrder(boolean isBefore, String siblingNodeId) {
        SiblingOrder result = new SiblingOrder();
        result.setIsBefore(isBefore);
        result.setSiblingNodeId(siblingNodeId);
        return result;
    }

    public static Class<? extends RmObject> getRmClass(@Nonnull String rmTypeName) throws ClassNotFoundException {
        int genericsTypeIndex = rmTypeName.indexOf('<');
        String name = genericsTypeIndex == -1 ? rmTypeName : rmTypeName.substring(0, genericsTypeIndex);
        String className = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name);
        //noinspection unchecked
        return (Class<RmObject>) Class.forName(RM_PACKAGE_NAME + '.' + className);
    }

}