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 "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 }