View Javadoc

1   /*
2    * Copyright 2005-2008 The Kuali Foundation
3    * 
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    * http://www.opensource.org/licenses/ecl2.php
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kns.datadictionary;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.krad.bo.BusinessObject;
20  import org.kuali.rice.krad.datadictionary.DataDictionary;
21  import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
22  import org.kuali.rice.krad.valuefinder.ValueFinder;
23  
24  import java.util.List;
25  
26  /**
27      The maintainableField element defines the specifications
28      for one data field.
29      JSTL: maintainableField is a Map accessed by the field name.
30      It contains entries with the following keys:
31          * field (boolean String)
32          * name (String)
33          * required (boolean String)
34  
35      * name is the name of the field
36      * required is true if the field must contain a non-null value
37      * readOnly is true if it cannot be updated
38      * template documentation from MaintenanceUtils.java:
39          Field templates are used in relation to multiple value lookups.
40          When doing a MV lookup on a collection, the returned BOs
41          are not necessarily of the same type as the elements of the
42          collection. Therefore, a means of mapping between the fields
43          for the 2 BOs are necessary. The template attribute of
44          <maintainableField> contained within <maintainableCollection>
45          tells us this mapping.
46          Example:
47          <maintainableField name="collectionAttrib" template="lookupBOAttrib">
48          means that when a list of BOs are returned, the lookupBOAttrib value
49          of the looked up BO will be placed into the collectionAttrib
50          value of the BO added to the collection
51      * webUILeaveFieldFunction is the name of a javascript function to called when
52          when the user tabs out of the field.
53      * webUILeaveFieldCallbackFunction
54          This is the call javascript function related to the webUILeaveFieldFunction.
55      * readOnlyAfterAdd
56          This is used to indicate that the field is read-only after the record has been
57          initially created.
58   */
59  @Deprecated
60  public class MaintainableFieldDefinition extends MaintainableItemDefinition implements FieldDefinitionI{
61      private static final long serialVersionUID = -1176087424343479963L;
62      
63  	protected boolean required = false;
64      protected boolean unconditionallyReadOnly = false;
65      protected boolean readOnlyAfterAdd = false;
66      protected boolean noLookup = false;
67      protected boolean lookupReadOnly = false;
68      
69      protected String defaultValue;
70      protected String template;
71      protected Class<? extends ValueFinder> defaultValueFinderClass;
72  
73      protected String webUILeaveFieldFunction = "";
74      protected String webUILeaveFieldCallbackFunction = "";
75      protected List<String> webUILeaveFieldFunctionParameters;
76  
77      protected Class<? extends BusinessObject> overrideLookupClass;
78      protected String overrideFieldConversions;
79      
80      protected String alternateDisplayAttributeName;
81      protected String additionalDisplayAttributeName;
82      
83      protected boolean triggerOnChange;
84      
85      protected Boolean showFieldLevelHelp = null; // use default from system
86      protected String fieldLevelHelpUrl = null;
87      
88      public MaintainableFieldDefinition() {}
89  
90      /**
91       * @return true if this attribute is required
92       */
93      public boolean isRequired() {
94          return required;
95      }
96  
97      /**
98  required is true if the field must contain a non-null value
99       */
100     public void setRequired(boolean required) {
101         this.required = required;
102     }
103 
104     /**
105      * @return Returns the defaultValue.
106      */
107     public String getDefaultValue() {
108         return defaultValue;
109     }
110 
111 
112     /**
113      * 
114                        The defaultValue element will pre-load the specified value
115                        into the lookup field.
116      */
117     public void setDefaultValue(String defaultValue) {
118         this.defaultValue = defaultValue;
119     }
120 
121 
122     /**
123      * @return custom defaultValue class
124      */
125     public Class<? extends ValueFinder> getDefaultValueFinderClass() {
126         return defaultValueFinderClass;
127     }
128 
129     /**
130 	 * @return the unconditionallyReadOnly
131 	 */
132 	public boolean isUnconditionallyReadOnly() {
133 		return this.unconditionallyReadOnly;
134 	}
135 
136 	/**
137 	 * @param unconditionallyReadOnly the unconditionallyReadOnly to set
138 	 */
139 	public void setUnconditionallyReadOnly(boolean unconditionallyReadOnly) {
140 		this.unconditionallyReadOnly = unconditionallyReadOnly;
141 	}
142 
143     /**
144      * Gets the overrideFieldConversions attribute. 
145      * @return Returns the overrideFieldConversions.
146      */
147     public String getOverrideFieldConversions() {
148         return overrideFieldConversions;
149     }
150 
151 
152     /**
153      * Single value lookups expect field conversions to be passed in as a HTTP parameter when the lookups is invoked from a quickfinder icon (i.e. magnifying glass on page).
154                         Field conversions are normally used to determine which fields will be returned when the "return value" link is clicked.
155 
156                         For example, if we're performing a quickfinder lookup and the field conversion string "a:document.someObject.a1,b:document.someObject.b1" is passed into the lookup,
157                         this means that when we click on a lookup result row to be returned:
158 
159                         * the value of property "a" from the selected result bo will be passed as the value of the HTTP parameter named "document.someObject.a1",
160                           which, in turn, populates the POJO property of the same name on the form
161                         * the value of property "b" from the selected result bo will be passed as the value of the HTTP parameter named "document.someObject.b1",
162                           which, in turn, populates the POJO property of the same name on the form
163 
164                         Normally, the field conversion string is automatically computed by the framework to return all of the primary key values of the looked up BO into the corresponding
165                         foreign key values of the destination BO (i.e. document.someObject in the example above).  However, putting in this element will allow for the overriding of the
166                         field conversions string.
167      */
168     public void setOverrideFieldConversions(String overrideFieldConversions) {
169         this.overrideFieldConversions = overrideFieldConversions;
170     }
171 
172 
173     /**
174      * Gets the overrideLookupClass attribute. 
175      * @return Returns the overrideLookupClass.
176      */
177     public Class<? extends BusinessObject> getOverrideLookupClass() {
178         return overrideLookupClass;
179     }
180 
181 
182 
183 
184     /**
185      * Directly validate simple fields.
186      * 
187      * @see org.kuali.rice.krad.datadictionary.DataDictionaryDefinition#completeValidation(java.lang.Class, java.lang.Object)
188      */
189     public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) {
190         if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, getName())) {
191             throw new AttributeValidationException("unable to find attribute or collection named '" + getName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
192         }
193 
194         if (StringUtils.isNotBlank(getAlternateDisplayAttributeName())) {
195             if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, getAlternateDisplayAttributeName())) {
196                 throw new AttributeValidationException("unable to find attribute or collection named '" + getAlternateDisplayAttributeName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
197             }
198         }
199         
200         if (StringUtils.isNotBlank(getAdditionalDisplayAttributeName())) {
201             if (!DataDictionary.isPropertyOf(rootBusinessObjectClass, getAdditionalDisplayAttributeName())) {
202                 throw new AttributeValidationException("unable to find attribute or collection named '" + getAdditionalDisplayAttributeName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
203             }
204         }
205 
206         if (defaultValueFinderClass != null && defaultValue != null) {
207             throw new AttributeValidationException("Both defaultValue and defaultValueFinderClass can not be specified on attribute " + getName() + " in rootBusinessObjectClass " + rootBusinessObjectClass.getName());
208         }
209    }
210 
211     /**
212      * @see java.lang.Object#toString()
213      */
214     public String toString() {
215         return "MaintainableFieldDefinition for field " + getName();
216     }
217 
218 
219     public String getTemplate() {
220         return template;
221     }
222 
223 
224     /**
225 template documentation from MaintenanceUtils.java:
226                             Field templates are used in relation to multiple value lookups.
227                             When doing a MV lookup on a collection, the returned BOs
228                             are not necessarily of the same type as the elements of the
229                             collection. Therefore, a means of mapping between the fields
230                             for the 2 BOs are necessary. The template attribute of
231                             <maintainableField> contained within <maintainableCollection>
232                             tells us this mapping.
233                             Example:
234                             <maintainableField name="collectionAttrib" template="lookupBOAttrib">
235                             means that when a list of BOs are returned, the lookupBOAttrib value
236                             of the looked up BO will be placed into the collectionAttrib
237                             value of the BO added to the collection
238  */
239     public void setTemplate(String template) {
240         this.template = template;
241     }
242 
243 
244     public String getWebUILeaveFieldCallbackFunction() {
245         return webUILeaveFieldCallbackFunction;
246     }
247 
248 
249     /**
250                         * webUILeaveFieldCallbackFunction
251                             This is the call javascript function related to the webUILeaveFieldFunction.
252      */
253     public void setWebUILeaveFieldCallbackFunction(String webUILeaveFieldCallbackFunction) {
254         this.webUILeaveFieldCallbackFunction = webUILeaveFieldCallbackFunction;
255     }
256 
257 
258     public String getWebUILeaveFieldFunction() {
259         return webUILeaveFieldFunction;
260     }
261 
262 
263     /**
264                         * webUILeaveFieldFunction is the name of a javascript function to called when
265                             when the user tabs out of the field.
266      */
267     public void setWebUILeaveFieldFunction(String webUILeaveFieldFunction) {
268         this.webUILeaveFieldFunction = webUILeaveFieldFunction;
269     }
270 
271 
272     public boolean isReadOnlyAfterAdd() {
273         return readOnlyAfterAdd;
274     }
275 
276 
277     /**
278      * This is used to indicate that the field is read-only after the record has been
279                             initially created.
280      */
281     public void setReadOnlyAfterAdd(boolean readOnlyAfterAdd) {
282         this.readOnlyAfterAdd = readOnlyAfterAdd;
283     }
284 
285 
286     /**
287 The defaultValueFinderClass specifies the java class that will be
288                       used to determine the default value of a lookup field.  The classname
289                       specified in this field must implement ValueFinder
290    */
291     public void setDefaultValueFinderClass(Class<? extends ValueFinder> defaultValueFinderClass) {
292         this.defaultValueFinderClass = defaultValueFinderClass;
293     }
294 
295 
296     /**
297      * The overrideLookupClass element is used to indicate the
298                         class that should be used for the magnifying glass lookup.
299                         The specified class must be a subclass of the business object
300                         class.
301      */
302     public void setOverrideLookupClass(Class<? extends BusinessObject> overrideLookupClass) {
303         this.overrideLookupClass = overrideLookupClass;
304     }
305     
306 	/**
307 	 * @return the noLookup
308 	 */
309 	public boolean isNoLookup() {
310 		return this.noLookup;
311 	}
312 
313 	/**
314 	 * @param noLookup the noLookup to set
315 	 */
316 	public void setNoLookup(boolean noLookup) {
317 		this.noLookup = noLookup;
318 	}
319 	
320 	public boolean isLookupReadOnly() {
321 		return lookupReadOnly;
322 	}
323     
324 	public void setLookupReadOnly(boolean lookupReadOnly) {
325     	this.lookupReadOnly = lookupReadOnly;
326     }
327 	
328     public Boolean isShowFieldLevelHelp() {
329         return showFieldLevelHelp;
330     }
331 
332     public void setShowFieldLevelHelp(Boolean showFieldLevelHelp) {
333         this.showFieldLevelHelp = showFieldLevelHelp;
334     }
335 
336     public String getFieldLevelHelpUrl() {
337         return fieldLevelHelpUrl;
338     }
339 
340     public void setFieldLevelHelpUrl(String fieldLevelHelpUrl) {
341         this.fieldLevelHelpUrl = fieldLevelHelpUrl;
342     }
343 	
344 	/**
345 	 * The alternateDisplayAttributeName is the name of the attribute whose value will be displayed instead
346 	 * of the actual maintenance field attribute. Only applies when field is read-only.
347 	 */
348     public String getAlternateDisplayAttributeName() {
349 		return this.alternateDisplayAttributeName;
350 	}
351 
352 	public void setAlternateDisplayAttributeName(String alternateDisplayAttributeName) {
353 		this.alternateDisplayAttributeName = alternateDisplayAttributeName;
354 	}
355 
356 	/**
357 	 * The additionalDisplayAttributeName is the name of the attribute whose value will be displayed in addition
358 	 * to the actual maintenance field attribute. Only applies when field is read-only.
359 	 */
360 	public String getAdditionalDisplayAttributeName() {
361 		return this.additionalDisplayAttributeName;
362 	}
363 
364 	public void setAdditionalDisplayAttributeName(String additionalDisplayAttributeName) {
365 		this.additionalDisplayAttributeName = additionalDisplayAttributeName;
366 	}
367 	
368 	public boolean isTriggerOnChange() {
369 		return this.triggerOnChange;
370 	}
371 
372 	public void setTriggerOnChange(boolean triggerOnChange) {
373 		this.triggerOnChange = triggerOnChange;
374 	}
375 
376 	/**
377   	 * @return the webUILeaveFieldFunctionParameters
378   	 */
379   	public List<String> getWebUILeaveFieldFunctionParameters() {
380   		return this.webUILeaveFieldFunctionParameters;
381   	}
382 
383   	/**
384   	 * @param webUILeaveFieldFunctionParameters the webUILeaveFieldFunctionParameters to set
385   	 */
386   	public void setWebUILeaveFieldFunctionParameters(
387   			List<String> webUILeaveFieldFunctionParameters) {
388   		this.webUILeaveFieldFunctionParameters = webUILeaveFieldFunctionParameters;
389   	}
390 
391 }