001 package org.apache.torque.mojo;
002
003 import java.util.Properties;
004
005 import org.apache.commons.lang.StringUtils;
006 import org.apache.maven.plugin.MojoExecutionException;
007 import org.apache.maven.plugin.descriptor.PluginDescriptor;
008 import org.apache.torque.util.JdbcConfigurer;
009 import org.kuali.core.db.torque.DumpTask;
010 import org.kuali.core.db.torque.PropertyHandlingException;
011 import org.kuali.core.db.torque.StringFilter;
012
013 /**
014 * Base Mojo for export related functionality
015 */
016 public abstract class ExportMojo extends AntTaskMojo {
017
018 /**
019 * Additional properties for the JDBC driver
020 *
021 * @parameter
022 */
023 private Properties driverProperties;
024
025 /**
026 * If true, files will be exported in a format that the Ant impex tasks can understand
027 *
028 * @parameter expression="${antCompatibilityMode}" default-value="false"
029 */
030 private boolean antCompatibilityMode;
031
032 /**
033 * The Maven artifactId. Included here as a simple property of the mojo itself to facilitate usage of
034 * <code>BeanUtils.copyProperties()</code> to copy properties between Mojo's and Ant tasks
035 *
036 * @parameter expression="${artifactId}" default-value="${project.artifactId}"
037 * @required
038 */
039 private String artifactId;
040
041 /**
042 * By default the version of the maven plugin being used during the build will be included as part of a comment in
043 * the XML. Set this to false to prevent this. Useful if you are committing files to SCM and don't want a change in
044 * the version of the plugin to show up as a change to the data.
045 *
046 * @parameter expression="${includeVersionInComment}" default-value="true"
047 * @required
048 */
049 private boolean includeVersionInComment;
050
051 /**
052 * Additional comment that gets placed into the generated XML document. Anything included here gets appended to the
053 * default value <br>
054 * <b>Default value is:</b> Auto-generated by the maven-impex-plugin v1.0.2<br>
055 *
056 * @parameter expression="${comment}"
057 */
058 private String comment;
059
060 /**
061 * Comma separated list of regular expressions for tables to include in the export
062 *
063 * @parameter expression="${includes}"
064 */
065 private String includes;
066
067 /**
068 * Comma separated list of regular expressions for tables to exclude from the export
069 *
070 * @parameter expression="${excludes}"
071 */
072 private String excludes;
073
074 /**
075 * The type of database we are targeting (eg oracle, mysql). This is optional if <code>url</code> is supplied as the
076 * database type will be automatically detected based on the <code>url</code>. If targetDatabase is explicitly
077 * supplied it will override the type selected by the automatic detection logic.
078 *
079 * @parameter expression="${targetDatabase}"
080 */
081 private String targetDatabase;
082
083 /**
084 * The schema to export. This parameter is optional, as the schema to export is automatically derived from platform
085 * specific logic that converts the artifactId.<br>
086 * <br>
087 * For example:<br>
088 * ks-embedded-db becomes KSEMBEDDED for Oracle, and ksembedded for MySQL If <code>schema</code> is supplied, the
089 * supplied value will be used instead of the value derived from the artifactId
090 *
091 * @parameter expression="${schema}"
092 */
093 private String schema;
094
095 /**
096 * Database driver classname. This parameter is optional, as the correct JDBC driver to use is detected from the
097 * <code>url</code> in almost all cases (works for Oracle, MySQL, Derby, PostGresSQL, DB2, H2, HSQL, SQL Server). If
098 * a driver is explicitly supplied, it will be used in place of the JDBC driver the automatic detection logic would
099 * have chosen.
100 *
101 * @parameter expression="${driver}"
102 */
103 private String driver;
104
105 /**
106 * The connect URL of the database.
107 *
108 * @parameter expression="${url}"
109 * @required
110 */
111 private String url;
112
113 /**
114 * The user name to connect to the database. If not specified this is automatically generated by platform specific
115 * logic for converting the artifact id.<br>
116 * <br>
117 * For example:<br>
118 * ks-embedded-db becomes KSEMBEDDED for Oracle and ksembedded for MySQL
119 *
120 * @parameter expression="${username}"
121 */
122 private String username;
123
124 /**
125 * The password for the database user. If not specified this is automatically generated by platform specific logic
126 * for converting the artifact id.<br>
127 * <br>
128 * For example:<br>
129 * ks-embedded-db becomes KSEMBEDDED for Oracle and ksembedded for MySQL
130 *
131 * @parameter expression="${password}"
132 */
133 private String password;
134
135 /**
136 * Returns the fully qualified class name of the database driver.
137 */
138 public String getDriver() {
139 return driver;
140 }
141
142 /**
143 * Sets the fully qualified class name of the database driver.
144 *
145 * @param driver
146 * the fully qualified class name of the database driver.
147 */
148 public void setDriver(final String driver) {
149 this.driver = driver;
150 }
151
152 /**
153 * Returns the password of the database user.
154 *
155 * @return the password of the database user.
156 */
157 public String getPassword() {
158 return password;
159 }
160
161 /**
162 * Sets the password of the database user.
163 *
164 * @param password
165 * the password of the database user.
166 */
167 public void setPassword(final String password) {
168 this.password = password;
169 }
170
171 /**
172 * Returns the connect URL to the database.
173 *
174 * @return the connect URL to the database.
175 */
176 public String getUrl() {
177 return url;
178 }
179
180 /**
181 * Sets the connect URL to the database.
182 *
183 * @param url
184 * the connect URL to the database.
185 */
186 public void setUrl(final String url) {
187 this.url = url;
188 }
189
190 public String getUsername() {
191 return username;
192 }
193
194 public void setUsername(final String username) {
195 this.username = username;
196 }
197
198 public String getSchema() {
199 return schema;
200 }
201
202 public void setSchema(final String schema) {
203 this.schema = schema;
204 }
205
206 public String getTargetDatabase() {
207 return targetDatabase;
208 }
209
210 public void setTargetDatabase(final String targetDatabase) {
211 this.targetDatabase = targetDatabase;
212 }
213
214 public String getIncludes() {
215 return includes;
216 }
217
218 public void setIncludes(final String includePatterns) {
219 this.includes = includePatterns;
220 }
221
222 public String getExcludes() {
223 return excludes;
224 }
225
226 public void setExcludes(final String excludePatterns) {
227 this.excludes = excludePatterns;
228 }
229
230 public String getComment() {
231 return comment;
232 }
233
234 public void setComment(final String comment) {
235 this.comment = comment;
236 }
237
238 protected String getUpdatedComment() {
239 PluginDescriptor descriptor = (PluginDescriptor) this.getPluginContext().get("pluginDescriptor");
240 if (descriptor == null) {
241 // This is null for Maven 2.x
242 return " Auto-generated by the maven-impex-plugin " + getComment();
243 }
244 String name = descriptor.getName();
245 String version = descriptor.getVersion();
246 String comment = " Auto-generated by the " + name;
247 if (isIncludeVersionInComment()) {
248 comment += " v" + version + " ";
249 }
250 if (!StringUtils.isEmpty(getComment())) {
251 comment += getComment();
252 }
253 return comment;
254 }
255
256 @Override
257 protected void configureTask() throws MojoExecutionException {
258 setComment(getUpdatedComment());
259 try {
260 JdbcConfigurer configurer = new JdbcConfigurer();
261 configurer.updateConfiguration(this);
262 configurer.validateConfiguration(this);
263 } catch (PropertyHandlingException e) {
264 throw new MojoExecutionException("Error handling properties", e);
265 }
266 super.configureTask();
267 DumpTask task = (DumpTask) super.getAntTask();
268 task.setIncludePatterns(StringFilter.getListFromCSV(getIncludes()));
269 task.setExcludePatterns(StringFilter.getListFromCSV(getExcludes()));
270 task.setDriverProperties(driverProperties);
271 }
272
273 public String getArtifactId() {
274 return artifactId;
275 }
276
277 public void setArtifactId(final String artifactId) {
278 this.artifactId = artifactId;
279 }
280
281 public boolean isAntCompatibilityMode() {
282 return antCompatibilityMode;
283 }
284
285 public void setAntCompatibilityMode(final boolean antCompatibilityMode) {
286 this.antCompatibilityMode = antCompatibilityMode;
287 }
288
289 /**
290 * @return the includeVersionInComment
291 */
292 public boolean isIncludeVersionInComment() {
293 return includeVersionInComment;
294 }
295
296 /**
297 * @param includeVersionInComment
298 * the includeVersionInComment to set
299 */
300 public void setIncludeVersionInComment(final boolean includeVersionInComment) {
301 this.includeVersionInComment = includeVersionInComment;
302 }
303
304 public Properties getDriverProperties() {
305 return driverProperties;
306 }
307
308 public void setDriverProperties(Properties driverProperties) {
309 this.driverProperties = driverProperties;
310 }
311 }