diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java index 62353b095..ab9258e2c 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java @@ -556,46 +556,15 @@ public class GenericDeploymentTool implements EJBDeploymentTool { log("looking at interface " + c.getName(), Project.MSG_VERBOSE); Class[] interfaces = c.getInterfaces(); for (int i = 0; i < interfaces.length; i++){ - log(" implements " + interfaces[i].getName(), Project.MSG_VERBOSE); - if (!interfaces[i].getName().equals("javax.ejb.EJBObject")) // do not add home interfaces - { - File superClassFile = new File(srcDir.getAbsolutePath() - + File.separatorChar - + interfaces[i].getName().replace('.',File.separatorChar) - + ".class" - ); - if (superClassFile.exists() && superClassFile.isFile()) - { - if (checkInterfaceClasses(interfaces[i].getName().replace('.',File.separatorChar)+".class", - superClassFile, checkEntries)) - { - checkEntries.put(interfaces[i].getName().replace('.',File.separatorChar)+".class", - superClassFile); - } - } - } + addInterface(interfaces[i], checkEntries); } } else // get as a class { log("looking at class " + c.getName(), Project.MSG_VERBOSE); Class s = c.getSuperclass(); - if (!s.getName().equals("java.lang.Object")) - { - File superClassFile = new File(srcDir.getAbsolutePath() - + File.separatorChar - + s.getName().replace('.',File.separatorChar) - + ".class" - ); - if (superClassFile.exists() && superClassFile.isFile()) - { - checkSuperClasses(s.getName().replace('.',File.separatorChar) + ".class", - superClassFile, checkEntries); - checkEntries.put(s.getName().replace('.',File.separatorChar) + ".class", - superClassFile); - } - } + addSuperClass(c.getSuperclass(), checkEntries); } } //if primative } @@ -606,7 +575,51 @@ public class GenericDeploymentTool implements EJBDeploymentTool { } //if } // while } + + private void addInterface(Class theInterface, Hashtable checkEntries) { + if (!theInterface.getName().startsWith("java")) // do not add system interfaces + { + File interfaceFile = new File(srcDir.getAbsolutePath() + + File.separatorChar + + theInterface.getName().replace('.',File.separatorChar) + + ".class" + ); + if (interfaceFile.exists() && interfaceFile.isFile()) + { + checkEntries.put(theInterface.getName().replace('.',File.separatorChar)+".class", + interfaceFile); + Class[] superInterfaces = theInterface.getInterfaces(); + for (int i = 0; i < superInterfaces.length; i++) { + addInterface(superInterfaces[i], checkEntries); + } + } + } + } + private void addSuperClass(Class superClass, Hashtable checkEntries) { + + if (!superClass.getName().startsWith("java")) + { + File superClassFile = new File(srcDir.getAbsolutePath() + + File.separatorChar + + superClass.getName().replace('.',File.separatorChar) + + ".class"); + if (superClassFile.exists() && superClassFile.isFile()) + { + checkEntries.put(superClass.getName().replace('.',File.separatorChar) + ".class", + superClassFile); + + // now need to get super classes and interfaces for this class + Class[] superInterfaces = superClass.getInterfaces(); + for (int i = 0; i < superInterfaces.length; i++) { + addInterface(superInterfaces[i], checkEntries); + } + + addSuperClass(superClass.getSuperclass(), checkEntries); + } + } + } + /** * Returns a Classloader object which parses the passed in generic EjbJar classpath. * The loader is used to dynamically load classes from javax.ejb.* and the classes @@ -630,100 +643,6 @@ public class GenericDeploymentTool implements EJBDeploymentTool { return classpathLoader; } - /** - * Checks to see if a Superclass of an Object needs to be included in the EJB Jar. - * This is done my checking the class and if it inherits from a superclass and that - * superclass is available then it includes that in the Hashtable of entries to be added - * to the Jar. - * - */ - protected void checkSuperClasses(String entryName, File entryFile, Hashtable checkEntries) - { - try - { - if (entryName.endsWith(".class")) //sanity check - { - // Load class to check superclass and interfaces - ClassLoader loader = getClassLoaderForBuild(); - String classname = entryName.substring(0,entryName.lastIndexOf(".class")).replace(File.separatorChar,'.'); - Class c = loader.loadClass(classname); - - Class s = c.getSuperclass(); - if (!s.getName().equals("java.lang.Object")) - { - File superClassFile = new File(srcDir.getAbsolutePath() - + File.separatorChar - + s.getName().replace('.',File.separatorChar) - + ".class" - ); - if (superClassFile.exists() && superClassFile.isFile()){ - checkSuperClasses(s.getName().replace('.',File.separatorChar) + ".class", superClassFile, checkEntries); - checkEntries.put(s.getName().replace('.',File.separatorChar) + ".class", superClassFile); - } - } - } - } - catch(ClassNotFoundException cnfe){ - String cnfmsg = "ClassNotFoundException while processing ejb-jar file" - + ". Details: " - + cnfe.getMessage(); - throw new BuildException(cnfmsg, cnfe); - } - } - - /** - * Checks to see if an interface extends another interface and if the final interface on the - * chain implements javax.ejb.EJBObject the it includes all interfaces in that chain in the Jar. - * - */ - protected boolean checkInterfaceClasses(String entryName, File entryFile, Hashtable checkEntries) - { - boolean addit = false; - try - { - if (entryName.endsWith(".class")) //sanity check - { - // Load class to check superclass and interfaces - ClassLoader loader = getClassLoaderForBuild(); - String classname = entryName.substring(0,entryName.lastIndexOf(".class")).replace(File.separatorChar,'.'); - Class c = loader.loadClass(classname); - - Class[] interfaces = c.getInterfaces(); - for (int i = 0; i < interfaces.length; i++){ - if (!interfaces[i].getName().equals("javax.ejb.EJBObject")){ // do not add home interfaces - File superClassFile = new File(srcDir.getAbsolutePath() - + File.separatorChar - + interfaces[i].getName().replace('.',File.separatorChar) - + ".class" - ); - if (superClassFile.exists() && superClassFile.isFile()){ - log("looking at interface " + interfaces[i].getName(), Project.MSG_VERBOSE); - - addit = checkInterfaceClasses(interfaces[i].getName().replace('.',File.separatorChar)+".class", - superClassFile, checkEntries); - if (addit) - { - log("adding at interface " + interfaces[i].getName(), Project.MSG_VERBOSE); - checkEntries.put(interfaces[i].getName().replace('.',File.separatorChar)+".class", - superClassFile); - } - } - } - else { - addit = true; - } - } - } - } - catch(ClassNotFoundException cnfe){ - String cnfmsg = "ClassNotFoundException while processing ejb-jar file" - + ". Details: " - + cnfe.getMessage(); - throw new BuildException(cnfmsg, cnfe); - } - return addit; - } - /** * Called to validate that the tool parameters have been configured. *