1 /*
2 * ========================================================================
3 *
4 * Copyright 2003 The Apache Software Foundation.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * ========================================================================
19 */
20 package org.apache.cactus.integration.ant.container.weblogic;
21
22 import java.io.File;
23 import java.io.IOException;
24
25 import org.apache.cactus.integration.ant.container.AbstractJavaContainer;
26 import org.apache.cactus.integration.ant.util.ResourceUtils;
27 import org.apache.tools.ant.BuildException;
28 import org.apache.tools.ant.taskdefs.Jar;
29 import org.apache.tools.ant.taskdefs.Java;
30 import org.apache.tools.ant.types.FilterChain;
31 import org.apache.tools.ant.types.Path;
32 import org.apache.tools.ant.types.ZipFileSet;
33 import org.apache.tools.ant.util.FileUtils;
34
35 /**
36 * Special container support for the Bea WebLogic 7.x application server.
37 *
38 * TODO: this doesn't work for me on JDK 1.3.1 and WL 7.0 SP2
39 *
40 * @version $Id: WebLogic7xContainer.java,v 1.17 2005/01/29 15:49:18 vmassol Exp $
41 */
42 public class WebLogic7xContainer extends AbstractJavaContainer
43 {
44
45 // Instance Variables ------------------------------------------------------
46
47 /**
48 * The Bea home directory.
49 */
50 private File beaHome;
51
52 /**
53 * The WebLogic 7.x installation directory. For example:
54 * "c:\bea\weblogic700".
55 */
56 private File dir;
57
58 /**
59 * The port to which the container should be bound.
60 */
61 private int port = 8080;
62
63 /**
64 * A user-specific <code>config.xml</code> WebLogic configuration file.
65 * If this variable is not set, the default configuration file from the
66 * JAR resources will be used.
67 */
68 private File configXml;
69
70 /**
71 * The temporary directory from which the container will be started.
72 */
73 private File tmpDir;
74
75 // Public Methods ----------------------------------------------------------
76
77 /**
78 * Sets the Bea home directory.
79 *
80 * @param theBeaHome The BEA home directory
81 */
82 public final void setBeaHome(File theBeaHome)
83 {
84 this.beaHome = theBeaHome;
85 }
86
87 /**
88 * Sets the WebLogic 7.x installation directory.
89 *
90 * @param theDir The directory to set
91 */
92 public final void setDir(File theDir)
93 {
94 this.dir = theDir;
95 }
96
97 /**
98 * Sets the port to which the container should listen.
99 *
100 * @param thePort The port to set
101 */
102 public final void setPort(int thePort)
103 {
104 this.port = thePort;
105 }
106
107 /**
108 * Sets the configuration file to use for the test installation of
109 * WebLogic.
110 *
111 * @param theConfigXml The custom <code>config.xml</code> file
112 */
113 public final void setConfigXml(File theConfigXml)
114 {
115 this.configXml = theConfigXml;
116 }
117
118 /**
119 * Sets the temporary installation directory.
120 *
121 * @param theTmpDir The temporary directory to set
122 */
123 public final void setTmpDir(File theTmpDir)
124 {
125 this.tmpDir = theTmpDir;
126 }
127
128 // AbstractContainer Implementation ----------------------------------------
129
130 /**
131 * @see org.apache.cactus.integration.ant.container.Container#getName
132 */
133 public final String getName()
134 {
135 return "WebLogic 7.x";
136 }
137
138 /**
139 * Returns the port to which the container should listen.
140 *
141 * @return The port
142 */
143 public final int getPort()
144 {
145 return this.port;
146 }
147
148 /**
149 * @see org.apache.cactus.integration.ant.container.Container#init
150 */
151 public final void init()
152 {
153 if (!this.dir.isDirectory())
154 {
155 throw new BuildException(this.dir + " is not a directory");
156 }
157
158 // If the beaHome attribute is not set, guess the bea home
159 // directory using the parent directory of this.dir
160 if (this.beaHome == null)
161 {
162 getLog().debug("Extrapolating beaHome to be ["
163 + this.dir.getParentFile() + "]");
164 this.beaHome = this.dir.getParentFile();
165 }
166 }
167
168 /**
169 * @see org.apache.cactus.integration.ant.container.Container#startUp
170 */
171 public final void startUp()
172 {
173 try
174 {
175 prepare("cactus/weblogic7x");
176
177 Java java = createJavaForStartUp();
178 java.setDir(new File(this.tmpDir, "testdomain"));
179
180 java.createJvmarg().setValue("-hotspot");
181 java.createJvmarg().setValue("-Xms32m");
182 java.createJvmarg().setValue("-Xmx200m");
183
184 File serverDir = new File(this.dir, "server");
185
186 java.addSysproperty(
187 createSysProperty("weblogic.Name", "testserver"));
188 java.addSysproperty(
189 createSysProperty("bea.home", this.beaHome));
190 java.addSysproperty(
191 createSysProperty("weblogic.management.username", "weblogic"));
192 java.addSysproperty(
193 createSysProperty("weblogic.management.password", "weblogic"));
194
195 // Note: The "=" in the call below is on purpose. It is left so that
196 // we end up with:
197 // -Djava.security.policy==./server/lib/weblogic.policy
198 // (otherwise, we would end up with:
199 // -Djava.security.policy=./server/lib/weblogic.policy, which
200 // will not add to the security policy but instead replace it).
201 java.addSysproperty(
202 createSysProperty("java.security.policy",
203 "=./server/lib/weblogic.policy"));
204
205 Path classpath = java.createClasspath();
206 classpath.createPathElement().setLocation(
207 new File(serverDir, "lib/weblogic_sp.jar"));
208 classpath.createPathElement().setLocation(
209 new File(serverDir, "lib/weblogic.jar"));
210
211 java.setClassname("weblogic.Server");
212 java.execute();
213 }
214 catch (IOException ioe)
215 {
216 getLog().error("Failed to startup the container", ioe);
217 throw new BuildException(ioe);
218 }
219 }
220
221 /**
222 * @see org.apache.cactus.integration.ant.container.Container#shutDown
223 */
224 public final void shutDown()
225 {
226 Java java = createJavaForShutDown();
227
228 File serverDir = new File(this.dir, "server");
229
230 Path classpath = java.createClasspath();
231 classpath.createPathElement().setLocation(
232 new File(serverDir, "lib/weblogic_sp.jar"));
233 classpath.createPathElement().setLocation(
234 new File(serverDir, "lib/weblogic.jar"));
235
236 java.setClassname("weblogic.Admin");
237 java.createArg().setValue("-url");
238 java.createArg().setValue("t3://" + this.getServer() + ":" + getPort());
239 java.createArg().setValue("-username");
240 java.createArg().setValue("weblogic");
241 java.createArg().setValue("-password");
242 java.createArg().setValue("weblogic");
243
244 // Forcing WebLogic shutdown to speed up the shutdown process
245 java.createArg().setValue("FORCESHUTDOWN");
246
247 java.execute();
248 }
249
250 // Private Methods ---------------------------------------------------------
251
252 /**
253 * Prepares a temporary installation of the container and deploys the
254 * web-application.
255 *
256 * @param theDirName The name of the temporary container installation
257 * directory
258 * @throws IOException If an I/O error occurs
259 */
260 private void prepare(String theDirName) throws IOException
261 {
262 FileUtils fileUtils = FileUtils.newFileUtils();
263 FilterChain filterChain = createFilterChain();
264
265 this.tmpDir = setupTempDirectory(this.tmpDir, theDirName);
266 cleanTempDirectory(this.tmpDir);
267
268 File testDomainDir = createDirectory(this.tmpDir, "testdomain");
269
270 if (this.configXml != null)
271 {
272 fileUtils.copyFile(this.configXml,
273 new File(testDomainDir, "config.xml"));
274 }
275 else
276 {
277 ResourceUtils.copyResource(getProject(),
278 RESOURCE_PATH + "weblogic7x/config.xml",
279 new File(testDomainDir, "config.xml"),
280 filterChain);
281 }
282
283 ResourceUtils.copyResource(getProject(),
284 RESOURCE_PATH + "weblogic7x/DefaultAuthenticatorInit.ldift",
285 new File(testDomainDir, "DefaultAuthenticatorInit.ldift"),
286 filterChain);
287
288 // TODO: For improvement, do not copy the weblogic.xml file
289 // in the tmpdir.
290
291 // Extract the weblogic.xml descriptor
292 File weblogicXml = new File(this.tmpDir, "weblogic.xml");
293 ResourceUtils.copyResource(getProject(),
294 RESOURCE_PATH + "weblogic7x/weblogic.xml",
295 weblogicXml, filterChain);
296
297 // deploy the web-app by copying the WAR file into the applications
298 // directory, adding the weblogic.xml descriptor in WEB-INF
299 File applicationsDir =
300 createDirectory(testDomainDir, "applications");
301 Jar jar = (Jar) createAntTask("jar");
302 jar.setDestFile(new File(applicationsDir,
303 getDeployableFile().getFile().getName()));
304 ZipFileSet zip = new ZipFileSet();
305 zip.setSrc(getDeployableFile().getFile());
306 jar.addZipfileset(zip);
307 ZipFileSet fileSet = new ZipFileSet();
308 fileSet.setDir(this.tmpDir);
309 fileSet.createInclude().setName("weblogic.xml");
310 fileSet.setPrefix("WEB-INF");
311 jar.addZipfileset(fileSet);
312 jar.execute();
313 }
314
315 }