You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Werner Punz <we...@gmx.at> on 2005/08/30 20:25:52 UTC

JSF success story

Martin Manfred and the others from vienna, know already the app, I 
showed an early beta version to them in Vienna,
I could not show it publicly due to various reasons....

But just for the general public here is a small success story,
I did a JSF app, around the timeframe of the 15th of may til the 15th of 
june (core crunch phase with some maintainance until now)

most of the controls currently hosted on jsf-comp were developed for 
that program due to the "insane" specs I got in last minute, which I 
could not get rid of.

So far so good, since the beginning of june the application has been 
rolled out, it is an intranet app, servicing around 60 users some of 
them working constantly with it, with around 12.000 addresses so far 
hammered in manually.

So far not a single crash, not the slightest memory problem,
a few minor bugfixes in between, and the tomcat runs on conservative 
128mb, with not even spiking the server which is a xeon server to 3% 
from time to time.

The application was programmed against myfaces 1.0.9, running on a 
Tomcat 5.5.9 under JDK 5.0....

I just wanted to share an internal success story, and wanted
to show that myfaces can be used perfectly for real apps...
It scales very well...

The app uses a combination of myfaces, some ajax controls,
some other controls like the client side tabbing pane,
hibernate in the old incarnation, and spring for
supporting classes in the middle tier.
It also used some effects from the script.aculo.us library
and from the fat library mapped into jsf tags.

The development time was dramatically reduced by the application of 
xdoclet for standard CRUD masks (which the app consists of around 50%)
and the application of the generated classes to the IOC system of spring
merged into JSF, via the Spring JSF integration library.


Werner


Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
http://wuerg.kicks-ass.net:8080/customcontrols/index.jsf
is my private demo server showing off some of the components developed 
for the project and now hosted on jsf-comp...

the problem is that many of the components from my side on jsf-comp 
currently are programmed against MyFaces 1.0.9, some of them are 
obsolete by now (the ajax autocomplete can be found better coded
in the sandbox)...
so if you use some of that stuff I am very willing to give help, but use 
it with care, since this is mainly alpha code...

Werner


Martin Marinschek wrote:
> this is a project on:
> 
> sourceforge.net
> 
> were people who want to drop jsf code can do it - without having to go
> through the rigorous ASF screening necessary ;)
> 
> depending on license issues, users base etc. some of this code might
> wander over to MyFaces core at some point in time.
> 
> regards,
> 
> Martin
> 
> 
> On 8/31/05, Dave Brondsema <da...@brondsema.net> wrote:
> 
>>Werner Punz wrote:
>>
>>>Martin Manfred and the others from vienna, know already the app, I
>>>showed an early beta version to them in Vienna,
>>>I could not show it publicly due to various reasons....
>>>
>>>But just for the general public here is a small success story,
>>>I did a JSF app, around the timeframe of the 15th of may til the 15th of
>>>june (core crunch phase with some maintainance until now)
>>>
>>>most of the controls currently hosted on jsf-comp were developed for
>>>that program due to the "insane" specs I got in last minute, which I
>>>could not get rid of.
>>>
>>
>>What and where is jsf-comp?
>>
>>--
>>Dave Brondsema
>>Software Developer
>>Cornerstone University
>>
>>
>>
> 
> 
> 


Re: JSF success story

Posted by Martin Marinschek <ma...@gmail.com>.
this is a project on:

sourceforge.net

were people who want to drop jsf code can do it - without having to go
through the rigorous ASF screening necessary ;)

depending on license issues, users base etc. some of this code might
wander over to MyFaces core at some point in time.

regards,

Martin


On 8/31/05, Dave Brondsema <da...@brondsema.net> wrote:
> Werner Punz wrote:
> > Martin Manfred and the others from vienna, know already the app, I
> > showed an early beta version to them in Vienna,
> > I could not show it publicly due to various reasons....
> >
> > But just for the general public here is a small success story,
> > I did a JSF app, around the timeframe of the 15th of may til the 15th of
> > june (core crunch phase with some maintainance until now)
> >
> > most of the controls currently hosted on jsf-comp were developed for
> > that program due to the "insane" specs I got in last minute, which I
> > could not get rid of.
> >
> 
> What and where is jsf-comp?
> 
> --
> Dave Brondsema
> Software Developer
> Cornerstone University
> 
> 
> 


-- 

http://www.irian.at
Your JSF powerhouse - 
JSF Trainings in English and German

Re: JSF success story

Posted by Dave Brondsema <da...@brondsema.net>.
Werner Punz wrote:
> Martin Manfred and the others from vienna, know already the app, I
> showed an early beta version to them in Vienna,
> I could not show it publicly due to various reasons....
> 
> But just for the general public here is a small success story,
> I did a JSF app, around the timeframe of the 15th of may til the 15th of
> june (core crunch phase with some maintainance until now)
> 
> most of the controls currently hosted on jsf-comp were developed for
> that program due to the "insane" specs I got in last minute, which I
> could not get rid of.
> 

