[Design of POJO Server] - Re: Diff behavior with diff AnnotatedMetaDataDeployer
by emuckenhuber
"alesj" wrote :
| Isn't it all just about the classes you push to creators?
| And with my Opt this should be optimized/good?
That should be fine.. much smarter now :)
The current annotation deployer actually just do hasAnnotation() on the class, method, field and so on...
The only difference i can see in the behaviour is:
"alesj" wrote :
|
| | jboss.j2ee:ear=jboss-seam-booking.ear,jar=jboss-seam-booking.ear,name=ChangePasswordAction,service=EJB3 -> java.lang.IllegalArgumentException: Can't find a persistence unit named '' in AbstractVFSDeploymentContext@21034618{vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear}
| |
|
with the current annotation deployer it's smth like:
anonymous wrote :
| jboss.j2ee:ear=jboss-seam-booking.ear,jar=jboss-seam-booking.jar,name=ChangePasswordAction,service=EJB3
|
note: the jar=jboss-seam-booking.jar :)
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167727#4167727
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167727
16 years, 5 months
[Design of POJO Server] - Re: Diff behavior with diff AnnotatedMetaDataDeployer
by alesj
"alesj" wrote :
| But none of them seems to work for me. ;-(
|
This is the error:
| 2008-07-30 20:18:30,593 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (RMI TCP Connection(4)-127.0.0.1) Error installing to Start: name=jboss.j2ee:ear=jboss-seam-booking.ear,jar=jboss-seam-booking.jar,name=HotelSearchingAction,service=EJB3 state=Create
| java.lang.NullPointerException
| at javax.naming.NameImpl.<init>(NameImpl.java:264)
| at javax.naming.CompoundName.<init>(CompoundName.java:187)
| at org.jnp.interfaces.NamingParser.parse(NamingParser.java:62)
| at org.jboss.util.naming.Util.rebind(Util.java:116)
| at org.jboss.ejb3.proxy.factory.BaseSessionProxyFactory.bindProxy(BaseSessionProxyFactory.java:192)
| at org.jboss.ejb3.proxy.factory.stateful.BaseStatefulProxyFactory.start(BaseStatefulProxyFactory.java:104)
| at org.jboss.ejb3.proxy.factory.stateful.StatefulLocalProxyFactory.start(StatefulLocalProxyFactory.java:136)
| at org.jboss.ejb3.session.ProxyDeployer.start(ProxyDeployer.java:135)
| at org.jboss.ejb3.session.SessionContainer.lockedStart(SessionContainer.java:188)
| at org.jboss.ejb3.stateful.StatefulContainer.lockedStart(StatefulContainer.java:286)
| at org.jboss.ejb3.EJBContainer.start(EJBContainer.java:855)
|
And
| jboss.j2ee:ear=jboss-seam-booking.ear,jar=jboss-seam-booking.ear,name=ChangePasswordAction,service=EJB3 -> java.lang.IllegalArgumentException: Can't find a persistence unit named '' in AbstractVFSDeploymentContext@21034618{vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear}
|
| jboss.j2ee:ear=jboss-seam-booking.ear,jar=jboss-seam-booking.ear,name=RegisterAction,service=EJB3 -> java.lang.IllegalArgumentException: Can't find a persistence unit named 'null' in AbstractVFSDeploymentContext@21034618{vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear}
|
Probably meaning that not enough information is passed into EJB3 metadata.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167718#4167718
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167718
16 years, 5 months
[Design of POJO Server] - Re: Diff behavior with diff AnnotatedMetaDataDeployer
by alesj
Opt:
| public class OptAnnotationMetaDataDeployer extends AnnotationMetaDataDeployer
| {
| public OptAnnotationMetaDataDeployer()
| {
| super();
| setInput(AnnotationEnvironment.class);
| }
|
| protected void processMetaData(VFSDeploymentUnit unit, WebMetaData webMetaData, ApplicationClientMetaData clientMetaData, List<VirtualFile> classpath) throws Exception
| {
| AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
| if(webMetaData != null)
| {
| processJBossWebMetaData(unit, finder);
| }
| else
| {
| if (clientMetaData != null)
| {
| processJBossClientMetaData(unit, finder);
| }
| else
| {
| String mainClassName = getMainClassName(unit);
| if (mainClassName != null)
| {
| processJBossClientMetaData(unit, finder);
| }
| else
| {
| processJBossMetaData(unit, finder);
| }
| }
| }
| }
|
| /**
| * Process jboss web meta data.
| *
| * @param unit the deployment unit
| * @param finder the finder
| */
| protected void processJBossWebMetaData(VFSDeploymentUnit unit, AnnotationFinder<AnnotatedElement> finder)
| {
| Web25MetaDataCreator creator = new Web25MetaDataCreator(finder);
| Collection<Class<?>> classes = getClasses(unit, creator);
| WebMetaData annotationMetaData = creator.create(classes);
| if(annotationMetaData != null)
| unit.addAttachment(WEB_ANNOTATED_ATTACHMENT_NAME, annotationMetaData, WebMetaData.class);
| }
|
| /**
| * Process jboss app client meta data.
| *
| * @param unit the deployment unit
| * @param finder the finder
| */
| protected void processJBossClientMetaData(VFSDeploymentUnit unit, AnnotationFinder<AnnotatedElement> finder)
| {
| ApplicationClient5MetaDataCreator creator = new ApplicationClient5MetaDataCreator(finder);
| Collection<Class<?>> classes = getClasses(unit, creator);
| ApplicationClientMetaData annotationMetaData = creator.create(classes);
| if(annotationMetaData != null)
| unit.addAttachment(CLIENT_ANNOTATED_ATTACHMENT_NAME, annotationMetaData, ApplicationClientMetaData.class);
| }
|
| /**
| * Process jboss meta data.
| *
| * @param unit the deployment unit
| * @param finder the finder
| */
| protected void processJBossMetaData(VFSDeploymentUnit unit, AnnotationFinder<AnnotatedElement> finder)
| {
| // Create the metadata model from the annotations
| JBoss50Creator creator = new JBoss50Creator(finder);
| Collection<Class<?>> classes = getClasses(unit, creator);
| JBossMetaData annotationMetaData = creator.create(classes);
| if(annotationMetaData != null)
| unit.addAttachment(EJB_ANNOTATED_ATTACHMENT_NAME, annotationMetaData, JBossMetaData.class);
| }
|
| /**
| * Get the classes for creator to process.
| *
| * @param unit the deployment unit
| * @param creator the creator
| * @return classes to process
| */
| @SuppressWarnings("unchecked")
| protected Collection<Class<?>> getClasses(VFSDeploymentUnit unit, AbstractCreator creator)
| {
| boolean trace = log.isTraceEnabled();
|
| AnnotationEnvironment env = unit.getAttachment(AnnotationEnvironment.class);
| if (env == null)
| {
| if (trace)
| log.trace("Cannot scan classes, missing AnnotationEnvironment as attachment: " + unit.getName());
|
| return Collections.emptySet();
| }
|
| String creatorInfo = creator.toString();
| AnnotationContext context = creator.getAnnotationContext();
| Set<Class<?>> classes = new HashSet<Class<?>>();
|
| Collection<Class<? extends Annotation>> typeAnnotations = context.getTypeAnnotations();
| if (trace)
| log.trace("Creator: " + creatorInfo + ", type annotations: " + typeAnnotations);
| for(Class<? extends Annotation> annotation : typeAnnotations)
| {
| Class<Annotation> annotationClass = (Class<Annotation>)annotation;
| Set<Element<Annotation, Class<?>>> elements = env.classIsAnnotatedWith(annotationClass);
| for(Element<Annotation, Class<?>> elt : elements)
| classes.add(elt.getOwner());
| }
|
| Collection<Class<? extends Annotation>> methodAnnotations = context.getMethodAnnotations();
| if (trace)
| log.trace("Creator: " + creatorInfo + ", method annotations: " + methodAnnotations);
| for(Class<? extends Annotation> annotation : methodAnnotations)
| {
| Class<Annotation> annotationClass = (Class<Annotation>)annotation;
| Set<Element<Annotation, Method>> elements = env.classHasMethodAnnotatedWith(annotationClass);
| for(Element<Annotation, Method> elt : elements)
| classes.add(elt.getOwner());
| }
|
| Collection<Class<? extends Annotation>> fieldAnnotations = context.getFieldAnnotations();
| if (trace)
| log.trace("Creator: " + creatorInfo + ", field annotations: " + fieldAnnotations);
| for(Class<? extends Annotation> annotation : fieldAnnotations)
| {
| Class<Annotation> annotationClass = (Class<Annotation>)annotation;
| Set<Element<Annotation, Field>> elements = env.classHasFieldAnnotatedWith(annotationClass);
| for(Element<Annotation, Field> elt : elements)
| classes.add(elt.getOwner());
| }
|
| if (trace)
| log.trace("Annotated classes [" + unit.getName() + ", " + creatorInfo + "]: " + classes);
|
| return classes;
| }
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167717#4167717
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167717
16 years, 5 months
[Design of POJO Server] - Diff behavior with diff AnnotatedMetaDataDeployer
by alesj
I'm testing new AnnotationMetaDataDeployer impl.
But none of them seems to work for me. ;-(
And I don't see what's so different between the new one's and the old one.
This is what the old one processes:
| 2008-07-30 19:16:49,203 TRACE [org.jboss.deployment.AnnotationMetaDataDeployer] (RMI TCP Connection(4)-127.0.0.1) Annotated classes:
|
| {ZipEntryHandler(a)22643817[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/BookingListAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/BookingListAction.class]=class org.jboss.seam.example.booking.BookingListAction,
|
| ZipEntryHandler(a)264752[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/AuthenticatorAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/AuthenticatorAction.class]=class org.jboss.seam.example.booking.AuthenticatorAction,
|
| ZipEntryHandler(a)20505518[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelSearching.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelSearching.class]=interface org.jboss.seam.example.booking.HotelSearching,
|
| ZipEntryHandler(a)32234525[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelBooking.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelBooking.class]=interface org.jboss.seam.example.booking.HotelBooking,
|
| ZipEntryHandler(a)29367791[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelSearchingAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelSearchingAction.class]=class org.jboss.seam.example.booking.HotelSearchingAction,
|
| ZipEntryHandler(a)32334045[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/Register.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/Register.class]=interface org.jboss.seam.example.booking.Register,
|
| ZipEntryHandler(a)24281983[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/ChangePasswordAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/ChangePasswordAction.class]=class org.jboss.seam.example.booking.ChangePasswordAction,
|
| ZipEntryHandler(a)18298829[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelBookingAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/HotelBookingAction.class]=class org.jboss.seam.example.booking.HotelBookingAction,
|
| ZipEntryHandler(a)22061158[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/Booking.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/Booking.class]=class org.jboss.seam.example.booking.Booking,
|
| ZipEntryHandler(a)5415906[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/Hotel.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/Hotel.class]=class org.jboss.seam.example.booking.Hotel,
|
| ZipEntryHandler(a)25521003[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/ChangePassword.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/ChangePassword.class]=interface org.jboss.seam.example.booking.ChangePassword,
|
| ZipEntryHandler(a)5208070[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/User.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/User.class]=class org.jboss.seam.example.booking.User,
|
| ZipEntryHandler(a)22088318[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/RegisterAction.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/RegisterAction.class]=class org.jboss.seam.example.booking.RegisterAction,
|
| ZipEntryHandler(a)25684047[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/Authenticator.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/Authenticator.class]=interface org.jboss.seam.example.booking.Authenticator,
|
| ZipEntryHandler(a)27568558[path=jboss-seam-booking.jar/org/jboss/seam/example/booking/BookingList.class context=file:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear real=vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear/jboss-seam-booking.jar/org/jboss/seam/example/booking/BookingList.class]=interface org.jboss.seam.example.booking.BookingList}
|
The already existing AltAMDD:
| 2008-07-30 19:42:37,015 TRACE [org.jboss.deployment.AltAnnotationMetaDataDeployer] (RMI TCP Connection(4)-127.0.0.1) Annotated classes:
|
| class org.jboss.seam.persistence.HibernateSessionProxyInterceptor,
| class org.jboss.seam.example.booking.BookingListAction,
| class org.jboss.seam.example.booking.RegisterAction,
| class org.jboss.seam.async.TimerServiceDispatcher,
| class org.jboss.seam.framework.EntityNotFoundException,
| class org.jboss.seam.security.AuthorizationException,
| interface org.jboss.seam.example.booking.HotelSearching,
| interface org.jboss.seam.example.booking.Register,
| class org.jboss.seam.example.booking.Booking,
| interface org.jboss.seam.async.LocalTimerServiceDispatcher,
| class org.jboss.seam.example.booking.HotelBookingAction,
| class org.jboss.seam.example.booking.HotelSearchingAction,
| class org.jboss.seam.example.booking.AuthenticatorAction,
| class org.jboss.seam.security.NotLoggedInException,
| class org.jboss.seam.transaction.EjbSynchronizations,
| class org.jboss.seam.example.booking.User,
| class org.jboss.seam.example.booking.Hotel,
| interface org.jboss.seam.example.booking.Authenticator,
| class org.jboss.seam.persistence.EntityManagerProxyInterceptor,
| class org.jboss.seam.intercept.SessionBeanInterceptor,
| interface org.jboss.seam.transaction.LocalEjbSynchronizations,
| interface org.jboss.seam.example.booking.ChangePassword,
| class org.jboss.seam.mock.MockSecureEntity,
| class org.jboss.seam.example.booking.ChangePasswordAction,
| interface org.jboss.seam.example.booking.HotelBooking,
| interface org.jboss.seam.example.booking.BookingList
|
And my new Opt (code in next post):
| 2008-07-30 17:17:31,625 TRACE [org.jboss.deployment.OptAnnotationMetaDataDeployer] (RMI TCP Connection(4)-127.0.0.1) Annotated classes [AbstractVFSDeploymentContext@22869899{vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear}, org.jboss.metadata.annotation.creator.ejb.jboss.JBoss50Creator@78049b]:
|
| org.jboss.seam.example.booking.AuthenticatorAction,
| org.jboss.seam.example.booking.BookingListAction,
| org.jboss.seam.example.booking.ChangePasswordAction,
| org.jboss.seam.example.booking.HotelBookingAction,
| org.jboss.seam.example.booking.HotelSearchingAction,
| org.jboss.seam.example.booking.RegisterAction,
|
| org.jboss.seam.async.TimerServiceDispatcher,
| org.jboss.seam.transaction.EjbSynchronizations,
|
| org.jboss.seam.framework.EntityNotFoundException,
| org.jboss.seam.security.AuthorizationException,
| org.jboss.seam.security.NotLoggedInException]
|
All this runs on the trunk versions of deployers, cl, vfs, microcontainer.
What does the old one do differently with classes that alternative two don't?
Isn't it all just about the classes you push to creators?
And with my Opt this should be optimized/good?
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167716#4167716
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167716
16 years, 5 months
[Design of POJO Server] - Re: ProfileService equiv to ServiceBindingManager
by bstansberry@jboss.com
Thanks. With that I should be able to handle parameter matching, figuring out the required types if not specified.
Looking at this, seems what I can do with parameter handling is fairly limited, but enough to get the job done for the port binding use case. Can handle this:
| <mbean ...>
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" parameter="A" default="1100"/>
| </attribute>
| </mbean>
|
And this:
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter>A</parameter>
| <parameter>1</parameter>
| </value-factory>
| </attribute>
|
And, as long as parameter type com.foo.Bar is visible and a PropertyEditor exists, this:
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter class="com.foo.Bar">A</parameter>
| <parameter class="java.lang.Integer">1</parameter>
| </value-factory>
| </attribute>
|
(I don't see a clear way to get FooProvider's classloader from a KernelControllerContext, so if com.foo.Bar is not visible, above won't work).
This also seems reasonably doable:
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter class="java.lang.Object">
| <value class="java.lang.Integer">1</value>
| </parameter>
| </value-factory>
| </attribute>
|
The following, while possibly doable are IMHO all a bridge too far:
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter><inject bean"FooParamProvider"/></parameter>
| </value-factory>
| </attribute>
|
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter>
| <bean name="FooParam" class="com.foo.FooParam"/>
| </parameter>
| </value-factory>
| </attribute>
|
| <attribute name="Foo">
| <value-factory bean="FooProvider" method="getFoo" default="1100">
| <parameter>
| <map>
| ...
| </map>
| </parameter>
| </value-factory>
| </attribute>
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167709#4167709
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167709
16 years, 5 months
[Design of POJO Server] - Re: Making Creators declare supported annotation types
by alesj
Aha, and I saw that I'm not getting @Entity marked classes back either.
e.g. running Seam Booking example:
| 2008-07-30 17:17:31,625 TRACE [org.jboss.deployment.OptAnnotationMetaDataDeployer] (RMI TCP Connection(4)-127.0.0.1) Annotated classes [AbstractVFSDeploymentContext@22869899{vfszip:/C:/projects/jboss5/trunk/testsuite/output/lib/jboss-seam-booking.ear}, org.jboss.metadata.annotation.creator.ejb.jboss.JBoss50Creator@78049b]:
|
| org.jboss.seam.example.booking.AuthenticatorAction,
| org.jboss.seam.example.booking.BookingListAction,
| org.jboss.seam.example.booking.ChangePasswordAction,
| org.jboss.seam.example.booking.HotelBookingAction,
| org.jboss.seam.example.booking.HotelSearchingAction,
| org.jboss.seam.example.booking.RegisterAction,
|
| org.jboss.seam.async.TimerServiceDispatcher,
| org.jboss.seam.transaction.EjbSynchronizations,
|
| org.jboss.seam.framework.EntityNotFoundException,
| org.jboss.seam.security.AuthorizationException,
| org.jboss.seam.security.NotLoggedInException]
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4167706#4167706
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4167706
16 years, 5 months