I'm new at this, so let me know if I'm out of line.

I needed to add <unknown-pk> in my jbosscmp-jdbc.xml (and to eliminate <cmp-field> from ejb-jar.xml and jbosscmp-jdbc.xml), so I modified the XDoclet templates for it.

I started with 1.2b2 (see patches), but also patched the current source for jbosscmp-jdbc.xml I found on ViewCVS (r1.37).

I added support for a new method level tag

@ejb.unknown-pk

It takes advantage of the existing @jboss and @ejb tags, and the method return type to get the rest of what it needs to populate the <unknown-pk>. It also prevents a <cmp-field> for the one marked as unknown-pk in both ejb-jar.xml and jbosscmp-jdbc.xml.

It doesn't handle putting <unknown-pk> in the <defaults> section, nor does it check to make sure only one method has @ejb.unknown-pk. It also doesn't allow for the possibility of an <unknown-pk> without a CMP getter. But its simplicity is all I needed to avoid a bunch of little merge files. Hopefully this sparks some more refinement.

I've tested my patch of 1.2b2 against JBoss 3.2RC1 (built from CVSTag).

Hope it's useful.

Thanks,

Tim

=================

Usage example:

/**
* @ejb.bean
* name="AccountEntry"
* type="CMP"
* cmp-version="2.x"
* schema="AccountEntry"
* view-type="local"
* @ejb.persistence
* table-name="payment.AccountEntry"
* @ejb.transaction
* type="Required"
* @ejb.pk
* class="java.lang.Object"
* @jboss.entity-command
* name="pk-sql"
* @jboss.entity-command-attribute
* name="pk-sql"
* value="SELECT nextval('payment.accountentry_accountentryid_seq')"
*/
public abstract class AccountEntryBean implements javax.ejb.EntityBean {

...


/**
* @ejb.persistence
* column-name="accountentryid"
* jdbc-type="INTEGER"
* sql-type="INTEGER"
* @ejb.unknown-pk
* @jboss.persistence
* auto-increment="true"
* @ejb.interface-method
*/
public abstract Integer getAccountEntryId();
public abstract void setAccountEntryId( Integer accountId );


...


}
--- beta/xdoclet/modules/ejb/dd/resources/ejb-body.xdt  2003-01-30 13:52:07.000000000 
-0700
+++ working/xdoclet/modules/ejb/dd/resources/ejb-body.xdt       2003-01-30 
+13:50:42.000000000 -0700
@@ -76,10 +76,12 @@
        </XDtEjbCmp:ifEntityIsCmp>
       </XDtConfig:ifConfigParamGreaterOrEquals>
         <XDtEjbCmp:forAllCmpFields>
+         <XDtMethod:ifDoesntHaveMethodTag tagName="ejb:unknown-pk">
          <cmp-field <XDtId:prefixedId prefix="CMPAttribute"/>>
             
<description><![CDATA[<XDtMethod:firstSentenceDescriptionOfCurrentMethod/>]]></description>
             <field-name><XDtMethod:propertyName/></field-name>
          </cmp-field>
+          </XDtMethod:ifDoesntHaveMethodTag>
         </XDtEjbCmp:forAllCmpFields>
         <XDtClass:ifHasClassTag tagName="ejb:bean" paramName="primkey-field" 
superclasses="true">
          <primkey-field><XDtClass:classTagValue tagName="ejb:bean" 
paramName="primkey-field" /></primkey-field>
--- beta/xdoclet/modules/jboss/ejb/resources/jbosscmp-jdbc_xml.xdt      2003-01-30 
13:42:23.000000000 -0700
+++ working/xdoclet/modules/jboss/ejb/resources/jbosscmp-jdbc_xml.xdt   2003-01-30 
+13:37:57.000000000 -0700
@@ -88,8 +88,8 @@
 
     <XDtMerge:merge file="jbosscmp-jdbc-{0}.xml">
       <XDtEjbCmp:forAllCmpFields>
-        <XDtMethod:ifDoesntHaveMethodTag tagName="jboss:not-persisted-field">
-          <XDtMethod:forAllMethodTags tagName="ejb:persistent-field|ejb.persistence">
+        <XDtMethod:ifDoesntHaveMethodTag 
+tagName="jboss:not-persisted-field,ejb:unknown-pk">
+            <XDtMethod:forAllMethodTags 
+tagName="ejb:persistent-field|ejb.persistence">
          <cmp-field>
             <field-name><XDtMethod:propertyName/></field-name>
                        <XDtMethod:ifHasMethodTag tagName="jboss.persistence" 