What and where is jsf-comp?

-- 
Dave Brondsema
Software Developer
Cornerstone University

Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
Sort of standard layout, you cannot cover very much with code gens...

if you move away from the standard masks you have to do something 
manually...

It is not that bad because JSF basically forces you to use CSS as much 
as possible.

Standard crud masks usually are always the same, and a little bit of 
manual tweaking has to be done at the later stage when you can expect 
that things do not change too much anymore.

I dont see the code gens as we have to generate a working app, it simply
does the job a team of standard coders have to do before things get 
really interesting...

But to my experience, it helped me at least to cut down dev time to 50%
if not more.


Werner



Enrique Medina wrote:
> Sounds really interesting...
> 
> But what about the layout? How is it defined?
> 
> 2005/8/31, Werner Punz <werpu@gmx.at <ma...@gmx.at>>:
> 
>     Enrique Medina wrote:
>      > Hi Werner,
>      >
>      > Could you please give us extenden information about the
>     application of
>      > xdoclet for standard CRUD maks and the use of IoC?
>      >
>      > I have a slight idea of what you're talking, but to concrete ;-)
>      >
>      > Thanks.
>      >
>     Yes, I started off and still am in the project as a one man team, it
>     started off as a project which had to be finished very swiftly and
>     will be dumped once a bigger system goes online, more details is NDA...
> 
>     I knew xdoclet in the past from an old job where I constantly had to
>     fight against monetary issues, and had in the end to do the work of an
>     entire team.
> 
>     What I did was to use xdoclet sort of as a code templating wizard,
>     which
>     generated the create update delete base code and the master detail views
>     from the given reverse engineered database objects...
> 
>     All I did was to extend it that way, that I had to add basic metadata
>     with form information to the database pojos and then had a run via
>     xdoclet over them. The result is basically a master detail module with
>     all the forms, some basic verification code and the dao layer, and it is
>     working and also with working faces-config files which were generated.
> 
>     Several form parts are split apart for easier maintenance via aliasbean
>     includes... or general includes
> 
>     No to overwrite my code again and again I used basic inheritance to add
>     manually the additional functionality to the java parts, nowadays if I
>     had to write it from scratch I probably would weave the objects into the
>     rest of the system via inversion of object control.
> 
>     the final forms were based upon the code templates generated but
>     manually altered and moved into separate directories, the binding could
>     then be done by altering the faces-config manually...
> 
>     So what happened is that you basically generate a basic application out
>     of an existing db schema and then start to alter the parts you need
>     changed and move them out of the generation base, so that you do not
>     overwrite them. That also means, you need at least one working project
>     codebase to start on to write your templates for the next project.
>     Once this huge task is done and the codebase is stabilized you can reuse
>     it for the next projects...
> 
> 
>     one of the generation classes for xdoclet looks like this:
>     /**
>       * @dbo.form.single module="gen" icon="img_institution_big"
>     title="Institutionsverwaltung"
>       * @dbo.binding.hibernate A simple changelog blog object which
>     handles the
>       *                        change logs and infos of the system
>       * @author Punz
>       *
>       * <PRE>
>       *
>       * Dummy class to generate the database forms
>       *
>       * currently following tags are supported dbo.form.single marks the
>     class as dbo
>       * master object on a single master detail form dbo.method mars a
>     method which
>       * has to be parsed as dbo method (only getters have to be marked
>     it has
>       * following attributes: header marks a plain text header or a ref
>     to an
>       * internationalization file sortable if set marks this property as
>     a sort
>       * criterion masterDisplay marks this one as displayable in the master
>     table
>       * detailDisplay marks this one as displayable in the detail table
>     as well
>       * detailField gives the jsf detail field type detailFieldParams
>     pushes the
>       * internal detail field params down to the template
>       *
>       * @dbo.method.validation marks that validation has to be added
>       *                        required="true/false" marks that the required
>     flag has
>       *                        to be set stdvalidators=" <f:validateLength
>       *                        minimum='2' maximum='40' />" a string of
>     standard
>       *                        validators
>       *
>       * @dbo.action sets an action with following parameters
>     oneonmany="true" marks
>       *             the action as simply two form oneonmany relations
>       *             header="Kontakte" linkheader for the action
>     masterDisplay="true"
>       *             display the action in the master display
>     detailDisplay="true"
>       *             display the action in the detail display as well
>       *             slave="Tblcontact" slave object in case of a simple one
>     on many
>       *
>       * </pre>
>       */
>     public class Institution extends ommiddlegen.Institution {
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getId ()
>           * @dbo.method header="Id" sortable="true" masterDisplay="true"
>     detailDisplay="true" detailField="h:inputHidden"
>     detailFieldType="h:inputHidden"
>              */
> 
>             public Integer getId() {
>                     return super.getId();
>             }
> 
> 
> 
> 
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getTitle()
>           *  @ dbo.method header="Name"  masterDisplay="true"
>     detailDisplay="true"
>           *  @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='50' />"
>           *  @dbo.method.search likeQuery="true"
>              */
>             public String getNachname() {
> 
>                     return super.getNachname();
>             }
> 
> 
> 
> 
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           * @dbo.method header="Beschreibung"   detailDisplay="true"
>     detailField="h:inputTextarea rows='10' cols='30' "
>     detailFieldType="h:inputTextarea"
>           * @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='3' maximum='512' />"
>              */
> 
>             public String getBeschreibung() {
>                     return super.getBeschreibung();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           * @dbo.method header="Rechtsform"   detailDisplay="true"
>              */
> 
>             public String getRechtsform() {
>                     // TODO Auto-generated method stub
>                     return super.getRechtsform();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           *  @dbo.method header="Anschrifttitel"  detailDisplay="true"
>           *  @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='50' />"
>              */
> 
>             public String getAnschrifttitel() {
>                     // TODO Auto-generated method stub
>                     return super.getAnschrifttitel();
>             }
> 
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           *  @dbo.method header="Gruppe"  detailDisplay="true"
>           *  @dbo.method.validation
>              */
> 
>             public String getGruppe() {
>                     return super.getGruppe();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription ()
>           *  @dbo.method header="Statut"  detailDisplay="true"
>              */
> 
>             public Byte getStatut() {
>                     return super.getStatut();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           *  @dbo.method header="Klassifikation"  detailDisplay="true"
>              */
> 
>             public Integer getKlassifikation() {
>                     return super.getKlassifikation();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           *  @dbo.method header="Straße"  detailDisplay="true"
>           *  @ dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='100' />
>              */
> 
>             public String getStrasse() {
>                     return super.getStrasse ();
>             }
> 
> 
>             /**
>           *  @dbo.method header="Hausnr"  detailDisplay="true"
>           *  @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='100' />
>              */
>             public String getHausnr() {
>                     return super.getHausnr();
>             }
> 
> 
>             /**
>           *  @dbo.method header="Ort"  detailDisplay="true"
>           *  @ dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='50' />"
>           *  @dbo.method.search likeQuery="true"
>              */
>             public String getOrt() {
>                     return super.getOrt();
>             }
> 
> 
>             /**
>           *  @dbo.method header="Plz"  detailDisplay="true"
>           *  @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='2' maximum='8' />"
>           *  @dbo.method.search likeQuery="true"
>              */
>             public String getPlz() {
>                     return super.getPlz ();
>             }
>             /**
>              *  @dbo.method header="Bundesland"  detailDisplay="true"
>              *  @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='1' maximum='1' />"
>              */
> 
>             public String getBld() {
>                     return super.getBld();
>             }
> 
>             /**
>              *  @dbo.method header="Land"  detailDisplay="true"
>              */
> 
>             public String getLand() {
>                     return super.getLand();
>             }
> 
>             /**
>              *  @dbo.method header="Email-1"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators="<x:validateEmail />"
>              */
> 
>             public String getEmail1() {
>                     return super.getEmail1();
>             }
> 
>             /**
>              *  @dbo.method header="Email-2"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators="<x:validateEmail />"
>              */
> 
>             public String getEmail2() {
>                     return super.getEmail2();
>             }
> 
>             /**
>              *  @dbo.method header="Mobiltelefon-1"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators="<x:validateRegExpr
>     pattern='^[0-9\s]+' />"
>              */
> 
>             public String getHandy1() {
>                     return super.getHandy1();
>             }
> 
> 
>             /**
>              *  @dbo.method header="Mobiltelefon-2"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators=" <x:validateRegExpr
>     pattern='^[0-9\s]+' />"
>              */
>             public String getHandy2() {
>                     return super.getHandy2();
>             }
> 
> 
>             /**
>              *  @dbo.method header="Telefon-1"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators="<x:validateRegExpr
>     pattern='^[0-9\s]+' />"
>              */
>             public String getTelefon1() {
>                     return super.getTelefon1();
>             }
> 
>             /**
>              *  @dbo.method header="Telefon-2"  detailDisplay="true"
>              *  @dbo.method.validation stdvalidators="<x:validateRegExpr
>     pattern='^[0-9\s]+' />"
>              */
> 
>             public String getTelefon2() {
>                     return super.getTelefon2();
>             }
> 
>             /**
>              * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
>           * @dbo.method header="BKZ"   detailDisplay="true"
>           * @dbo.method.validation required="true"
>     stdvalidators="<f:validateLength minimum='3' maximum='3' />"
>              */
> 
>             public String getBkz() {
>                     return super.getBkz();
>             }
> 
>     }
> 
> 
>     Werner
> 
> 


Re: JSF success story

Posted by Enrique Medina <e....@gmail.com>.
Sounds really interesting...

But what about the layout? How is it defined?

2005/8/31, Werner Punz <we...@gmx.at>:
> 
> Enrique Medina wrote:
> > Hi Werner,
> >
> > Could you please give us extenden information about the application of
> > xdoclet for standard CRUD maks and the use of IoC?
> >
> > I have a slight idea of what you're talking, but to concrete ;-)
> >
> > Thanks.
> >
> Yes, I started off and still am in the project as a one man team, it
> started off as a project which had to be finished very swiftly and
> will be dumped once a bigger system goes online, more details is NDA...
> 
> I knew xdoclet in the past from an old job where I constantly had to
> fight against monetary issues, and had in the end to do the work of an
> entire team.
> 
> What I did was to use xdoclet sort of as a code templating wizard, which
> generated the create update delete base code and the master detail views
> from the given reverse engineered database objects...
> 
> All I did was to extend it that way, that I had to add basic metadata
> with form information to the database pojos and then had a run via
> xdoclet over them. The result is basically a master detail module with
> all the forms, some basic verification code and the dao layer, and it is
> working and also with working faces-config files which were generated.
> 
> Several form parts are split apart for easier maintenance via aliasbean
> includes... or general includes
> 
> No to overwrite my code again and again I used basic inheritance to add
> manually the additional functionality to the java parts, nowadays if I
> had to write it from scratch I probably would weave the objects into the
> rest of the system via inversion of object control.
> 
> the final forms were based upon the code templates generated but
> manually altered and moved into separate directories, the binding could
> then be done by altering the faces-config manually...
> 
> So what happened is that you basically generate a basic application out
> of an existing db schema and then start to alter the parts you need
> changed and move them out of the generation base, so that you do not
> overwrite them. That also means, you need at least one working project
> codebase to start on to write your templates for the next project.
> Once this huge task is done and the codebase is stabilized you can reuse
> it for the next projects...
> 
> 
> one of the generation classes for xdoclet looks like this:
> /**
> * @dbo.form.single module="gen" icon="img_institution_big"
> title="Institutionsverwaltung"
> * @dbo.binding.hibernate A simple changelog blog object which handles the
> * change logs and infos of the system
> * @author Punz
> *
> * <PRE>
> *
> * Dummy class to generate the database forms
> *
> * currently following tags are supported dbo.form.single marks the
> class as dbo
> * master object on a single master detail form dbo.method mars a
> method which
> * has to be parsed as dbo method (only getters have to be marked it has
> * following attributes: header marks a plain text header or a ref to an
> * internationalization file sortable if set marks this property as a sort
> * criterion masterDisplay marks this one as displayable in the master
> table
> * detailDisplay marks this one as displayable in the detail table as well
> * detailField gives the jsf detail field type detailFieldParams pushes the
> * internal detail field params down to the template
> *
> * @dbo.method.validation marks that validation has to be added
> * required="true/false" marks that the required
> flag has
> * to be set stdvalidators=" <f:validateLength
> * minimum='2' maximum='40' />" a string of standard
> * validators
> *
> * @dbo.action sets an action with following parameters
> oneonmany="true" marks
> * the action as simply two form oneonmany relations
> * header="Kontakte" linkheader for the action
> masterDisplay="true"
> * display the action in the master display
> detailDisplay="true"
> * display the action in the detail display as well
> * slave="Tblcontact" slave object in case of a simple one
> on many
> *
> * </pre>
> */
> public class Institution extends ommiddlegen.Institution {
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getId()
> * @dbo.method header="Id" sortable="true" masterDisplay="true"
> detailDisplay="true" detailField="h:inputHidden"
> detailFieldType="h:inputHidden"
> */
> 
> public Integer getId() {
> return super.getId();
> }
> 
> 
> 
> 
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getTitle()
> * @dbo.method header="Name" masterDisplay="true"
> detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='50' />"
> * @dbo.method.search likeQuery="true"
> */
> public String getNachname() {
> 
> return super.getNachname();
> }
> 
> 
> 
> 
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Beschreibung" detailDisplay="true"
> detailField="h:inputTextarea rows='10' cols='30' "
> detailFieldType="h:inputTextarea"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='3' maximum='512' />"
> */
> 
> public String getBeschreibung() {
> return super.getBeschreibung();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Rechtsform" detailDisplay="true"
> */
> 
> public String getRechtsform() {
> // TODO Auto-generated method stub
> return super.getRechtsform();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Anschrifttitel" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='50' />"
> */
> 
> public String getAnschrifttitel() {
> // TODO Auto-generated method stub
> return super.getAnschrifttitel();
> }
> 
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Gruppe" detailDisplay="true"
> * @dbo.method.validation
> */
> 
> public String getGruppe() {
> return super.getGruppe();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Statut" detailDisplay="true"
> */
> 
> public Byte getStatut() {
> return super.getStatut();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Klassifikation" detailDisplay="true"
> */
> 
> public Integer getKlassifikation() {
> return super.getKlassifikation();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="Straße" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='100' />
> */
> 
> public String getStrasse() {
> return super.getStrasse();
> }
> 
> 
> /**
> * @dbo.method header="Hausnr" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='100' />
> */
> public String getHausnr() {
> return super.getHausnr();
> }
> 
> 
> /**
> * @dbo.method header="Ort" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='50' />"
> * @dbo.method.search likeQuery="true"
> */
> public String getOrt() {
> return super.getOrt();
> }
> 
> 
> /**
> * @dbo.method header="Plz" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='2' maximum='8' />"
> * @dbo.method.search likeQuery="true"
> */
> public String getPlz() {
> return super.getPlz();
> }
> /**
> * @dbo.method header="Bundesland" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='1' maximum='1' />"
> */
> 
> public String getBld() {
> return super.getBld();
> }
> 
> /**
> * @dbo.method header="Land" detailDisplay="true"
> */
> 
> public String getLand() {
> return super.getLand();
> }
> 
> /**
> * @dbo.method header="Email-1" detailDisplay="true"
> * @dbo.method.validation stdvalidators="<x:validateEmail />"
> */
> 
> public String getEmail1() {
> return super.getEmail1();
> }
> 
> /**
> * @dbo.method header="Email-2" detailDisplay="true"
> * @dbo.method.validation stdvalidators="<x:validateEmail />"
> */
> 
> public String getEmail2() {
> return super.getEmail2();
> }
> 
> /**
> * @dbo.method header="Mobiltelefon-1" detailDisplay="true"
> * @dbo.method.validation stdvalidators="<x:validateRegExpr
> pattern='^[0-9\s]+' />"
> */
> 
> public String getHandy1() {
> return super.getHandy1();
> }
> 
> 
> /**
> * @dbo.method header="Mobiltelefon-2" detailDisplay="true"
> * @dbo.method.validation stdvalidators=" <x:validateRegExpr
> pattern='^[0-9\s]+' />"
> */
> public String getHandy2() {
> return super.getHandy2();
> }
> 
> 
> /**
> * @dbo.method header="Telefon-1" detailDisplay="true"
> * @dbo.method.validation stdvalidators="<x:validateRegExpr
> pattern='^[0-9\s]+' />"
> */
> public String getTelefon1() {
> return super.getTelefon1();
> }
> 
> /**
> * @dbo.method header="Telefon-2" detailDisplay="true"
> * @dbo.method.validation stdvalidators="<x:validateRegExpr
> pattern='^[0-9\s]+' />"
> */
> 
> public String getTelefon2() {
> return super.getTelefon2();
> }
> 
> /**
> * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
> * @dbo.method header="BKZ" detailDisplay="true"
> * @dbo.method.validation required="true"
> stdvalidators="<f:validateLength minimum='3' maximum='3' />"
> */
> 
> public String getBkz() {
> return super.getBkz();
> }
> 
> }
> 
> 
> Werner
> 
>

Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
Enrique Medina wrote:
> Hi Werner,
> 
> Could you please give us extenden information about the application of 
> xdoclet for standard CRUD maks and the use of IoC?
> 
> I have a slight idea of what you're talking, but to concrete ;-)
> 
> Thanks.
> 
Yes, I started off and still am in the project as a one man team, it 
started off as a project which had to be finished very swiftly and
will be dumped once a bigger system goes online, more details is NDA...

I knew xdoclet in the past from an old job where I constantly had to 
fight against monetary issues, and had in the end to do the work of an 
entire team.

What I did was to use xdoclet sort of as a code templating wizard, which 
generated the create update delete base code and the master detail views
from the given reverse engineered database objects...

All I did was to extend it that way, that I had to add basic metadata
with form information to the database pojos and then had a run via 
xdoclet over them. The result is basically a master detail module with 
all the forms, some basic verification code and the dao layer, and it is 
working and also with working faces-config files which were generated.

Several form parts are split apart for easier maintenance via aliasbean 
includes... or general includes

No to overwrite my code again and again I used basic inheritance to add 
manually the additional functionality to the java parts, nowadays if I 
had to write it from scratch I probably would weave the objects into the 
rest of the system via inversion of object control.

the final forms were based upon the code templates generated but 
manually altered and moved into separate directories, the binding could 
then be done by altering the faces-config manually...

So what happened is that you basically generate a basic application out
of an existing db schema and then start to alter the parts you need 
changed and move them out of the generation base, so that you do not 
overwrite them. That also means, you need at least one working project 
codebase to start on to write your templates for the next project.
Once this huge task is done and the codebase is stabilized you can reuse 
it for the next projects...


one of the generation classes for xdoclet looks like this:
/**
  * @dbo.form.single module="gen" icon="img_institution_big" 
title="Institutionsverwaltung"
  * @dbo.binding.hibernate A simple changelog blog object which handles the
  *                        change logs and infos of the system
  * @author Punz
  *
  * <PRE>
  *
  * Dummy class to generate the database forms
  *
  * currently following tags are supported dbo.form.single marks the 
class as dbo
  * master object on a single master detail form dbo.method mars a 
method which
  * has to be parsed as dbo method (only getters have to be marked it has
  * following attributes: header marks a plain text header or a ref to an
  * internationalization file sortable if set marks this property as a sort
  * criterion masterDisplay marks this one as displayable in the master 
table
  * detailDisplay marks this one as displayable in the detail table as well
  * detailField gives the jsf detail field type detailFieldParams pushes the
  * internal detail field params down to the template
  *
  * @dbo.method.validation marks that validation has to be added
  *                        required="true/false" marks that the required 
flag has
  *                        to be set stdvalidators=" <f:validateLength
  *                        minimum='2' maximum='40' />" a string of standard
  *                        validators
  *
  * @dbo.action sets an action with following parameters 
oneonmany="true" marks
  *             the action as simply two form oneonmany relations
  *             header="Kontakte" linkheader for the action 
masterDisplay="true"
  *             display the action in the master display 
detailDisplay="true"
  *             display the action in the detail display as well
  *             slave="Tblcontact" slave object in case of a simple one 
on many
  *
  * </pre>
  */
public class Institution extends ommiddlegen.Institution {

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getId()
      * @dbo.method header="Id" sortable="true" masterDisplay="true" 
detailDisplay="true" detailField="h:inputHidden" 
detailFieldType="h:inputHidden"
	 */

	public Integer getId() {
		return super.getId();
	}

	

	
	
	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getTitle()
      *  @dbo.method header="Name"  masterDisplay="true" 
detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='50' />"
      *  @dbo.method.search likeQuery="true"
	 */
	public String getNachname() {

		return super.getNachname();
	}





	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      * @dbo.method header="Beschreibung"   detailDisplay="true" 
detailField="h:inputTextarea rows='10' cols='30' " 
detailFieldType="h:inputTextarea"
      * @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='3' maximum='512' />"
	 */

	public String getBeschreibung() {
		return super.getBeschreibung();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      * @dbo.method header="Rechtsform"   detailDisplay="true"
	 */

	public String getRechtsform() {
		// TODO Auto-generated method stub
		return super.getRechtsform();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      *  @dbo.method header="Anschrifttitel"  detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='50' />"
	 */

	public String getAnschrifttitel() {
		// TODO Auto-generated method stub
		return super.getAnschrifttitel();
	}

	
	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      *  @dbo.method header="Gruppe"  detailDisplay="true"
      *  @dbo.method.validation
	 */

	public String getGruppe() {
		return super.getGruppe();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      *  @dbo.method header="Statut"  detailDisplay="true"
	 */

	public Byte getStatut() {
		return super.getStatut();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      *  @dbo.method header="Klassifikation"  detailDisplay="true"
	 */

	public Integer getKlassifikation() {
		return super.getKlassifikation();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      *  @dbo.method header="Straße"  detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='100' />
	 */

	public String getStrasse() {
		return super.getStrasse();
	}


	/**
      *  @dbo.method header="Hausnr"  detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='100' />
	 */
	public String getHausnr() {
		return super.getHausnr();
	}


	/**
      *  @dbo.method header="Ort"  detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='50' />"
      *  @dbo.method.search likeQuery="true"
	 */
	public String getOrt() {
		return super.getOrt();
	}


	/**
      *  @dbo.method header="Plz"  detailDisplay="true"
      *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='2' maximum='8' />"
      *  @dbo.method.search likeQuery="true"
	 */
	public String getPlz() {
		return super.getPlz();
	}
	/**
	 *  @dbo.method header="Bundesland"  detailDisplay="true"
	 *  @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='1' maximum='1' />"
	 */     	

	public String getBld() {
		return super.getBld();
	}

	/**
	 *  @dbo.method header="Land"  detailDisplay="true"
	 */     	

	public String getLand() {
		return super.getLand();
	}

	/**
	 *  @dbo.method header="Email-1"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators="<x:validateEmail />"
	 */     	

	public String getEmail1() {
		return super.getEmail1();
	}

	/**
	 *  @dbo.method header="Email-2"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators="<x:validateEmail />"
	 */     	

	public String getEmail2() {
		return super.getEmail2();
	}

	/**
	 *  @dbo.method header="Mobiltelefon-1"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators="<x:validateRegExpr 
pattern='^[0-9\s]+' />"
	 */     	

	public String getHandy1() {
		return super.getHandy1();
	}


	/**
	 *  @dbo.method header="Mobiltelefon-2"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators=" <x:validateRegExpr 
pattern='^[0-9\s]+' />"
	 */     	
	public String getHandy2() {
		return super.getHandy2();
	}


	/**
	 *  @dbo.method header="Telefon-1"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators="<x:validateRegExpr 
pattern='^[0-9\s]+' />"
	 */     	
	public String getTelefon1() {
		return super.getTelefon1();
	}

	/**
	 *  @dbo.method header="Telefon-2"  detailDisplay="true"
	 *  @dbo.method.validation stdvalidators="<x:validateRegExpr 
pattern='^[0-9\s]+' />"
	 */

	public String getTelefon2() {
		return super.getTelefon2();
	}

	/**
	 * @see ommiddlegen.AbstractDiffsyschangelog#getDescription()
      * @dbo.method header="BKZ"   detailDisplay="true"
      * @dbo.method.validation required="true" 
stdvalidators="<f:validateLength minimum='3' maximum='3' />"
	 */

	public String getBkz() {
		return super.getBkz();
	}

}


Werner


Re: JSF success story

Posted by Enrique Medina <e....@gmail.com>.
Hi Werner,

Could you please give us extenden information about the application of 
xdoclet for standard CRUD maks and the use of IoC?

I have a slight idea of what you're talking, but to concrete ;-)

Thanks.

2005/8/30, Werner Punz <we...@gmx.at>:
> 
> Martin Manfred and the others from vienna, know already the app, I
> showed an early beta version to them in Vienna,
> I could not show it publicly due to various reasons....
> 
> But just for the general public here is a small success story,
> I did a JSF app, around the timeframe of the 15th of may til the 15th of
> june (core crunch phase with some maintainance until now)
> 
> most of the controls currently hosted on jsf-comp were developed for
> that program due to the "insane" specs I got in last minute, which I
> could not get rid of.
> 
> So far so good, since the beginning of june the application has been
> rolled out, it is an intranet app, servicing around 60 users some of
> them working constantly with it, with around 12.000 addresses so far
> hammered in manually.
> 
> So far not a single crash, not the slightest memory problem,
> a few minor bugfixes in between, and the tomcat runs on conservative
> 128mb, with not even spiking the server which is a xeon server to 3%
> from time to time.
> 
> The application was programmed against myfaces 1.0.9, running on a
> Tomcat 5.5.9 under JDK 5.0....
> 
> I just wanted to share an internal success story, and wanted
> to show that myfaces can be used perfectly for real apps...
> It scales very well...
> 
> The app uses a combination of myfaces, some ajax controls,
> some other controls like the client side tabbing pane,
> hibernate in the old incarnation, and spring for
> supporting classes in the middle tier.
> It also used some effects from the script.aculo.us<http://script.aculo.us>library
> and from the fat library mapped into jsf tags.
> 
> The development time was dramatically reduced by the application of
> xdoclet for standard CRUD masks (which the app consists of around 50%)
> and the application of the generated classes to the IOC system of spring
> merged into JSF, via the Spring JSF integration library.
> 
> 
> Werner
> 
>

Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
Sean Schofield wrote:
> Just remember that if your management has concerns you can always
> leave the company/client name out of it.  I can't imagine they would
> object if you did that.
> 
It is less that they would object it, I more would fear that they will 
use it for too much propaganda, difficult story, but I will try to
get the perms... if possible...


Re: JSF success story

Posted by Sean Schofield <se...@gmail.com>.
Just remember that if your management has concerns you can always
leave the company/client name out of it.  I can't imagine they would
object if you did that.

sean

On 8/30/05, Werner Punz <we...@gmx.at> wrote:
> Sean Schofield wrote:
> >>Actually I would love to, but the main problem is that I am using
> >>some icon sets which the origin and license is not fully , I know they
> >>are free but I could not find out yet under which license, so screenies
> >>are somewhat problematic :-(, it does not matter for an in house project
> >>but going into public with it causes a different set of problems, if I
> >>am unlucky. Otherwise the project would have
> >>been on Kitos site already :-(
> >
> >
> > You can still share with Kito's site.  Just skip any questionable
> > icons or content.  You don't even need to show a screen shot.  We
> > should keep putting this stuff out there for people to learn and
> > benefit from.
> >
> > sean
> >
> Ok I will talk to my management about it...
> 
> 
> Werner
> 
>

Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
Sean Schofield wrote:
>>Actually I would love to, but the main problem is that I am using
>>some icon sets which the origin and license is not fully , I know they
>>are free but I could not find out yet under which license, so screenies
>>are somewhat problematic :-(, it does not matter for an in house project
>>but going into public with it causes a different set of problems, if I
>>am unlucky. Otherwise the project would have
>>been on Kitos site already :-(
> 
> 
> You can still share with Kito's site.  Just skip any questionable
> icons or content.  You don't even need to show a screen shot.  We
> should keep putting this stuff out there for people to learn and
> benefit from.
> 
> sean
> 
Ok I will talk to my management about it...


Werner


Re: JSF success story

Posted by Sean Schofield <se...@gmail.com>.
> Actually I would love to, but the main problem is that I am using
> some icon sets which the origin and license is not fully , I know they
> are free but I could not find out yet under which license, so screenies
> are somewhat problematic :-(, it does not matter for an in house project
> but going into public with it causes a different set of problems, if I
> am unlucky. Otherwise the project would have
> been on Kitos site already :-(

You can still share with Kito's site.  Just skip any questionable
icons or content.  You don't even need to show a screen shot.  We
should keep putting this stuff out there for people to learn and
benefit from.

sean

Re: JSF success story

Posted by Werner Punz <we...@gmx.at>.
Matthias Wessendorf wrote:
> Manfred-
> 
> that sounds great!
> 
> Perhaps you are interested to write about the application?
> 
> Kito D. Mann is interested in "success stroy reports" for his Trenches series.
> 
> -Matthias
>
Actually I would love to, but the main problem is that I am using
some icon sets which the origin and license is not fully , I know they 
are free but I could not find out yet under which license, so screenies 
are somewhat problematic :-(, it does not matter for an in house project 
but going into public with it causes a different set of problems, if I 
am unlucky. Otherwise the project would have
been on Kitos site already :-(

Until I can replace those with something under a cleared license
this thing is sort of a "hidden" project.

I was looking at the Eclipse icon sets, for replacement, but they
did not meet my needs fully, lots of icons were missing, which I would 
need...

I just wanted to give everyone a thumbs up from my personal experience
if he/she considers to use JSF for a project, it is a more than viable 
option to implement something webcentric.


I ran into a number of smaller issues during implementation, mainly
caused by some bugs in the data table, and the tabbing system (which I 
switched later to my client side one), but those seemed to be cleared by 
now...

Also I did some early starting mistakes, because I did not know about 
x:saveState upfront, which caused me to implement a somewhat rough
caching algorithm which merely does the same.
But besides that and the insane specs I got in last minute the whole 
project was easy to program.



Werner



> On 8/30/05, Werner Punz <we...@gmx.at> wrote:
> 
>>Martin Manfred and the others from vienna, know already the app, I
>>showed an early beta version to them in Vienna,
>>I could not show it publicly due to various reasons....
>>
>>But just for the general public here is a small success story,
>>I did a JSF app, around the timeframe of the 15th of may til the 15th of
>>june (core crunch phase with some maintainance until now)
>>
>>most of the controls currently hosted on jsf-comp were developed for
>>that program due to the "insane" specs I got in last minute, which I
>>could not get rid of.
>>
>>So far so good, since the beginning of june the application has been
>>rolled out, it is an intranet app, servicing around 60 users some of
>>them working constantly with it, with around 12.000 addresses so far
>>hammered in manually.
>>
>>So far not a single crash, not the slightest memory problem,
>>a few minor bugfixes in between, and the tomcat runs on conservative
>>128mb, with not even spiking the server which is a xeon server to 3%
>>from time to time.
>>
>>The application was programmed against myfaces 1.0.9, running on a
>>Tomcat 5.5.9 under JDK 5.0....
>>
>>I just wanted to share an internal success story, and wanted
>>to show that myfaces can be used perfectly for real apps...
>>It scales very well...
>>
>>The app uses a combination of myfaces, some ajax controls,
>>some other controls like the client side tabbing pane,
>>hibernate in the old incarnation, and spring for
>>supporting classes in the middle tier.
>>It also used some effects from the script.aculo.us library
>>and from the fat library mapped into jsf tags.
>>
>>The development time was dramatically reduced by the application of
>>xdoclet for standard CRUD masks (which the app consists of around 50%)
>>and the application of the generated classes to the IOC system of spring
>>merged into JSF, via the Spring JSF integration library.
>>
>>
>>Werner
>>
>>
> 
> 
> 


Re: JSF success story

Posted by Matthias Wessendorf <mw...@gmail.com>.
Manfred-

that sounds great!

Perhaps you are interested to write about the application?

Kito D. Mann is interested in "success stroy reports" for his Trenches series.

-Matthias

On 8/30/05, Werner Punz <we...@gmx.at> wrote:
> Martin Manfred and the others from vienna, know already the app, I
> showed an early beta version to them in Vienna,
> I could not show it publicly due to various reasons....
> 
> But just for the general public here is a small success story,
> I did a JSF app, around the timeframe of the 15th of may til the 15th of
> june (core crunch phase with some maintainance until now)
> 
> most of the controls currently hosted on jsf-comp were developed for
> that program due to the "insane" specs I got in last minute, which I
> could not get rid of.
> 
> So far so good, since the beginning of june the application has been
> rolled out, it is an intranet app, servicing around 60 users some of
> them working constantly with it, with around 12.000 addresses so far
> hammered in manually.
> 
> So far not a single crash, not the slightest memory problem,
> a few minor bugfixes in between, and the tomcat runs on conservative
> 128mb, with not even spiking the server which is a xeon server to 3%
> from time to time.
> 
> The application was programmed against myfaces 1.0.9, running on a
> Tomcat 5.5.9 under JDK 5.0....
> 
> I just wanted to share an internal success story, and wanted
> to show that myfaces can be used perfectly for real apps...
> It scales very well...
> 
> The app uses a combination of myfaces, some ajax controls,
> some other controls like the client side tabbing pane,
> hibernate in the old incarnation, and spring for
> supporting classes in the middle tier.
> It also used some effects from the script.aculo.us library
> and from the fat library mapped into jsf tags.
> 
> The development time was dramatically reduced by the application of
> xdoclet for standard CRUD masks (which the app consists of around 50%)
> and the application of the generated classes to the IOC system of spring
> merged into JSF, via the Spring JSF integration library.
> 
> 
> Werner
> 
> 


-- 
Matthias Wessendorf
Zülpicher Wall 12, 239
50674 Köln