File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Ant, Maven and Other Build Tools and the fly likes XDoclet not generating methods into Local interface Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Engineering » Ant, Maven and Other Build Tools
Bookmark "XDoclet not generating methods into Local interface" Watch "XDoclet not generating methods into Local interface" New topic
Author

XDoclet not generating methods into Local interface

Chris Rowse
Greenhorn

Joined: Aug 02, 2004
Posts: 5
Hi,
I am having a problem using XDoclet to geterate methods into the local interface. The remote interface is working fine.

Either I am missing something, or there are serious performance gains to be made using XDoclet and EJB.

The generated Local interface looks (IMHO) like a useless extension of the HOME interface!! :-)

On a live bean, deployed in JBoss, about 99% of the time is spent in the getXXX() and setXXX() methods of remote bean. This is acceptible when I access a few beaans individually, but useless if I want to findall() 20000 beans of 50Kb each and do some work on them.

I want to be able to delegate this task to the EE container so everything runs locally, and get rid of the RMI calls.

Using a value object doesnt help since the data must be streamed between the EE container and the web (tomcat) containers.

My thinking is to have a number of Stateless Session beans, that run in the EE container and have the form

public String method() {
// Use JNDI to find Local Business bean
StringBuffer sb = new StringBuffer();
Collection c = bean.findAll();
// Iterate over collection
while (it.hasNext()) {
// get Bean or its attributes
// using REMOTE about 99% of the time is spent HERE
// do something
// log to sb;
// perhaps create some other beans
// can also take substantial time in setXXX) or ejbCreate() methods
}
return sb.toString();
}



Any ideas. or help will be much appreciated.

----------Here is the EJBsource code ---------------------------------------
package natis.ejb;
import java.io.UnsupportedEncodingException;

import java.rmi.*;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.ejb.*;

