Hello Magnus

Thanks for your answer. I've already analysed the code for generating the "binding-DD-file".

My problem is that, when writing the dd for the websphere.resource-ref tag, i have to know the id of the resource-ref element from another tag (ejb.resource-ref with the same res-ref-name, see my sample). When generating the "bindings-DD-file", you can take the jndi name directly from the ejb.resource-ref tag and you don't have to search for another tag.

I tried to solve this problem by looping through all ejb.resource-ref elements (as for the the "binding-DD-file"). Then i tried to find the websphere.resource-ref element with the same res-ref-name. I tried to solve this by using the match variable (see my code in the attached file).

My problem is that this does not work because the forAllClassTags Tag resets the value of the match variable (see method forAllClassTags in class xdoclet.tagshandler.ClassTagsHandler).

Is the behaviour of the xdoclet.tagshandler.ClassTagsHandler correct?

My code works if i modify the xdoclet.tagshandler.ClassTagsHandler so that it does not reset the match variable.

I will create a case in JIRA for this tomorrow.

Regards,
Matthias

Magnus Larsson schrieb:
Hello Matthias!

My name is Magnus Larsson and I am responsible for the WebSphere module.
I will be happy to help you on this!

I took a quick look in IBM RSA to see how IBM generate the code you are talking about. Here is an extract from the "extension-DD-file":

<ejbExtensions xmi:type="ejbext:SessionExtension" xmi:id="SessionExtension_1103726745000">
<enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#SampleSession"/>
<resourceRefExtensions xmi:id="ResourceRefExtension_1103726745000" isolationLevel="TRANSACTION_READ_COMMITTED">
<resourceRef href="META-INF/ejb-jar.xml#ResourceRef_1103726744970"/>
</resourceRefExtensions>
</ejbExtensions>


Its structure is to me very similar to the corresponding code fragment you can find in the "binding-DD-file":

<ejbBindings xmi:id="EnterpriseBeanBinding_1103726744970" jndiName="ejb/se/callista/ebj/SampleSessionHome">
<enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#SampleSession"/>
<resRefBindings xmi:id="ResourceRefBinding_1103726744970" jndiName="jdbc/MyDb">
<bindingResourceRef href="META-INF/ejb-jar.xml#ResourceRef_1103726744970"/>
</resRefBindings>
</ejbBindings>


Since we already generate code for the bindingfile I guess you simply can copy that structure from the binding-template-file into the extension-template-file and then just change the details...

If you preffer I can make an initial effort to add the code in the extension-template-file and you can test it and then suggest adjustments that you find appropriate.

Anyhow please create a case in JIRA for this so that we can follow up all extensions and bug fixes in a formalized way.

Best Regards,
Magnus.


On Tuesday 21 December 2004 21:03, Matthias Germann wrote:

Dear XDoclet developers,

I'm trying to create a patch for an additional feature in the IBM
WebSphere module.

IBM Websphere offers the possibility to specify additional properties
for a Resource-Reference in a proprietary deployment descriptor (i.e.
the transaction isolation level).

I thought that i could add a "websphere.resource-ref" Tag for the
additional WebSphere proprietary parameters. As a bean may declare
multiple Resource-References, the tags could look like this:

/*
 * @ejb.resource-ref
 *   res-ref-name="DS1"
 * @websphere.resource-ref
 *   res-ref-name="DS1"
 *   transaction-isolation="TRANSACTION_READ_COMMITTED"
 *
 * @ejb.resource-ref
 *  res-ref-name="DS2"
 * @websphere.resource-ref
 *   res-ref-name="DS2"
 *   transaction-isolation="TRANSACTION_READ_UNCOMMITTED"
 */

The generated deployment descriptors for this example should look
similar to the snippets below. It's important to notice that the
Elements in the WebSphere proprietary descriptors are links to the
Elements in the ejb-jar.xml with the ID attribute and not with the
res-ref-name.

ejb-jar.xml:
<resource-ref id="ResRef_12>
  <res-ref-name>DS1<res-ref-name>
  ...
