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 }