/**
*
* @ejb.bean
* name="TestBean"
* jndi-name="ejb/TestBeanRemote"
* local-jndi-name="ejb/TestBeanLocal"
* view-type="both"
* type="CMP"
* cmp-version="2.x"
* primkey-field="id"
* local-business-interface="natis.interfaces.TestBeanLocalHome"
* business-interface="natis.interfaces.TestBeanRemoteHome"
*
* @ejb.home
* local-class="natis.interfaces.TestBeanLocalHome"
* remote-class="natis.interfaces.TestBeanRemoteHome"
* @ejb.interface
* local-class="natis.interfaces.TestBeanLocal"
* remote-class="natis.interfaces.TestBeanRemote"
*
* @ejb.finder
* signature="Collection findAll()"
* role-name="Administrator"
* transaction-type="NotSupported"
* unchecked="true"
*
* @ejb.persistence
* read-time-out="10000"
* fetch-size="20"
* table-name="TestBean_001"
*
* @ejb.pk
* generate="true"
* unchecked="true"
*
* @jboss.ejb-external-ref-jndi
* jndi-name="/UUIDKeyGeneratorFactory"
* ref-name="comp:env/keygenerator"
*
*
* @jboss.create-table "${jboss.create.table}"
* @jboss.remove-table "${jboss.remove.table}"
* @jboss.tuned-updates "${jboss.tuned.updates}"
* @jboss.read-only "${jboss.read.only}"
* @jboss.read-ahead strategy="on-load"
* page-size="50"
* eager load group = "TestBeanIndex"
*
* @jboss.persistence
* datasource="java:/DefaultDS"
* datasource-mapping="Hypersonic SQL"
* create-table="true"
* remove-table-"false"
* fetch-size="10"
*
* @ejb.security-identity
* run-as="sa"
*
* @ejb.value-object
* match="*"
*
* @struts.form
* name="Entry"
* include-all="true"
*
* @struts.action
* name="TestSaveAction"
* path="/natis/action/saveTest"
* scope="request"
* roles="*"
*
* @version $Revision: 1.17 $
* @author <a href="mailto:chris@forthtree.co.za@forthtree.co.za">Chris@forth.co.za</a>
*/
public abstract class TestBean implements EntityBean {

EntityContext entityContext;

/**
* EJBCREATE
* @return pk primary key set to null
*
* @ejb.create-method
*/
public String ejbCreate() throws CreateException {
return null;
}
public void ejbPostCreate() throws CreateException {
}

/**
* Id of this TestBean.
*
* @ejb.pk-field
* class="java.lang.String"
* @ejb.persistent-field
* @ejb.interface-method view-type="both"
*
* @ejb.persistence column-name="TestBean_id"
* @ejb.permission
* role-name="Administrator"
*
* @jboss.unknown-pk
* class="java.lang.String"
* readonly="true"
* column-name="TestBean_id"
* sql-type="char(32)"
* //jboss.auto-increment
*
* @jonas.cmp-field-jdbc-mapping
* field-name="id"
* jdbc-field-name="TestBean_id"
*/
public abstract String getId();

/**
* No interface method for setId(..). See page 130 of the EJB 2.0 specification:
* "Once the primary key for an entity bean has been set, the Bean Provider must
* not attempt to change it by use of set accessor methods on the primary key
* cmp-fields. The Bean provider should therefore not expose the set accessor
* methods for the primary key cmp-fields in the component interface of the
* entity bean.". A work around would be to remove and then an re-create the bean.
*/
protected abstract void setId(String id);


/**
* @ejb.permission
* role-name="Administrator"
* @ejb.transaction
* type="Supports"
* @ejb.value-object
* exclude="false"
* match="*"
* @ejb.persistent-field
* @ejb.persistence
* column-name="mfData"
* sql-type="text(500)"
* @ejb.interface-method
* view-type="both"
*
* @struts.form-field
* form-name="Entry"
*
* @jonas.cmp-field-jdbc-mapping
* field-name="mfData"
* jdbc-field-name="mfData"
*/

public abstract String getData();
/**
* @ejb.permission
* role-name="Administrator"
* @ejb.transaction
* type="Supports"
* @ejb.value-object
* exclude="false"
* match="*"
* @ejb.persistent-field
* @ejb.interface-method
* view-type="both"
*
* @struts.form-field
* form-name="Entry"
*
*/
public abstract void setData(String mfData);

/** * @ejb.interface-method
* view-type="local"

*/
public String toIx() {
return getId() + "|" + getData();
}





/**
* Gets the EntityContext. To be used by classes extending this.
* @return the EntityContext of the EJB
*/
protected EntityContext getEntityContext() {
return entityContext;
}

/** Required to implement EntityBean. Sets the EntityContext. */
public void setEntityContext(EntityContext entityContext) throws EJBException {
this.entityContext = entityContext;
}

/** Required to implement EntityBean. Sets the EntityContext to null. */
public void unsetEntityContext() throws EJBException {
entityContext = null;
}

/** Required to implement EntityBean. Not implemented. */
public void ejbActivate() throws EJBException { }

/** Required to implement EntityBean. Not implemented. */
public void ejbPassivate() throws EJBException { }

/** Required to implement EntityBean. Not implemented. */
public void ejbLoad() throws EJBException { }

/** Required to implement EntityBean. Not implemented. */
public void ejbStore() throws EJBException { }

/** Required to implement EntityBean. Not implemented. */
public void ejbRemove() throws RemoveException, EJBException { }




}


---------- Here is the EJBDOCLET tag --------------------------------------
<target depends="prepare" name="ejbdoclet">

<echo>+---------------------------------------------------+</echo>
<echo>| |</echo>
<echo>| R U N N I N G E J B D O C L E T |</echo>
<echo>| |</echo>
<echo>+---------------------------------------------------+</echo>
<!--
-->
<ejbdoclet
destdir="${project.gen-src.dir}"
mergedir="${project.merge.dir}"
excludedtags="@version,@author,@todo"
addedtags="@xdoclet-generated at ${TODAY},@copyright The Forthtree,@author Chris Rowse, @version ${version}"
ejbspec="2.0"
force="${project.xdoclet.force}"
verbose="true"
>

