001    /**
002     * Copyright 2005-2012 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.kns.document.authorization;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.kns.web.ui.Field;
020    import org.kuali.rice.krad.datadictionary.mask.MaskFormatter;
021    
022    /**
023     * This class represents the authorization restrictions (or lack of) for a given field.
024     * 
025     * 
026     */
027    /**
028     * This is a description of what this class does - zjzhou don't forget to fill this in. 
029     * 
030     * @author Kuali Rice Team (rice.collab@kuali.org)
031     *
032     */
033    public class FieldRestriction {
034    
035        private String fieldName;
036        private boolean editable;
037        private boolean viewable;
038        private boolean masked;
039        private boolean partiallyMasked;
040        private MaskFormatter maskFormatter;
041        private boolean shouldBeEncrypted;
042        /**
043         * Constructs a FieldAuthorization.java.
044         */
045        public FieldRestriction() {
046            editable = true;
047            viewable = true;
048        }
049    
050        /**
051         * 
052         * Constructs a FieldAuthorization.java.
053         * 
054         * @param fieldName - name of field to represent
055         * @param canEdit - true if the field is editable in this context, false otherwise
056         * @param canView - true if thie field is viewable in this context, false otherwise
057         * 
058         */
059        public FieldRestriction(String fieldName, boolean canEdit, boolean canView) {
060            this.fieldName = fieldName;
061            setEditable(canEdit); // using setters here to run impossible combinations check
062            setViewable(canView);
063        }
064        
065        /**
066         * 
067         * Constructs a FieldAuthorization.java.
068         * 
069         * @param fieldName - name of the field to represent
070         * @param fieldAuthorizationFlag - Field.HIDDEN, Field.READONLY, or Field.EDITABLE
071         */
072        public FieldRestriction(String fieldName, String fieldAuthorizationFlag) {
073            // if an invalid flag is passed in, the choke on it
074            if (!fieldAuthorizationFlag.equals(Field.EDITABLE) && !fieldAuthorizationFlag.equals(Field.READONLY) 
075                            && !fieldAuthorizationFlag.equals(Field.HIDDEN) && !fieldAuthorizationFlag.equals(Field.MASKED)
076                            && !fieldAuthorizationFlag.equals(Field.PARTIALLY_MASKED)) {
077                throw new IllegalArgumentException("The only allowable values are " +
078                            "Field.HIDDEN, Field.READONLY, Field.EDITABLE, Field.MASKED and Field.PARTIALLY_MASKED");
079            }
080    
081            this.fieldName = fieldName;
082    
083            if (fieldAuthorizationFlag.equals(Field.EDITABLE)) {
084                this.editable = true;
085                this.viewable = true;
086            } else if (fieldAuthorizationFlag.equals(Field.READONLY)) {
087                this.editable = false;
088                this.viewable = true;
089            } else if (fieldAuthorizationFlag.equals(Field.HIDDEN)) {
090                this.editable = false;
091                this.viewable = false;
092            } else if(fieldAuthorizationFlag.equals(Field.MASKED)){
093                            this.masked = true;
094                            this.viewable = true;
095                            this.editable = false;
096                    } else if(fieldAuthorizationFlag.equals(Field.PARTIALLY_MASKED)){
097                            this.partiallyMasked = true;
098                            this.viewable = true;
099                            this.editable = false;
100                    }
101        }
102    
103        /**
104         * 
105         * This method returns the correct flag from the Kuali Field object, that corresponds to the particular combination of editable
106         * and viewable set on this object.
107         * 
108         * @return Field.HIDDEN, Field.READONLY, or Field.EDITABLE
109         * 
110         */
111        public String getKualiFieldDisplayFlag() {
112    
113            if (!editable && !viewable) {
114                return Field.HIDDEN;
115            }
116            if (!editable && viewable) {
117                return Field.READONLY;
118            }
119            else {
120                return Field.EDITABLE;
121            }
122    
123        }
124    
125        /**
126         * 
127         * This method returns true if the FieldAuthorization is some kind of restriction, and returns false if it is an editable field.
128         * 
129         * @return boolean
130         * 
131         */
132        public boolean isRestricted() {
133            if (!editable || !viewable) {
134                return true;
135            }
136            else {
137                return false;
138            }
139        }
140    
141        /**
142         * 
143         * This method returns true if this authorization prohibits Viewing and Editing, resulting in a hidden field.
144         * 
145         * @return boolean
146         * 
147         */
148        public boolean isHidden() {
149            if (!editable && !viewable) {
150                return true;
151            }
152            else {
153                return false;
154            }
155        }
156    
157        /**
158         * 
159         * This method returns true if this authorization prohibits Editing but not Viewing, resulting in a ReadOnly field.
160         * 
161         * @return boolean
162         * 
163         */
164        public boolean isReadOnly() {
165            if (!editable && viewable) {
166                return true;
167            }
168            else {
169                return false;
170            }
171        }
172    
173        /**
174         * Gets the editable attribute.
175         * 
176         * @return Returns the editable.
177         */
178        public boolean isEditable() {
179            return editable;
180        }
181    
182        /**
183         * Sets the editable attribute value.
184         * 
185         * Note that if editable is being set to true, and the internal value of viewable is false, viewable will be flipped to true, to
186         * avoid impossible combinations of flags.
187         * 
188         * @param editable The editable to set.
189         */
190        public void setEditable(boolean editable) {
191            if (editable && !this.viewable) {
192                this.viewable = true;
193            }
194            this.editable = editable;
195        }
196    
197        /**
198         * Gets the fieldName attribute.
199         * 
200         * @return Returns the fieldName.
201         */
202        public String getFieldName() {
203            return fieldName;
204        }
205    
206        /**
207         * Sets the fieldName attribute value.
208         * 
209         * @param fieldName The fieldName to set.
210         */
211        public void setFieldName(String fieldName) {
212            this.fieldName = fieldName;
213        }
214    
215        /**
216         * Gets the viewable attribute.
217         * 
218         * @return Returns the viewable.
219         */
220        public boolean isViewable() {
221            return viewable;
222        }
223    
224        /**
225         * Sets the viewable attribute value.
226         * 
227         * Note that if viewable is being set to false, and the internal value of editable is true, then editable will be silently
228         * flipped to false. This is done to avoid impossible combinations of authorization flags.
229         * 
230         * @param viewable The viewable to set.
231         */
232        public void setViewable(boolean viewable) {
233            if (!viewable && this.editable) {
234                this.editable = false;
235            }
236            this.viewable = viewable;
237        }
238    
239        /**
240         * @see java.lang.Object#toString()
241         */
242        public String toString() {
243            StringBuffer sb = new StringBuffer();
244            sb.append(this.fieldName);
245            sb.append(" [");
246            if (this.editable) {
247                sb.append("editable");
248            }
249            else {
250                sb.append("not editable");
251            }
252            sb.append(",");
253            if (this.viewable) {
254                sb.append("viewable");
255            }
256            else {
257                sb.append("not viewable");
258            }
259            sb.append("]");
260            return sb.toString();
261        }
262    
263        /**
264         * @see java.lang.Object#equals(java.lang.Object)
265         */
266        public boolean equals(Object obj) {
267            boolean equal = false;
268    
269            if (obj != null) {
270                if (this.getClass().equals(obj.getClass())) {
271                    FieldRestriction other = (FieldRestriction) obj;
272    
273                    if (StringUtils.equals(this.fieldName, other.getFieldName())) {
274                        if (this.editable == other.isEditable() && this.viewable == other.isViewable()) {
275                            equal = true;
276                        }
277                    }
278                }
279            }
280    
281            return equal;
282        }
283    
284        /**
285         * @see java.lang.Object#hashCode()
286         */
287        public int hashCode() {
288            return toString().hashCode();
289        }
290    
291            /**
292             * @return the masked
293             */
294            public boolean isMasked() {
295                    return this.masked;
296            }
297    
298            /**
299             * @return the partiallyMasked
300             */
301            public boolean isPartiallyMasked() {
302                    return this.partiallyMasked;
303            }
304    
305            
306            /**
307             * @return the shouldBeEncrypted
308             */
309            public boolean isShouldBeEncrypted() {
310                    return this.shouldBeEncrypted;
311            }
312    
313            /**
314             * @param shouldBeEncrypted the shouldBeEncrypted to set
315             */
316            public void setShouldBeEncrypted(boolean shouldBeEncrypted) {
317                    this.shouldBeEncrypted = shouldBeEncrypted;
318            }
319    
320            /**
321             * @return the maskFormatter
322             */
323            public MaskFormatter getMaskFormatter() {
324                    return this.maskFormatter;
325            }
326    
327            /**
328             * @param maskFormatter the maskFormatter to set
329             */
330            public void setMaskFormatter(MaskFormatter maskFormatter) {
331                    this.maskFormatter = maskFormatter;
332            }
333            
334            
335    }