blob: 1cd06ad3a2177f70223087b17e29bc3c75514260 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000, 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.optional.ejb;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.ant.types.Path;
import java.io.File;
/**
* Execute a Weblogic server.
*
* @author <a href="mailto:conor@cortexebusiness.com.au">Conor MacNeill</a>, Cortex ebusiness Pty Limited
*/
public class WLRun extends Task {
static protected final String DEFAULT_WL51_POLICY_FILE = "weblogic.policy";
static protected final String DEFAULT_WL60_POLICY_FILE = "lib/weblogic.policy";
static protected final String DEFAULT_PROPERTIES_FILE = "weblogic.properties";
/**
* The classpath to be used when running the Java VM. It must contain the weblogic
* classes <b>and</b> the implementation classes of the home and remote interfaces.
*/
private Path classpath;
/**
* The weblogic classpath to the be used when running weblogic.
*/
private Path weblogicClasspath;
private String weblogicMainClass = "weblogic.Server";
/**
* Addional arguments to pass to the JVM used to run weblogic
*/
private String additionalArgs = "";
/**
* The security policy to use when running the weblogic server
*/
private String securityPolicy;
/**
* The weblogic system home directory
*/
private File weblogicSystemHome;
/**
* The weblogic domain
*/
private String weblogicDomainName;
/**
* The name of the weblogic server - used to select the server's directory in the
* weblogic home directory.
*/
private String weblogicSystemName = "myserver";
/**
* The file containing the weblogic properties for this server.
*/
private String weblogicPropertiesFile = null;
/**
* additional args to pass to the spawned jvm
*/
private String additionalJvmArgs = "";
/**
* The location of the BEA Home under which this server is run.
* WL6 only
*/
private File beaHome = null;
/**
* The management username
*/
private String managementUsername = "system";
/**
* The management password
*/
private String managementPassword = null;
/**
* The provate key password - used for SSL
*/
private String pkPassword = null;
/**
* Add the classpath for the user classes
*/
public Path createClasspath() {
if (classpath == null) {
classpath = new Path(project);
}
return classpath.createPath();
}
/**
* Get the classpath to the weblogic classpaths
*/
public Path createWLClasspath() {
if (weblogicClasspath == null) {
weblogicClasspath = new Path(project);
}
return weblogicClasspath.createPath();
}
/**
* Do the work.
*
* The work is actually done by creating a separate JVM to run a helper task.
* This approach allows the classpath of the helper task to be set. Since the
* weblogic tools require the class files of the project's home and remote
* interfaces to be available in the classpath, this also avoids having to
* start ant with the class path of the project it is building.
*
* @exception BuildException if someting goes wrong with the build
*/
public void execute() throws BuildException {
if (weblogicSystemHome == null) {
throw new BuildException("weblogic home must be set");
}
if (!weblogicSystemHome.isDirectory()) {
throw new BuildException("weblogic home directory " + weblogicSystemHome.getPath() +
" is not valid");
}
if (beaHome != null) {
executeWLS6();
} else {
executeWLS();
}
}
private File findSecurityPolicyFile(String defaultSecurityPolicy) {
String securityPolicy = this.securityPolicy;
if (securityPolicy == null) {
securityPolicy = defaultSecurityPolicy;
}
File securityPolicyFile = new File( weblogicSystemHome, securityPolicy );
// If an explicit securityPolicy file was specified, it maybe an
// absolute path. Use the project to resolve it.
if (this.securityPolicy != null && !securityPolicyFile.exists()) {
securityPolicyFile = project.resolveFile(securityPolicy);
}
// If we still can't find it, complain
if (!securityPolicyFile.exists()) {
throw new BuildException("Security policy " + securityPolicy +
" was not found.");
}
return securityPolicyFile;
}
private void executeWLS6() {
File securityPolicyFile = findSecurityPolicyFile( DEFAULT_WL60_POLICY_FILE );
if (!beaHome.isDirectory()) {
throw new BuildException("BEA home " + beaHome.getPath() +
" is not valid");
}
File configFile = new File(weblogicSystemHome, "config/" + weblogicDomainName + "/config.xml");
if (!configFile.exists()) {
throw new BuildException("Server config file " + configFile + " not found.");
}
if (managementPassword == null) {
throw new BuildException("You must supply a management password to start the server");
}
Java weblogicServer = (Java)project.createTask("java");
weblogicServer.setTaskName(getTaskName());
weblogicServer.setFork(true);
weblogicServer.setDir(weblogicSystemHome);
weblogicServer.setClassname(weblogicMainClass);
String jvmArgs = additionalJvmArgs;
jvmArgs += " -Dweblogic.Domain=" + weblogicDomainName;
jvmArgs += " -Dweblogic.Name=" + weblogicSystemName;
jvmArgs += " -Dweblogic.system.home=" + weblogicSystemHome;
jvmArgs += " -Dbea.home=" + beaHome;
jvmArgs += " -Djava.security.policy==" + securityPolicyFile;
jvmArgs += " -Dweblogic.management.username=" + managementUsername;
jvmArgs += " -Dweblogic.management.password=" + managementPassword;
if (pkPassword != null) {
jvmArgs += " -Dweblogic.pkpassword=" + pkPassword;
}
weblogicServer.createJvmarg().setLine(jvmArgs);
weblogicServer.createArg().setLine(additionalArgs);
if (classpath != null) {
weblogicServer.setClasspath(classpath);
}
if (weblogicServer.executeJava() != 0) {
throw new BuildException("Execution of weblogic server failed");
}
}
private void executeWLS() {
File securityPolicyFile = findSecurityPolicyFile( DEFAULT_WL51_POLICY_FILE );
File propertiesFile = null;
if (weblogicPropertiesFile == null) {
weblogicPropertiesFile = DEFAULT_PROPERTIES_FILE;
}
propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile);
if (!propertiesFile.exists()) {
// OK, properties file may be absolute
propertiesFile = project.resolveFile(weblogicPropertiesFile);
if (!propertiesFile.exists()) {
throw new BuildException("Properties file " + weblogicPropertiesFile +
" not found in weblogic home " + weblogicSystemHome +
" or as absolute file");
}
}
Java weblogicServer = (Java)project.createTask("java");
weblogicServer.setTaskName(getTaskName());
weblogicServer.setFork(true);
weblogicServer.setClassname(weblogicMainClass);
String jvmArgs = additionalJvmArgs;
if (weblogicClasspath != null) {
jvmArgs += " -Dweblogic.class.path=" + weblogicClasspath;
}
jvmArgs += " -Djava.security.manager -Djava.security.policy==" + securityPolicyFile;
jvmArgs += " -Dweblogic.system.home=" + weblogicSystemHome;
jvmArgs += " -Dweblogic.system.name=" + weblogicSystemName;
jvmArgs += " -Dweblogic.system.propertiesFile=" + weblogicPropertiesFile;
weblogicServer.createJvmarg().setLine(jvmArgs);
weblogicServer.createArg().setLine(additionalArgs);
if (classpath != null) {
weblogicServer.setClasspath(classpath);
}
if (weblogicServer.executeJava() != 0) {
throw new BuildException("Execution of weblogic server failed");
}
}
/**
* Set the classpath to be used for this execution.
*
* @param s the classpath to use when executing the weblogic server.
*/
public void setClasspath(Path classpath) {
this.classpath = classpath;
}
/**
* Set the weblogic classpath.
*
* The weblogic classpath is used by weblogic to support dynamic class loading.
*
* @param weblogicClasspath the weblogic classpath
*/
public void setWlclasspath(Path weblogicClasspath) {
this.weblogicClasspath = weblogicClasspath;
}
/**
* Set the security policy for this invocation of weblogic.
*
* @param securityPolicy the security policy to use.
*/
public void setPolicy(String securityPolicy) {
this.securityPolicy = securityPolicy;
}
/**
* The location where weblogic lives.
*
* @param weblogicHome the home directory of weblogic.
*
*/
public void setHome(File weblogicHome) {
weblogicSystemHome = weblogicHome;
}
/**
* The location of the BEA Home.
*
* @param beaHome the BEA Home directory.
*
*/
public void setBEAHome(File beaHome) {
this.beaHome = beaHome;
}
/**
* Set the name of the server to run
*
* @param systemName the name of the server.
*/
public void setName(String serverName) {
this.weblogicSystemName = serverName;
}
/**
* Set the Domain to run in
*
* @param domain the domain
*/
public void setDomain(String domain) {
this.weblogicDomainName = domain;
}
/**
* Set the properties file to use.
*
* The location of the properties file is relative to the weblogi system home
*
* @param propertiesFilename the properties file name
*/
public void setProperties(String propertiesFilename) {
this.weblogicPropertiesFile = propertiesFilename;
}
/**
* Set the additional arguments to pass to the weblogic JVM
* @param args the arguments to be passed to the JVM
*/
public void setJvmargs(String args) {
this.additionalJvmArgs = args;
}
/**
* Set the management username to run the server
*
* @param username the management username of the server.
*/
public void setUsername(String username) {
this.managementUsername = username;
}
/**
* Set the management password of the server
*
* @param password the management pasword of the server.
*/
public void setPassword(String password) {
this.managementPassword = password;
}
/**
* Set the private key password so the server can decrypt the SSL private key file.
*
* @param pkpassword the private key password,
*/
public void setPKPassword(String pkpassword) {
this.pkPassword = pkpassword;
}
public void setArgs(String args) {
additionalArgs = args;
}
public void setWeblogicMainClass(String c) {
weblogicMainClass = c;
}
}