gwtp - Why canReveal() of GateKeeper was called before the EventHandler was called (GWT)? -


i got header presenter nested presenter. customer presenter child of header presenter (ie customer presenter put slot of header presenter).

so want use mygatekeeper manage login page. headerpresenter fire passuserinfoevent.

public class mygatekeeper implements gatekeeper{ private string logineduserid="";  private final eventbus eventbus;  @inject public mygatekeeper (final eventbus eventbus){      this.eventbus = eventbus;       this.eventbus.addhandler(passuserinfoevent.gettype(), new passuserinfohandler(){          @override         public void onpassuserinfo(passuserinfoevent event) {             // todo auto-generated method stub             string userid=event.getuserid();             logineduserid=userid;            }      }); }  @override public boolean canreveal(){     system.out.println(logineduserid+"test");     if(!logineduserid.equals("")){         system.out.println(loginedusermeaningid+"cxcxc");         return true;     }     else{         return false;     } } 

}

in customerpresenter:

@proxycodesplit @nametoken(nametokens.cust) @usegatekeeper(mygatekeeper.class) public interface myproxy extends proxyplace<customerpresenter> { } 

however after run, not show gui loggined. tested & found canreveal() in mygatekeeper called before passuserinfohandler() called, canreveal never return true;

how fix problem?

the usual pattern accomplish bind currentuser class in singleton:

bind(currentuser.class).in(singleton.class); 

and inject gatekeeper. inside gatekeeper's canreveal method, you'll check currentuser.isloggedin() :

private final currentuser currentuser;  @inject mygatekeeper(currentuser currentuser) {     this.currentuser = currentuser; }   @override public boolean canreveal() {     return currentuser.isloggedin(); } 

you should initialize currentuser.isloggedin field inside bootstrapper (see https://github.com/arcbees/gwtp/wiki/bootstrapping-or-application-initialization) calling server. here's example using gwtp's restdispatch:

public class bootstrapperimpl implements bootstrapper {     private final string unauthorizedplace;     private final currentuser currentuser;     private final placemanager placemanager;     private final restdispatch restdispatch;     private final userresource userresource;      @inject     bootstrapperimpl(             @unauthorizedplace string unauthorizedplace,             currentuser currentuser,             placemanager placemanager,             restdispatch restdispatch,             userresource userresource) {         this.unauthorizedplace = unauthorizedplace;         this.currentuser = currentuser;         this.placemanager = placemanager;         this.restdispatch = restdispatch;         this.userresource = userresource;     }      @override     public void onbootstrap() {         checkifuserisloggedin();     }      private void checkifuserisloggedin() {         restdispatch.execute(userresource.iscurrentuserloggedin(), new abstractasynccallback<boolean>() {             @override             public void onsuccess(boolean iscurrentuserloggedin) {                 navigate(iscurrentuserloggedin);             }         });     }      private void navigate(boolean iscurrentuserloggedin) {         currentuser.setloggedin(iscurrentuserloggedin);          if (iscurrentuserloggedin) {             placemanager.revealcurrentplace();         } else {             placemanager.revealplace(new placerequest.builder().nametoken(unauthorizedplace).build());         }     } } 

Comments

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -