diff --git a/WHATSNEW b/WHATSNEW
index 70b32e7d1..fdcf70d56 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -15,7 +15,7 @@ Other changes:
* Ant now uses JAXP 1.1
-* rmic now supports Kaffe's version of rmic.
+* rmic now supports Kaffe's and Weblogic's version of rmic.
* new magic property build.rmic to chose the rmic implementation
diff --git a/docs/manual/CoreTasks/rmic.html b/docs/manual/CoreTasks/rmic.html
index 6dda8619b..84b924136 100644
--- a/docs/manual/CoreTasks/rmic.html
+++ b/docs/manual/CoreTasks/rmic.html
@@ -28,10 +28,11 @@ supports all attributes of <fileset>
<include>
, <exclude>
and
<patternset>
elements.
It is possible to use different compilers. This can be selected with the
-"build.rmic" property. There are two choices:
+"build.rmic" property. There are three choices:
- sun (the standard compiler of the JDK)
- kaffe (the standard compiler of Kaffe)
+ - weblogic
Parameters
diff --git a/src/main/org/apache/tools/ant/taskdefs/Rmic.java b/src/main/org/apache/tools/ant/taskdefs/Rmic.java
index 2759e2aeb..5e8215cf0 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Rmic.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Rmic.java
@@ -401,7 +401,9 @@ public class Rmic extends MatchingTask {
// Move the generated source file to the base directory
if (null != sourceBase) {
for (int j = 0; j < fileCount; j++) {
- moveGeneratedFile(baseDir, sourceBase, (String) compileList.elementAt(j));
+ moveGeneratedFile(baseDir, sourceBase,
+ (String) compileList.elementAt(j),
+ adapter);
}
}
compileList.removeAllElements();
@@ -412,9 +414,12 @@ public class Rmic extends MatchingTask {
*
* @exception org.apache.tools.ant.BuildException When error copying/removing files.
*/
- private void moveGeneratedFile (File baseDir, File sourceBaseFile, String classname)
+ private void moveGeneratedFile (File baseDir, File sourceBaseFile,
+ String classname,
+ RmicAdapter adapter)
throws BuildException {
- String stubFileName = classname.replace('.', File.separatorChar) + "_Stub.java";
+ String stubFileName = classname.replace('.', File.separatorChar)
+ + adapter.getStubClassSuffix()+".java";
File oldStubFile = new File(baseDir, stubFileName);
File newStubFile = new File(sourceBaseFile, stubFileName);
try {
@@ -426,7 +431,8 @@ public class Rmic extends MatchingTask {
throw new BuildException(msg, ioe, location);
}
if (!"1.2".equals(stubVersion)) {
- String skelFileName = classname.replace('.', '/') + "_Skel.java";
+ String skelFileName = classname.replace('.', File.separatorChar)
+ + adapter.getSkelClassSuffix()+".java";
File oldSkelFile = new File(baseDir, skelFileName);
File newSkelFile = new File(sourceBaseFile, skelFileName);
try {
diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java b/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java
index faad14e3f..aa939da7c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java
@@ -76,21 +76,34 @@ import java.util.Vector;
public abstract class DefaultRmicAdapter implements RmicAdapter {
private Rmic attributes;
+ private FileNameMapper mapper;
+
+ public DefaultRmicAdapter() {
+ }
public void setRmic( Rmic attributes ) {
this.attributes = attributes;
+ mapper = new RmicFileNameMapper();
}
public Rmic getRmic() {
return attributes;
}
+ public String getStubClassSuffix() {
+ return "_Stub";
+ }
+
+ public String getSkelClassSuffix() {
+ return "_Skel";
+ }
+
/**
- * This implementation maps *.class to *_Stub.class and - if
- * stubversion is not 1.2 - to _Skel.class.
+ * This implementation maps *.class to *getStubClassSuffix().class and - if
+ * stubversion is not 1.2 - to *getSkelClassSuffix().class.
*/
public FileNameMapper getMapper() {
- return new RmicFileNameMapper();
+ return mapper;
}
/**
@@ -297,13 +310,13 @@ public abstract class DefaultRmicAdapter implements RmicAdapter {
RmicFileNameMapper() {
stubMapper = new GlobPatternMapper();
stubMapper.setFrom("*.class");
- stubMapper.setTo("*_Stub.class");
+ stubMapper.setTo("*"+getStubClassSuffix()+".class");
// no _Skel file in stub version 1.2
if (!"1.2".equals(attributes.getStubVersion())) {
skelMapper = new GlobPatternMapper();
skelMapper.setFrom("*.class");
- skelMapper.setTo("*_Skel.class");
+ skelMapper.setTo("*"+getSkelClassSuffix()+".class");
}
}
@@ -319,8 +332,9 @@ public abstract class DefaultRmicAdapter implements RmicAdapter {
public String[] mapFileName(String name) {
String[] stubName = stubMapper.mapFileName(name);
- if (stubName == null || name.endsWith("_Stub.class")
- || name.endsWith("_Skel.class")) {
+ if (stubName == null
+ || name.endsWith(getStubClassSuffix()+".class")
+ || name.endsWith(getSkelClassSuffix()+".class")) {
// Not a .class file
return null;
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapter.java b/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapter.java
index 7e044b032..8cc77ff90 100644
--- a/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapter.java
@@ -93,6 +93,18 @@ public interface RmicAdapter {
*/
public FileNameMapper getMapper();
+ /**
+ * Difference between original class file name and the generated
+ * stub class.
+ */
+ public String getStubClassSuffix();
+
+ /**
+ * Difference between original class file name and the generated
+ * skel class.
+ */
+ public String getSkelClassSuffix();
+
/**
* The CLASSPATH this rmic process will use.
*/
diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java b/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java
index e8dc4e586..fe694767d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java
+++ b/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java
@@ -110,8 +110,10 @@ public class RmicAdapterFactory {
if ( rmicType.equalsIgnoreCase("sun") ) {
return new SunRmic();
- } if ( rmicType.equalsIgnoreCase("kaffe") ) {
+ } else if ( rmicType.equalsIgnoreCase("kaffe") ) {
return new KaffeRmic();
+ } else if ( rmicType.equalsIgnoreCase("weblogic") ) {
+ return new WLRmic();
}
return resolveClassName( rmicType );
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java
new file mode 100644
index 000000000..091b7e0b5
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java
@@ -0,0 +1,123 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 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
+ * .
+ */
+
+package org.apache.tools.ant.taskdefs.rmic;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.LogOutputStream;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.Path;
+
+import java.io.*;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/**
+ * The implementation of the rmic for WebLogic
+ *
+ * @author Takashi Okamoto
+ */
+public class WLRmic extends DefaultRmicAdapter {
+
+ public boolean execute() throws BuildException {
+ getRmic().log("Using WebLogic rmic", Project.MSG_VERBOSE);
+ Commandline cmd = setupRmicCommand();
+
+ PrintStream err = System.err;
+ PrintStream out = System.out;
+
+ try {
+ PrintStream logstr =
+ new PrintStream(new LogOutputStream(getRmic(), Project.MSG_WARN));
+ System.setOut(logstr);
+ System.setErr(logstr);
+
+ // Create an instance of the rmic
+ Class c = Class.forName("weblogic.rmic");
+ Method doRmic = c.getMethod("main",
+ new Class [] { String[].class });
+ doRmic.invoke(null, new Object[] { cmd.getArguments() });
+ return true;
+ } catch (ClassNotFoundException ex) {
+ throw new BuildException("Cannot use WebLogic rmic, as it is not available"+
+ " A common solution is to set the environment variable"+
+ " CLASSPATH.", getRmic().getLocation() );
+ }
+ catch (Exception ex) {
+ if (ex instanceof BuildException) {
+ throw (BuildException) ex;
+ } else {
+ throw new BuildException("Error starting WebLogic rmic: ", ex, getRmic().getLocation());
+ }
+ } finally {
+ System.setErr(err);
+ System.setOut(out);
+ }
+ }
+
+ /**
+ * Get the suffix for the rmic stub classes
+ */
+ public String getStubClassSuffix() {
+ return "_WLStub";
+ }
+
+ /**
+ * Get the suffix for the rmic skeleton classes
+ */
+ public String getSkelClassSuffix() {
+ return "_WLSkel";
+ }
+}