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">