Hi!

I developed Faces Freeway to archive this dynamic generation:
http://facesfreeway.l3x.net/sample.html
The samples are not up to date, much more can be done already.
For those wanting to browse the source code:
http://facesfreeway.l3x.net/xref/index.html

It extracts metadata from your entites and generates the jsf tree
dynamically.
All this is pluggable and extensible.

I'll update the samples, just I need to find the time :-(

Ciao,
Mario
> I've been chatting with Gavin about this for some time-- the code generation 
> vs. dynamic generation for scaffolding.  I believe the tooling coming from 
> seam/hbm is all code generation where I would think there would be advantages 
> to having component sets that dynamically determine validators and converters 
> based on metadata.  Higher level components could be constructed to actually 
> compose the CRUD pages as a droppable component.
>
>   
>> Please check out hbm2seam ( Hibernate Tools suite ) before a lot of hard 
>> work 
>> is poured into this.  There may be a large duplication of effort.  The last 
>> I 
>> checked, this was in alpha.
>>
>> Dennis Byrne
>>
>>     
>>> -----Original Message-----
>>> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
>>> Sent: Wednesday, May 3, 2006 11:57 AM
>>> To: [email protected]
>>> Subject: RE: Summer of Code
>>>
>>> JSF *really* needs this agility with CRUD scaffolding.  I've been thinking 
>>>       
>> though with JEE 5 and the EJB 3 adoption, that you couldn't produce 
>> something 
>> similar to your proposal that works off of pure EJB 3 metadata define the 
>> pages.  Something like:
>>     
>>> <ejb:form>
>>>
>>> <ejb:field>
>>>
>>> <ejb:dataTable>
>>>
>>> <ejb:filter>
>>>
>>> This way, you could have your EJB 3 annotated model and without doing any 
>>>       
>> model wiring, these components would work by Class type to handle 
>> persistence/UI concerns directly without hand-holding.
>>     
>>> As for templating with Facelets, Rick Hightower published something similar 
>>>       
>> at IBM:
>>     
>>> http://www-128.ibm.com/developerworks/java/library/j-facelets/index.html
>>>
>>> He says he has another article on the topic coming out soon.
>>>
>>> Overall, the need you are describing is obviously there.  I wish JBoss 
>>>       
>> would've pursued this route more actively with Seam's UI library.
>>     
>>> -- Jacob
>>>
>>>
>>>       
>>>> Hello. It is not a comlete proposal, but I rather want to know your opinion
>>>> on the project i'm working on. It is not straight myfaces codebase related,
>>>> but you seem as most appropriate mentor. I planned to work on it before I
>>>> knew that there is SoC. But may be you will convince me of its uselessness.
>>>>
>>>> Recently I have been writing application using jsf. The application is
>>>> mostly CRUD. I think that there is much glue code that can be eliminated.
>>>> All that identical CRUD backing beans, forms, dataTables, navigation rules.
>>>> It is all powerful, but it should be possible to eliminate it until you 
>>>>         
>> need
>>     
>>>> something not very trivial. This is the principle which the Ruby on Rails
>>>> growing popularity came from.
>>>>
>>>> There arises a need to define rules of generating it all based on
>>>> information about a data model. Code generation tools are insufficient.
>>>> Imagine, you have generated all the beans and views, than provided some
>>>> changes to some of them and than you want to add small change to the
>>>> template or, say, add a field to the domain object. Now you are left on 
>>>>         
>> your
>>     
>>>> own to manually change it everywhere it is used.
>>>>
>>>> I propose to extend facelets templating abilities to be able to encapsulate
>>>> all that routine tasks into templates. See:
>>>> 1) <template name="templateName"> marks any part of view definition as a
>>>> template.
>>>> 2) <insert name="insertName"> marks parts of the template as redefinable.
>>>> 3) <define name="insertName"> redefines redefinable parts during particular
>>>> template usage.
>>>> <insert template="templateName"> inserts template and if it is being used
>>>> inside another template definition it automatically marks redefinable part.
>>>> It can contain only <define> tags. Other tags inside it are treated as tags
>>>> inside <define> without name property defined.
>>>> With <insert name="insertName"> used during particular template usage you
>>>> can insert part of template marked as redefinable.
>>>>
>>>> Than we should generalize data CRUD interfaces and provide implementations
>>>> for technologies/contracts we use to implement business layer. I plan to 
>>>>         
>> use
>>     
>>>> very simple and extendable interfaces.
>>>>
>>>> Let's assume that
>>>> <data provider="reflectionDataProvider" var="lastItem"
>>>> object="#{itemsService}" methodName="getLastItem"/>
>>>> will get the Item object from getLastItem method and set lastItem variable
>>>> to Map containing Item object properties as keys and their values as 
>>>>         
>> values.
>>     
>>>> Now the dream is to use
>>>> <insert template="map" data="#{lastItem}"/>
>>>> to create simple edit form.
>>>>
>>>> See how we can create such a template:
>>>>
>>>> <template name="map">
>>>>    <c:forEach items="#{data}" var="pair">
>>>>        <insert template=".field" name="#{pair.key}" dataMap="#{data}"/>
>>>>    </c:forEach>
>>>> </template>
>>>>
>>>> <template name="map.field">
>>>>    #{key}:
>>>>    <isType name="bool" var="#{dataMap[key]}"><insert
>>>> template=".bool"><insert name="validator"/></insert></isType>
>>>>    <isType name="java.lang.String" var="#{dataMap[key]}"><insert
>>>> template=".string" name="validator"/></isType>
>>>>    <isType name="html" var="#{dataMap[key]}"><insert template=".html"
>>>> name="validator"/></isType>
>>>>    <isType name="java.util.Map" var="#{dataMap[key]}"><insert
>>>> template=".object" name="validator"></isType>
>>>> </template>
>>>>
>>>> <template name="object.field.bool">
>>>>    <h:selectBooleanCheckbox value="#{value}"><insert/></h:inputBoolean>
>>>> </template>
>>>> <template name="object.field.string">
>>>>    <h:inputText value="#{value}"><insert/></h:inputText>
>>>> </template>
>>>> <template name="object.field.html">
>>>>    <t:inputHtml value="#{value}"><insert/></h:inputHtml>
>>>> </template>
>>>> <template name="object.field.map">
>>>>    <insert template="map" data="#{value}"/>
>>>> </template>
>>>>
>>>> where for <isType> there is a helper TagHandler, which evalutes its body if
>>>> var is of pointed type. It is decided based on user-provided algorithm. It
>>>> allows to do such things as automatically providing textarea for long texts
>>>> and so.
>>>>
>>>> It is not necessary to divide all this functionality to many templates, it
>>>> can reside in only one.
>>>>
>>>> Now you can, for example, define special validator for itemUrl field of
>>>> lastItem object:
>>>> <insert template="map" data="#{lastItem}">
>>>>    <define name="itemUrl.validator">
>>>>        <t:validateUrl/>
>>>>    </define>
>>>> </insert>
>>>> And for other fields we can add into template default validator, which will
>>>> validate them using hibernate validator annotations.
>>>>
>>>> Or we can redefine all components used to represent itemUrl property:
>>>> <insert template="map" data="#{lastItem}">
>>>>    <define name="itemUrl">
>>>>        #{lastItem.itemUrl} - url of item description
>>>>    </define>
>>>> </insert>
>>>> Or we can extend or partially redefine map.field template to differently
>>>> handle some types.
>>>>
>>>> Actually, for short it is display only sample. It is not a comprehensive
>>>> description of my ideas. We will be able to write
>>>> <data var="actualItems" object="#{itemsService}"
>>>> methodName="getActualItems"/>
>>>> <insert template="object" data="#{actualItems}"/>
>>>> to represent a complete CRUD interface for caveatemptor.hibernate.org data
>>>> model with an ability to drill down to assotiated objects. And you still
>>>> have an ability to partially redefine default templates behavior. I call it
>>>> Smart UI. And important point that it does not impose any requirements to
>>>> your other view code. You can use it anywhere in facelets pages 
>>>>         
>> definitions.
>>     
>>>> And than you can easily scale introducing backing beans, navigation rules 
>>>>         
>> or
>>     
>>>> anything else only when you need it.
>>>>
>>>> Feedback is appreciated.
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/Summer-of-Code-t1550695.html#a4212272
>>>> Sent from the My Faces - Dev forum at Nabble.com.
>>>>
>>>>         
>>     
>
>   

Reply via email to