1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package net.sf.beanform;
16
17 import org.apache.tapestry.IForm;
18 import org.apache.tapestry.IMarkupWriter;
19 import org.apache.tapestry.IRender;
20 import org.apache.tapestry.IRequestCycle;
21 import org.apache.tapestry.engine.DirectServiceParameter;
22 import org.apache.tapestry.engine.ILink;
23 import org.apache.tapestry.form.Form;
24 import org.apache.tapestry.form.FormSupport;
25 import org.apache.tapestry.form.FormSupportImpl;
26
27 /***
28 * A form that expects to be contained by a {@link BeanForm} instance and whose direct
29 * service link corresponds to the containing {@link BeanForm}, rather than itself.
30 *
31 * @author Daniel Gredler
32 */
33 public abstract class LinkForm extends Form {
34
35 @Override
36 protected FormSupport newFormSupport( IMarkupWriter writer, IRequestCycle cycle ) {
37 return new LinkFormSupport( writer, cycle, this );
38 }
39
40 /***
41 * Providing an instance of this class in {@link LinkForm#newFormSupport(IMarkupWriter, IRequestCycle)}
42 * is the functional equivalent of overriding {@link Form#getLink(IRequestCycle)} so that it returns a
43 * link to the containing {@link BeanForm}, which we can't do because it is a private method.
44 */
45 public class LinkFormSupport extends FormSupportImpl {
46 public LinkFormSupport( IMarkupWriter writer, IRequestCycle cycle, IForm form ) {
47 super( writer, cycle, form );
48 }
49 @Override
50 public void render( String method, IRender render, ILink link, String scheme, Integer port ) {
51 IRequestCycle cycle = LinkForm.this.getPage().getRequestCycle();
52 BeanForm beanForm = (BeanForm) cycle.getAttribute( BeanForm.BEAN_FORM_ATTRIBUTE );
53 Object parameter = new DirectServiceParameter( beanForm );
54 link = LinkForm.this.getDirectService().getLink( true, parameter );
55 super.render( method, render, link, scheme, port );
56 }
57 }
58
59 }