Someone's been paying attention.

The only issue here is that the annotation only works on otherwise
unclaimed fields.  It would be nice if it would work on fields that
are @Retain or otherwise (even @Inject).  That will require new
methods on ComponentClassTransformation, i.e.,
getAllFieldsWithAnnotation(), which wouldn't filter the way
getFieldsWithAnnotation() does.


On Nov 25, 2007 11:52 AM, Apache Wiki <[EMAIL PROTECTED]> wrote:
> Dear Wiki user,
>
> You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for 
> change notification.
>
> The following page has been changed by SvenHomburg:
> http://wiki.apache.org/tapestry/Tapestry5ManipulateClassesAtRuntime
>
> New page:
> in my applications many times i use pages with the grid component and i am 
> too lazy ;) to write in every page a setter and getter methode for grid's row 
> parameter.
> so i help my self with the following classes and code segments...
>
> the annotation ...
> {{{
> /**
>  * generates setter/getter for a grid bean.
>  *
>  * @author <a href="mailto:[EMAIL PROTECTED]">shomburg</a>
>  * @version $Id: GridRowBean.java 41 2007-11-25 18:54:58Z shomburg $
>  */
> @Target(FIELD)
> @Retention(RUNTIME)
> @Documented
> public @interface GridRowBean
> {
> }
> }}}
>
> the worker, it adds the setter and getter for the grid bean.
> {{{#!java
> /**
>  * add setter/getter methodes.
>  *
>  * @author <a href="mailto:[EMAIL PROTECTED]">shomburg</a>
>  * @version $Id: GridRowBeanWorker.java 41 2007-11-25 18:54:58Z shomburg $
>  */
> public class GridRowBeanWorker implements ComponentClassTransformWorker
> {
>     /**
>      * Invoked to perform a transformation on an as-yet unloaded component 
> class, represented by the
>      * [EMAIL PROTECTED] org.apache.tapestry.services.ClassTransformation} 
> instance. In some cases,
>      * the worker may make changes to the
>      * component model -- for example, a worker that deals with parameters 
> may update the model to
>      * reflect those parameters.
>      */
>     public void transform(ClassTransformation transformation, 
> MutableComponentModel model)
>     {
>         List<String> names = 
> transformation.findFieldsWithAnnotation(GridRowBean.class);
>
>         if (names.isEmpty())
>             return;
>
>         for (String name : names)
>         {
>             addGridRowBeanGetter(transformation, name);
>             addGridRowBeanSetter(transformation, name);
>         }
>     }
>
>     private void addGridRowBeanGetter(ClassTransformation transformation, 
> String fieldName)
>     {
>         String fieldType = transformation.getFieldType(fieldName);
>         String methodName = "get" + 
> StringUtils.capitalize(InternalUtils.stripMemberPrefix(fieldName));
>
>         TransformMethodSignature sig =
>                        new TransformMethodSignature(Modifier.PUBLIC, 
> fieldType, methodName, null, null);
>
>         BodyBuilder builder = new BodyBuilder();
>         builder.begin();
>         builder.addln("return %s;", fieldName);
>         builder.end();
>
>         transformation.addMethod(sig, builder.toString());
>     }
>
>     private void addGridRowBeanSetter(ClassTransformation transformation, 
> String fieldName)
>     {
>         String fieldType = transformation.getFieldType(fieldName);
>         String methodName = "set" + 
> StringUtils.capitalize(InternalUtils.stripMemberPrefix(fieldName));
>
>         TransformMethodSignature sig =
>                    new TransformMethodSignature(Modifier.PUBLIC, "void",
>                                  methodName, new String[]{fieldType}, null);
>
>         BodyBuilder builder = new BodyBuilder();
>         builder.begin();
>         builder.addln("%s = $1;", fieldName);
>         builder.end();
>
>         transformation.addMethod(sig, builder.toString());
>     }
> }
> }}}
>
> ... contribute the new worker to Tapestry's ComponentClassTransformWorker ...
> {{{#!java
>     /**
>      * Adds a number of standard component class transform workers:
>      * <ul>
>      * <li>GridRowBean -- generates setter/getter for a grid bean</li>
>      * </ul>
>      */
>     public static void contributeComponentClassTransformWorker(
>                                 
> OrderedConfiguration<ComponentClassTransformWorker> configuration)
>     {
>         configuration.add("GridRowBean", new GridRowBeanWorker(), 
> "after:Inject*");
>     }
> }}}
>
> ... mark the bean _client with @GridRowBean annotation ...
> {{{#!java
>     @GridRowBean
>     private Client _clientRow;
>
>     /**
>      * get the grid data from datasource.
>      *
>      * @return grid data from datasource
>      */
>     public GridDataSource getGridSource()
>     {
>         ClientDAO entityDAO = (ClientDAO) getDefaultDAO(Client.class);
>         return new HibernateDataSource(entityDAO, "FROM Client");
>     }
> }}}
>
> ... tell the grid component wich property should use for the row parameter ...
> {{{
>     <table t:type="Grid" model="gridModel" source="gridSource" 
> row="clientRow">
>
>         <t:parameter name="recIdCell">
>             <span t:type="core5/link/EditAction" context="clientRow.recId"/>
>         </t:parameter>
>
>         <t:parameter name="addressCityCell">
>             ${clientRow.address.country.isoSign}
>             ${clientRow.address.zip}
>             ${clientRow.address.city}
>         </t:parameter>
>
>     </table>
> }}}
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>



-- 
Howard M. Lewis Ship
Partner and Senior Architect at Feature50

Creator Apache Tapestry and Apache HiveMind

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to