paramName="read-only">
@@ -150,9 +150,10 @@
                        <auto-increment/>
                    </XDtMethod:ifHasMethodTag>
          </cmp-field>
-          </XDtMethod:forAllMethodTags>
-        </XDtMethod:ifDoesntHaveMethodTag>
+            </XDtMethod:forAllMethodTags>
+          </XDtMethod:ifDoesntHaveMethodTag>
       </XDtEjbCmp:forAllCmpFields>
+
       <XDtClass:forAllClassTags tagName="jboss:cmp-field">
          <cmp-field>
             <field-name><XDtClass:classTagValue tagName="jboss:cmp-field" 
paramName="field-name"/></field-name>
@@ -265,6 +266,54 @@
          </XDtClass:forAllClassTags>
     </XDtMerge:merge>
 
+
+
+
+      <XDtEjbCmp:forAllCmpFields>
+          <XDtMethod:ifHasMethodTag tagName="ejb:unknown-pk">
+            <XDtMethod:forAllMethodTags 
+tagName="ejb:persistent-field|ejb.persistence">
+         <unknown-pk>
+          <XDtMethod:ifHasMethodTag tagName="ejb:unknown-pk">
+            <unknown-pk-class><XDtMethod:methodType 
+fullQualifiedFormat="true"/></unknown-pk-class>
+          </XDtMethod:ifHasMethodTag>
+
+            <field-name><XDtMethod:propertyName/></field-name>
+              <XDtMethod:ifDoesntHaveMethodTag 
+tagName="jboss:dvc-property,jboss:property">
+                <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:column-name,jboss:column-name" 
+paramName="column-name,name">
+                       <XDtComment:comment>
+                               Please note that tagName contains 3 alternatives and 
+paramName contains 2 alternatives. This is
+                               necessary so XDoclet can catch:
+                                   1) @ejb.persistence column-name="xxx"
+                                       2) @jboss.column-name name="xxx"
+                                       3) @jboss.column-name xxx
+                               There is similar syntax in other places.
+                       </XDtComment:comment>
+            <column-name><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:column-name,jboss:column-name" 
+paramName="column-name,name" paramNum="0"/></column-name>
+                </XDtMethod:ifHasMethodTag>
+
+            <XDtComment:comment>
+              according to the DTD, jdbc-type and sql-type are a pair, one can't 
+exist without the other...
+              probably need a cleaner way of doing what I do below...
+            </XDtComment:comment>
+            <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:jdbc-type,jboss:jdbc-type" paramName="jdbc-type,type">
+            <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:sql-type,jboss:sql-type" paramName="sql-type,type">
+            <jdbc-type><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:jdbc-type,jboss:jdbc-type" paramName="jdbc-type,type" 
+paramNum="0"/></jdbc-type>
+            <sql-type><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:sql-type,jboss:sql-type" paramName="sql-type,type" 
+paramNum="0"/></sql-type>
+            </XDtMethod:ifHasMethodTag>
+            </XDtMethod:ifHasMethodTag>
+
+          </XDtMethod:ifDoesntHaveMethodTag>
+         <XDtMethod:ifHasMethodTag tagName="jboss:persistence" 
+paramName="auto-increment">
+            <auto-increment/>
+          </XDtMethod:ifHasMethodTag>
+         </unknown-pk>
+            </XDtMethod:forAllMethodTags>
+        </XDtMethod:ifHasMethodTag>
+      </XDtEjbCmp:forAllCmpFields>
+
+
+
+
        <XDtClass:ifHasClassTag tagName="jboss:entity-command" paramName="name">
        <entity-command name="<XDtClass:classTagValue tagName="jboss:entity-command" 
paramName="name"/>"<XDtClass:ifHasClassTag tagName="jboss:entity-command" 
paramName="class"> class="<XDtClass:classTagValue tagName="jboss:entity-command" 
paramName="class"/>"</XDtClass:ifHasClassTag>>
          <XDtClass:forAllClassTags tagName="jboss:entity-command-attribute">
