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 }