| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| Varies |
|
| 1.3333333333333333;1.333 |
| 1 | /** | |
| 2 | The contents of this file are subject to the Mozilla Public License Version 1.1 | |
| 3 | (the "License"); you may not use this file except in compliance with the License. | |
| 4 | You may obtain a copy of the License at http://www.mozilla.org/MPL/ | |
| 5 | Software distributed under the License is distributed on an "AS IS" basis, | |
| 6 | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the | |
| 7 | specific language governing rights and limitations under the License. | |
| 8 | ||
| 9 | The Original Code is "Varies.java". Description: | |
| 10 | "Varies is a Type used as a placeholder for another Type in cases where | |
| 11 | the appropriate Type is not known until run-time (e.g" | |
| 12 | ||
| 13 | The Initial Developer of the Original Code is University Health Network. Copyright (C) | |
| 14 | 2001. All Rights Reserved. | |
| 15 | ||
| 16 | Contributor(s): ______________________________________. | |
| 17 | ||
| 18 | Alternatively, the contents of this file may be used under the terms of the | |
| 19 | GNU General Public License (the "GPL"), in which case the provisions of the GPL are | |
| 20 | applicable instead of those above. If you wish to allow use of your version of this | |
| 21 | file only under the terms of the GPL and not to allow others to use your version | |
| 22 | of this file under the MPL, indicate your decision by deleting the provisions above | |
| 23 | and replace them with the notice and other provisions required by the GPL License. | |
| 24 | If you do not delete the provisions above, a recipient may use your version of | |
| 25 | this file under either the MPL or the GPL. | |
| 26 | ||
| 27 | */ | |
| 28 | ||
| 29 | package ca.uhn.hl7v2.model; | |
| 30 | ||
| 31 | import ca.uhn.hl7v2.HL7Exception; | |
| 32 | import ca.uhn.hl7v2.Location; | |
| 33 | import ca.uhn.hl7v2.parser.EncodingCharacters; | |
| 34 | import ca.uhn.hl7v2.parser.FixFieldDataType; | |
| 35 | import ca.uhn.hl7v2.parser.ModelClassFactory; | |
| 36 | import ca.uhn.hl7v2.parser.ParserConfiguration; | |
| 37 | ||
| 38 | /** | |
| 39 | * <p>Varies is a Type used as a placeholder for another Type in cases where | |
| 40 | * the appropriate Type is not known until run-time (e.g. OBX-5). | |
| 41 | * Parsers and validators may have logic that enforces restrictions on the | |
| 42 | * Type based on other features of a segment.</p> | |
| 43 | * <p>If you want to set both the type and the values of a Varies object, you should | |
| 44 | * set the type first by calling setData(Type t), keeping a reference to your Type, | |
| 45 | * and then set values by calling methods on the Type. Here is an example:</p> | |
| 46 | * <p><code>CN cn = new CN();<br> | |
| 47 | * variesObject.setData(cn);<br> | |
| 48 | * cn.getIDNumber().setValue("foo");</code></p> | |
| 49 | * | |
| 50 | * @author Bryan Tripp (bryan_tripp@users.sourceforge.net) | |
| 51 | * @author Andy Pardue | |
| 52 | */ | |
| 53 | @SuppressWarnings("serial") | |
| 54 | public class Varies implements Variable { | |
| 55 | ||
| 56 | /** | |
| 57 | * System property key: The value may be set to provide a default | |
| 58 | * datatype ("ST", "NM", etc) for an OBX segment with a missing | |
| 59 | * OBX-2 value. | |
| 60 | * | |
| 61 | * @deprecated use FixOBX5#DEFAULT_OBX2_TYPE_PROP | |
| 62 | */ | |
| 63 | public static final String DEFAULT_OBX2_TYPE_PROP = FixFieldDataType.DEFAULT_OBX2_TYPE_PROP; | |
| 64 | ||
| 65 | /** | |
| 66 | * System property key: The value may be set to provide a default | |
| 67 | * datatype ("ST", "NM", etc) for an OBX segment with an invalid | |
| 68 | * OBX-2 value type. In other words, if OBX-2 has a value of "ZYZYZ", | |
| 69 | * which is not a valid value, but this property is set to "ST", then | |
| 70 | * OBX-5 will be parsed as an ST. | |
| 71 | * | |
| 72 | * @deprecated use FixOBX5#INVALID_OBX2_TYPE_PROP | |
| 73 | */ | |
| 74 | public static final String INVALID_OBX2_TYPE_PROP = FixFieldDataType.INVALID_OBX2_TYPE_PROP; | |
| 75 | ||
| 76 | /** | |
| 77 | * <p> | |
| 78 | * System property key: If this is not set, or set to "true", and a subcomponent delimiter is found within the | |
| 79 | * value of a Varies of a primitive type, this subcomponent delimiter will be treated as a literal | |
| 80 | * character instead of a subcomponent delimiter, and will therefore be escaped if the message is | |
| 81 | * re-encoded. This is handy when dealing with non-conformant sending systems which do not correctly | |
| 82 | * escape ampersands in OBX-5 values. | |
| 83 | * </p> | |
| 84 | * <p> | |
| 85 | * For example, consider the following OBX-5 segment: | |
| 86 | * <pre> | |
| 87 | * OBX||ST|||Apples, Pears & Bananas||| | |
| 88 | * </pre> | |
| 89 | * In this example, the data type is a primitive ST and does not support subcomponents, and the | |
| 90 | * ampersand is obviously not intended to represent a subcomponent delimiter. If this | |
| 91 | * property is set to <code>true</code>, the entire string will be treated as the | |
| 92 | * value of OBX-5, and if the message is re-encoded the string will appear | |
| 93 | * as "Apples, Pears \T\ Bananas". | |
| 94 | * </p> | |
| 95 | * <p> | |
| 96 | * If this property is set to anything other than "true", the subcomponent delimiter is treated as a component delimiter, | |
| 97 | * so the value after the ampersand is placed into an {@link ExtraComponents extra component}. | |
| 98 | * </p> | |
| 99 | * | |
| 100 | * @deprecated use FixOBX5#ESCAPE_SUBCOMPONENT_DELIM_IN_PRIMITIVE | |
| 101 | */ | |
| 102 | public static final String ESCAPE_SUBCOMPONENT_DELIM_IN_PRIMITIVE = FixFieldDataType.ESCAPE_SUBCOMPONENT_DELIM_IN_PRIMITIVE; | |
| 103 | ||
| 104 | ||
| 105 | private Type data; | |
| 106 | private Message message; | |
| 107 | ||
| 108 | /** | |
| 109 | * Creates new Varies. | |
| 110 | * | |
| 111 | * @param message message to which this type belongs | |
| 112 | */ | |
| 113 | 9605 | public Varies(Message message) { |
| 114 | 9605 | data = new GenericPrimitive(message); |
| 115 | 9605 | this.message = message; |
| 116 | 9605 | } |
| 117 | ||
| 118 | /** | |
| 119 | * Returns the data contained by this instance of Varies. Returns a GenericPrimitive unless | |
| 120 | * setData() has been called. | |
| 121 | * | |
| 122 | * @return the data contained by this instance of Varies | |
| 123 | */ | |
| 124 | public Type getData() { | |
| 125 | 20075 | return this.data; |
| 126 | } | |
| 127 | ||
| 128 | public String getName() { | |
| 129 | 0 | String name = "*"; |
| 130 | 0 | if (this.data != null) { |
| 131 | 0 | name = this.data.getName(); |
| 132 | } | |
| 133 | 0 | return name; |
| 134 | } | |
| 135 | ||
| 136 | /** | |
| 137 | * Sets the data contained by this instance of Varies. If a data object already exists, | |
| 138 | * then its values are copied to the incoming data object before the old one is replaced. | |
| 139 | * For example, if getData() returns an ST with the value "19901012" and you call | |
| 140 | * setData(new DT()), then subsequent calls to getData() will return the same DT, with the value | |
| 141 | * set to "19901012". | |
| 142 | * | |
| 143 | * @param data the data to be set for this Varies instance | |
| 144 | * @throws DataTypeException if the data could not be set | |
| 145 | */ | |
| 146 | public void setData(Type data) throws DataTypeException { | |
| 147 | 1990 | if (this.data != null) { |
| 148 | 1990 | if (!(this.data instanceof Primitive) || ((Primitive) this.data).getValue() != null) { |
| 149 | 1760 | ca.uhn.hl7v2.util.DeepCopy.copy(this.data, data); |
| 150 | } | |
| 151 | } | |
| 152 | 1990 | this.data = data; |
| 153 | 1990 | } |
| 154 | ||
| 155 | public ExtraComponents getExtraComponents() { | |
| 156 | 10 | return this.data.getExtraComponents(); |
| 157 | } | |
| 158 | ||
| 159 | /** | |
| 160 | * @return the message to which this Type belongs | |
| 161 | */ | |
| 162 | public Message getMessage() { | |
| 163 | 2425 | return message; |
| 164 | } | |
| 165 | ||
| 166 | /** | |
| 167 | * <p> | |
| 168 | * Sets the data type of field 5 in the given OBX segment to the value of OBX-2. The argument | |
| 169 | * is a Segment as opposed to a particular OBX because it is meant to work with any version. | |
| 170 | * </p> | |
| 171 | * <p> | |
| 172 | * Note that if no value is present in OBX-2, or an invalid value is present in | |
| 173 | * OBX-2, this method will throw an error. This behaviour can be corrected by using the | |
| 174 | * following system properties: {@link #DEFAULT_OBX2_TYPE_PROP} and {@link #INVALID_OBX2_TYPE_PROP}, | |
| 175 | * or by using configuration in {@link ParserConfiguration} | |
| 176 | * </p> | |
| 177 | * | |
| 178 | * @param segment OBX segment instance to be modified | |
| 179 | * @param factory ModelClassFactory to be used | |
| 180 | * @throws HL7Exception if the operation fails | |
| 181 | * @deprecated use FixOBX5#fixOBX5 | |
| 182 | */ | |
| 183 | public static void fixOBX5(Segment segment, ModelClassFactory factory) throws HL7Exception { | |
| 184 | 0 | FixFieldDataType.fixOBX5(segment, factory, segment.getMessage().getParser().getParserConfiguration()); |
| 185 | 0 | } |
| 186 | ||
| 187 | /** | |
| 188 | * <p> | |
| 189 | * Sets the data type of field 5 in the given OBX segment to the value of OBX-2. The argument | |
| 190 | * is a Segment as opposed to a particular OBX because it is meant to work with any version. | |
| 191 | * </p> | |
| 192 | * <p> | |
| 193 | * Note that if no value is present in OBX-2, or an invalid value is present in | |
| 194 | * OBX-2, this method will throw an error. This behaviour can be corrected by using the | |
| 195 | * following system properties: {@link #DEFAULT_OBX2_TYPE_PROP} and {@link #INVALID_OBX2_TYPE_PROP} | |
| 196 | * or by using configuration in {@link ParserConfiguration} | |
| 197 | * </p> | |
| 198 | * | |
| 199 | * @param segment OBX segment instance to be modified | |
| 200 | * @param factory ModelClassFactory to be used | |
| 201 | * @param parserConfiguration configuration that influences setting OBX-5 | |
| 202 | * @throws HL7Exception if the operation fails | |
| 203 | * @deprecated use FixOBX5#fixOBX5 | |
| 204 | */ | |
| 205 | public static void fixOBX5(Segment segment, ModelClassFactory factory, ParserConfiguration parserConfiguration) | |
| 206 | throws HL7Exception { | |
| 207 | 0 | FixFieldDataType.fixOBX5(segment, factory, parserConfiguration); |
| 208 | 0 | } |
| 209 | ||
| 210 | ||
| 211 | /** | |
| 212 | * {@inheritDoc } | |
| 213 | */ | |
| 214 | public void parse(String string) throws HL7Exception { | |
| 215 | 100 | if (data != null) { |
| 216 | 100 | data.clear(); |
| 217 | } | |
| 218 | 100 | getMessage().getParser().parse(this, string, EncodingCharacters.getInstance(getMessage())); |
| 219 | 100 | } |
| 220 | ||
| 221 | /** | |
| 222 | * {@inheritDoc } | |
| 223 | */ | |
| 224 | public String encode() throws HL7Exception { | |
| 225 | 130 | return getMessage().getParser().doEncode(this, EncodingCharacters.getInstance(getMessage())); |
| 226 | } | |
| 227 | ||
| 228 | /** | |
| 229 | * {@inheritDoc } | |
| 230 | */ | |
| 231 | public void clear() { | |
| 232 | 5 | data.clear(); |
| 233 | 5 | } |
| 234 | ||
| 235 | /** | |
| 236 | * {@inheritDoc } | |
| 237 | */ | |
| 238 | public boolean isEmpty() throws HL7Exception { | |
| 239 | 25 | return data.isEmpty(); |
| 240 | } | |
| 241 | ||
| 242 | /** | |
| 243 | * {@inheritDoc } | |
| 244 | */ | |
| 245 | public String toString() { | |
| 246 | 0 | return AbstractType.toString(this); |
| 247 | } | |
| 248 | ||
| 249 | public boolean accept(MessageVisitor visitor, Location currentLocation) throws HL7Exception { | |
| 250 | 115 | return data.accept(visitor, currentLocation); |
| 251 | } | |
| 252 | ||
| 253 | public Location provideLocation(Location location, int index, int repetition) { | |
| 254 | 75 | return data.provideLocation(location, index, repetition); |
| 255 | } | |
| 256 | ||
| 257 | } |