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 "DataTypeGenerator.java". Description:
10 "Generates skeletal source code for Datatype classes based on the
11 HL7 database"
12
13 The Initial Developer of the Original Code is University Health Network. Copyright (C)
14 2001. All Rights Reserved.
15
16 Contributor(s): James Agnew
17
18 Alternatively, the contents of this file may be used under the terms of the
19 GNU General Public License (the �GPL�), in which case the provisions of the GPL are
20 applicable instead of those above. If you wish to allow use of your version of this
21 file only under the terms of the GPL and not to allow others to use your version
22 of this file under the MPL, indicate your decision by deleting the provisions above
23 and replace them with the notice and other provisions required by the GPL License.
24 If you do not delete the provisions above, a recipient may use your version of
25 this file under either the MPL or the GPL.
26
27 */
28
29 package ca.uhn.hl7v2.mvnplugin;
30
31 import java.io.FileReader;
32
33 import org.apache.maven.plugin.AbstractMojo;
34 import org.apache.maven.plugin.MojoExecutionException;
35 import org.apache.maven.plugin.MojoFailureException;
36 import org.apache.maven.project.MavenProject;
37 import org.codehaus.plexus.util.IOUtil;
38
39 import ca.uhn.hl7v2.conf.parser.ProfileParser;
40 import ca.uhn.hl7v2.conf.spec.RuntimeProfile;
41 import ca.uhn.hl7v2.sourcegen.conf.GenerateDataTypesEnum;
42 import ca.uhn.hl7v2.sourcegen.conf.ProfileSourceGenerator;
43
44 /**
45 * Maven Plugin for generating HAPI message structure classes which are based on
46 * an HL7 conformance profile file. For more information on using this plugin, see
47 * the <a href="confgen-usage.html">Confgen Usage</a> page.
48 *
49 * @author <a href="mailto:jamesagnew@sourceforge.net">James Agnew</a>
50 * @goal confgen
51 * @phase generate-sources
52 * @requiresDependencyResolution runtime
53 * @requiresProject
54 * @inheritedByDefault false
55 * @since 2.1
56 */
57 public class ConfGenMojo extends AbstractMojo {
58
59 /**
60 * The maven project.
61 *
62 * @parameter property="project"
63 * @required
64 * @readonly
65 * @since 2.1
66 */
67 MavenProject project;
68
69 /**
70 * The target directory for the generated source
71 *
72 * @parameter
73 * @required
74 * @since 2.1
75 */
76 String targetDirectory;
77
78 /**
79 * The conformance profile (XML file path) to use
80 *
81 * @parameter
82 * @required
83 * @since 2.1
84 */
85 String profile;
86
87 /**
88 * The package for the generated source, e.g. "com.acme.hl7structure.adt"
89 *
90 * @parameter
91 * @required
92 * @since 2.1
93 */
94 String packageName;
95
96 /**
97 * Should data types be generated. Valid options are:
98 * <ul>
99 * <li><b>NONE</b>: Do not generate custom data types, use HAPI's normal
100 * data type classes for the HL7 version that the profile corresponds to
101 * <li><b>SINGLE</b>: Generate a single instance of each data type. In this
102 * case, hapi will generate a custom data type for the first instance of
103 * each type that it finds. So, any customizations that need to be made must
104 * be made in the very first time that a particular data type is used within
105 * a profile. For example, if you need to customize the "SN" data type, you
106 * will need to customize the very first one that appears in the profile, as
107 * all SNs within your message type will use the structure generated by the
108 * first one.
109 * <li><b>ALL</b>: Generate an individual data type object for each and every
110 * instance of a datatype within a structure. Note that this is very powerful
111 * and flexible,
112 * but also has the potential to generate a large number of classes, so use with
113 * caution.
114 * </ul>
115 *
116 * @parameter default-value="NONE"
117 * @since 2.1
118 */
119 String generateDataTypes = "NONE";
120
121 /**
122 * The package from which to load the templates
123 *
124 * @parameter default="ca.uhn.hl7v2.sourcegen.templates"
125 * @since 2.1
126 */
127 String templatePackage = "ca.uhn.hl7v2.sourcegen.templates";
128
129 /**
130 * Should structures be treated as resources
131 */
132 private boolean structuresAsResources;
133
134 /**
135 * File extension for the generated source files.
136 */
137 private String fileExt = "java";
138
139 /**
140 * {@inheritDoc}
141 */
142 public void execute() throws MojoExecutionException {
143
144 GenerateDataTypesEnum genDt;
145 try {
146 genDt = GenerateDataTypesEnum.valueOf(generateDataTypes);
147 } catch (IllegalArgumentException e) {
148 throw new MojoExecutionException("Unknown \"generateDataTypes\" value: " + generateDataTypes);
149 }
150
151 try {
152
153 String profileString;
154 FileReader reader = new FileReader(profile);
155 profileString = IOUtil.toString(reader);
156
157 ProfileParser profileParser = new ProfileParser(false);
158 RuntimeProfile runtimeProfile = profileParser.parse(profileString);
159
160 ProfileSourceGenerator gen = new ProfileSourceGenerator(runtimeProfile, targetDirectory, packageName, genDt, templatePackage, fileExt);
161 gen.generate();
162
163 if (!structuresAsResources) {
164 getLog().info("Adding path to compile sources: " + targetDirectory);
165 project.addCompileSourceRoot(targetDirectory);
166 }
167
168 } catch (Exception e) {
169 throw new MojoExecutionException(e.getMessage(), e);
170 }
171
172 project.addCompileSourceRoot(targetDirectory);
173
174 }
175
176 public static void main(String[] args) throws MojoExecutionException, MojoFailureException {
177
178 ConfGenMojo tst = new ConfGenMojo();
179 tst.targetDirectory = "hapi-test/target/generated-sources/confgen";
180 tst.packageName = "ca.uhn.hl7v2.test.conf.json";
181 tst.profile = "hapi-test/src/test/resources/ca/uhn/hl7v2/conf/parser/ADT_A01.xml";
182 tst.structuresAsResources = true;
183 tst.templatePackage = "ca.uhn.hl7v2.sourcegen.templates.json";
184 tst.generateDataTypes = "SINGLE";
185 tst.fileExt = "json";
186 tst.execute();
187
188 }
189
190 }