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 "ProfileName.java". Description:
10 "This Class represents the name of a conformance class. It is used to generate
11 names for classes, accessors for those classes, member variable to hold those
12 classes, etc. It is also responsable for tracking the names of all siblings
13 within a package, to ensure that no two classes have the same name."
14
15 The Initial Developer of the Original Code is University Health Network. Copyright (C)
16 2001. All Rights Reserved.
17
18 Contributor(s): James Agnew
19 Paul Brohman
20 Mitch Delachevrotiere
21 Shawn Dyck
22 Cory Metcalf
23
24 Alternatively, the contents of this file may be used under the terms of the
25 GNU General Public License (the ?GPL?), in which case the provisions of the GPL are
26 applicable instead of those above. If you wish to allow use of your version of this
27 file only under the terms of the GPL and not to allow others to use your version
28 of this file under the MPL, indicate your decision by deleting the provisions above
29 and replace them with the notice and other provisions required by the GPL License.
30 If you do not delete the provisions above, a recipient may use your version of
31 this file under either the MPL or the GPL.
32
33 */
34 package ca.uhn.hl7v2.conf.classes.generator.builders;
35
36 import java.util.HashMap;
37
38 import ca.uhn.hl7v2.sourcegen.SourceGenerator;
39
40 /** This Class represents the name of a conformance class. It is used to generate
41 * names for classes, accessors for those classes, member variable to hold those
42 * classes, etc. It is also responsable for tracking the names of all siblings
43 * within a package, to ensure that no two classes have the same name.
44 * @author <table><tr>James Agnew</tr>
45 * <tr>Paul Brohman</tr>
46 * <tr>Mitch Delachevrotiere</tr>
47 * <tr>Shawn Dyck</tr>
48 * <tr>Cory Metcalf</tr></table>
49 */
50 public final class ProfileName {
51
52 /** Integer value representing the <code>profileName</code> value for Component */
53 public static final int PS_COMP = 4;
54
55 /** Integer value representing the <code>profileName</code> value for Field */
56 public static final int PS_FIELD = 3;
57
58 /** Integer value representing the <code>profileName</code> value for Message */
59 public static final int PS_MSG = 0;
60
61 /** Integer value representing the <code>profileName</code> value for Segment */
62 public static final int PS_SEG = 2;
63
64 /** Integer value representing the <code>profileName</code> value for SegGroup */
65 public static final int PS_SEGG = 1;
66
67 /** Integer value representing the <code>profileName</code> value for SubComponent */
68 public static final int PS_SUBC = 5;
69
70 private static final String[] PS_TYPES = { "Msg", "SegGrp", "Seg", "Field", "Comp", "SubComp" };
71 protected HashMap<String, Object> nameMap; // Map containing the name of the parent and all children at any given level
72 private String parentName; // The name of the parent name assosiated with this ProfileName
73
74 private String profileName; // The name that this ProfileName represents
75 private final int profileStructureType; // The HL7 structure level that this ProfileName represents
76
77 /** Creates a new instance of ProfileName
78 * @param profileName the name of the profile
79 * @param profileStructureType The Profile Structure Type for this Name. The
80 * Profile Structure Type is prepended to each class in the class hierarchy
81 * both for clarity and to avoid name collisions.
82 */
83 public ProfileName(String profileName, int profileStructureType) {
84 this(profileName, profileStructureType, new HashMap<>(50), profileName);
85 }
86
87 /** Creates a new instance of ProfileName
88 * @param profileName the name of the profile
89 * @param profileStructureType The Profile Structure Type for this Name. The
90 * Profile Structure Type is prepended to each class in the class hierarchy
91 * both for clarity and to avoid name collisions.
92 * @param nameMap a list of all the children in ProfileName
93 * @param parentName the name of the parent to the child
94 */
95 private ProfileName(String profileName, int profileStructureType, HashMap<String, Object> nameMap, String parentName) {
96 this.profileName = profileName;
97 this.profileStructureType = profileStructureType;
98 this.nameMap = nameMap;
99 this.parentName = parentName;
100
101 // TODO: These are workarounds.. These should probably be resolved somehow.
102 if (profileName.equals("Acknowledgment Code"))
103 this.profileName = "Acknowledgement Code";
104 if (this.parentName != null && this.parentName.equals("NK1") && profileName.equals("Name"))
105 this.profileName = "NKName";
106
107 // Append a number to the name if there is already a ProfileName with this particular name
108 int i = 1;
109 while (nameMap.containsKey(this.profileStructureType + this.profileName)) {
110 i++;
111 this.profileName = profileName + i;
112 }
113
114 // Store the new name in the hashmap
115 nameMap.put(this.profileStructureType + this.profileName, null);
116 }
117
118 /** This method clears the name map for this Profile Name, meaning that new names
119 * entered after the map was cleared will not collide with names entered
120 * before. This should be used when a ProfileName object is passed to a child
121 * builder class.
122 * @return ProfileName Returns the ProfileName object
123 */
124 public ProfileName clearNameMap() {
125 this.nameMap = new HashMap<>(50);
126 nameMap.put(this.profileStructureType + this.profileName, null);
127 this.parentName = this.profileName;
128 return this;
129 }
130
131 /** Compares two ProfileName objects by comparing their <code>getAccessorName()</code>
132 * method return value.
133 * @return true if the names are equivalent
134 */
135 public boolean equals(ProfileName n) {
136 return getAccessorName().equals(n.getAccessorName());
137 }
138
139 /** Returns the accessor name
140 * @return the Accessor name
141 */
142 public String getAccessorName() {
143 // SegGroup names are a special case because makeAccessorName() chews out the
144 // underscores they have to contain.
145 if (profileStructureType == PS_SEGG)
146 return "get" + this.profileName;
147 else
148 return "get" + (SourceGenerator.makeAccessorName(this.profileName, this.parentName));
149 }
150
151 /** Returns the Class name
152 * @return the Class name
153 */
154 public String getClassName() {
155 String name = getAccessorName().substring(3, 4).toUpperCase() + getAccessorName().substring(4);
156 return PS_TYPES[profileStructureType] + name;
157 }
158
159 /** Returns the Member name
160 * @return the Member name
161 */
162 public String getMemberName() {
163 String memberName = getAccessorName().substring(3, 4).toLowerCase() + getAccessorName().substring(4);
164 if (!Character.isJavaIdentifierStart(memberName.charAt(0)))
165 memberName = "_" + memberName;
166
167 return memberName;
168 }
169
170 /** Returns the original name
171 * @return the original name
172 */
173 public String getOriginalName() {
174 return this.profileName;
175 }
176
177 /** Returns the Package name
178 * @return the Package name
179 */
180 public String getPackageName() {
181 return getAccessorName().substring(3) + "children";
182 }
183
184 /** creates a new instance of ProfileName
185 * @return the new ProfileName
186 */
187 public ProfileName newInstance(String profileName, int profileStructureType) {
188 return new ProfileName(profileName, profileStructureType, this.nameMap, this.profileName);
189 }
190
191 }