1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 package ca.uhn.hl7v2.conf.classes.generator.builders;
32
33 import ca.uhn.hl7v2.conf.classes.generator.genclasses.GeneratedConformanceContainer;
34 import ca.uhn.hl7v2.conf.classes.generator.genclasses.GeneratedMethod;
35 import ca.uhn.hl7v2.conf.classes.generator.genclasses.GeneratedRepGetter;
36 import ca.uhn.hl7v2.conf.spec.message.ProfileStructure;
37 import ca.uhn.hl7v2.conf.spec.message.Seg;
38 import ca.uhn.hl7v2.conf.spec.message.SegGroup;
39
40
41
42
43
44
45
46
47 public class ConformanceSegGroupBuilder {
48
49 private final DeploymentManager depManager;
50 private final DocumentationBuilder docBuilder;
51
52 private final String packageName;
53 private final String structID;
54 private final String version;
55
56
57
58
59
60
61 public ConformanceSegGroupBuilder(String packageName, String version, DeploymentManager depManager, String structID) {
62 super();
63 this.packageName = packageName;
64 this.version = version;
65 this.docBuilder = DocumentationBuilder.getDocumentationBuilder();
66 this.depManager = depManager;
67 this.structID = structID;
68 }
69
70
71
72
73
74
75
76 public void buildClass(SegGroup segGroup, String parentUnderlyingType, ProfileName profileName) {
77 GeneratedConformanceContainerclasses/GeneratedConformanceContainer.html#GeneratedConformanceContainer">GeneratedConformanceContainer gcc = new GeneratedConformanceContainer();
78 ConformanceSegmentBuilderonformanceSegmentBuilder.html#ConformanceSegmentBuilder">ConformanceSegmentBuilder confSegBuilder = new ConformanceSegmentBuilder(packageName + "." + profileName.getPackageName(), version, depManager);
79 ConformanceSegGroupBuilderanceSegGroupBuilder.html#ConformanceSegGroupBuilder">ConformanceSegGroupBuilder confSegGroupBuilder = new ConformanceSegGroupBuilder(packageName + "." + profileName.getPackageName(), version, depManager, structID);
80
81 String underlyingDataType = structID + "_" + generateSegGroupName(segGroup);
82 String underlyingPackageType = "ca.uhn.hl7v2.model." + version + ".group." + underlyingDataType;
83
84
85 gcc.setClassPackage(packageName);
86 gcc.addClassImport("ca.uhn.hl7v2.conf.classes.abs.*");
87 gcc.addClassImport("ca.uhn.hl7v2.conf.classes.exceptions.*");
88 gcc.addClassImport("ca.uhn.hl7v2.*");
89 gcc.addClassImport(packageName + "." + profileName.getPackageName() + ".*");
90
91 gcc.setName(profileName.getClassName());
92 gcc.setProperties("extends AbstractConformanceContainer implements Repeatable");
93 gcc.setMinMaxReps(segGroup.getMin(), segGroup.getMax());
94 gcc.addMemberVariable("private " + underlyingPackageType + " hapiSegGroup;");
95
96
97 GeneratedMethod theConstructor = gcc.getConstructor();
98 docBuilder.decorateConstructor( theConstructor, profileName.getClassName() );
99 theConstructor.addParam(parentUnderlyingType + " underlyingMessage", "The underlying message object");
100 theConstructor.addParam("int rep", "The underlying rep number");
101 theConstructor.addToThrows("HL7Exception");
102
103 UnderlyingAccessors/UnderlyingAccessor.html#UnderlyingAccessor">UnderlyingAccessor underlyingAccessor = new UnderlyingAccessor(parentUnderlyingType, "get" + underlyingDataType);
104 theConstructor.addToBody("this.hapiSegGroup = underlyingMessage." + underlyingAccessor.toString() + ";");
105
106 for (int i = 1; i <= segGroup.getChildren(); i++) {
107
108 String usage = segGroup.getChild(i).getUsage();
109 if( usage != null && (usage.equals("X") || usage.equals("B") || usage.equals("U")) )
110 continue;
111
112 if (segGroup.getChild(i) instanceof Seg) {
113 ProfileName childProfileName = profileName.newInstance(segGroup.getChild(i).getName(), ProfileName.PS_SEG);
114
115
116 gcc.addMemberVariable("private FiniteList " + childProfileName.getMemberName() + ";");
117 theConstructor.addToBody(childProfileName.getMemberName() + " = new FiniteList( " + childProfileName.getClassName() + ".class, hapiSegGroup );");
118 UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingPackageType, childProfileName.getAccessorName());
119 GeneratedRepGetterr/genclasses/GeneratedRepGetter.html#GeneratedRepGetter">GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.getAcceptsRep());
120
121 docBuilder.decorateRepGetter(repGetter, segGroup.getChild(i), childProfileName.getOriginalName());
122 gcc.addMethod(repGetter);
123 if (depManager.getVerbose())
124 System.out.println("Generating Segment: " + packageName + "." + gcc.getName());
125
126 confSegBuilder.buildClass((Seg) segGroup.getChild(i), underlyingPackageType, childProfileName.clearNameMap());
127
128 } else
129 if (segGroup.getChild(i) instanceof SegGroup) {
130 ProfileName childProfileName = profileName.newInstance(segGroup.getChild(i).getName(), ProfileName.PS_SEGG);
131
132
133 gcc.addMemberVariable("private FiniteList " + childProfileName.getMemberName() + ";");
134 theConstructor.addToBody(childProfileName.getMemberName() + " = new FiniteList( " + childProfileName.getClassName() + ".class, hapiSegGroup );");
135
136 String underlyingAccessorName = "get" + structID + "_" + ConformanceSegGroupBuilder.generateSegGroupName((SegGroup)segGroup.getChild(i));
137 UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingPackageType, underlyingAccessorName);
138 GeneratedRepGetterr/genclasses/GeneratedRepGetter.html#GeneratedRepGetter">GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.getAcceptsRep());
139
140 docBuilder.decorateRepGetter(repGetter, segGroup.getChild(i), childProfileName.getOriginalName());
141 gcc.addMethod(repGetter);
142 if (depManager.getVerbose())
143 System.out.println("Generating SegGroup: " + packageName + "." + gcc.getName());
144
145 confSegGroupBuilder.buildClass((SegGroup) segGroup.getChild(i), underlyingPackageType, childProfileName.clearNameMap());
146 }
147
148 }
149
150 depManager.generateFile(gcc, packageName, profileName.getClassName());
151
152 }
153
154
155
156
157
158 public static String generateSegGroupName(SegGroup segGroup) {
159 StringBuilder name = new StringBuilder();
160
161 for (int i = 1; i <= segGroup.getChildren(); i++) {
162 ProfileStructure child = segGroup.getChild(i);
163 if (child instanceof Seg)
164 name.append(child.getName());
165 else
166 name.append(generateSegGroupName((SegGroup) child));
167 }
168
169 return name.toString();
170 }
171
172 }