<fileset dir="${project.java.dir}">
<include name="${project}/ssb/*Bean.java"/>

<include name="${project}/ejb/*Bean.java"/>
<include name="${project}/ejb/*BeanMS.java"/>

<include name="${project}/ejb/${project}*.java"/>
<include name="${project}/ejb/*Error.java"/>

<exclude name="${project}/ejb/Base*.java"/>


</fileset>

<fileset dir="${project.tmp.dir}">
<include name="${project}/**/*Bean.java"/>
<include name="${project}/ejb/*BeanMS.java"/>

<include name="${project}/**/*Error.java"/>
</fileset>


<!--
<fileset dir="${project.java.dir}">
<include name="${project}/ssb/*Bean.java"/>
</fileset>
-->
<packageSubstitution packages="ejb" substituteWith="interfaces"/>
<packageSubstitution packages="absbeans" substituteWith="interfaces"/>

<session/>
<remoteinterface/>
<localinterface/>
<homeinterface/>
<localhomeinterface/>
<!--
<dataobject/>
-->

<valueobject/>

<entitypk/>

<entitycmp/>
<entitybmp/>


<dao>
<packageSubstitution packages="ejb" substituteWith="dao"/>
</dao>

<utilobject cacheHomes="true" includeGUID="true"/>

<deploymentdescriptor
description="${project} Deployment"
destdir="${project.target.dir}/META-INF"
mergedir="${project.merge.dir}"
validatexml="true">
<configParam name="clientjar" value="${project}Client.jar"/>
</deploymentdescriptor>


<jboss
version="3.2"
unauthenticatedPrincipal="nobody"
xmlencoding="UTF-8"
destdir="${project.target.dir}/META-INF"
validatexml="true"
preferredrelationmapping="relation-table"
/>

<!--
<weblogic
version="6.1"
xmlencoding="UTF-8"
destdir="${project.target.dir}/META-INF"
validatexml="true"
datasource="java:/${project}DataSource"
mergedir="${project.merge.dir}"
persistence="weblogic"
/>

<jrun
version="4.0"
xmlencoding="UTF-8"
destdir="${project.target.dir}/MNETA-INF"
validatexml="true"
/>

<webSphere destdir="${project.target.dir}/META-INF"/>
-->
<!--
<jonas
version="2.5"
xmlencoding="UTF-8"
destdir="${project.target.dir}/META-INF"
validatexml="false"
mergedir="${project.merge.dir}"
/>

<orion destdir="${project.target.dir}/META-INF"/>

<apachesoap destdir="${project.target.dir}/META-INF"/>
-->

<strutsform/>

<castormapping destdir="${project.target.dir}/META-INF" validatexml="false"/>

</ejbdoclet>

</target>

---------- Here is the generated Remote interface ------------------

/*
* Generated by XDoclet - Do not edit!
*/
package natis.interfaces;

/**
* Remote interface for TestBean.
* @xdoclet-generated at 2-08-04
* @copyright The Forthtree
* @author Chris Rowse
* @version ${version}
*/
public interface TestBeanRemote
extends javax.ejb.EJBObject
{
/**
* Id of this TestBean.
*/
public java.lang.String getId( )
throws java.rmi.RemoteException;

public java.lang.String getData( )
throws java.rmi.RemoteException;

public void setData( java.lang.String mfData )
throws java.rmi.RemoteException;

}



---------- Here is the generated LOCAL interface
/*
* Generated by XDoclet - Do not edit!
*/
package natis.interfaces;

/**
* Local interface for TestBean.
* @xdoclet-generated at 2-08-04
* @copyright The Forthtree
* @author Chris Rowse
* @version ${version}
*/
public interface TestBeanLocal
extends javax.ejb.EJBLocalObject, natis.interfaces.TestBeanLocalHome
{

}
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: XDoclet not generating methods into Local interface