You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Nathan Collette (JIRA)" <ji...@apache.org> on 2010/06/19 01:19:22 UTC

[jira] Created: (WICKET-2920) Repeaters fail to correctly display after a page render where the previous page render was determined by the authorization strategy

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.


[jira] Resolved: (WICKET-2920) Repeaters fail to correctly display after a page render where the previous page render was determined by the authorization strategy

Posted by "Igor Vaynberg (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-2920?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Igor Vaynberg resolved WICKET-2920.
-----------------------------------

      Assignee: Igor Vaynberg
    Resolution: Cannot Reproduce

quickstart is needed, most likely user error.

> 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
>            Assignee: Igor Vaynberg
>
> 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.


[jira] Commented: (WICKET-2920) Repeaters fail to correctly display after a page render where the previous page render was determined by the authorization strategy

Posted by "Jeremy Thomerson (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WICKET-2920?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12880370#action_12880370 ] 

Jeremy Thomerson commented on WICKET-2920:
------------------------------------------

Please provide a quickstart that demonstrates this rather complex
description of an issue.  Thank you.




-- 
Jeremy Thomerson
http://www.wickettraining.com


> 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.