<rvanoostrum@ezgov.com> and Larry V. Streepy, Jr. <streepy@healthlanguage.com> on the ant-user mailing list: (1) don't even try to perform uptodate checks for IDL mode or when the -always(generate) option for IIOP mode has been specified (2) ignore -keepgenerated in IDL mode (we don't know what to keep) (3) use the correct target file names in IIOP mode. PR: 1625 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269263 13f79535-47bb-0310-9956-ffa450edef68master
@@ -65,6 +65,7 @@ import org.apache.tools.ant.util.*; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.rmi.Remote; | |||
import java.util.Vector; | |||
/** | |||
@@ -400,10 +401,16 @@ 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), | |||
adapter); | |||
if (idl) { | |||
log("Cannot determine sourcefiles in idl mode, ", | |||
Project.MSG_WARN); | |||
log("sourcebase attribute will be ignored.", Project.MSG_WARN); | |||
} else { | |||
for (int j = 0; j < fileCount; j++) { | |||
moveGeneratedFile(baseDir, sourceBase, | |||
(String) compileList.elementAt(j), | |||
adapter); | |||
} | |||
} | |||
} | |||
compileList.removeAllElements(); | |||
@@ -446,8 +453,20 @@ public class Rmic extends MatchingTask { | |||
*/ | |||
protected void scanDir(File baseDir, String files[], | |||
FileNameMapper mapper) { | |||
SourceFileScanner sfs = new SourceFileScanner(this); | |||
String[] newFiles = sfs.restrict(files, baseDir, baseDir, mapper); | |||
String[] newFiles = files; | |||
if (idl) { | |||
log("will leave uptodate test to rmic implementation in idl mode.", | |||
Project.MSG_VERBOSE); | |||
} else if (iiop | |||
&& iiopopts != null && iiopopts.indexOf("-always") > -1) { | |||
log("no uptodate test as -always option has been specified", | |||
Project.MSG_VERBOSE); | |||
} else { | |||
SourceFileScanner sfs = new SourceFileScanner(this); | |||
newFiles = sfs.restrict(files, baseDir, baseDir, mapper); | |||
} | |||
for (int i = 0; i < newFiles.length; i++) { | |||
String classname = newFiles[i].replace(File.separatorChar, '.'); | |||
classname = classname.substring(0, classname.lastIndexOf(".class")); | |||
@@ -461,8 +480,8 @@ public class Rmic extends MatchingTask { | |||
public boolean isValidRmiRemote(String classname) { | |||
try { | |||
Class testClass = loader.loadClass(classname); | |||
// One cannot RMIC an interface | |||
if (testClass.isInterface()) { | |||
// One cannot RMIC an interface for "classic" RMI (JRMP) | |||
if (testClass.isInterface() && !iiop && !idl) { | |||
return false; | |||
} | |||
return isValidRmiRemote(testClass); | |||
@@ -482,30 +501,35 @@ public class Rmic extends MatchingTask { | |||
} | |||
/** | |||
* Check to see if the class or (super)interfaces implement | |||
* java.rmi.Remote. | |||
* Returns the topmost interface that extends Remote for a given | |||
* class - if one exists. | |||
*/ | |||
private boolean isValidRmiRemote (Class testClass) { | |||
Class rmiRemote = java.rmi.Remote.class; | |||
if (rmiRemote.equals(testClass)) { | |||
// This class is java.rmi.Remote | |||
return true; | |||
} | |||
Class [] interfaces = testClass.getInterfaces(); | |||
if (interfaces != null) { | |||
for (int i = 0; i < interfaces.length; i++) { | |||
if (rmiRemote.equals(interfaces[i])) { | |||
// This class directly implements java.rmi.Remote | |||
return true; | |||
} | |||
if (isValidRmiRemote(interfaces[i])) { | |||
return true; | |||
public Class getRemoteInterface(Class testClass) { | |||
if (Remote.class.isAssignableFrom(testClass)) { | |||
Class [] interfaces = testClass.getInterfaces(); | |||
if (interfaces != null) { | |||
for (int i = 0; i < interfaces.length; i++) { | |||
if (Remote.class.isAssignableFrom(interfaces[i])) { | |||
return interfaces[i]; | |||
} | |||
} | |||
} | |||
} | |||
return false; | |||
return null; | |||
} | |||
/** | |||
* Check to see if the class or (super)interfaces implement | |||
* java.rmi.Remote. | |||
*/ | |||
private boolean isValidRmiRemote (Class testClass) { | |||
return getRemoteInterface(testClass) != null; | |||
} | |||
/** | |||
* Classloader for the user-specified classpath. | |||
*/ | |||
public ClassLoader getLoader() {return loader;} | |||
} | |||
@@ -60,6 +60,7 @@ import org.apache.tools.ant.types.*; | |||
import org.apache.tools.ant.util.*; | |||
import java.io.File; | |||
import java.util.Random; | |||
import java.util.Vector; | |||
/** | |||
@@ -320,6 +321,8 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { | |||
} | |||
} | |||
private final static Random rand = new Random(); | |||
/** | |||
* Mapper that possibly returns two file names, *_Stub and *_Skel. | |||
*/ | |||
@@ -353,19 +356,30 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { | |||
return null; | |||
} | |||
if (!attributes.getIiop()) { | |||
/* | |||
* fallback in case we have trouble loading the class or | |||
* don't know how to handle it (there is no easy way to | |||
* know what IDL mode would generate. | |||
* | |||
* This is supposed to make Ant always recompile the | |||
* class, as a file of that name should not exist. | |||
*/ | |||
String[] target = new String[] {name+".tmp."+rand.nextLong()}; | |||
if (!attributes.getIiop() && !attributes.getIdl()) { | |||
// JRMP with simple naming convention | |||
if ("1.2".equals(attributes.getStubVersion())) { | |||
return new String[] { | |||
target = new String[] { | |||
base + getStubClassSuffix() + ".class" | |||
}; | |||
} else { | |||
return new String[] { | |||
target = new String[] { | |||
base + getStubClassSuffix() + ".class", | |||
base + getSkelClassSuffix() + ".class", | |||
}; | |||
} | |||
} else { | |||
int lastSlash = base.lastIndexOf("/"); | |||
} else if (!attributes.getIdl()) { | |||
int lastSlash = base.lastIndexOf(File.separatorChar); | |||
String dirname = ""; | |||
/* | |||
@@ -382,11 +396,55 @@ public abstract class DefaultRmicAdapter implements RmicAdapter { | |||
String filename = base.substring(index); | |||
return new String[] { | |||
dirname + "_" + filename + getStubClassSuffix() + ".class", | |||
dirname + "_" + filename + getTieClassSuffix() + ".class" | |||
}; | |||
try { | |||
Class c = attributes.getLoader().loadClass(classname); | |||
if (c.isInterface()) { | |||
// only stub, no tie | |||
target = new String[] { | |||
dirname + "_" + filename + getStubClassSuffix() | |||
+ ".class" | |||
}; | |||
} else { | |||
/* | |||
* stub is derived from implementation, | |||
* tie from interface name. | |||
*/ | |||
Class interf = attributes.getRemoteInterface(c); | |||
String iName = interf.getName(); | |||
String iDir = ""; | |||
int iIndex = -1; | |||
int lastDot = iName.lastIndexOf("."); | |||
if (lastDot == -1) { | |||
// no package | |||
iIndex = 0; | |||
} else { | |||
iIndex = lastDot + 1; | |||
iDir = iName.substring(0, iIndex); | |||
iDir = iDir.replace('.', File.separatorChar); | |||
} | |||
target = new String[] { | |||
dirname + "_" + filename + getTieClassSuffix() | |||
+ ".class", | |||
iDir + "_" + iName.substring(iIndex) | |||
+ getStubClassSuffix() + ".class" | |||
}; | |||
} | |||
} catch (ClassNotFoundException e) { | |||
attributes.log("Unable to verify class " + classname | |||
+ ". It could not be found.", | |||
Project.MSG_WARN); | |||
} catch (NoClassDefFoundError e) { | |||
attributes.log("Unable to verify class " + classname | |||
+ ". It is not defined.", Project.MSG_WARN); | |||
} catch (Throwable t) { | |||
attributes.log("Unable to verify class " + classname | |||
+ ". Loading caused Exception: " | |||
+ t.getMessage(), Project.MSG_WARN); | |||
} | |||
} | |||
return target; | |||
} | |||
} | |||