You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Apache Wiki <wi...@apache.org> on 2007/11/25 20:52:26 UTC
[Tapestry Wiki] Update of "Tapestry5ManipulateClassesAtRuntime" by
SvenHomburg
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:shomburg@hsofttec.com">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:shomburg@hsofttec.com">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
* {@link 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: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org
Re: [Tapestry Wiki] Update of "Tapestry5ManipulateClassesAtRuntime" by SvenHomburg
Posted by Howard Lewis Ship <hl...@gmail.com>.
Also, I would have named the annotation something like @Acessible or @Property.
On Nov 25, 2007 8:29 PM, Howard Lewis Ship <hl...@gmail.com> wrote:
> 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 <wi...@apache.org> 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:shomburg@hsofttec.com">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:shomburg@hsofttec.com">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
> > * {@link 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: dev-unsubscribe@tapestry.apache.org
> > For additional commands, e-mail: dev-help@tapestry.apache.org
> >
> >
>
>
>
> --
> Howard M. Lewis Ship
> Partner and Senior Architect at Feature50
>
> Creator Apache Tapestry and Apache HiveMind
>
--
Howard M. Lewis Ship
Partner and Senior Architect at Feature50
Creator Apache Tapestry and Apache HiveMind
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org
Re: [Tapestry Wiki] Update of "Tapestry5ManipulateClassesAtRuntime" by SvenHomburg
Posted by Howard Lewis Ship <hl...@gmail.com>.
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 <wi...@apache.org> 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:shomburg@hsofttec.com">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:shomburg@hsofttec.com">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
> * {@link 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: dev-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: dev-help@tapestry.apache.org
>
>
--
Howard M. Lewis Ship
Partner and Senior Architect at Feature50
Creator Apache Tapestry and Apache HiveMind
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org