1 package org.apache.tomcat.maven.plugin.tomcat7; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import org.apache.maven.artifact.manager.WagonManager; 23 import org.apache.maven.plugin.MojoExecutionException; 24 import org.apache.maven.wagon.authentication.AuthenticationInfo; 25 import org.apache.tomcat.maven.common.deployer.TomcatManager; 26 import org.apache.tomcat.maven.common.deployer.TomcatManagerException; 27 import org.codehaus.plexus.util.StringUtils; 28 29 import java.io.IOException; 30 import java.net.MalformedURLException; 31 import java.net.URL; 32 import java.util.StringTokenizer; 33 34 /** 35 * Abstract goal that provides common configuration for Catalina-based goals. 36 * 37 * @author Mark Hobson <markhobson@gmail.com> 38 * @version $Id: AbstractCatalinaMojo.html 1305321 2012-03-26 12:01:12Z olamy $ 39 */ 40 public abstract class AbstractCatalinaMojo 41 extends AbstractTomcat7Mojo 42 { 43 // ---------------------------------------------------------------------- 44 // Constants 45 // ---------------------------------------------------------------------- 46 47 /** 48 * The name of this Maven plugin. Used to produce the user agent when communicating with Tomcat manager. 49 */ 50 private String name = "Apache Tomcat Maven Plugin"; 51 52 /** 53 * The default username to use when authenticating with Tomcat manager. 54 */ 55 private static final String DEFAULT_USERNAME = "admin"; 56 57 /** 58 * The default password to use when authenticating with Tomcat manager. 59 */ 60 private static final String DEFAULT_PASSWORD = ""; 61 62 // ---------------------------------------------------------------------- 63 // Mojo Parameters 64 // ---------------------------------------------------------------------- 65 66 /** 67 * The Maven Wagon manager to use when obtaining server authentication details. 68 * 69 * @component role="org.apache.maven.artifact.manager.WagonManager" 70 * @required 71 * @readonly 72 */ 73 private WagonManager wagonManager; 74 75 /** 76 * The full URL of the Tomcat manager instance to use. 77 * 78 * @parameter expression="${maven.tomcat.url}" default-value="http://localhost:8080/manager/html" 79 * @required 80 */ 81 private URL url; 82 83 /** 84 * The server id in settings.xml to use when authenticating with Tomcat manager, or <code>null</code> to use 85 * defaults of username <code>admin</code> and no password. 86 * 87 * @parameter expression="${maven.tomcat.server}" 88 */ 89 private String server; 90 91 /** 92 * The URL encoding charset to use when communicating with Tomcat manager. 93 * 94 * @parameter expression="${maven.tomcat.charset}" default-value="ISO-8859-1" 95 * @required 96 */ 97 private String charset; 98 99 /** 100 * The tomcat username to use for deployment 101 * 102 * @parameter expression="${tomcat.username}" 103 * @since 1.0-alpha-2 104 */ 105 private String username; 106 107 /** 108 * The password to use for deployment 109 * 110 * @parameter expression="${tomcat.password}" 111 * @since 1.0-alpha-2 112 */ 113 private String password; 114 115 /** 116 * @parameter expression="${plugin.version}" 117 * @required 118 * @readonly 119 */ 120 private String version; 121 122 // ---------------------------------------------------------------------- 123 // Fields 124 // ---------------------------------------------------------------------- 125 126 /** 127 * The Tomcat manager wrapper object. 128 */ 129 private TomcatManager manager; 130 131 // ---------------------------------------------------------------------- 132 // Mojo Implementation 133 // ---------------------------------------------------------------------- 134 135 /** 136 * {@inheritDoc} 137 */ 138 public void execute() 139 throws MojoExecutionException 140 { 141 try 142 { 143 invokeManager(); 144 } 145 catch ( TomcatManagerException exception ) 146 { 147 throw new MojoExecutionException( 148 messagesProvider.getMessage( "AbstractCatalinaMojo.managerError", exception.getMessage() ) ); 149 } 150 catch ( IOException exception ) 151 { 152 throw new MojoExecutionException( messagesProvider.getMessage( "AbstractCatalinaMojo.managerIOError" ), 153 exception ); 154 } 155 } 156 157 // ---------------------------------------------------------------------- 158 // Protected Methods 159 // ---------------------------------------------------------------------- 160 161 /** 162 * Invokes Tomcat manager when this Mojo is executed. 163 * 164 * @throws org.apache.maven.plugin.MojoExecutionException 165 * if there was a problem executing this goal 166 * @throws org.apache.tomcat.maven.common.deployer.TomcatManagerException 167 * if the Tomcat manager request fails 168 * @throws java.io.IOException if an i/o error occurs 169 */ 170 protected abstract void invokeManager() 171 throws MojoExecutionException, TomcatManagerException, IOException; 172 173 /** 174 * Gets the Tomcat manager wrapper object configured for this goal. 175 * 176 * @return the Tomcat manager wrapper object 177 * @throws org.apache.maven.plugin.MojoExecutionException 178 * if there was a problem obtaining the authentication details 179 */ 180 protected TomcatManager getManager() 181 throws MojoExecutionException 182 { 183 // lazily instantiate when config values have been injected 184 if ( manager == null ) 185 { 186 String userName; 187 String password; 188 189 if ( server == null ) 190 { 191 // no server set, use defaults 192 getLog().debug( messagesProvider.getMessage( "AbstractCatalinaMojo.defaultAuth" ) ); 193 userName = DEFAULT_USERNAME; 194 password = DEFAULT_PASSWORD; 195 } 196 else 197 { 198 // obtain authenication details for specified server from wagon 199 AuthenticationInfo info = wagonManager.getAuthenticationInfo( server ); 200 if ( info == null ) 201 { 202 throw new MojoExecutionException( 203 messagesProvider.getMessage( "AbstractCatalinaMojo.unknownServer", server ) ); 204 } 205 206 // derive username 207 userName = info.getUserName(); 208 if ( userName == null ) 209 { 210 getLog().debug( messagesProvider.getMessage( "AbstractCatalinaMojo.defaultUserName" ) ); 211 userName = DEFAULT_USERNAME; 212 } 213 214 // derive password 215 password = info.getPassword(); 216 if ( password == null ) 217 { 218 getLog().debug( messagesProvider.getMessage( "AbstractCatalinaMojo.defaultPassword" ) ); 219 password = DEFAULT_PASSWORD; 220 } 221 } 222 223 // if userName/password are defined in the mojo or the cli they override 224 if ( !StringUtils.isEmpty( this.username ) ) 225 { 226 userName = this.username; 227 password = this.password == null ? "" : this.password; 228 } 229 230 manager = new TomcatManager( url, userName, password, charset ); 231 manager.setUserAgent( name + "/" + version ); 232 } 233 234 return manager; 235 } 236 237 /** 238 * Gets the full URL of the Tomcat manager instance. 239 * 240 * @return the full URL of the Tomcat manager instance to use 241 */ 242 protected URL getURL() 243 { 244 return url; 245 } 246 247 /** 248 * Gets the webapp context path to use when communicating with Tomcat manager. 249 * 250 * @return the webapp context path to use 251 */ 252 protected String getPath() 253 { 254 return path; 255 } 256 257 /** 258 * Gets the URL of the deployed webapp. 259 * 260 * @return the URL of the deployed webapp 261 * @throws java.net.MalformedURLException if the deployed webapp URL is invalid 262 */ 263 protected URL getDeployedURL() 264 throws MalformedURLException 265 { 266 return new URL( getURL(), getPath() ); 267 } 268 269 /** 270 * Splits the given string into lines and writes each one separately to the log at info level. 271 * 272 * @param string the string to write 273 */ 274 protected void log( String string ) 275 { 276 StringTokenizer tokenizer = new StringTokenizer( string, "\n\r" ); 277 278 while ( tokenizer.hasMoreTokens() ) 279 { 280 getLog().info( tokenizer.nextToken() ); 281 } 282 } 283 }