Howdy,
I have done some hacking on a gui that uses xjavadoc to parse classes, and
then reads an xml config file that describes each tag and their usage. this
tag information is organised within an enclosing domain (ex: all weblogic
ejb tags). This file contains enough meta information both to configure a
gui and create tag docs. See attached file for an example.
All we need to create HTML docs is an XSL stylesheet, and ant can apply the
XSLT transformation between the xml file and the stylesheet, and we'll end
up with a fully documented (and nicely formatted) tag set (provided the xml
contains all the info ;-). (We can even take it further and use Apache FOP
or Stylebook to create even fancier docs). This also enforces rigid rules
for document writers, which will result in more consistent docs.
By the way, the gui works pretty good, but it's a little wet behind the
ears. It organises all classes under groups (Various EJBs, Struts, Web etc.)
in a tree pane on the left. the classes' methods are also in this tree. By
selecting a class or method, the right panel will display a tabbed pane with
different tag groups. This is the panel which is constructed from the xml
file. The xml also describes under which conditions a tag is appropriate or
not, and displays only the tags that make sense to the selected class or
method. Tooltips and stuff. Each class or method is "categorised" by looking
at the class definition (for example, is this a subclass of
javax.ejb.SessionBean?), but also at the tag level (does this SessionBean
class have an @ejb:bean type="Stateless" tag?). Each tag is applicable to
one or many such categories of classes and methods.
I guess the next steps with this gui would be to:
1) Get code mutation (tag addition/removal/update in the source code).
Waiting for xjavadoc to handle this.
2) Merge it with Middlegen, which is another gui I wrote that can generate
CMP EJB XDoclet annotated source code that maps to a database schema. It
handles relations too, and is pretty neat.
http://boss.bekk.no/boss/middlegen/. It has some 500 downloads, but the
discussion is a bit slow. I'm hoping to get some more contributers.
3) Upload the whole thing somewhere. Right now, I have both guis under the
same Middlegen source tree. I guess the best would be to separate
xdoclet/xjavadoc/xdoclet-gui from each other. Both guis will be tightly
coupled, so I think it's ok to leave it where it is. We should change the
licence and file header.
Ok, thats all I had on my mind. It's fun working with you all.
Aslak.
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]On Behalf Of Ara
> Abrahamian
> Sent: 4. januar 2002 15:32
> To: 'Erik Hatcher'; [EMAIL PROTECTED]
> Subject: RE: [Xdoclet-user] NullPointerException <template> - help!
>
>
> Hi,
>
> Well, you know it's an open source project and hardly OS projects with
> volunteers follow a strict schedule. Anyway I think there's not much
> left to do for 1.1 release (maybe some changes here and there and some
> jboss stuff). So next week I hope we'll release it :o)
>
> Regarding documentation:
> It's way more than my and many other team members' ability to write all
> the docs, we're busy ppl as anyone is. I would love to see some
> contribution in this regard from user community, specially I'm very
> interested in converting from html-based docs to an xml+xsl+stylebook
> system (we actually need it for some new sub-projects too, the GUI tool
> for example) and some more docs/tutorial/examples. We really have some
> big goals for next releases.
>
> Cheers,
> Ara.
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED] [mailto:xdoclet-user-
> > [EMAIL PROTECTED]] On Behalf Of Erik Hatcher
> > Sent: Friday, January 04, 2002 5:14 PM
> > To: [EMAIL PROTECTED]
> > Subject: Re: [Xdoclet-user] NullPointerException <template> - help!
> >
> > Thanks again, Ara!
> >
> > The {0} worked great, of course, after building XDoclet from CVS.
> >
> > Is there a timeframe set for the next official release? I'm curious,
> as
> > I'm
> > writing about XDoclet and while running off of CVS is fine for me for
> now,
> > I'd rather a release version support the examples I'll be showing.
> >
> > Also, the link to the XDoclet site is wrong on the live resources page
> > (http://xdoclet.sourceforge.net/resources.html). It says "xdoclet",
> but
> > goes to the Sourceforge "ejbdoclet" site. This has caught me
> off-guard a
> > few times.
> >
> > XDoclet rocks! I'd like to see its documentation improved
> substantially
> > though, and may jump in to assist with that at some point in the
> future.
> > Its not been easy to track down exactly how to get rolling with custom
> > templates. All the "pieces" are there but more examples and
> explanations
> > of
> > things like {0} and forAllClasses needs to be easy to find.
> >
> > Thanks for a great product. Keep up the good work! :)
> >
> > Erik
> >
> >
> > ----- Original Message -----
> > From: "Ara Abrahamian" <[EMAIL PROTECTED]>
> > To: "'Erik Hatcher'" <[EMAIL PROTECTED]>;
> > <[EMAIL PROTECTED]>
> > Sent: Friday, January 04, 2002 6:16 AM
> > Subject: RE: [Xdoclet-user] NullPointerException <template> - help!
> >
> >
> > > Use either {0} (for per-class output) or forAllClasses (for-all
> output).
> > > I strongly recommend you latest code from cvs and I also recommend
> you
> > > to read latest cvs's core/docs/architecture.html and the
> auto-generated
> > > template descriptions.
> > >
> > > Ara.
> > >
> > > > -----Original Message-----
> > > > From: [EMAIL PROTECTED]
> [mailto:xdoclet-user-
> > > > [EMAIL PROTECTED]] On Behalf Of Erik Hatcher
> > > > Sent: Friday, January 04, 2002 2:25 PM
> > > > To: [EMAIL PROTECTED]
> > > > Subject: Re: [Xdoclet-user] NullPointerException <template> -
> help!
> > > >
> > > > Many thanks to both Ara and Matthew. Your quick and accurate
> replies
> > > were
> > > > most appreciated!
> > > >
> > > > Using the <XDoclet:forAllClasses> worked great. I tried using {0}
> in
> > > the
> > > > destination file instead and all I got was a file with "{0}" in
> its
> > > name -
> > > > so is this feature a post-1.0.1 feature? I'm sticking with 1.0.1
> for
> > > the
> > > > time being as I have plenty of other variables in my equation and
> I'm
> > > > trying
> > > > to minimize them as much as possible.
> > > >
> > > > In my particular case, the forAllClasses is the approach I need,
> but
> > > I'm
> > > > curious why the {0} doesn't work. I'm also assuming the "XDt"
> prefix
> > > for
> > > > tags is post-1.0.1, right?
> > > >
> > > > Thanks again,
> > > > Erik
> > > >
> > > >
> > > > ----- Original Message -----
> > > > From: "Ara Abrahamian" <[EMAIL PROTECTED]>
> > > > To: "'Erik Hatcher'" <[EMAIL PROTECTED]>;
> > > > <[EMAIL PROTECTED]>
> > > > Sent: Friday, January 04, 2002 3:59 AM
> > > > Subject: RE: [Xdoclet-user] NullPointerException <template> -
> help!
> > > >
> > > >
> > > > > There should be a problem in your template file. It throws NPE
> > > because
> > > > > getCurrentClass() in className() return null, in other words you
> > > want to
> > > > > get the current class name but no current class is set. You
> should
> > > use
> > > > > template tags which set it and iterate over classes
> > > > > (XDtClass:forAllClasses for example).
> > > > >
> > > > > Basically templates are run in two modes: per-class and for-all.
> You
> > > > > designate per-class mode by simply adding a {0} in
> destinationFile,
> > > and
> > > > > xdoclet will substitute it with the class name. In for-all mode,
> > > > > template is run for all specified classes matching the criteria
> > > > > (deriving from x, having tag y, etc), so you have to do a
> > > forAllClasses
> > > > > and then move on to work on each class and generate an output
> file
> > > based
> > > > > on those classes.
> > > > >
> > > > > Ara.
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: [EMAIL PROTECTED]
> > > [mailto:xdoclet-user-
> > > > > > [EMAIL PROTECTED]] On Behalf Of Erik Hatcher
> > > > > > Sent: Friday, January 04, 2002 4:46 AM
> > > > > > To: [EMAIL PROTECTED]
> > > > > > Subject: [Xdoclet-user] NullPointerException <template> -
> help!
> > > > > >
> > > > > > I'm using this build.xml piece:
> > > > > >
> > > > > > <xdoclet sourcepath="${src.dir}"
> > > > > > destdir="${build.dir}"
> > > > > > classpathref="xdoclet.classpath">
> > > > > > <fileset dir="${src.dir}">
> > > > > > <include name="**/*.java" />
> > > > > > </fileset>
> > > > > > <template templateFile="temp.template"
> > > > > > destinationfile="temp.properties"></template>
> > > > > > </xdoclet>
> > > > > >
> > > > > > [xdoclet] (TemplateEngine.invokeMethod 524 )
> Invoking
> > > method
> > > > > > failed:
> > > > > > lassName , line=1 of template file: C:\test\temp.template
> > > > > > [xdoclet] java.lang.NullPointerException
> > > > > > [xdoclet] at xdoclet.SubTask.className(SubTask.java:576)
> > > > > > [xdoclet] at java.lang.reflect.Method.invoke(Native
> Method)
> > > > > > [xdoclet] at
> > > > > > xdoclet.util.TemplateEngine.invokeMethod(TemplateEngine.java
> > > > > > 520)
> > > > > > [xdoclet] at
> > > > > > xdoclet.util.TemplateEngine.invokeContentMethod(TemplateEngi
> > > > > > e.java:627)
> > > > > > [xdoclet] at
> > > > > > xdoclet.util.TemplateEngine.generate(TemplateEngine.java:428
> > > > > >
> > > > > > [xdoclet] at
> > > > > > xdoclet.SubTask.generateFileUsingTemplate(SubTask.java:3052)
> > > > > > [xdoclet] at
> > > > > > xdoclet.TemplateSubTask.execute(TemplateSubTask.java:33)
> > > > > > [xdoclet] at
> > > > > > xdoclet.DocletTask$DocletMain.start(DocletTask.java:284)
> > > > > > [xdoclet] at java.lang.reflect.Method.invoke(Native
> Method)
> > > > > > [xdoclet] at
> > > > > > com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.jav
> > > > > >
> > > > > > I've tried this with both Ant 1.4.1 and the latest (from CVS)
> > > version
> > > > > and
> > > > > > get the same error.
> > > > > >
> > > > > > I'm using XDoclet 1.0.1 release version.
> > > > > >
> > > > > > Any help is greatly appreciated.
> > > > > >
> > > > > > Thanks,
> > > > > > Erik
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > _______________________________________________
> > > > > > Xdoclet-user mailing list
> > > > > > [EMAIL PROTECTED]
> > > > > > https://lists.sourceforge.net/lists/listinfo/xdoclet-user
> > > > >
> > > > >
> > > > > _________________________________________________________
> > > > > Do You Yahoo!?
> > > > > Get your free @yahoo.com address at http://mail.yahoo.com
> > > > >
> > > > >
> > > >
> > > >
> > > > _______________________________________________
> > > > Xdoclet-user mailing list
> > > > [EMAIL PROTECTED]
> > > > https://lists.sourceforge.net/lists/listinfo/xdoclet-user
> > >
> > >
> > > _________________________________________________________
> > > Do You Yahoo!?
> > > Get your free @yahoo.com address at http://mail.yahoo.com
> > >
> > >
> >
> >
> > _______________________________________________
> > Xdoclet-user mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/xdoclet-user
>
>
> _________________________________________________________
> Do You Yahoo!?
> Get your free @yahoo.com address at http://mail.yahoo.com
>
>
> _______________________________________________
> Xdoclet-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/xdoclet-user
<!--
This metafile can be used for xdoclet documentation generation and for
middlegen gui creation.
If someone wants to run middlegen as a non-gui batch job (with ant perhaps),
they can modify this file (which is also bundled inside middlegen)
and provide default values for some parameters. It can even be possible
to specify a ValueFactory class. We should ship middlegen with a default
value factory class which sets "" or the 1st value if <values> exists
and not optional.
-->
<xdoclet>
<tagshandler>
<name>weblogic</name>
<usage>WebLogic Server</usage>
<class-tags>
<tag>
<name>weblogic:pool</name>
<usage>Blah blah blah, maybe in SDATA</usage>
<parameter>
<name>max-beans-in-free-pool</name>
<type>java.lang.Integer</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
</parameter>
<parameter>
<name>initial-beans-in-free-pool</name>
<type>java.lang.Integer</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
</parameter>
</tag>
<tag>
<name>weblogic:cache</name>
<usage>Blah blah blah, maybe in SDATA</usage>
<parameter>
<name>max-beans-in-cache</name>
<type>java.lang.Integer</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
<constraints>
<type-constraint>
<type-name>javax.ejb.EntityBean</type-name>
</type-constraint>
<type-constraint>
<type-name>javax.ejb.SessionBean</type-name>
<class-tag>
<name>ejb:bean</name>
<parameter>type</parameter>
<value>Stateless</value>
</class-tag>
</type-constraint>
</constraints>
</parameter>
<parameter>
<name>idle-timeout-seconds</name>
<type>java.lang.Integer</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
<multiple>true</multiple>
<constraints>
<type-constraint>
<type-name>javax.ejb.EntityBean</type-name>
</type-constraint>
<type-constraint>
<type-name>javax.ejb.SessionBean</type-name>
<class-tag>
<name>ejb:bean</name>
<parameter>type</parameter>
<value>Stateless</value>
</class-tag>
</type-constraint>
</constraints>
</parameter>
<parameter>
<name>read-timeout-seconds</name>
<type>java.lang.Integer</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
<constraints>
<type-constraint>
<type-name>javax.ejb.EntityBean</type-name>
</type-constraint>
</constraints>
</parameter>
<parameter>
<name>concurrency-strategy</name>
<type>java.lang.String</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
<constraints>
<type>
<type-name>javax.ejb.EntityBean</type-name>
</type>
</constraints>
<values>
<value>Exclusive</value>
<value>Database</value>
<value>ReadOnly</value>
</values>
<!-- For dynamic values. Can for example look at db field -->
<value-factory>middlegen.vendor.weblogic.CacheValueFactory</value-factory>
</parameter>
<parameter>
<name>cache-type</name>
<type>java.lang.String</type>
<usage>Blah blah blah, maybe in SDATA</usage>
<mandatory>false</mandatory>
<constraints>
<type-constraint>
<type-name>javax.ejb.SessionBean</type-name>
<class-tag>
<name>ejb:bean</name>
<parameter>type</parameter>
<value>Stateless</value>
</class-tag>
</type-constraint>
</constraints>
<version>
<name>xdoclet</name>
<value>1.0.1</value>
</version>
<version>
<name>weblogic</name>
<value>6.1</value>
</version>
<values>
<value>NRU</value>
<value>LRU</value>
</values>
</parameter>
<parameter>
<name>BOOLEAN_TEST_ON</name>
<type>java.lang.Boolean</type>
<usage>Yes or no?</usage>
<mandatory>true</mandatory>
<!--values>
<value>true</value>
</values-->
</parameter>
<parameter>
<name>BOOLEAN_TEST_OFF</name>
<type>java.lang.Boolean</type>
<usage>Yes or no?</usage>
<mandatory>true</mandatory>
<!--values>
<value>false</value>
</values-->
</parameter>
</tag>
<tag>
<name>weblogic:lifecycle</name>
<usage>Blah blah blah, maybe in SDATA</usage>
<parameter>
<name>passivation-strategy</name>
<type>java.lang.String</type>
<usage>
The passivation-strategy can be either "default" or "transaction". With
the default setting the container will attempt to keep a working set
of beans in the cache. With the "transaction" setting, the container will
passivate the bean after every transaction (or method call for a
non-transactional invocation).
</usage>
<mandatory>false</mandatory>
<constraints>
<type-constraint>
<type-name>javax.ejb.EntityBean</type-name>
</type-constraint>
<type-constraint>
<type-name>javax.ejb.SessionBean</type-name>
<class-tag>
<name>ejb:bean</name>
<parameter>type</parameter>
<value>Stateful</value>
</class-tag>
</type-constraint>
</constraints>
</parameter>
</tag>
</class-tags>
</tagshandler>
<tagshandler>
<name>ejb</name>
<usage>Standard EJB</usage>
<class-tags>
<tag>
<name>ejb:env-entry</name>
<usage>Environment</usage>
<parameter>
<name>name</name>
<type>java.lang.String</type>
<usage>This is only for testing</usage>
<mandatory>false</mandatory>
</parameter>
<parameter>
<name>value</name>
<type>java.lang.String</type>
<usage>This is only for testing</usage>
<mandatory>false</mandatory>
</parameter>
<parameter>
<name>type</name>
<type>java.lang.String</type>
<usage>This is only for testing</usage>
<mandatory>false</mandatory>
</parameter>
</tag>
</class-tags>
</tagshandler>
</xdoclet>