/*
 * Copyright 2002-2004 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.springframework.richclient.command.support;

import java.beans.PropertyChangeListener;
import java.util.Map;

import org.springframework.binding.value.ValueModel;
import org.springframework.binding.value.support.ValueHolder;
import org.springframework.richclient.command.GuardedActionCommandExecutor;
import org.springframework.richclient.command.ParameterizableActionCommandExecutor;

/**
 * @author Keith Donald
 */
public class AbstractActionCommandExecutor implements ParameterizableActionCommandExecutor,
        GuardedActionCommandExecutor {

    private ValueModel enabled = new ValueHolder(Boolean.FALSE);

    public boolean isEnabled() {
        return ((Boolean)enabled.getValue()).booleanValue();
    }

    public void setEnabled(boolean enabled) {
        this.enabled.setValue(Boolean.valueOf(enabled));
    }

    public void addEnabledListener(PropertyChangeListener listener) {
        enabled.addValueChangeListener(listener);
    }

    public void removeEnabledListener(PropertyChangeListener listener) {
        enabled.removeValueChangeListener(listener);
    }

    public void execute(Map parameters) {
        execute();
    }

    public void execute() {
    }

}
/*
 * Copyright 2002-2004 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.springframework.richclient.command.support;

import java.beans.PropertyChangeListener;
import java.util.Map;

import org.springframework.binding.value.ValueModel;
import org.springframework.binding.value.support.ValueHolder;
import org.springframework.richclient.command.GuardedActionCommandExecutor;
import org.springframework.richclient.command.ParameterizableActionCommandExecutor;
import org.springframework.richclient.core.SecurityControllable;

/**
 * @author Keith Donald
 */
public class AbstractActionCommandExecutor implements ParameterizableActionCommandExecutor,
        GuardedActionCommandExecutor, SecurityControllable {

    private ValueModel enabled = new ValueHolder(Boolean.FALSE);

    private boolean authorized = true;
    private boolean maskedEnabledState = false;
    private String securityControllerId = null;

    /**
     * Set the Id of the security controller that should manage this object.
     * @param controllerId Id (bean name) of the security controller
     */
    public void setSecurityControllerId(String controllerId) {
        this.securityControllerId = controllerId;
    }

    /**
     * Get the id (bean name) of the security controller that should manage this object.
     * @return controller id
     */
    public String getSecurityControllerId() {
        return securityControllerId;
    }

    /**
     * Set the authorized state.  Setting authorized to false will override any call
     * to {@link #setEnabled(boolean)}.  As long as this object is unauthorized,
     * it can not be enabled.
     * @param authorized Pass <code>true</code> if the object is to be authorized
     */
    public void setAuthorized( boolean authorized ) {

        if( isAuthorized() != authorized ) {
            
            this.authorized = authorized;

            // We need to apply a change to our enabled state depending on our
            // new authorized state.
            if( authorized ) {
                // install the last requested enabled state
                setEnabled(maskedEnabledState);
            } else {
                // Record the current enabled state and then disable
                maskedEnabledState = isEnabled();
                internalSetEnabled(false);
            }
        }
    }

    /**
     * Get the authorized state.
     * @return authorized
     */
    public boolean isAuthorized() {
        return authorized;
    }

    public boolean isEnabled() {
        return ((Boolean)enabled.getValue()).booleanValue();
    }

    /**
     * Set the enabled state of this command.  Note that if we are currently not
     * authorized, then the new value will just be recorded and no change in the
     * current enabled state will be made.
     * @param enabled state
     */
    public void setEnabled(boolean enabled) {
        maskedEnabledState = enabled;
        if( isAuthorized() ) {
            internalSetEnabled( enabled );
        }
    }

    /**
     * Internal method to set the enabled state.  This is needed so that calls
     * made to the public setEnabled and this method can be handled differently.
     * @param enabled state
     * @see #setAuthorized(boolean)
     */
    protected void internalSetEnabled( boolean enabled ) {
        this.enabled.setValue(Boolean.valueOf(enabled));
    }

    public void addEnabledListener(PropertyChangeListener listener) {
        enabled.addValueChangeListener(listener);
    }

    public void removeEnabledListener(PropertyChangeListener listener) {
        enabled.removeValueChangeListener(listener);
    }

    public void execute(Map parameters) {
        execute();
    }

    public void execute() {
    }

}
Implement SecurityControllable