001    package org.granite.client.tide.javafx;
002    
003    import javafx.beans.property.ReadOnlyBooleanPropertyBase;
004    
005    import org.granite.client.tide.Context;
006    import org.granite.client.tide.server.ServerSession;
007    import org.granite.client.tide.server.SimpleTideResponder;
008    import org.granite.client.tide.server.TideFaultEvent;
009    import org.granite.client.tide.server.TideResponder;
010    import org.granite.client.tide.server.TideResultEvent;
011    
012    
013    public class ObservableRole extends ReadOnlyBooleanPropertyBase {
014            
015            private final BaseIdentity identity;
016            private final Context context;
017            private final ServerSession serverSession;
018            private final String name;
019            private final String roleName;
020            
021            private Boolean hasRole = null;
022            
023            
024            public ObservableRole(BaseIdentity identity, Context context, ServerSession serverSession, String name, String roleName) {
025                    super();
026                    this.identity = identity;
027                    this.context = context;
028                    this.serverSession = serverSession;
029                    this.name = name;
030                    this.roleName = roleName;
031            }
032    
033            @Override
034            public Object getBean() {
035                    return identity;
036            }
037    
038            @Override
039            public String getName() {
040                    return name + "." + roleName;
041            }
042    
043            @Override
044            public boolean get() {
045                    if (hasRole == null) {
046                            if (this.identity.isLoggedIn())
047                                    getFromRemote(null);
048                            return false;
049            }
050                    return hasRole;
051        }
052            
053            public boolean get(TideResponder<Boolean> tideResponder) {
054                    if (hasRole != null) {
055                    if (tideResponder != null) {
056                            TideResultEvent<Boolean> event = new TideResultEvent<Boolean>(context, serverSession, null, hasRole);
057                            tideResponder.result(event);
058                    }
059                    return hasRole;
060                    }
061                    if (this.identity.isLoggedIn())
062                            getFromRemote(tideResponder);
063                    return false;
064            }    
065            
066            public void getFromRemote(final TideResponder<Boolean> tideResponder) {
067                    this.identity.call(name, roleName, new SimpleTideResponder<Boolean>() {
068                            @Override
069                            public void result(TideResultEvent<Boolean> event) {
070                                    if (tideResponder != null)
071                                            tideResponder.result(event);
072                                    hasRole = event.getResult();
073                                    fireValueChangedEvent();
074                            }
075                            
076                            @Override
077                            public void fault(TideFaultEvent event) {
078                                    if (tideResponder != null)
079                                            tideResponder.fault(event);
080                                    clear();
081                            }
082                    });
083            }
084            
085            public void clear() {
086                    hasRole = null;
087                    fireValueChangedEvent();
088            }
089    }