you can wrap the PropertyModel with some sort of a CachingModel that would cache the value returned from the PropertyModel for the duration of the request.
Something like this:
class RequestCachingModel implements IModel {
private IModel delegate;
private transient Object cache;
private transient boolean cached=false;
public RequestCachingModel(IModel delegate) {
this.delegate=delegate;
}
public Object getObject(Component c) {
if (!cached) {
cache=delegate.getObject(c);
cached=true;
}
return cache;
}
public Object setObject(Component c, Object o) {
delegate.setObject(o);
detach();
}
public void detach() {
cached=false;
cache=null;
}
....
}
hope this helps
-Igor
The class in question:
public final class LevelsPage extends AuthenticatedWebPage
{
private ArrayList levels;
/**
* Constructor
*
* @param parameters
*/
public LevelsPage(final PageParameters parameters)
{
// Add table of levels
final PageableListView listView;
add(listView = new PageableListView("levels", new PropertyModel(this, "levels"), 8)
{
public void populateItem(final ListItem listItem)
{
final Level level = (Level)listItem.getModelObject();
listItem.add(new TextField("name", new Model(level.getName())));
listItem.add(new TextField("number", new Model(new Integer(level.getNumber()))));
listItem.add(new Button("delete"));
}
});
// Add new level button
Button addLevelButton = new Button("addlevel") {
protected void onSubmit() {
System.out.println("Add new level selected");
}
};
Link addGroupButton = new Link("addLevel") {
public void onClick() {
levels.add(new Level(110, "Level1", 25));
}
};
add(addGroupButton);
add(addLevelButton);
add(new PagingNavigator("levelnavigator", listView));
}
/**
*
* @return List of levels
*/
public List getLevels()
{
if(levels==null){
levels = new ArrayList();
}
levels.add(new Level(100, "Admin", 0));
levels.add(new Level(101, "Supervisor", 10));
levels.add(new Level(102, "Group", 15));
levels.add(new Level(103, "Normal", 20));
levels.add(new Level(104, "Limited", 25));
levels.add(new Level(105, "Web", 50));
return levels;
}
}
