001package ca.uhn.fhir.context;
002
003/*
004 * #%L
005 * HAPI FHIR - Core Library
006 * %%
007 * Copyright (C) 2014 - 2017 University Health Network
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 * 
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 * 
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import java.util.List;
024import java.util.Map;
025import java.util.Set;
026import java.util.Map.Entry;
027
028import org.hl7.fhir.instance.model.api.IBase;
029import org.hl7.fhir.instance.model.api.IBaseReference;
030
031public abstract class BaseRuntimeChildDefinition {
032
033        public abstract IAccessor getAccessor();
034
035        public abstract BaseRuntimeElementDefinition<?> getChildByName(String theName);
036
037        public abstract BaseRuntimeElementDefinition<?> getChildElementDefinitionByDatatype(Class<? extends IBase> theType);
038
039        public abstract String getChildNameByDatatype(Class<? extends IBase> theDatatype);
040
041        public abstract String getElementName();
042
043        public String getExtensionUrl() {
044                return null;
045        }
046
047        public Object getInstanceConstructorArguments() {
048                return null;
049        }
050
051        public abstract int getMax();
052
053        public abstract int getMin();
054
055        public abstract IMutator getMutator();
056
057        public abstract Set<String> getValidChildNames();
058
059        public abstract boolean isSummary();
060
061        abstract void sealAndInitialize(FhirContext theContext, Map<Class<? extends IBase>, BaseRuntimeElementDefinition<?>> theClassToElementDefinitions);
062
063        @Override
064        public String toString() {
065                return getClass().getSimpleName() + "[" + getElementName() + "]";
066        }
067
068        public interface IAccessor {
069                List<IBase> getValues(Object theTarget);
070        }
071
072        public interface IMutator {
073                void addValue(Object theTarget, IBase theValue);
074
075                void setValue(Object theTarget, IBase theValue);
076        }
077
078        BaseRuntimeElementDefinition<?> findResourceReferenceDefinition(Map<Class<? extends IBase>, BaseRuntimeElementDefinition<?>> theClassToElementDefinitions) {
079                for (Entry<Class<? extends IBase>, BaseRuntimeElementDefinition<?>> next : theClassToElementDefinitions.entrySet()) {
080                        if (IBaseReference.class.isAssignableFrom(next.getKey())) {
081                                return next.getValue();
082                        }
083                }
084                
085                // Shouldn't happen
086                throw new IllegalStateException("Unable to find reference type");
087        }
088
089        // public String getExtensionUrl() {
090        // return null;
091        // }
092}