</resource-ref>
<resource-ref id="ResRef_13>
  <res-ref-name>DS2<res-ref-name>
  ...
</resource-ref>

WebSphere proprietary descriptor (names may be wrong) :
<resource-ref-ext>
  <resource-ref href="ejb-jar.xml#ResRef_12"/>
  <transactionIsolation>TRANSACTION_READ_COMMITTED</transactionIsolation>
</resource-ref-ext>

<resource-ref-ext>
  <resource-ref href="ejb-jar.xml#ResRef_12"/>
  <transactionIsolation>TRANSACTION_READ_COMMITTED</transactionIsolation>
</resource-ref-ext>


I thought, that i could loop through the "ejb.resource-ref" tags and create a <resource-ref-ext> element in the WebSphere DD for each ejb.resource-ref tag. If i use the same prefix for generating the id as the ejb Module, i should be able to get the correct ID for the href Attribute. If there is a "websphere.resource-ref" tag with the same "res-ref-name" parameter value as the "res-ref-name" of the current "ejb.resource-ref" tag, the values from this tag are inserted into the WebSphere DD element.

The essential part of my WebSphere DD Template looks like below. I try
to use the match variable for storing the "res-ref-name".

<XDtClass:forAllClassTags tagName="ejb.resource-ref" >
<resource-ref-ext>
  <resource-ref href="ejb-jar.xml#<XDtId:prefixedId prefix='ResRef'
wrapInIdEquals='false'/>"/>
<XDtClass:classTagValueMatch tagName="ejb.resource-ref"
paramName="res-ref-name"/>
<XDtClass:forAllClassTags tagName="websphere.resource-ref" >
<XDtClass:ifClassTagValueMatches tagName="websphere.resource-ref"
paramName="res-ref-name">
<XDtClass:ifHasClassTag tagName="websphere.resource-ref"
paramName="transaction-isolation">
...

This does not work because the forAllClassTags resets the value of the
match variable (see method forAllClassTags in class
xdoclet.tagshandler.ClassTagsHandler). Therefore, a
"transaction-isolation" element is never created.

Is there a better approach than mine?

Is it the right approach to use the match variable for saving the value
of the "res-ref-name"?

Why does the ClassTagsHandler reset the value of the match variable in
the forAllClassTags method?

I found similar code in the jboss module
(modules/jboss/src/xdoclet/modules/jboss/jmx/resources/jbossmx-xml-descript
or.xdt)

I have not tested the code, but i think that it does not work because it
uses the same pattern as i try to use.

Thanks for your help.

Regards,
Matthias


    <XDtComment:comment>
    |
    | resource-ref extensions
    |
    </XDtComment:comment>
    
    <XDtClass:forAllClassTags tagName="ejb.resource-ref">
     <resourceRefExtensions xmi:<XDtId:prefixedId prefix="ResourceRef_ext"/>>
      <resourceRef href="META-INF/ejb-jar.xml#<XDtId:prefixedId prefix='ResRef' 
wrapInIdEquals='false'/>"/>
      <XDtClass:classTagValueMatch tagName="ejb.resource-ref" 
paramName="res-ref-name"/>
       <XDtClass:forAllClassTags tagName="websphere.resource-ref">
        <XDtClass:ifClassTagValueMatches tagName="websphere.resource-ref" 
paramName="res-ref-name">
         <XDtClass:ifHasClassTag tagName="websphere.resource-ref" 
paramName="isolation-level">
      <isolationLevel><XDtClass:classTagValue tagName="websphere.resource-ref" 
paramName="isolation-level"/></isolationLevel>
         </XDtClass:ifHasClassTag>
         <XDtClass:ifHasClassTag tagName="websphere.resource-ref" 
paramName="connection-management-policy">
      <connectionManagementPolicy><XDtClass:classTagValue 
tagName="websphere.resource-ref" 
paramName="connection-management-policy"/></connectionManagementPolicy>
         </XDtClass:ifHasClassTag>         
        </XDtClass:ifClassTagValueMatches>
       </XDtClass:forAllClassTags>
     </resourceRefExtensions>
    </XDtClass:forAllClassTags>
        

Reply via email to