diff --git a/docs/manual/OptionalTasks/depend.html b/docs/manual/OptionalTasks/depend.html index 044858a0a..441a8b251 100644 --- a/docs/manual/OptionalTasks/depend.html +++ b/docs/manual/OptionalTasks/depend.html @@ -147,6 +147,12 @@ classes. Defaults to false check dependencies No + + warnOnRmiStubs + Flag to disable warnings about files that look like rmic generated stub/skeleton + classes, and which have no .java source. Useful when doing rmi development. + No, default=true +

Parameters specified as nested elements

diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java index eac1d0357..386cd2500 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java @@ -31,6 +31,8 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.taskdefs.rmic.DefaultRmicAdapter; +import org.apache.tools.ant.taskdefs.rmic.WLRmic; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.depend.DependencyAnalyzer; @@ -95,6 +97,11 @@ public class Depend extends MatchingTask { */ private boolean closure = false; + /** + * flag to enable warning if we encounter RMI stubs + */ + private boolean warnOnRmiStubs=true; + /** * Flag which controls whether the reversed dependencies should be * dumped to the log @@ -154,6 +161,16 @@ public class Depend extends MatchingTask { createClasspath().setRefid(r); } + /** + * flag to set to true if you want dependency issues with RMI + * stubs to appear at warning level. + * @param warnOnRmiStubs + * @since Ant1.7 + */ + public void setWarnOnRmiStubs(boolean warnOnRmiStubs) { + this.warnOnRmiStubs = warnOnRmiStubs; + } + /** * Read the dependencies from cache file * @@ -326,10 +343,8 @@ public class Depend extends MatchingTask { while (depEnum.hasMoreElements()) { dependencyList.addElement(depEnum.nextElement()); } - if (dependencyList != null) { - cacheDirty = true; - dependencyMap.put(info.className, dependencyList); - } + cacheDirty = true; + dependencyMap.put(info.className, dependencyList); } // This class depends on each class in the dependency list. For each @@ -454,14 +469,7 @@ public class Depend extends MatchingTask { } if (affectedClassInfo.sourceFile == null) { - if (!affectedClassInfo.isUserWarned) { - log("The class " + affectedClass + " in file " - + affectedClassInfo.absoluteFile.getPath() - + " is out of date due to " + className - + " but has not been deleted because its source file" - + " could not be determined", Project.MSG_WARN); - affectedClassInfo.isUserWarned = true; - } + warnOutOfDateButNotDeleted(affectedClassInfo, affectedClass, className); continue; } @@ -503,6 +511,54 @@ public class Depend extends MatchingTask { return count; } + /** + * warn when a class is out of date, but not deleted as its source is unknown. + * MSG_WARN is the normal level, but we downgrade to MSG_VERBOSE for RMI files + * if {@link #warnOnRmiStubs is false} + * @param affectedClassInfo info about the affectd class + * @param affectedClass the name of the affected .class file + * @param className the file that is triggering the out of dateness + */ + private void warnOutOfDateButNotDeleted( + ClassFileInfo affectedClassInfo, String affectedClass, + String className) { + if (affectedClassInfo.isUserWarned) { + return; + } + int level = Project.MSG_WARN; + if(!warnOnRmiStubs) { + //downgrade warnings on RMI stublike classes, as they are generated + //by rmic, so there is no need to tell the user that their source is + //missing. + if(isRmiStub(affectedClass, className)) { + level=Project.MSG_VERBOSE; + } + } + log("The class " + affectedClass + " in file " + + affectedClassInfo.absoluteFile.getPath() + + " is out of date due to " + className + + " but has not been deleted because its source file" + + " could not be determined", level); + affectedClassInfo.isUserWarned = true; + } + + /** + * test for being an RMI stub + * @param affectedClass + * @param className + * @return + */ + private boolean isRmiStub(String affectedClass, String className) { + return isStub(affectedClass,className, DefaultRmicAdapter.RMI_STUB_SUFFIX) + || isStub(affectedClass, className, DefaultRmicAdapter.RMI_SKEL_SUFFIX) + || isStub(affectedClass, className, WLRmic.RMI_STUB_SUFFIX) + || isStub(affectedClass, className, WLRmic.RMI_SKEL_SUFFIX); + } + + private boolean isStub(String affectedClass,String baseClass,String suffix) { + return (baseClass+suffix).equals(affectedClass); + } + /** * Dump the dependency information loaded from the classes to the Ant log */ @@ -548,7 +604,7 @@ public class Depend extends MatchingTask { private void determineOutOfDateClasses() { outOfDateClasses = new Hashtable(); for (int i = 0; i < srcPathList.length; i++) { - File srcDir = (File) getProject().resolveFile(srcPathList[i]); + File srcDir = getProject().resolveFile(srcPathList[i]); if (srcDir.exists()) { DirectoryScanner ds = this.getDirectoryScanner(srcDir); String[] files = ds.getIncludedFiles(); 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 4eea5cec7..4fa6bf596 100644 --- a/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java +++ b/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java @@ -25,7 +25,6 @@ import org.apache.tools.ant.taskdefs.Rmic; import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.util.FileNameMapper; -import org.apache.tools.ant.util.JavaEnvUtils; /** * This is the default implementation for the RmicAdapter interface. @@ -39,6 +38,9 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { private Rmic attributes; private FileNameMapper mapper; private static final Random rand = new Random(); + public static final String RMI_STUB_SUFFIX = "_Stub"; + public static final String RMI_SKEL_SUFFIX = "_Skel"; + public static final String RMI_TIE_SUFFIX = "_Tie"; public DefaultRmicAdapter() { } @@ -53,15 +55,15 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { } protected String getStubClassSuffix() { - return "_Stub"; + return RMI_STUB_SUFFIX; } protected String getSkelClassSuffix() { - return "_Skel"; + return RMI_SKEL_SUFFIX; } protected String getTieClassSuffix() { - return "_Tie"; + return RMI_TIE_SUFFIX; } /** diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/ForkingSunRmic.java b/src/main/org/apache/tools/ant/taskdefs/rmic/ForkingSunRmic.java index 6f90e1f5f..0b70e63cf 100644 --- a/src/main/org/apache/tools/ant/taskdefs/rmic/ForkingSunRmic.java +++ b/src/main/org/apache/tools/ant/taskdefs/rmic/ForkingSunRmic.java @@ -23,8 +23,8 @@ package org.apache.tools.ant.taskdefs.rmic; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.JavaEnvUtils; import org.apache.tools.ant.taskdefs.Rmic; -import org.apache.tools.ant.taskdefs.Java; import org.apache.tools.ant.taskdefs.Execute; import org.apache.tools.ant.taskdefs.LogStreamHandler; import org.apache.tools.ant.types.Commandline; @@ -56,7 +56,7 @@ public class ForkingSunRmic extends DefaultRmicAdapter { Commandline cmd = setupRmicCommand(); Project project=owner.getProject(); //rely on RMIC being on the path - cmd.setExecutable(SunRmic.RMIC_EXECUTABLE); + cmd.setExecutable(JavaEnvUtils.getJdkExecutable(SunRmic.RMIC_EXECUTABLE)); //set up the args String[] args=cmd.getCommandline(); diff --git a/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java index 3c80c493a..17215b5c3 100644 --- a/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java +++ b/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java @@ -40,6 +40,8 @@ public class WLRmic extends DefaultRmicAdapter { + "set the environment variable " + "CLASSPATH."; public static final String ERROR_WLRMIC_FAILED = "Error starting WebLogic rmic: "; + public static final String RMI_STUB_SUFFIX = "_WLStub"; + public static final String RMI_SKEL_SUFFIX = "_WLSkel"; public boolean execute() throws BuildException { getRmic().log("Using WebLogic rmic", Project.MSG_VERBOSE); @@ -80,13 +82,13 @@ public class WLRmic extends DefaultRmicAdapter { * Get the suffix for the rmic stub classes */ public String getStubClassSuffix() { - return "_WLStub"; + return RMI_STUB_SUFFIX; } /** * Get the suffix for the rmic skeleton classes */ public String getSkelClassSuffix() { - return "_WLSkel"; + return RMI_SKEL_SUFFIX; } }