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