001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
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,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krad.uif.component;
017    
018    import java.io.Serializable;
019    import java.util.HashMap;
020    import java.util.Map;
021    
022    /**
023     * Component security is used to flag permissions that exist in KIM for various component state (like edit and view)
024     *
025     * <p>
026     * In addition, properties such as additional role and permission details can be configured to use when
027     * checking the KIM permissions
028     * </p>
029     *
030     * <p>
031     * Security subclasses exist adding on flags apporiate for that component
032     * </p>
033     *
034     * @author Kuali Rice Team (rice.collab@kuali.org)
035     */
036    public class ComponentSecurity extends ConfigurableBase implements Serializable {
037        private static final long serialVersionUID = 726347449984853891L;
038    
039        private boolean editAuthz;
040        private boolean viewAuthz;
041    
042        private String namespaceAttribute;
043        private String componentAttribute;
044        private String idAttribute;
045    
046        private Map<String, String> additionalPermissionDetails;
047        private Map<String, String> additionalRoleQualifiers;
048    
049        public ComponentSecurity() {
050            editAuthz = false;
051            viewAuthz = false;
052    
053            additionalPermissionDetails = new HashMap<String, String>();
054            additionalRoleQualifiers = new HashMap<String, String>();
055        }
056    
057        /**
058         * Indicates whether the component has edit authorization and KIM should be consulted
059         *
060         * @return boolean true if the component has edit authorization, false if not
061         */
062        public boolean isEditAuthz() {
063            return editAuthz;
064        }
065    
066        /**
067         * Setter for the edit authorization flag
068         *
069         * @param editAuthz
070         */
071        public void setEditAuthz(boolean editAuthz) {
072            this.editAuthz = editAuthz;
073        }
074    
075        /**
076         * Indicates whether the component has view authorization and KIM should be consulted
077         *
078         * @return boolean true if the component has view authorization, false if not
079         */
080        public boolean isViewAuthz() {
081            return viewAuthz;
082        }
083    
084        /**
085         * Setter for the view authorization flag
086         *
087         * @param viewAuthz
088         */
089        public void setViewAuthz(boolean viewAuthz) {
090            this.viewAuthz = viewAuthz;
091        }
092    
093        /**
094         * Namespace code that should be sent as permission detail when doing a permission check on this field
095         *
096         * <p>
097         * When the namespace code is a detail for a permission check, this property can be configured to override the
098         * namespace derived by the system
099         * </p>
100         *
101         * @return String namespace code
102         */
103        public String getNamespaceAttribute() {
104            return namespaceAttribute;
105        }
106    
107        /**
108         * Setter for the namespace code to use for details
109         *
110         * @param namespaceAttribute
111         */
112        public void setNamespaceAttribute(String namespaceAttribute) {
113            this.namespaceAttribute = namespaceAttribute;
114        }
115    
116        /**
117         * Component code that should be sent as permission detail when doing a permission check on this field
118         *
119         * <p>
120         * When the component code is a detail for a permission check, this property can be configured to override the
121         * component code derived by the system
122         * </p>
123         *
124         * @return String component code
125         */
126        public String getComponentAttribute() {
127            return componentAttribute;
128        }
129    
130        /**
131         * Setter for the component code to use for details
132         *
133         * @param componentAttribute
134         */
135        public void setComponentAttribute(String componentAttribute) {
136            this.componentAttribute = componentAttribute;
137        }
138    
139        /**
140         * Id that should be sent as permission detail when doing a permission check on this field
141         *
142         * <p>
143         * By default they system will send the component id as a permission detail, this property can be configured to
144         * send a different id for the permission check
145         * </p>
146         *
147         * @return String id
148         */
149        public String getIdAttribute() {
150            return idAttribute;
151        }
152    
153        /**
154         * Setter for the id to use for details
155         *
156         * @param idAttribute
157         */
158        public void setIdAttribute(String idAttribute) {
159            this.idAttribute = idAttribute;
160        }
161    
162        /**
163         * Map of key value pairs that should be added as permission details when doing KIM permission checks for this
164         * component
165         *
166         * <p>
167         * Any details given here that will override details with the same key that were derived by the system
168         * </p>
169         *
170         * @return Map<String, String>
171         */
172        public Map<String, String> getAdditionalPermissionDetails() {
173            return additionalPermissionDetails;
174        }
175    
176        /**
177         * Setter for the map of additional permission details
178         *
179         * @param additionalPermissionDetails
180         */
181        public void setAdditionalPermissionDetails(Map<String, String> additionalPermissionDetails) {
182            this.additionalPermissionDetails = additionalPermissionDetails;
183        }
184    
185        /**
186         * Map of key value pairs that should be added as role qualifiers when doing KIM permission checks for this
187         * component
188         *
189         * <p>
190         * Any qualifiers given here that will override qualifiers with the same key that were derived by the system
191         * </p>
192         *
193         * @return Map<String, String>
194         */
195        public Map<String, String> getAdditionalRoleQualifiers() {
196            return additionalRoleQualifiers;
197        }
198    
199        /**
200         * Setter for the map of additional role qualifiers
201         *
202         * @param additionalRoleQualifiers
203         */
204        public void setAdditionalRoleQualifiers(Map<String, String> additionalRoleQualifiers) {
205            this.additionalRoleQualifiers = additionalRoleQualifiers;
206        }
207    
208        @Override
209        protected void finalize() throws Throwable {
210            try {
211                idAttribute = null;
212                componentAttribute = null;
213                namespaceAttribute = null;
214                additionalRoleQualifiers = null;
215                additionalPermissionDetails = null;
216            } finally {
217                // don't call super.finalize() in attempt to avoid loop between maps.
218            }
219        }
220    }