1 /**
2 * Copyright 2005-2016 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 }