Can't use the same subtask twice within a single run
----------------------------------------------------
Key: XDT-1621
URL: http://opensource.atlassian.com/projects/xdoclet/browse/XDT-1621
Project: XDoclet
Type: Bug
Components: Core
Versions: 1.2.3
Reporter: R. Lemos
Assigned to: xdoclet-devel (Use for new issues)
Consider an EJB Application having a couple of beans that are arranged in two
ejb-jar modules, and then packaged into one ear (enterprise application
archive).
In this setup, two deployment descriptors need to be generated. It is possible
to generate a descriptor for some beans, thanks to the havingClassTag
attribute. So one could configure xdoclet this way:
<ejbdoclet ...>
.
.
<deploymentdescriptor destdir="deployment/moduleXXX/META-INF"
havingClassTag="module.XXX"/>
</ejbdoclet>
So far so good. This snippet should be repeated two times for the two ejb-jar
modules.
The problem arises when the project grows in number of classes and, worse,
number of EJB modules. Multiple invocations of ejbdoclet inccurs in thousands
of java source files been read and analysed.
A simple workaround could be one single run of xdoclet with multiple
invocations of a subtask:
<ejbdoclet ...>
.
.
<deploymentdescriptor destdir="deployment/moduleA/META-INF"
havingClassTag="module.A"/>
<deploymentdescriptor destdir="deployment/moduleB/META-INF"
havingClassTag="module.B"/>
</ejbdoclet>
But this won't work since the subtasks are created in advance, when xdoclet
modules are registered [EMAIL PROTECTED] xdoclet.DocletTask#registerModules()].
After that, each invocation will get the same subtask object [EMAIL PROTECTED]
xdoclet.DocletTask#createDynamicElement()], and it will be reconfigured over
and over again. The result will be a kind of a merge of definitions, with the
former attributes being overwritten by the latter.
I propose a patch by which the subtasks retrieved are cloned before being
configured. This way, the subtask map populated in registerModules() is kept
"clean" (of configuration attributes), and each invocation will get its own
instance.
Each (well, actually not all of them) subclass of xdoclet.SubTask should have
its clone method overridden, to clone the fields that are mutable objects.
The patch that corrects the bug for the ejb deployment and home and business
interfaces follows:
--------------------------- cut here ---------------------------
diff -Naur xdoclet-1.2.3-original/core/src/xdoclet/DocletTask.java
xdoclet-1.2.3/core/src/xdoclet/DocletTask.java
--- xdoclet-1.2.3-original/core/src/xdoclet/DocletTask.java 2005-04-15
21:01:51.000000000 -0300
+++ xdoclet-1.2.3/core/src/xdoclet/DocletTask.java 2006-03-30
13:10:20.000000000 -0300
@@ -342,6 +342,8 @@
if (subTask == null) {
throw new
BuildException(Translator.getString(XDocletMessages.class,
XDocletMessages.CREATE_TASK_ERROR, new String[]{name, getTaskName()}));
}
+ subTask = (SubTask) subTask.clone();
+
subTasks.add(subTask);
return subTask;
}
diff -Naur xdoclet-1.2.3-original/core/src/xdoclet/SubTask.java
xdoclet-1.2.3/core/src/xdoclet/SubTask.java
--- xdoclet-1.2.3-original/core/src/xdoclet/SubTask.java 2004-10-10
20:27:50.000000000 -0300
+++ xdoclet-1.2.3/core/src/xdoclet/SubTask.java 2006-03-30 12:55:06.000000000
-0300
@@ -28,7 +28,7 @@
* @created June 16, 2001
* @version $Revision: 1.75 $
*/
-public abstract class SubTask extends DocletSupport implements Serializable
+public abstract class SubTask extends DocletSupport implements Serializable,
Cloneable
{
private XJavaDoc _xJavaDoc;
@@ -225,4 +225,14 @@
{
return _xJavaDoc;
}
+
+ protected Object clone() {
+ try {
+ SubTask clone = (SubTask) super.clone();
+ clone.configParams = (ArrayList)
clone.configParams.clone();
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
}
diff -Naur xdoclet-1.2.3-original/core/src/xdoclet/TemplateSubTask.java
xdoclet-1.2.3/core/src/xdoclet/TemplateSubTask.java
--- xdoclet-1.2.3-original/core/src/xdoclet/TemplateSubTask.java
2005-04-15 21:01:51.000000000 -0300
+++ xdoclet-1.2.3/core/src/xdoclet/TemplateSubTask.java 2006-03-30
13:03:25.000000000 -0300
@@ -66,7 +66,7 @@
* @see #setExtent(TemplateSubTask.ExtentTypes)
* @see #getExtent()
*/
- private List ofType = new ArrayList();
+ private ArrayList ofType = new ArrayList();
/**
* You can control the extent in which the type search occurs. Valid
values are: <i>concrete-type</i> , <i>
@@ -900,4 +900,11 @@
this.type = type;
}
}
+
+ protected Object clone() {
+ TemplateSubTask clone = (TemplateSubTask) super.clone();
+ clone.ofType = (ArrayList)clone.ofType.clone();
+ clone.packageSubstitutions = (ArrayList)
clone.packageSubstitutions.clone();
+ return clone;
+ }
}
--------------------------- cut here ---------------------------
Note that this patch will correct the bug for other subtasks as well (in fact,
any subclass whose fields are immutable objects will be correctly cloned).
Thanks
R. Lemos
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/xdoclet/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
xdoclet-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel