Repeaters fail to correctly display after a page render where the previous page
render was determined by the authorization strategy
-----------------------------------------------------------------------------------------------------------------------------------
Key: WICKET-2920
URL: https://issues.apache.org/jira/browse/WICKET-2920
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4.7
Environment: Windows XP - Jetty/Tomcat
Reporter: Nathan Collette
First of all I want to say that this issue seems pretty similar to WICKET-943
Here's what happens to the best of my understanding.
A page renders with an unauthenticated user, where a ListView's
action=Component.RENDER in IAuthorizationStrategy is based on authentication.
The page is loaded, and the component is not rendered because the user is
unauthenticated. Then a user clicks the login -> redirectToInterceptPage....
However, upon returning to the page, the internalBeforeRender() method is
called on the ListView Component, and that method calls determineVisibility()
which is made up of 3 parts. isVisible() which returns "true",
isVisibilityAllowed() which also returns "true" and isRenderAllowed() -- which
returns "false". A "false" that is still based upon the previous page's load
where it checked the IAuthorizationStrategy Component.RENDER and determined due
to unauthentication that it should not be rendered. And because it returns
false, determineVisiblity() returns false and the onBeforeRender() method
inside the internalBeforeRender() method is not called and populateItems is
also then never called. After all that has happened, then the Component.RENDER
action is checked and it determines that the component should be rendered...but
it is too late to have the data on the screen load properly because the
popuplateItem's was never called.
Here are some code snippets. Note that in my particular use case the
AuthorizationStrategy was employed on the Container wrapping the list view, but
I also ran tests where the AuthorizationStrategy was directly on the ListView.
@Authorized
public class MemberWebMarkupContainer extends WebMarkupContainer {
public MemberWebMarkupContainer(String id) {
super(id);
}
}
WebMarkupContainer isMember = new MemberWebMarkupContainer("isMember");
isMember.add(new ListView<Consultant>("consultants", new
LoadableConsultantModel()) {
protected void populateItem(ListItem<Consultant> item) {
Consultant consultant = item.getModelObject();
item.add(new Label("name", consultant.getDisplayName()));
item.add(new Label("phone", consultant.getPhoneNumber()));
item.add(new ExternalLink("emailLink", "mailto:" +
consultant.getEmail(), consultant.getEmail()));
}
};
};
....
public class HelpCenterAuthorizationStrategy implements IAuthorizationStrategy,
IUnauthorizedComponentInstantiationListener {
@Override
public boolean isActionAuthorized(Component component, Action action) {
if(action.equals(Component.RENDER)) {
Class<? extends Component> c = component.getClass();
Authorized authorized = c.getAnnotation(Authorized.class);
if(authorized != null) {
return HelpCenterSession.get().isAuthenticated();
}
}
return true;
}
}
My current work-around for the problem is to modify my webMarkupContainer like
so:
WebMarkupContainer isMember = new MemberWebMarkupContainer("isMember") {
/*To get
* around the issue of the ListView not properly
updating.
* Methods of interest:
Component:callOnBeforeRenderIfNotVisible
* Component:internalBeforeRender() **/
@Override
protected boolean callOnBeforeRenderIfNotVisible() {
return true;
};
};
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.