001package org.hl7.fhir.r5.terminologies; 002 003/* 004 Copyright (c) 2011+, HL7, Inc. 005 All rights reserved. 006 007 Redistribution and use in source and binary forms, with or without modification, 008 are permitted provided that the following conditions are met: 009 010 * Redistributions of source code must retain the above copyright notice, this 011 list of conditions and the following disclaimer. 012 * Redistributions in binary form must reproduce the above copyright notice, 013 this list of conditions and the following disclaimer in the documentation 014 and/or other materials provided with the distribution. 015 * Neither the name of HL7 nor the names of its contributors may be used to 016 endorse or promote products derived from this software without specific 017 prior written permission. 018 019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 020 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 021 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 022 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 023 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 024 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 025 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 026 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 027 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 028 POSSIBILITY OF SUCH DAMAGE. 029 030 */ 031 032 033 034import java.io.FileNotFoundException; 035import java.io.IOException; 036import java.util.ArrayList; 037import java.util.List; 038 039import org.hl7.fhir.r5.model.Parameters; 040import org.hl7.fhir.r5.model.ValueSet; 041 042public interface ValueSetExpander { 043 public enum TerminologyServiceErrorClass { 044 UNKNOWN, NOSERVICE, SERVER_ERROR, VALUESET_UNSUPPORTED, CODESYSTEM_UNSUPPORTED, BLOCKED_BY_OPTIONS; 045 046 public boolean isInfrastructure() { 047 return this == NOSERVICE || this == SERVER_ERROR || this == VALUESET_UNSUPPORTED; 048 } 049 } 050 051 public class ETooCostly extends Exception { 052 053 public ETooCostly(String msg) { 054 super(msg); 055 } 056 057 } 058 059 /** 060 * Some value sets are just too big to expand. Instead of an expanded value set, 061 * you get back an interface that can test membership - usually on a server somewhere 062 * 063 * @author Grahame 064 */ 065 public class ValueSetExpansionOutcome { 066 private ValueSet valueset; 067 private String error; 068 private TerminologyServiceErrorClass errorClass; 069 private String txLink; 070 private List<String> allErrors = new ArrayList<>(); 071 072 public ValueSetExpansionOutcome(ValueSet valueset) { 073 super(); 074 this.valueset = valueset; 075 this.error = null; 076 } 077 public ValueSetExpansionOutcome(ValueSet valueset, String error, TerminologyServiceErrorClass errorClass) { 078 super(); 079 this.valueset = valueset; 080 this.error = error; 081 this.errorClass = errorClass; 082 allErrors.add(error); 083 } 084 public ValueSetExpansionOutcome(ValueSetChecker service, String error, TerminologyServiceErrorClass errorClass) { 085 super(); 086 this.valueset = null; 087 this.error = error; 088 this.errorClass = errorClass; 089 allErrors.add(error); 090 } 091 public ValueSetExpansionOutcome(String error, TerminologyServiceErrorClass errorClass) { 092 this.valueset = null; 093 this.error = error; 094 this.errorClass = errorClass; 095 allErrors.add(error); 096 } 097 public ValueSetExpansionOutcome(String error, TerminologyServiceErrorClass errorClass, List<String> errList) { 098 this.valueset = null; 099 this.error = error; 100 this.errorClass = errorClass; 101 this.allErrors.addAll(errList); 102 if (!allErrors.contains(error)) { 103 allErrors.add(error); 104 } 105 } 106 107 public ValueSet getValueset() { 108 return valueset; 109 } 110 public String getError() { 111 return error; 112 } 113 public TerminologyServiceErrorClass getErrorClass() { 114 return errorClass; 115 } 116 public String getTxLink() { 117 return txLink; 118 } 119 public ValueSetExpansionOutcome setTxLink(String txLink) { 120 this.txLink = txLink; 121 return this; 122 } 123 public List<String> getAllErrors() { 124 return allErrors; 125 } 126 127 public boolean isOk() { 128 return (allErrors.isEmpty() || (allErrors.size() == 1 && allErrors.get(0) == null)) && error == null; 129 } 130 } 131/** 132 * 133 * @param source the value set definition to expand 134 * @param profile a set of parameters affecting the outcome. If you don't supply parameters, the default internal parameters will be used. 135 * 136 * @return 137 * @throws ETooCostly 138 * @throws FileNotFoundException 139 * @throws IOException 140 */ 141 public ValueSetExpansionOutcome expand(ValueSet source, Parameters parameters) throws ETooCostly, FileNotFoundException, IOException; 142}