package org.codehaus.mojo.weblogic;
/*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.mojo.weblogic.util.WeblogicMojoUtilities;
import weblogic.Deployer;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* This class is a base class for all deployment related mojos.
*
* @author <a href="mailto:scott@theryansplace.com">Scott Ryan</a>
* @version $Id$
* @description Deploy an artifact (war, ear, etc) to a target(s) which can be servers or clusters.
*/
public abstract class DeployMojoBase
extends AbstractWeblogicMojo
{
/**
* The dns hostname of the Weblogic Admin server.
*
* @parameter expression="${weblogic.adminServer.hostName}" default-value="localhost"
*/
private String adminServerHostName;
/**
* The protocol to use to access the Weblogic Admin server for deployment.
*
* @parameter expression="${weblogic.adminServer.protocol}" default-value="t3"
*/
private String adminServerProtocol;
/**
* The admin port of the Weblogic Admin Server.
*
* @parameter expression="${weblogic.adminServer.port}" default-value="7001"
*/
private String adminServerPort;
/**
* The Admin UserId to access the Weblogic Admin server for deployment.
*
* @parameter expression="${weblogic.user}" default-value="weblogic"
*/
private String userId;
/**
* The admin password to access the Weblogic Admin server for deployment.
*
* @parameter expression="${weblogic.password}" default-value="weblogic"
*/
private String password;
/**
* The full path to artifact to be deployed.
*
* @parameter expression="${project.build.directory}/${project.build.finalName}"
*/
private String artifactPath;
/**
* The project packaging used to check the suffix on the artifact.
*
* @parameter expression="${project.packaging}"
*/
private String projectPackaging;
/**
* The name to use when deploying the object.
*
* @parameter expression="${project.artifactId}"
*/
private String name;
/**
* A comma seperated list of names of servers or clusters to deploy the artifact onto.
*
* @parameter expression="${weblogic.targetNames}" default-value="AdminServer"
*/
private String targetNames;
/**
* True if you are running on a machine that is remote to the admin server. If this is a remote deployment and this
* is set to false then it is assumed that all source paths are valid paths on the admin server.
*
* @parameter default-value="false"
*/
private boolean remote;
/**
* True if you want to turn off staging
*
* @parameter default-value="true"
*/
private boolean stage;
/**
* True to turn on debugging
*
* @parameter default-value="false"
*/
private boolean debug;
/**
* True to turn on debugging
*
* @parameter default-value="true"
*/
private boolean verbose;
/**
* Set to true to upload the code.
*
* @parameter default-value="false"
*/
private boolean upload;
/**
* If set to true, the deployer will not stop if a failure is detected.
*
* @parameter default-value="false"
*/
private boolean continueOnFailure;
/**
* Set this value to true so weblogic will return immediately
*
* @parameter default-value="false"
*/
private boolean noWait;
/**
* Set this value to the timeout seconds. Set to <=0 to disable
*
* @parameter default-value="-1"
*/
private int timeout;
/**
* Print the version for weblogic
*
* @parameter default-value="false"
*/
private boolean version;
/**
* Tell weblogic to ignore the versions an apply the task to all versions.
*
* @parameter default-value="false"
*/
private boolean noVersion;
/**
* tell weblogic to not exit if there is a deployment failure.
*
* @parameter default-value="false"
*/
private boolean noExit;
/**
* Deploy the target as an exploded directory. The target should be the
* target directory.
*
* @parameter expression="${weblogic.exploded}" default-value="false"
*/
private boolean exploded;
/**
* Deploy the target with the referenced deployment plan
*
* @parameter expression="${weblogic.deploymentPlanPath}"
*/
private String deploymentPlanPath;
/**
* This method will perform the deployment of the object to the proper server url.
*
* @throws MojoExecutionException Thrown if we fail to obtain a Weblogic deployment instance.
*/
public void execute()
throws MojoExecutionException
{
super.execute();
if ( getLog().isWarnEnabled() )
{
getLog().warn( "Running the Deploy Mojo Base without an implementation" );
}
//throw new MojoExecutionException( "Unimplemented Mojo Base" );
}
/**
* Returns the value for the admin server host name property.
*
* @return The value of the admin server host name property.
*/
public String getAdminServerHostName()
{
return this.adminServerHostName;
}
/**
* Sets the value of the admin server host name property.
*
* @param inAdminServerHostName The new value of the admin server host name property.
*/
public void setAdminServerHostName( final String inAdminServerHostName )
{
this.adminServerHostName = inAdminServerHostName;
}
/**
* Returns the value for the admin server port property.
*
* @return The value of the admin server port property.
*/
public String getAdminServerPort()
{
return this.adminServerPort;
}
/**
* Sets the value of the admin server port property.
*
* @param inAdminServerPort The new value of the admin server port property.
*/
public void setAdminServerPort( final String inAdminServerPort )
{
this.adminServerPort = inAdminServerPort;
}
/**
* Returns the value for the name property.
*
* @return The value of the name property.
*/
public String getName()
{
return this.name;
}
/**
* Sets the value of the name property.
*
* @param inName The new value of the name property.
*/
public void setName( final String inName )
{
this.name = inName;
}
/**
* Returns the value for the password property.
*
* @return The value of the password property.
*/
public String getPassword()
{
return this.password;
}
/**
* Sets the value of the password property.
*
* @param inPassword The new value of the password property.
*/
public void setPassword( final String inPassword )
{
this.password = inPassword;
}
/**
* Returns the value for the target names property.
*
* @return The value of the target names property.
*/
public String getTargetNames()
{
return this.targetNames;
}
/**
* Sets the value of the target names property.
*
* @param inTargetNames The new value of the target names property.
*/
public void setTargetNames( final String inTargetNames )
{
this.targetNames = inTargetNames;
}
/**
* Returns the value for the user id property.
*
* @return The value of the user id property.
*/
public String getUserId()
{
return this.userId;
}
/**
* Sets the value of the user id property.
*
* @param inUserId The new value of the user id property.
*/
public void setUserId( final String inUserId )
{
this.userId = inUserId;
}
/**
* This method will return a list of target by parsing the comma separated list of targets..
*
* @return The value of target list.
*/
public List getTargetList()
{
List targets = new ArrayList();
StringTokenizer tokens = new StringTokenizer( this.getTargetNames(), "," );
while ( tokens.hasMoreTokens() )
{
targets.add( tokens.nextToken() );
}
return targets;
}
/**
* Getter for property remote.
*
* @return The value of remote.
*/
public boolean isRemote()
{
return this.remote;
}
/**
* Setter for the remote.
*
* @param inRemote The value of remote.
*/
public void setRemote( final boolean inRemote )
{
this.remote = inRemote;
}
/**
* Getter for property admin server protocol.
*
* @return The value of admin server protocol.
*/
public String getAdminServerProtocol()
{
return this.adminServerProtocol;
}
/**
* Setter for the admin server protocol.
*
* @param inAdminServerProtocol The value of admin server protocol.
*/
public void setAdminServerProtocol( final String inAdminServerProtocol )
{
this.adminServerProtocol = inAdminServerProtocol;
}
/**
* Setter for the admin server protocol.
*
* @param deploymentPlanPath The path to the deployment plan
*/
public void setDeploymentPlanPath( String deploymentPlanPath )
{
this.deploymentPlanPath = deploymentPlanPath;
}
/**
* This method will build up the parameters required for the various deployment operations.
*
* @param inOperation The deployment operation to take place.
* @return The value of input parameters to be passed to the deployer.
*/
protected String[] getInputParameters( String inOperation )
{
final List parameterList = new ArrayList();
// Create the admin URL
final String adminURL = WeblogicMojoUtilities.getAdminUrl( this.adminServerProtocol, this.adminServerHostName,
this.adminServerPort );
// Load the admin url
parameterList.add( "-adminurl" );
parameterList.add( adminURL );
// add the admin user name
parameterList.add( "-username" );
parameterList.add( this.getUserId() );
// add the admin password
parameterList.add( "-password" );
parameterList.add( this.getPassword() );
if ( this.verbose )
{
parameterList.add( "-verbose" );
}
if ( this.debug )
{
parameterList.add( "-debug" );
}
if ( this.noWait )
{
parameterList.add( "-nowait" );
}
if ( this.timeout > 0 )
{
parameterList.add( "-timeout " + this.timeout );
}
if ( this.version )
{
parameterList.add( "-version" );
}
if ( this.noVersion )
{
parameterList.add( "-noVersion" );
}
if ( this.noExit )
{
parameterList.add( "-noexit" );
}
// Not valid for listapps operation
if ( !inOperation.equalsIgnoreCase( "listapps" ) )
{
// add the artifact name
parameterList.add( "-name" );
parameterList.add( this.getName() );
}
// not use in listabpps
if ( !inOperation.equalsIgnoreCase( "listapps" ) )
{
// add the target comma seperated list
parameterList.add( "-targets" );
parameterList.add( this.getTargetNames() );
}
// Only use these parameters for a deploy operation
if ( inOperation.equalsIgnoreCase( "deploy" ) )
{
// add if remote
if ( this.isRemote() )
{
parameterList.add( "-upload" );
}
parameterList.add( "-source" );
parameterList.add( this.getArtifactPath() );
if ( this.deploymentPlanPath != null && this.deploymentPlanPath.length() > 0 )
{
parameterList.add("-plan");
parameterList.add( this.deploymentPlanPath );
}
}
// Set the operation
String operation = "-" + inOperation;
parameterList.add( operation );
if ( getLog().isInfoEnabled() )
{
getLog().info( "Weblogic Deployment parameters " + parameterList );
}
return (String[]) parameterList.toArray( new String[parameterList.size()] );
}
/**
* Executes the deployer with the given parameters. Returns success or failure.
*
* @param parameters the parameters to execute
* @param errorMessage the error message
* @return success
* @throws MojoExecutionException when the deployer fails and the continueOnFailure is false
*/
protected boolean executeDeployer( String[] parameters, final String errorMessage )
throws MojoExecutionException
{
try
{
if ( getLog().isDebugEnabled() )
{
getLog().debug( "continueOnFailure is " + continueOnFailure );
}
Deployer deployer = new Deployer( parameters );
deployer.run();
}
catch ( Exception e )
{
if ( getLog().isDebugEnabled() )
{
getLog().debug( errorMessage + ": " + e.getMessage() );
}
if ( this.continueOnFailure )
{
getLog().info( "Continuing on failure." );
getLog().error( e );
return false;
}
else
{
throw new MojoExecutionException( errorMessage + ": " + e.getMessage(), e );
}
}
finally
{
WeblogicMojoUtilities.unsetWeblogicProtocolHandler();
}
return true;
}
/**
* Getter for property artifact path. If the {@link #exploded} attribute is set
* the value will be {@link #artifactPath}.
*
* @return The value of artifact path.
*/
public String getArtifactPath()
{
final String fixedArtifactPath;
if ( this.exploded )
{
fixedArtifactPath = this.artifactPath;
}
else
{
fixedArtifactPath = WeblogicMojoUtilities.updateArtifactName( this.artifactPath, this.projectPackaging );
}
if ( getLog().isDebugEnabled() )
{
getLog().debug( "fixedArtifactPath=" + fixedArtifactPath );
}
return fixedArtifactPath;
}
/**
* Setter for the artifact path.
*
* @param inArtifactPath The value of artifact path.
*/
public void setArtifactPath( final String inArtifactPath )
{
this.artifactPath = inArtifactPath;
}
/**
* Getter for property project packaging.
*
* @return The value of project packaging.
*/
public String getProjectPackaging()
{
return projectPackaging;
}
/**
* Setter for the project packaging.
*
* @param inProjectPackaging The value of project packaging.
*/
public void setProjectPackaging( final String inProjectPackaging )
{
this.projectPackaging = inProjectPackaging;
}
/**
* toString methode: creates a String representation of the object
*
* @return the String representation
*/
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append( "DeployMojoBase[" );
buffer.append( "adminServerHostName = " ).append( adminServerHostName );
buffer.append( ", adminServerProtocol = " ).append( adminServerProtocol );
buffer.append( ", adminServerPort = " ).append( adminServerPort );
buffer.append( ", userId = " ).append( userId );
buffer.append( ", password = ****" );
buffer.append( ", artifactPath = " ).append( artifactPath );
buffer.append( ", projectPackaging = " ).append( projectPackaging );
buffer.append( ", name = " ).append( name );
buffer.append( ", targetNames = " ).append( targetNames );
buffer.append( ", remote = " ).append( remote );
buffer.append( "]" );
return buffer.toString();
}
/**
* @return the stage
*/
public boolean isStage()
{
return stage;
}
/**
* @param stage the stage to set
*/
public void setStage( boolean stage )
{
this.stage = stage;
}
/**
* @return the debug
*/
public boolean isDebug()
{
return debug;
}
/**
* @param debug the debug to set
*/
public void setDebug( boolean debug )
{
this.debug = debug;
}
/**
* @return the verbose
*/
public boolean isVerbose()
{
return verbose;
}
/**
* @param verbose the verbose to set
*/
public void setVerbose( boolean verbose )
{
this.verbose = verbose;
}
/**
* @return the upload
*/
public boolean isUpload()
{
return upload;
}
/**
* @param upload the upload to set
*/
public void setUpload( boolean upload )
{
this.upload = upload;
}
/**
* Getter for continueOnFailure
*
* @return true if the deployer should continue
*/
public boolean isContinueOnFailure()
{
return continueOnFailure;
}
/**
* Setter for continue on failure. Set to true so the deployer
* will not stop if there is a failure.
*
* @param continueOnFailure the value to set
*/
public void setContinueOnFailure( boolean continueOnFailure )
{
this.continueOnFailure = continueOnFailure;
}
/**
* Getter for noWait
*
* @return the value of noWait
*/
public boolean isNoWait()
{
return noWait;
}
/**
* Setter for noWait
*
* @param noWait if set to true, weblogic will not wait for deployment success
*/
public void setNoWait( boolean noWait )
{
this.noWait = noWait;
}
/**
* Getter for deployment timeout
*
* @return the timeout in seconds
*/
public int getTimeout()
{
return timeout;
}
/**
* Setter for the deployment timeout
*
* @param timeout in seconds
*/
public void setTimeout( int timeout )
{
this.timeout = timeout;
}
/**
* Getter for version
*
* @return true if weblogic should print the version
*/
public boolean isVersion()
{
return version;
}
/**
* Setter for version
*
* @param version set to true to have weblogic print the version
*/
public void setVersion( boolean version )
{
this.version = version;
}
/**
* Getter for the -noversion flag
*
* @return true if the -noversion flag should be used.
*/
public boolean isNoVersion()
{
return noVersion;
}
/**
* Setter for noVersion.
*
* @param noVersion set to true if the -noversion flag should be used
*/
public void setNoVersion( boolean noVersion )
{
this.noVersion = noVersion;
}
/**
* getter for this.noExit
*
* @return true if weblogic should not use System.exit() when problems arise.
*/
public boolean isNoExit()
{
return noExit;
}
/**
* Setter for this.noExit
*
* @param noExit set to true if weblogic should NOT use System.exit() when problems arise.
*/
public void setNoExit( boolean noExit )
{
this.noExit = noExit;
}
/**
* Getter for {@link #exploded}.
*
* @return true if the deployer should use the target artifact path as the source parameter
*/
public boolean isExploded()
{
return exploded;
}
/**
* Setter for {@link #exploded}.
*
* @param exploded true to use the target artifact path as the -source parameter
*/
public void setExploded( boolean exploded )
{
this.exploded = exploded;
}
}