Shawn,
Thank you for your assistance. I managed to make my test applicaton
work at last.
I now need to modify my real application, so it works properly.
Next task is to learn about i18n with tapestry 4 ...
On 24/01/06, Shawn Church <[EMAIL PROTECTED]> wrote:
> Jabbar,
>
> I actually implemented your test code yesterday with all of my changes,
> so I can verify at least it works for me. FYI, I'm using the release
> version of Tapestry 4.0 and Hivemind 1.1.
>
> I didn't mention Home.java also needs to implement SelectablePage, so
> that might be an issue. But if you are not seeing perSelectedPage as a
> property of Page1, 2, and 3, please verify that SelectablePage is
> implemented by each of them. You could also convert SelectablePage to a
> class which extends BasePage, and then Home, Page1, 2, and 3 could
> simply extend SelectablePage. You could of course eliminate
> SelectablePage completely if you prefer to duplicate the property
> persistence code in each one.
>
> I believe everything else from your original code is fine. If you add a
> page to your selection list which does not persist the perSelectedPage
> property, the target page should be rendered correctly but the list
> value will return to the default (Home).
>
> Even though this method worked for me, I noticed that for each page
> render I have one hidden form value (encapsulating the perSelectedPage
> property) for each page. The parameters are named "appstate:Home",
> "appstate:Page1", etc. So, every page in your application will have
> these additional parameters encoded. It really would be best if the
> property could be bound to the Border component, but as I stepped
> through the code I could see that the containing page is being inspected
> for persistent properties rather than the component itself.
>
> Another option which works well is session persistence (using a Visit or
> Global property), but this may not be an option if you are trying to
> remain stateless.
>
> Shawn
>
> Quoting Jabbar <[EMAIL PROTECTED]>:
>
> > Hello Shawn,
> >
> > Thank you for your reply. I've tried your suggestion but it doesn't
> > work.
> >
> > Inside the method 'public void selectedPage(IRequestCycle cycle) '
> > 'PropertyUtils.isWritable(cycle.getPage(), "perSelectedPage") '
> > always
> > returns false
> >
> > and inside the method 'public void pageBeginRender(PageEvent event)
> > {'
> > '
> >
> PropertyUtils.isReadable(event.getRequestCycle().getPage(),"perSelectedPage")
> > )'
> >
> > always returns false.
> >
> > I have used java.util.List
> > PropertyUtils.getReadableProperties(java.lang.Object target)
> > and
> >
> > java.util.List PropertyUtils.getWriteableProperties(java.lang.Object
> > target)
> >
> > both do not return 'perSelectedPage'
> >
> > Do you have any more ideas?
> >
> >
> > On 23/01/06, Shawn Church <[EMAIL PROTECTED]> wrote:
> > > Jabbar,
> > >
> > > Since persistent properties follow the page containing each
> > component
> > > (rather than the component itself), I believe you are going to have
> > to
> > > have the "perSelectedPage" property bound to each "selectable" page
> > itself.
> > >
> > > There may be more elegant ways to accomplish what you are wanting,
> > but
> > > I've included some code below which might help.
> > >
> > > Please try this (or something similar):
> > >
> > > Border.java:
> > >
> > > public abstract class Border extends BaseComponent implements
> > > PageBeginRenderListener
> > > {
> > > public abstract String getSelectedPage();
> > >
> > > public abstract void setSelectedPage(String page);
> > >
> > > public void selectedPage(IRequestCycle cycle) {
> > > cycle.activate(getSelectedPage());
> > >
> > > if( PropertyUtils.isWritable(cycle.getPage(),
> > "perSelectedPage") )
> > > PropertyUtils.write(cycle.getPage(), "perSelectedPage",
> > > getSelectedPage());
> > > }
> > >
> > > public PageSelectionModel getPageSelectionModel() {
> > > return new PageSelectionModel();
> > > }
> > >
> > > public void pageBeginRender(PageEvent event) {
> > > if( !event.getRequestCycle().isRewinding() )
> > > {
> > > if(
> > PropertyUtils.isReadable(event.getRequestCycle().getPage(),
> > > "perSelectedPage") )
> > > {
> > > String selpage = ( String )
> > > PropertyUtils.read(event.getRequestCycle().getPage(),
> > "perSelectedPage");
> > > if( selpage != null )
> > > setSelectedPage(( String ) selpage);
> > > }
> > > }
> > > }
> > > }
> > >
> > > One each for Page1.page, Page2.page, Page3.page, etc.:
> > >
> > > <?xml version="1.0"?>
> > > <!DOCTYPE page-specification PUBLIC
> > > "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
> > > "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
> > >
> > > <page-specification class="com.technolog.page.Page1">
> > > </page-specification>
> > >
> > > One each for Page1.java, Page2.java, Page3.java, etc.:
> > >
> > > public abstract class Page1 extends BasePage implements
> > SelectablePage
> > > {
> > > }
> > >
> > > SelectablePage.java:
> > >
> > > import org.apache.tapestry.IPage;
> > > import org.apache.tapestry.annotations.Persist;
> > >
> > > public interface SelectablePage extends IPage
> > > {
> > > @Persist("client:app")
> > > public abstract String getPerSelectedPage();
> > >
> > > public abstract void setPerSelectedPage(String page);
> > > }
> > >
> > > Shawn
> > >
> > >
> > > Quoting Jabbar <[EMAIL PROTECTED]>:
> > >
> > > > Hello all,
> > > > I'm having serious client side persistence problems. I have a
> > border
> > > > component which has a property selection component. From there I
> > can
> > > > select which page I want to goto, by default the home page is
> > shown.
> > > >
> > > > If I select a new page then the property selection does not show
> > the
> > > > new page, but the main body of the page shows the selected page.
> > > >
> > > > Obviously there is something I don't understand regarding client
> > > > side
> > > > persistence.
> > > > I have included the source for a test web application I wrote.
> > Does
> > > > any body have any suggestions?
> > > >
> > > > --
> > > > Thanks
> > > >
> > > > Jabbar Azam
> > > >
> > > > //-- start of source code
> > > >
> > >
> >
> ---------------------------------------------------------------------------------------------------
> > > >
> > > > Border.java
> > > > ----------------
> > > > package com.technolog.page;
> > > >
> > > > import org.apache.tapestry.BaseComponent;
> > > > import org.apache.tapestry.IRequestCycle;
> > > > import org.apache.tapestry.annotations.Persist;
> > > > import org.apache.tapestry.event.PageBeginRenderListener;
> > > > import org.apache.tapestry.event.PageEvent;
> > > >
> > > > import com.technolog.model.PageSelectionModel;
> > > >
> > > > /**
> > > > * This the parent component of all the other web pages. Every
> > web
> > > > page is placed
> > > > * within this page. This allows the header, footer and
> > navigation
> > > > to
> > > > be modified
> > > > * without changing every page.
> > > > *
> > > > * @author Jabbar Azam
> > > > *
> > > > */
> > > > public abstract class Border extends BaseComponent implements
> > > > PageBeginRenderListener{
> > > >
> > > > @Persist("client:app")
> > > > public abstract String getPerSelectedPage();
> > > > public abstract void setPerSelectedPage(String page);
> > > >
> > > > public abstract String getSelectedPage();
> > > > public abstract void setSelectedPage(String page);
> > > >
> > > > public void selectedPage(IRequestCycle cycle) {
> > > > setPerSelectedPage(getSelectedPage());
> > > > cycle.activate(getSelectedPage());
> > > > }
> > > >
> > > > public PageSelectionModel getPageSelectionModel() {
> > > >
> > > > return new PageSelectionModel();
> > > > }
> > > >
> > > > public void pageBeginRender(PageEvent event) {
> > > > if (!event.getRequestCycle().isRewinding()) {
> > > > setSelectedPage(getPerSelectedPage());
> > > > }
> > > > }
> > > >
> > > > }
> > > >
> > > >
> > >
> >
> ---------------------------------------------------------------------------------------
> > > > PageSelectionModel.java
> > > > ------------------------------------
> > > >
> > > > package com.technolog.model;
> > > >
> > > > import java.io.Serializable;
> > > > import java.util.List;
> > > > import java.util.Vector;
> > > >
> > > > import org.apache.tapestry.form.IPropertySelectionModel;
> > > >
> > > >
> > > > public class PageSelectionModel implements
> > IPropertySelectionModel,
> > > > Serializable {
> > > >
> > > > /**
> > > > *
> > > > */
> > > > private static final long serialVersionUID =
> > > > 5195300859295677036L;
> > > > protected List<String> pageList = new Vector<String>();
> > > >
> > > > /**
> > > > *
> > > > * @param siteListDAO
> > > > * @param user
> > > > */
> > > > public PageSelectionModel() {
> > > >
> > > > pageList.add("Home");
> > > > pageList.add("Page1");
> > > > pageList.add("Page2");
> > > > pageList.add("Page3");
> > > >
> > > >
> > > > }
> > > > /**
> > > > *
> > > > */
> > > > public int getOptionCount() {
> > > > return pageList.size();
> > > > }
> > > > /**
> > > > *
> > > > */
> > > > public Object getOption(int idx) {
> > > > return pageList.get(idx);
> > > > }
> > > >
> > > > /**
> > > > *
> > > > */
> > > > public String getValue(int idx) {
> > > > return Integer.toString(idx);
> > > > }
> > > >
> > > > /**
> > > > *
> > > > */
> > > > public Object translateValue(String idx) {
> > > > return getOption(Integer.parseInt(idx));
> > > > }
> > > >
> > > > public String getLabel(int idx) {
> > > > return (String)getOption(idx);
> > > > }
> > > >
> > > > }
> > > >
> > > >
> > > >
> > >
> >
> --------------------------------------------------------------------------------------------------------
> > > >
> > > > Border.html
> > > > -----------------
> > > > <html>
> > > > <head jwcid="@Shell" title="test">
> > > > <title>Test</title>
> > > > </head>
> > > >
> > > > <body jwcid="@Body">
> > > >
> > > > <table>
> > > > <form jwcid="@Form"
> > listener="listener:selectedPage"><tr><td><span
> > > > jwcid="pageSelection"/></td></tr></form>
> > > > <tr><td><span jwcid="@RenderBody"/></td></tr>
> > > >
> > > > </table>
> > > >
> > > > </body>
> > > > </html>
> > > >
> > > >
> > >
> >
> --------------------------------------------------------------------------------------------------------------
> > > >
> > > > Border.jwc
> > > > ---------------
> > > > <?xml version="1.0" encoding="UTF-8"?>
> > > > <!DOCTYPE component-specification
> > > > PUBLIC "-//Apache Software Foundation//Tapestry
> > Specification
> > > > 4.0//EN"
> > > > "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
> > > > <!-- generated by Spindle, http://spindle.sourceforge.net -->
> > > >
> > > > <component-specification class="com.technolog.page.Border"
> > > > allow-informal-parameters="no">
> > > >
> > > > <component id="pageSelection" type="PropertySelection">
> > > > <binding name="model" value="pageSelectionModel"/>
> > > > <binding name="value" value="selectedPage"/>
> > > > <binding name="submitOnChange"
> > value="literal:yes"/>
> > > > </component>
> > > > </component-specification>
> > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------------------------------
> > > >
> > > > Home.html
> > > > ----------------
> > > > <span jwcid="$content$">
> > > > <span jwcid="@Border">
> > > > <h1>Home Page</h1>
> > > > </span>
> > > > </span>
> > > >
> > >
> >
> --------------------------------------------------------------------------------------------------------------
> > > >
> > > > Page1.html
> > > > -----------------
> > > > <span jwcid="$content$">
> > > > <span jwcid="@Border">
> > > > <h1>Page 1</h1>
> > > > </span>
> > > > </span>
> > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------------------------------
> > > >
> > > > Page 2.html
> > > > ------------------
> > > > <span jwcid="$content$">
> > > > <span jwcid="@Border">
> > > > <h1>Page 2</h1>
> > > > </span>
> > > > </span>
> > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------------------------------
> > > >
> > > > Page3.html
> > > > -----------------
> > > > <span jwcid="$content$">
> > > > <span jwcid="@Border">
> > > > <h1>Page 3</h1>
> > > > </span>
> > > > </span>
> > > >
> > > > //end of source code
> > > >
> > > >
> > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail:
> > [EMAIL PROTECTED]
> > > > For additional commands, e-mail:
> > > > [EMAIL PROTECTED]
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail:
> > [EMAIL PROTECTED]
> > > For additional commands, e-mail:
> > [EMAIL PROTECTED]
> > >
> > >
> >
> >
> > --
> > Thanks
> >
> > Jabbar Azam
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail:
> > [EMAIL PROTECTED]
> >
> >
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
--
Thanks
Jabbar Azam
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]