--- head/xdoclet/modules/jboss/ejb/resources/jbosscmp-jdbc_xml.xdt      2003-01-30 
13:45:28.000000000 -0700
+++ contrib/xdoclet/modules/jboss/ejb/resources/jbosscmp-jdbc_xml.xdt   2003-01-30 
+13:47:10.000000000 -0700
@@ -86,7 +86,7 @@
 
     <XDtMerge:merge file="jbosscmp-jdbc-{0}.xml">
       <XDtEjbCmp:forAllCmpFields>
-        <XDtMethod:ifDoesntHaveMethodTag tagName="jboss:not-persisted-field">
+        <XDtMethod:ifDoesntHaveMethodTag 
+tagName="jboss:not-persisted-field,ejb:unknown-pk">
           <XDtMethod:forAllMethodTags tagName="ejb:persistent-field|ejb.persistence">
          <cmp-field>
             <field-name><XDtMethod:propertyName/></field-name>
@@ -263,6 +263,48 @@
          </XDtClass:forAllClassTags>
     </XDtMerge:merge>
 
+      <XDtEjbCmp:forAllCmpFields>
+          <XDtMethod:ifHasMethodTag tagName="ejb:unknown-pk">
+            <XDtMethod:forAllMethodTags 
+tagName="ejb:persistent-field|ejb.persistence">
+         <unknown-pk>
+          <XDtMethod:ifHasMethodTag tagName="ejb:unknown-pk">
+            <unknown-pk-class><XDtMethod:methodType 
+fullQualifiedFormat="true"/></unknown-pk-class>
+          </XDtMethod:ifHasMethodTag>
+
+            <field-name><XDtMethod:propertyName/></field-name>
+              <XDtMethod:ifDoesntHaveMethodTag 
+tagName="jboss:dvc-property,jboss:property">
+                <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:column-name,jboss:column-name" 
+paramName="column-name,name">
+                       <XDtComment:comment>
+                               Please note that tagName contains 3 alternatives and 
+paramName contains 2 alternatives. This is
+                               necessary so XDoclet can catch:
+                                   1) @ejb.persistence column-name="xxx"
+                                       2) @jboss.column-name name="xxx"
+                                       3) @jboss.column-name xxx
+                               There is similar syntax in other places.
+                       </XDtComment:comment>
+            <column-name><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:column-name,jboss:column-name" 
+paramName="column-name,name" paramNum="0"/></column-name>
+                </XDtMethod:ifHasMethodTag>
+
+            <XDtComment:comment>
+              according to the DTD, jdbc-type and sql-type are a pair, one can't 
+exist without the other...
+              probably need a cleaner way of doing what I do below...
+            </XDtComment:comment>
+            <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:jdbc-type,jboss:jdbc-type" paramName="jdbc-type,type">
+            <XDtMethod:ifHasMethodTag 
+tagName="ejb:persistence,jboss:sql-type,jboss:sql-type" paramName="sql-type,type">
+            <jdbc-type><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:jdbc-type,jboss:jdbc-type" paramName="jdbc-type,type" 
+paramNum="0"/></jdbc-type>
+            <sql-type><XDtMethod:methodTagValue 
+tagName="ejb:persistence,jboss:sql-type,jboss:sql-type" paramName="sql-type,type" 
+paramNum="0"/></sql-type>
+            </XDtMethod:ifHasMethodTag>
+            </XDtMethod:ifHasMethodTag>
+
+          </XDtMethod:ifDoesntHaveMethodTag>
+         <XDtMethod:ifHasMethodTag tagName="jboss:persistence" 
+paramName="auto-increment">
+            <auto-increment/>
+          </XDtMethod:ifHasMethodTag>
+         </unknown-pk>
+            </XDtMethod:forAllMethodTags>
+        </XDtMethod:ifHasMethodTag>
+      </XDtEjbCmp:forAllCmpFields>
+
        <XDtClass:ifHasClassTag tagName="jboss:entity-command" paramName="name">
        <entity-command name="<XDtClass:classTagValue tagName="jboss:entity-command" 
paramName="name"/>"<XDtClass:ifHasClassTag tagName="jboss:entity-command" 
paramName="class"> class="<XDtClass:classTagValue tagName="jboss:entity-command" 
paramName="class"/>"</XDtClass:ifHasClassTag>>
          <XDtClass:forAllClassTags tagName="jboss:entity-command-attribute">


Reply via email to