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.javafx.spring.Identity;
007    import org.granite.client.tide.server.ServerSession;
008    import org.granite.client.tide.server.SimpleTideResponder;
009    import org.granite.client.tide.server.TideFaultEvent;
010    import org.granite.client.tide.server.TideResponder;
011    import org.granite.client.tide.server.TideResultEvent;
012    
013    public class ObservablePermission 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 Object entity;
020            private final String action;
021            
022            private Boolean hasPermission = null;
023            
024            
025            public ObservablePermission(Identity identity, Context context, ServerSession serverSession, String name, Object entity, String action) {
026                    super();
027                    this.identity = identity;
028                    this.context = context;
029                    this.serverSession = serverSession;
030                    this.name = name;
031                    this.entity = entity;
032                    this.action = action;
033            }
034    
035            @Override
036            public Object getBean() {
037                    return identity;
038            }
039    
040            @Override
041            public String getName() {
042                    return name;
043            }
044    
045            @Override
046            public boolean get() {
047                    if (hasPermission == null) {
048                            if (this.identity.isLoggedIn())
049                                    getFromRemote(null);
050                            return false;
051            }
052                    return hasPermission;
053        }
054            
055            public boolean get(TideResponder<Boolean> tideResponder) {
056                    if (hasPermission != null) {
057                    if (tideResponder != null) {
058                            TideResultEvent<Boolean> event = new TideResultEvent<Boolean>(context, serverSession, null, hasPermission);
059                            tideResponder.result(event);
060                    }
061                    return hasPermission;
062                    }
063                    if (this.identity.isLoggedIn())
064                            getFromRemote(tideResponder);
065                    return false;
066            }    
067            
068            public void getFromRemote(final TideResponder<Boolean> tideResponder) {
069                    this.identity.call(name, entity, action, new SimpleTideResponder<Boolean>() {
070                            @Override
071                            public void result(TideResultEvent<Boolean> event) {
072                                    if (tideResponder != null)
073                                            tideResponder.result(event);
074                                    hasPermission = event.getResult();
075                                    fireValueChangedEvent();
076                            }
077                            
078                            @Override
079                            public void fault(TideFaultEvent event) {
080                                    if (tideResponder != null)
081                                            tideResponder.fault(event);
082                                    clear();
083                            }
084                    });
085            }
086            
087            public void clear() {
088                    hasPermission = null;
089                    fireValueChangedEvent();
090            }
091    }