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
xdoclet-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to