001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.command.support;
017
018 import java.beans.PropertyChangeListener;
019 import java.util.Map;
020
021 import org.springframework.binding.value.ValueModel;
022 import org.springframework.binding.value.support.ValueHolder;
023 import org.springframework.richclient.command.GuardedActionCommandExecutor;
024 import org.springframework.richclient.command.ParameterizableActionCommandExecutor;
025 import org.springframework.richclient.core.SecurityControllable;
026
027 /**
028 * @author Keith Donald
029 */
030 public class AbstractActionCommandExecutor implements ParameterizableActionCommandExecutor,
031 GuardedActionCommandExecutor, SecurityControllable {
032
033 private ValueModel enabled = new ValueHolder(Boolean.FALSE);
034
035 private boolean authorized = true;
036 private boolean maskedEnabledState = false;
037 private String securityControllerId = null;
038
039 /**
040 * Set the Id of the security controller that should manage this object.
041 * @param controllerId Id (bean name) of the security controller
042 */
043 public void setSecurityControllerId(String controllerId) {
044 this.securityControllerId = controllerId;
045 }
046
047 /**
048 * Get the id (bean name) of the security controller that should manage this object.
049 * @return controller id
050 */
051 public String getSecurityControllerId() {
052 return securityControllerId;
053 }
054
055 /**
056 * Set the authorized state. Setting authorized to false will override any call
057 * to {@link #setEnabled(boolean)}. As long as this object is unauthorized,
058 * it can not be enabled.
059 * @param authorized Pass <code>true</code> if the object is to be authorized
060 */
061 public void setAuthorized( boolean authorized ) {
062
063 if( isAuthorized() != authorized ) {
064
065 this.authorized = authorized;
066
067 // We need to apply a change to our enabled state depending on our
068 // new authorized state.
069 if( authorized ) {
070 // install the last requested enabled state
071 setEnabled(maskedEnabledState);
072 } else {
073 // Record the current enabled state and then disable
074 maskedEnabledState = isEnabled();
075 internalSetEnabled(false);
076 }
077 }
078 }
079
080 /**
081 * Get the authorized state.
082 * @return authorized
083 */
084 public boolean isAuthorized() {
085 return authorized;
086 }
087
088 public boolean isEnabled() {
089 return ((Boolean)enabled.getValue()).booleanValue();
090 }
091
092 /**
093 * Set the enabled state of this command. Note that if we are currently not
094 * authorized, then the new value will just be recorded and no change in the
095 * current enabled state will be made.
096 * @param enabled state
097 */
098 public void setEnabled(boolean enabled) {
099 maskedEnabledState = enabled;
100 if( isAuthorized() ) {
101 internalSetEnabled( enabled );
102 }
103 }
104
105 /**
106 * Internal method to set the enabled state. This is needed so that calls
107 * made to the public setEnabled and this method can be handled differently.
108 * @param enabled state
109 * @see #setAuthorized(boolean)
110 */
111 protected void internalSetEnabled( boolean enabled ) {
112 this.enabled.setValue(Boolean.valueOf(enabled));
113 }
114
115 public void addEnabledListener(PropertyChangeListener listener) {
116 enabled.addValueChangeListener(listener);
117 }
118
119 public void removeEnabledListener(PropertyChangeListener listener) {
120 enabled.removeValueChangeListener(listener);
121 }
122
123 public void execute(Map parameters) {
124 execute();
125 }
126
127 public void execute() {
128 }
129
130 }