View Javadoc
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 "IStructureDefinition.java"
10   *
11   * The Initial Developer of the Original Code is University Health Network. Copyright (C)
12   * 2001.  All Rights Reserved.
13   *
14   * Contributor(s):
15   *
16   * Alternatively, the contents of this file may be used under the terms of the
17   * GNU General Public License (the  �GPL�), in which case the provisions of the GPL are
18   * applicable instead of those above.  If you wish to allow use of your version of this
19   * file only under the terms of the GPL and not to allow others to use your version
20   * of this file under the MPL, indicate your decision by deleting  the provisions above
21   * and replace  them with the notice and other provisions required by the GPL License.
22   * If you do not delete the provisions above, a recipient may use your version of
23   * this file under either the MPL or the GPL.
24   *
25   */
26  
27  
28  package ca.uhn.hl7v2.parser;
29  
30  import java.util.List;
31  import java.util.Set;
32  
33  /**
34   * Contains information about the composition of a given type of {@link ca.uhn.hl7v2.model.Structure Structure}.
35   * At runtime, parsers will use accessors provided by various structure types (messages, groups,
36   * segments) to determine the structure of a messages. Structure definitions are used
37   * to cache that information between parse calls.
38   */
39  public interface IStructureDefinition {
40  
41      /**
42       * @return Returns this structure's first sibling (in other words, its
43       *         parent's first child). Returns
44       *         <code>null<code> if this is the first sibling, or if this has no parent
45       */
46      IStructureDefinition getFirstSibling();
47  
48      /**
49       * @return Returns the next leaf (segment) after this one, within the same
50       * group, only if one exists and this structure is also a leaf. Otherwise returns <code>null</code>.
51       */
52      IStructureDefinition getNextLeaf();
53  
54      /**
55       * @return The name of the segment, as it is known to it's parent. This
56       * will differ from {{@link #getName()}} in the case of multiple segments
57       * with the same name in a group, e.g. the two PID segments in ADT_A17,
58       * where the second one it known as PID2 to it's parent. 
59       */
60      String getNameAsItAppearsInParent();
61      
62      /**
63       * @return Returns the name of this structure
64       */
65      String getName();
66  
67      /**
68       * @return Returns true if this structure is a segment
69       */
70      boolean isSegment();
71  
72      /**
73       * @return Returns true if this is a repeatable structure
74       */
75      boolean isRepeating();
76  
77      /**
78       * @return Returns all children of this structure definition
79       */
80      List<StructureDefinition> getChildren();
81  
82      /**
83       * @return Returns the index of the position of this structure
84       * within it's parent's children
85       */
86      int getPosition();
87  
88      /**
89       * @return Returns the parent structure of this structure, if one exists.
90       * Otherwise, returns null.
91       */
92      IStructureDefinition getParent();
93  
94      /**
95       * @return Returns true if this structure is the final child of it's parent.
96       */
97      boolean isFinalChildOfParent();
98  
99      /**
100      * @return Returns this structure's next sibling within it's parent, if any.
101      */
102     IStructureDefinition getNextSibling();
103 
104     /**
105      * @return Does this structure have children (i.e. is it not a segment)
106      */
107     boolean hasChildren();
108 
109     /**
110      * Should only be called on a leaf node (segment). Returns the names
111      * of all valid children which may follow this one, at any level in the
112      * hierarchy (including as later siblings of parent structures to
113      * this one)
114      *
115      * @return the names of all valid children which may follow this one
116      */
117     Set<String> getNamesOfAllPossibleFollowingLeaves();
118 
119     /**
120      * @return structure definition of first child of null if there is no child
121      */
122     IStructureDefinition getFirstChild();
123 
124     /**
125      * Returns the names of any possible children that could be the first
126      * required child of this group.
127      *
128      * For instance, for the group below "ORC" and "OBR" would both be
129      * returned, as they are both potential first children of this group.
130      *
131      * Note that the name returned by {@link #getName() this.getName()}
132      * is also returned.
133      *
134      * <code>
135      *               ORDER_OBSERVATION
136      *	  {
137      *	  [ ORC ]
138      *	  OBR
139      *	  [ { NTE } ]
140      *	  [ CTD ]
141      *	                OBSERVATION
142      *	     {
143      *	     [ OBX ]
144      *	     [ { NTE } ]
145      *	     }
146      *	                OBSERVATION
147      *	  [ { FT1 } ]
148      *	  [ { CTI } ]
149      *	  }
150      *	                ORDER_OBSERVATION
151      *	   </code>
152      *
153      *
154      * @return the names of any possible children that could be the first
155      * required child of this group
156      */
157     Set<String> getAllPossibleFirstChildren();
158 
159     /**
160      * @return Returns the names of all children of this structure, including first elements within child groups
161      */
162     Set<String> getAllChildNames();
163 
164     /**
165      * @return true if this element a choice element
166      *
167      * @see ca.uhn.hl7v2.model.Group#isChoiceElement(String)
168      */
169     boolean isChoiceElement();
170     
171     /**
172      * @return true if this a required structure within it's parent
173      */
174     boolean isRequired();
175 
176 }