001 package org.apache.torque.mojo;
002
003 import java.util.Properties;
004
005 import org.apache.maven.plugin.MojoExecutionException;
006 import org.apache.maven.settings.Server;
007 import org.kuali.db.DatabaseCommand;
008
009 import static org.apache.commons.lang.StringUtils.*;
010
011 /**
012 * Common logic for running SQL commands on a database
013 */
014 public abstract class AbstractDBACommandMojo extends AbstractSQLExecutorMojo {
015 public static final String DATABASE_PROPERTY = "database";
016 public static final String DATABASE_PW_PROPERTY = "databasePassword";
017 public static final String DATABASE_USERNAME_PROPERTY = "databaseUsername";
018
019 /**
020 * URL to connect directly to the database server itself (ie: no database specified). This is optional as it is
021 * automatically detected in almost all cases from the <code>url</code>. If <code>serverUrl</code> is explicitly
022 * supplied it overrides the <code>serverUrl</code> chosen by the automatic detection logic.
023 *
024 * @parameter expression="${serverUrl}"
025 */
026 String serverUrl;
027
028 /**
029 * The name of the database to DROP/CREATE. If not specified, this defaults to a database name that is compatible
030 * with ${targetDatabase} based on platform specific logic that converts the artifact id.<br>
031 * <br>
032 *
033 * For example:<br>
034 * ks-embedded-db is converted to KSEMBEDDED for Oracle, and ksembedded for MySQL)
035 *
036 * @parameter expression="${database}"
037 */
038 String database;
039
040 /**
041 * The user to DROP/CREATE when issuing DBA commands for creating/dropping a user. If not specified, this defaults
042 * to a user that is compatible with ${targetDatabase} based on platform specific logic that converts the artifact
043 * id.<br>
044 * <br>
045 *
046 * For example:<br>
047 * ks-embedded-db is converted to KSEMBEDDED for Oracle, and ksembedded for MySQL
048 *
049 * @parameter expression="${databaseUser}"
050 */
051 String databaseUser;
052
053 /**
054 * The password for the user that is DROPPED/CREATED. If not specified, this defaults to a password that is
055 * compatible with ${targetDatabase} based on platform specific logic that converts the artifact id.<br>
056 * <br>
057 *
058 * For example:<br>
059 * ks-embedded-db is converted to KSEMBEDDED for Oracle, and ksembedded for MySQL
060 *
061 * @parameter expression="${databasePassword}"
062 */
063 String databasePassword;
064
065 /**
066 * Lookup DBA credentials in settings.xml using this key. If nothing is found under
067 * <code>impex.dba.${project.artifactId}</code> a second attempt will be made to locate a set of credentials under
068 * <code>impex.dba.${url}</code>
069 *
070 * @parameter expression="${dbaSettingsKey}" default-value="impex.dba.${project.artifactId}"
071 */
072 String dbaSettingsKey;
073
074 protected String getTransactionDescription(DatabaseCommand command) {
075 return command + " " + getDatabase();
076 }
077
078 protected void updateConfiguration() throws MojoExecutionException {
079 super.updateConfiguration();
080 if (isEmpty(database)) {
081 database = platform.getSchemaName(getProject().getArtifactId());
082 }
083 if (isEmpty(databasePassword)) {
084 databasePassword = platform.getSchemaName(getProject().getArtifactId());
085 }
086 if (isEmpty(databaseUser)) {
087 databaseUser = platform.getSchemaName(getProject().getArtifactId());
088 }
089 if (isEmpty(serverUrl)) {
090 serverUrl = platform.getServerUrl(url);
091 }
092 }
093
094 @Override
095 protected String getUpdatedPassword(Server server, String password) {
096 // They already gave us a password, don't mess with it
097 if (!isEmpty(password)) {
098 return password;
099 }
100 if (server != null) {
101 // We've successfully located a server in settings.xml, use the password from that
102 getLog().info("Located a password in settings.xml under the server id '" + server.getId() + "' Password: " + getDisplayPassword(server.getPassword()));
103 return server.getPassword();
104 }
105 // Do not return a default value
106 return null;
107 }
108
109 @Override
110 protected String getUpdatedUsername(Server server, String username) {
111 // They already gave us a username, don't mess with it
112 if (!isEmpty(username)) {
113 return username;
114 }
115 if (server != null) {
116 // We've successfully located a server in settings.xml, use the username from that
117 getLog().info("Located a username in settings.xml under the server id '" + server.getId() + "' Username: " + server.getUsername());
118 return server.getUsername();
119 }
120 // Do not return a default value
121 return null;
122 }
123
124 @Override
125 protected Properties getContextProperties() {
126 Properties properties = super.getContextProperties();
127 properties.setProperty(DATABASE_PROPERTY, getDatabase());
128 properties.setProperty(DATABASE_PW_PROPERTY, getDatabasePassword());
129 properties.setProperty(DATABASE_USERNAME_PROPERTY, getDatabaseUser());
130 return properties;
131 }
132
133 @Override
134 protected Server getServerFromSettingsKey() {
135 Server server = getSettings().getServer(dbaSettingsKey);
136 if (server != null) {
137 return server;
138 }
139
140 String settingsKey = "impex.dba." + getUrl();
141 return getSettings().getServer(settingsKey);
142 }
143
144 @Override
145 protected void validateConfiguration() throws MojoExecutionException {
146 super.validateConfiguration();
147 if (isEmpty(database)) {
148 throw new MojoExecutionException("\n\nNo database was specified.\nSpecify a database in the plugin configuration or as a system property.\n\nFor example:\n-Ddatabase=MYDB\n\n.");
149 }
150 }
151
152 public String getDatabase() {
153 return database;
154 }
155
156 public void setDatabase(String schema) {
157 this.database = schema;
158 }
159
160 public String getDatabasePassword() {
161 return databasePassword;
162 }
163
164 public void setDatabasePassword(String databasePassword) {
165 this.databasePassword = databasePassword;
166 }
167
168 public String getDatabaseUser() {
169 return databaseUser;
170 }
171
172 public void setDatabaseUser(String databaseUsername) {
173 this.databaseUser = databaseUsername;
174 }
175
176 public String getServerUrl() {
177 return serverUrl;
178 }
179
180 public void setServerUrl(String serverUrl) {
181 this.serverUrl = serverUrl;
182 }
183
184 public String getDbaSettingsKey() {
185 return dbaSettingsKey;
186 }
187
188 public void setDbaSettingsKey(String dbaSettingsKey) {
189 this.dbaSettingsKey = dbaSettingsKey;
190 }
191 }