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 "AbstractPrimitive.java". Description:
10 * "Base class for Primitives. Performs validation in setValue()."
11 *
12 * The Initial Developer of the Original Code is University Health Network. Copyright (C)
13 * 2001-2005. All Rights Reserved.
14 *
15 * Contributor(s): ______________________________________.
16 *
17 * Alternatively, the contents of this file may be used under the terms of the
18 * GNU General Public License (the �GPL�), in which case the provisions of the GPL are
19 * applicable instead of those above. If you wish to allow use of your version of this
20 * file only under the terms of the GPL and not to allow others to use your version
21 * of this file under the MPL, indicate your decision by deleting the provisions above
22 * and replace them with the notice and other provisions required by the GPL License.
23 * If you do not delete the provisions above, a recipient may use your version of
24 * this file under either the MPL or the GPL.
25 *
26 */
27
28 package ca.uhn.hl7v2.model;
29
30 import java.util.Collection;
31
32 import ca.uhn.hl7v2.HL7Exception;
33 import ca.uhn.hl7v2.Location;
34 import ca.uhn.hl7v2.parser.EncodingCharacters;
35 import ca.uhn.hl7v2.parser.Parser;
36 import ca.uhn.hl7v2.validation.PrimitiveTypeRule;
37 import ca.uhn.hl7v2.validation.ValidationContext;
38 import ca.uhn.hl7v2.validation.ValidationException;
39
40 /**
41 * Base class for Primitives. Performs validation in setValue().
42 *
43 * @author Bryan Tripp
44 */
45 @SuppressWarnings("serial")
46 public abstract class AbstractPrimitive extends AbstractType implements Primitive {
47
48 /**
49 * @param message message to which this type belongs
50 */
51 public AbstractPrimitive(Message message) {
52 super(message);
53 }
54
55 private String myValue;
56
57 /**
58 * Returns the value of getValue()
59 * @see java.lang.Object#toString
60 */
61 public String toString() {
62 return this.getValue();
63 }
64
65 /**
66 * @see ca.uhn.hl7v2.model.Primitive#getValue()
67 */
68 public String getValue() {
69 return myValue;
70 }
71
72 /**
73 * Sets the value of this Primitive, first performing validation as specified
74 * by <code>getMessage().getValidationContext()</code>. No validation is performed
75 * if getMessage() returns null.
76 * <p>
77 * Note: as of the next HAPI release, the ValidationContext will be retrieved
78 * from getParser().getValidationContext(), which ultimately is the ValidationContext
79 * of the active HapiContext.
80 *
81 * @see ca.uhn.hl7v2.model.Primitive#setValue(String)
82 */
83 public void setValue(String theValue) throws DataTypeException {
84 Message message = getMessage();
85
86 if (message != null) {
87 ValidationContext context = message.getParser().getValidationContext();
88 String version = message.getVersion();
89
90 if (context != null) {
91 Collection<PrimitiveTypeRule> rules = context.getPrimitiveRules(version, getName(), this);
92
93 for (PrimitiveTypeRule rule : rules) {
94 theValue = rule.correct(theValue);
95 ValidationException[] ve = rule.apply(theValue);
96 if (ve.length > 0) {
97 throw new DataTypeException(ve[0]);
98 }
99 }
100 }
101 }
102
103 myValue = theValue;
104 }
105
106
107 /**
108 * {@inheritDoc }
109 */
110 @Override
111 public String encode() throws HL7Exception {
112 Parser p = getMessage().getParser();
113 return p.doEncode(this, EncodingCharacters.getInstance(getMessage()));
114 }
115
116
117 /**
118 * {@inheritDoc }
119 */
120 @Override
121 public void parse(String string) throws HL7Exception {
122 if (string == null) {
123 clear();
124 return;
125 }
126
127 EncodingCharacters encodingCharacters = EncodingCharacters.getInstance(getMessage());
128 char subc = encodingCharacters.getSubcomponentSeparator();
129 char cmpc = encodingCharacters.getComponentSeparator();
130
131 clear();
132
133 // If the string contains subcomponent delimiters, parse
134 // these as extra components
135 int subcIndex = string.indexOf(subc);
136 int cmpcIndex = string.indexOf(cmpc);
137 if (subcIndex != -1 || cmpcIndex != -1) {
138
139 //Object ancestor = AbstractMessage.findAncestorOf(this);
140
141 int index;
142 char escapeChar;
143 if (cmpcIndex != -1) {
144 index = cmpcIndex;
145 escapeChar = cmpc;
146 } else {
147 index = subcIndex;
148 escapeChar = subc;
149 }
150
151 setValue(string.substring(0, index));
152 while (index != -1) {
153 int prevIndex = index + 1;
154 index = string.indexOf(escapeChar, prevIndex);
155 if (index != -1) {
156 String nextSubComponent = string.substring(prevIndex, index);
157 getExtraComponents().getComponent(getExtraComponents().numComponents()).parse(nextSubComponent);
158 } else {
159 String nextSubComponent = string.substring(prevIndex);
160 if (nextSubComponent.length() > 0) {
161 getExtraComponents().getComponent(getExtraComponents().numComponents()).parse(nextSubComponent);
162 }
163 }
164 }
165
166 } else {
167
168 String escaped = getMessage().getParser().getParserConfiguration()
169 .getEscaping().unescape(string, encodingCharacters);
170 setValue(escaped);
171
172 }
173 }
174
175
176 /**
177 * {@inheritDoc }
178 */
179 @Override
180 public void clear() {
181 super.clear();
182 myValue = null;
183 }
184
185 @Override
186 public boolean isEmpty() throws HL7Exception {
187 return (myValue == null || myValue.length() == 0) && super.isEmpty();
188 }
189
190 public boolean accept(MessageVisitor visitor, Location location) throws HL7Exception {
191 return visitor.visit(this, location);
192 }
193
194 }