From: Waite, H. <hol...@ba...> - 2004-12-28 23:42:33
|
I'm trying to write an XDoclet body tag that iterates through an abstract class' unimplemented methods. In addition to searching the inheritance tree for abstract methods, I presume that I would also need to examine all implemented interfaces. For some reason, XClass interfaces are not being identified as such and 'getMethods()' is returning an empty collection. Things work fine for XClass objects that represent classes (test.bean.TestBean1Ejb). j2ee.jar is included the classpath defined in my ANT file. Any idea where I'm going wrong? package whatever; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import xdoclet.XDocletException; import xdoclet.tagshandler.AbstractProgramElementTagsHandler; import xjavadoc.XClass; import xjavadoc.XMethod; /** Deals with (abstract) class' unimplemented methods. */ public class UnimplementedMethodsHandler extends AbstractProgramElementTagsHandler { // constants ---------------------------------------------------------------------------- ---- private static final DummyLogger LOGGER = new DummyLogger(); // methods ---------------------------------------------------------------------------- ------ /** * Evaluate body for each method that requires an implementation. Accounts for access * modifiers and class hierarchies. What happens is class overrides abstract method * which it can't see? What if abstract method overrides concrete method? */ public void forAllUnimplementedMethods( String pTemplate, Properties pAttributes ) throws XDocletException { if(getCurrentClass() == null) throw new XDocletException("Current class is null"); final Map methods = unimplementedMethods(getCurrentClass()); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Unimplemented methods: " + methods.keySet()); } for (Iterator iter = methods.values().iterator(); iter.hasNext();) { final XMethod method = (XMethod) iter.next(); setCurrentMethod(method); setCurrentClass(method.getContainingClass()); generate(pTemplate); } } /** * Return collection of all methods that would need to be * implemented by a concrete subclass/implementor. * @return Map from signature (String) to XMethod */ private static Map unimplementedMethods(XClass pClass) { LOGGER.debug("Finding unimplemented methods for " + pClass.getName() + "..."); // map from full signature to XMethods declared in interfaces final Map interfaceMethods = new HashMap(); // add methods for super-interfaces // I assume that 'getInterfaces()' includes interfaces declared in superclasses for (Iterator iter = pClass.getInterfaces().iterator(); iter.hasNext();) { interfaceMethods.putAll(unimplementedMethods((XClass) iter.next())); } LOGGER.debug(pClass.getQualifiedName() + " interface? " + pClass.isInterface()); LOGGER.debug( pClass.getQualifiedName() + " subclass of Object? " + pClass.isSubclassOf("java.lang.Object", true) ); LOGGER.debug( pClass.getQualifiedName() + " has " + pClass.getMethods().size() + " method(s)" ); // TODO... return Collections.EMPTY_MAP; } } Output: ----------------- Buildfile: C:\eclipse\workspace\CmpWrapTest\build.xml cmpwrap: compile: [javac] Compiling 1 source file to C:\eclipse\workspace\CmpWrap\generated\bin2 build: [jar] Building jar: C:\eclipse\workspace\CmpWrap\generated\cmpwrap.jar [cmpwrap] (XDocletMain.start 47 ) Running <twostagedatamanagement/> [cmpwrap] (TemplateSubTask.engineStarted 802 ) Generating output for 'test.bean.TestBean1Ejb' using template file 'jar:file:C:\eclipse\workspace\CmpWrap\generated\cmpwrap.jar!/twostagedatama nagement.xdt'. [cmpwrap] Finding unimplemented methods for TestBean1Ejb... [cmpwrap] Finding unimplemented methods for EntityBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] Finding unimplemented methods for EnterpriseBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] javax.ejb.EnterpriseBean interface? false [cmpwrap] javax.ejb.EnterpriseBean subclass of Object? false [cmpwrap] javax.ejb.EnterpriseBean has 0 method(s) [cmpwrap] javax.ejb.EntityBean interface? false [cmpwrap] javax.ejb.EntityBean subclass of Object? false [cmpwrap] javax.ejb.EntityBean has 0 method(s) [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] Finding unimplemented methods for EnterpriseBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] javax.ejb.EnterpriseBean interface? false [cmpwrap] javax.ejb.EnterpriseBean subclass of Object? false [cmpwrap] javax.ejb.EnterpriseBean has 0 method(s) [cmpwrap] test.bean.TestBean1Ejb interface? false [cmpwrap] test.bean.TestBean1Ejb subclass of Object? true [cmpwrap] test.bean.TestBean1Ejb has 8 method(s) [cmpwrap] Unimplemented methods: [] [cmpwrap] Finding unimplemented methods for TestBean1Ejb... [cmpwrap] Finding unimplemented methods for EntityBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] Finding unimplemented methods for EnterpriseBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] javax.ejb.EnterpriseBean interface? false [cmpwrap] javax.ejb.EnterpriseBean subclass of Object? false [cmpwrap] javax.ejb.EnterpriseBean has 0 method(s) [cmpwrap] javax.ejb.EntityBean interface? false [cmpwrap] javax.ejb.EntityBean subclass of Object? false [cmpwrap] javax.ejb.EntityBean has 0 method(s) [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] Finding unimplemented methods for EnterpriseBean... [cmpwrap] Finding unimplemented methods for Serializable... [cmpwrap] java.io.Serializable interface? false [cmpwrap] java.io.Serializable subclass of Object? false [cmpwrap] java.io.Serializable has 0 method(s) [cmpwrap] javax.ejb.EnterpriseBean interface? false [cmpwrap] javax.ejb.EnterpriseBean subclass of Object? false [cmpwrap] javax.ejb.EnterpriseBean has 0 method(s) [cmpwrap] test.bean.TestBean1Ejb interface? false [cmpwrap] test.bean.TestBean1Ejb subclass of Object? true [cmpwrap] test.bean.TestBean1Ejb has 8 method(s) BUILD SUCCESSFUL Total time: 3 seconds |