You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
11 KiB
272 lines
11 KiB
diff -uprN xdoclet-1.2.2.orig/modules/hibernate/src/xdoclet/modules/hibernate/HibernateTagsHandler.java xdoclet-1.2.2/modules/hibernate/src/xdoclet/modules/hibernate/HibernateTagsHandler.java
|
|
--- xdoclet-1.2.2.orig/modules/hibernate/src/xdoclet/modules/hibernate/HibernateTagsHandler.java 2004-10-14 04:39:06.000000000 +0200
|
|
+++ xdoclet-1.2.2/modules/hibernate/src/xdoclet/modules/hibernate/HibernateTagsHandler.java 2005-04-03 15:20:31.000000000 +0200
|
|
@@ -4,10 +4,7 @@
|
|
*/
|
|
package xdoclet.modules.hibernate;
|
|
|
|
-import java.util.Collection;
|
|
-import java.util.Iterator;
|
|
-import java.util.LinkedList;
|
|
-import java.util.Properties;
|
|
+import java.util.*;
|
|
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.tools.ant.types.Parameter;
|
|
@@ -48,6 +45,18 @@ public class HibernateTagsHandler
|
|
|
|
private Parameter currentOtherMapping;
|
|
|
|
+ private static boolean isHibernated(XClass xClass)
|
|
+ {
|
|
+ if (xClass == null) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return (
|
|
+ xClass.getDoc().getTag("hibernate.class") != null ||
|
|
+ xClass.getDoc().getTag("hibernate.subclass") != null
|
|
+ );
|
|
+ }
|
|
+
|
|
/**
|
|
* Returns full path of hibernate file for the current class.
|
|
*
|
|
@@ -594,9 +603,11 @@ public class HibernateTagsHandler
|
|
log.debug("typeName=" + typeName);
|
|
|
|
Collection classes = getXJavaDoc().getSourceClasses();
|
|
+ List reorderedClasses = flattenHierachy(getCurrentClass(), classes);
|
|
+
|
|
XClass clazz;
|
|
|
|
- for (Iterator i = classes.iterator(); i.hasNext(); ) {
|
|
+ for (Iterator i = reorderedClasses.iterator(); i.hasNext(); ) {
|
|
clazz = (XClass) i.next();
|
|
|
|
log.debug("clazz=" + clazz);
|
|
@@ -604,8 +615,13 @@ public class HibernateTagsHandler
|
|
if (DocletSupport.isDocletGenerated(clazz)) {
|
|
log.debug("isDocletGenerated");
|
|
}
|
|
- else if (clazz.getSuperclass() != null && clazz.getSuperclass().getQualifiedName().equals(typeName)) {
|
|
- log.debug("is a subclass");
|
|
+ else if (isValidSubclass(clazz, getCurrentClass())) {
|
|
+ if (getCurrentClass().isInterface()) {
|
|
+ log.debug("is an implementing class");
|
|
+ }
|
|
+ else {
|
|
+ log.debug("is a subclass");
|
|
+ }
|
|
|
|
XClass current = getCurrentClass();
|
|
|
|
@@ -735,10 +751,108 @@ public class HibernateTagsHandler
|
|
//TODO: Why do we need this!!??
|
|
}
|
|
|
|
+ private boolean isValidSubclass(XClass clazz, XClass currentClass)
|
|
+ {
|
|
+ String typeName = currentClass.getQualifiedName();
|
|
+
|
|
+ // easy case, clazz is implementing interface of hibernated class
|
|
+ // NB: not easy anymore, if we've got a hibernated interface hierachy
|
|
+ // only return true for "deepest" implemented interface in this hierachy
|
|
+ if (currentClass.isInterface() && clazz.isImplementingInterface(typeName)) {
|
|
+ List extending = currentClass.getExtendingInterfaces();
|
|
+
|
|
+ if (extending.isEmpty()) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ for (int i = 0; i < extending.size(); i++) {
|
|
+ XClass xClass = (XClass) extending.get(i);
|
|
+
|
|
+ if (isHibernated(xClass) && clazz.isImplementingInterface(xClass.getQualifiedName())) {
|
|
+ // we found an interface deeper in the hierachy
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ if (clazz.getSuperclass() != null) {
|
|
+ // easy case, this class is direct subclass of the hibernated type
|
|
+ if (clazz.getSuperclass().equals(typeName)) {
|
|
+ return true;
|
|
+ }
|
|
+ else {
|
|
+ // go up class hierarchy to find first hibernate tag
|
|
+ XClass xc = clazz;
|
|
+
|
|
+ do {
|
|
+ xc = xc.getSuperclass();
|
|
+
|
|
+ } while (xc != null && !isHibernated(xc));
|
|
+
|
|
+ // did we find a valid superclass, is it the current ?
|
|
+ if (xc != null) {
|
|
+ return xc.equals(currentClass);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+ }
|
|
+
|
|
private HibernateSubTask getHibernateSubTask()
|
|
{
|
|
return ((HibernateSubTask) (DocletContext.getInstance()
|
|
.getSubTaskBy(DocletTask.getSubTaskName(HibernateSubTask.class))));
|
|
}
|
|
+
|
|
+ /**
|
|
+ * Flattens the collection of classes by eliminating descendants (for hibernated non
|
|
+ * interface classes).
|
|
+ *
|
|
+ * @param currentClass
|
|
+ * @param classes
|
|
+ * @return
|
|
+ */
|
|
+ private List flattenHierachy(XClass currentClass, Collection classes)
|
|
+ {
|
|
+ Log log = LogUtil.getLog(HibernateTagsHandler.class, "flattenHierachy");
|
|
+
|
|
+ log.debug("for class " + currentClass);
|
|
+
|
|
+ if (!currentClass.isInterface()) {
|
|
+ List l = new ArrayList(classes);
|
|
+
|
|
+ l.retainAll(currentClass.getAllSubclasses());
|
|
+ return l;
|
|
+ }
|
|
+
|
|
+ Set s = new HashSet(classes);
|
|
+
|
|
+ log.debug("initial set size: " + s.size());
|
|
+
|
|
+ for (Iterator iterator = classes.iterator(); iterator.hasNext(); ) {
|
|
+ XClass xClass = (XClass) iterator.next();
|
|
+
|
|
+ if (xClass.isInterface() || !isHibernated(xClass)) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ List subClasses = xClass.getAllSubclasses();
|
|
+
|
|
+ for (int i = 0; i < subClasses.size(); i++) {
|
|
+ XClass aClass = (XClass) subClasses.get(i);
|
|
+
|
|
+ if (s.contains(aClass)) {
|
|
+ log.debug("removing " + aClass + " from set");
|
|
+ s.remove(aClass);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ log.debug("new set size: " + s.size());
|
|
+
|
|
+ return new ArrayList(s);
|
|
+ }
|
|
}
|
|
|
|
diff -uprN xdoclet-1.2.2.orig/modules/hibernate/src/xdoclet/modules/hibernate/resources/hibernate-properties.xdt xdoclet-1.2.2/modules/hibernate/src/xdoclet/modules/hibernate/resources/hibernate-properties.xdt
|
|
--- xdoclet-1.2.2.orig/modules/hibernate/src/xdoclet/modules/hibernate/resources/hibernate-properties.xdt 2004-10-10 11:43:05.000000000 +0200
|
|
+++ xdoclet-1.2.2/modules/hibernate/src/xdoclet/modules/hibernate/resources/hibernate-properties.xdt 2005-04-03 15:20:31.000000000 +0200
|
|
@@ -1,4 +1,4 @@
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.property">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.property" superclasses="false">
|
|
<property
|
|
name="<XDtMethod:propertyName />"
|
|
type="<XDtMethod:methodTagValue tagName="hibernate.property" paramName="type" default="<XDtMethod:methodType/>"/>"
|
|
@@ -20,7 +20,7 @@
|
|
</XDtHibernate:setCurrentTag>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.many-to-one">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.many-to-one" superclasses="false">
|
|
<many-to-one
|
|
name="<XDtMethod:propertyName/>"
|
|
class="<XDtMethod:methodTagValue tagName="hibernate.many-to-one" paramName="class" default="<XDtMethod:methodType/>" />"
|
|
@@ -43,7 +43,7 @@
|
|
</XDtHibernate:setCurrentTag>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.one-to-one">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.one-to-one" superclasses="false">
|
|
<one-to-one
|
|
name="<XDtMethod:propertyName/>"
|
|
class="<XDtMethod:methodTagValue tagName="hibernate.one-to-one" paramName="class" default="<XDtMethod:methodType/>"/>"
|
|
@@ -59,7 +59,7 @@
|
|
/>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.component">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.component" superclasses="false">
|
|
<component
|
|
name="<XDtMethod:propertyName />"
|
|
class="<XDtMethod:methodTagValue tagName="hibernate.component" paramName="class" default="<XDtMethod:methodType/>"/>"
|
|
@@ -84,7 +84,7 @@
|
|
/>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.set">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.set" superclasses="false">
|
|
<set
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.set" paramName="table">
|
|
@@ -114,7 +114,7 @@
|
|
</set>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.bag">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.bag" superclasses="false">
|
|
<bag
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.bag" paramName="table">
|
|
@@ -143,7 +143,7 @@
|
|
</bag>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.list">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.list" superclasses="false">
|
|
<list
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.list" paramName="table">
|
|
@@ -166,7 +166,7 @@
|
|
</list>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.map">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.map" superclasses="false">
|
|
<map
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.map" paramName="table">
|
|
@@ -193,7 +193,7 @@
|
|
</map>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.array">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.array" superclasses="false">
|
|
<array
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.array" paramName="table">
|
|
@@ -218,7 +218,7 @@
|
|
</array>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.primitive-array">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.primitive-array" superclasses="false">
|
|
<primitive-array
|
|
<XDtHibernate:roleAttribute/>="<XDtMethod:propertyName/>"
|
|
<XDtMethod:ifHasMethodTag tagName="hibernate.primitive-array" paramName="table">
|
|
@@ -236,7 +236,7 @@
|
|
</primitive-array>
|
|
</XDtMethod:ifHasMethodTag>
|
|
|
|
- <XDtMethod:ifHasMethodTag tagName="hibernate.any">
|
|
+ <XDtMethod:ifHasMethodTag tagName="hibernate.any" superclasses="false">
|
|
<any
|
|
name="<XDtMethod:propertyName />"
|
|
id-type="<XDtMethod:methodTagValue tagName="hibernate.any" paramName="id-type"/>"
|