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.

Reply via email to