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.kns.lookup;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.core.api.config.property.ConfigContext;
020 import org.kuali.rice.core.web.format.DateFormatter;
021 import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions;
022 import org.kuali.rice.kns.document.authorization.FieldRestriction;
023 import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
024 import org.kuali.rice.kns.service.KNSServiceLocator;
025 import org.kuali.rice.kns.util.KNSConstants;
026 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
027 import org.kuali.rice.krad.util.KRADConstants;
028 import org.kuali.rice.krad.util.ObjectUtils;
029
030 import java.io.Serializable;
031 import java.sql.Date;
032 import java.util.HashMap;
033 import java.util.Iterator;
034 import java.util.List;
035 import java.util.Map;
036
037 /**
038 * This class holds details of html data for an action url.
039 *
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 *
042 */
043 @Deprecated
044 public abstract class HtmlData implements Serializable {
045
046 protected static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(HtmlData.class);
047
048 public static final String ANCHOR_HTML_DATA_TYPE = AnchorHtmlData.class.getName();
049 public static final String INPUT_HTML_DATA_TYPE = InputHtmlData.class.getName();
050
051 protected String name = "";
052 protected String title = "";
053 protected String methodToCall = "";
054 protected String displayText = "";
055 protected String prependDisplayText = "";
056 protected String appendDisplayText = "";
057 protected List<HtmlData> childUrlDataList;
058 protected String maxLength;
059
060 /**
061 *
062 * This method constructs the complete html tag based on the class attribute
063 * values.
064 *
065 * @return
066 */
067 public abstract String constructCompleteHtmlTag();
068
069 /**
070 * @return the appendDisplayText
071 */
072 public String getAppendDisplayText() {
073 return this.appendDisplayText;
074 }
075
076 /**
077 * @param appendDisplayText the appendDisplayText to set
078 */
079 public void setAppendDisplayText(String appendDisplayText) {
080 this.appendDisplayText = appendDisplayText;
081 }
082
083 /**
084 * @return the childUrlDataList
085 */
086 public List<HtmlData> getChildUrlDataList() {
087 return this.childUrlDataList;
088 }
089
090 /**
091 * @param childUrlDataList the childUrlDataList to set
092 */
093 public void setChildUrlDataList(List<HtmlData> childUrlDataList) {
094 this.childUrlDataList = childUrlDataList;
095 }
096
097 /**
098 * @return the prependDisplayText
099 */
100 public String getPrependDisplayText() {
101 return this.prependDisplayText;
102 }
103
104 /**
105 * @param prependDisplayText the prependDisplayText to set
106 */
107 public void setPrependDisplayText(String prependDisplayText) {
108 this.prependDisplayText = prependDisplayText;
109 }
110
111 /**
112 * @return the title
113 */
114 public String getTitle() {
115 return this.title;
116 }
117
118 /**
119 * @param title the title to set
120 */
121 public void setTitle(String title) {
122 this.title = title;
123 }
124
125 /**
126 * @return the name
127 */
128 public String getName() {
129 return this.name;
130 }
131
132 /**
133 * @param name the name to set
134 */
135 public void setName(String name) {
136 this.name = name;
137 }
138
139 /**
140 * @return the displayText
141 */
142 public String getDisplayText() {
143 return this.displayText;
144 }
145
146 /**
147 * @param displayText the displayText to set
148 */
149 public void setDisplayText(String displayText) {
150 this.displayText = displayText;
151 }
152
153 /**
154 * @return the methodToCall
155 */
156 public String getMethodToCall() {
157 return this.methodToCall;
158 }
159
160 /**
161 * @param methodToCall the methodToCall to set
162 */
163 public void setMethodToCall(String methodToCall) {
164 this.methodToCall = methodToCall;
165 }
166
167 public String getTitle(String prependText, Class bo, List keys) {
168 return KRADConstants.EMPTY_STRING;
169 }
170
171 /**
172 * KFSMI-658 This method gets the title text for a link/control
173 *
174 * @param prependText
175 * @param dataObject
176 * @param fieldConversions
177 * @param returnKeys
178 * @return title text
179 */
180 public static String getTitleText(String prependText, Object dataObject, List<String> keys, BusinessObjectRestrictions businessObjectRestrictions) {
181 if (dataObject == null)
182 return KRADConstants.EMPTY_STRING;
183
184 Map<String, String> keyValueMap = new HashMap<String, String>();
185 Iterator keysIt = keys.iterator();
186 while (keysIt.hasNext()) {
187 String fieldNm = (String) keysIt.next();
188 Object fieldVal = ObjectUtils.getPropertyValue(dataObject, fieldNm);
189
190 FieldRestriction fieldRestriction = null;
191 if (businessObjectRestrictions != null) {
192 fieldRestriction = businessObjectRestrictions.getFieldRestriction(fieldNm);
193 }
194
195 if (KNSServiceLocator.getDataDictionaryService().getAttributeDefinition(dataObject.getClass().getName(), fieldNm) == null) {
196 fieldVal = KRADConstants.EMPTY_STRING;
197 } else if (fieldRestriction != null && (fieldRestriction.isMasked() || fieldRestriction.isPartiallyMasked())) {
198 fieldVal = fieldRestriction.getMaskFormatter().maskValue(fieldVal);
199 } else if (fieldVal == null) {
200 fieldVal = KRADConstants.EMPTY_STRING;
201 } else if (fieldVal instanceof Date) {
202 // need to format date in url
203 DateFormatter dateFormatter = new DateFormatter();
204 fieldVal = dateFormatter.format(fieldVal);
205 }
206 keyValueMap.put(fieldNm, fieldVal.toString());
207 }
208 return getTitleText(prependText, dataObject.getClass(), keyValueMap);
209 }
210
211 private static BusinessObjectAuthorizationService businessObjectAuthorizationService;
212 private static BusinessObjectAuthorizationService getBusinessObjectAuthorizationService() {
213 if (businessObjectAuthorizationService == null) {
214 businessObjectAuthorizationService = KNSServiceLocator.getBusinessObjectAuthorizationService();
215 }
216 return businessObjectAuthorizationService;
217 }
218
219 public static String getTitleText(String prependText, Class<?> dataObjectClass, Map<String, String> keyValueMap) {
220 StringBuffer titleText = new StringBuffer(prependText);
221 for (String key : keyValueMap.keySet()) {
222 String fieldVal = keyValueMap.get(key).toString();
223
224 if (StringUtils.isNotBlank(fieldVal)) {
225 titleText.append(KRADServiceLocatorWeb.getDataDictionaryService()
226 .getAttributeLabel(dataObjectClass, key)
227 + "=" + fieldVal.toString() + " ");
228 }
229 }
230 return titleText.toString();
231 }
232
233 /**
234 *
235 * This class is an extension of HtmlData. It represents an anchor tag.
236 *
237 * @author Kuali Rice Team (rice.collab@kuali.org)
238 *
239 */
240 public static class AnchorHtmlData extends HtmlData {
241 public static final String TARGET_BLANK = "_blank";
242 protected String href = "";
243 protected String target = "";
244 protected String style = "";
245 protected String styleClass ="";
246 protected String onclick ="";
247
248 /**
249 * Needed by inquiry framework
250 */
251 public AnchorHtmlData() {
252 }
253
254 public AnchorHtmlData(String href, String title) {
255 this.href = href;
256 this.title = title;
257 }
258
259 public AnchorHtmlData(String href, String methodToCall,
260 String displayText) {
261 this.href = href;
262 this.methodToCall = methodToCall;
263 this.displayText = displayText;
264 }
265
266 /**
267 * @param href the href to set
268 */
269 public void setHref(String href) {
270 this.href = href;
271 }
272
273 /**
274 *
275 * This method generates anchor tag.
276 *
277 * @see HtmlData#constructCompleteHtmlTag()
278 */
279 public String constructCompleteHtmlTag() {
280 String completeHtmlTag;
281 if (StringUtils.isEmpty(getHref()))
282 completeHtmlTag = getDisplayText();
283 else
284 completeHtmlTag = getPrependDisplayText()
285 + "<a title=\""
286 + title
287 + "\""
288 + " href=\""
289 + getHref()
290 + "\""
291 + getStyle()
292 + " "
293 + getStyleClass()
294 + " "
295 + (StringUtils.isEmpty(getOnclick()) ? "" : " onClick=\""
296 + getOnclick() + "\" ")
297 + (StringUtils.isEmpty(getTarget()) ? "" : " target=\""
298 + getTarget() + "\" ") + ">" + getDisplayText()
299 + "</a>" + getAppendDisplayText();
300 return completeHtmlTag;
301 }
302
303 /**
304 * @return the target
305 */
306 public String getTarget() {
307 return this.target;
308 }
309
310 /**
311 * @param target
312 * the target to set
313 */
314 public void setTarget(String target) {
315 this.target = target;
316 }
317
318 /**
319 * @return the style
320 */
321 public String getStyle() {
322 return this.style;
323 }
324
325 /**
326 * @param style the style to set
327 */
328 public void setStyle(String style) {
329 this.style = style;
330 }
331
332 /**
333 * @return the styleClass
334 */
335 public String getStyleClass() {
336 return this.styleClass;
337 }
338
339 /**
340 * @param styleClass the styleClass to set
341 */
342 public void setStyleClass(String styleClass) {
343 this.styleClass = styleClass;
344 }
345
346 /**
347 * @return the onclick
348 */
349 public String getOnclick() {
350 return this.onclick;
351 }
352
353 /**
354 * @param onclick the onclick to set
355 */
356 public void setOnclick(String onclick) {
357 this.onclick = onclick;
358 }
359
360 /**
361 * @return the href
362 */
363 public String getHref() {
364 return this.href;
365 }
366
367 /**
368 * @return the methodToCall
369 */
370 public String getMethodToCall() {
371 return this.methodToCall;
372 }
373
374 }
375
376 /**
377 *
378 * This class is an extension of HtmlData. It represents an input tag.
379 *
380 * @author Kuali Rice Team (rice.collab@kuali.org)
381 *
382 */
383 public static class InputHtmlData extends HtmlData {
384 public static final String CHECKBOX_INPUT_TYPE = "checkbox";
385 public static final String CHECKBOX_CHECKED_VALUE = "checked";
386
387 protected String inputType = "";
388 protected String src = "";
389 protected String styleClass = "";
390 protected String border = "0";
391 protected String checked = "";
392 protected String value = "";
393
394 public InputHtmlData(String name, String inputType) {
395 this.name = name;
396 this.inputType = inputType;
397 }
398
399 public InputHtmlData(String name, String inputType, String src) {
400 this.name = name;
401 this.inputType = inputType;
402 this.src = src;
403 }
404
405 /***********************************************************************
406 *
407 * This method contructs an input tag.
408 *
409 * @see HtmlData#constructCompleteHtmlTag()
410 */
411 public String constructCompleteHtmlTag() {
412 return getPrependDisplayText()
413 + "<input title=\""
414 + title
415 + "\""
416 + " name=\""
417 + getName()
418 + "\""
419 + (StringUtils.isEmpty(src) ? ""
420 : " src=\"" + src + "\" ")
421 + " type=\""
422 + getInputType()
423 + "\""
424 + (StringUtils.isEmpty(value) ? ""
425 : " value=\"" + value + "\" ")
426 + (StringUtils.isEmpty(checked) ? ""
427 : " checked=\"" + checked + "\" ")
428 + (StringUtils.isEmpty(getStyleClass()) ? ""
429 : " styleClass=\"" + getStyleClass() + "\" ")
430 + " border=\"" + getBorder() + "\"" + " value=\""
431 + getDisplayText() + "\"" + "/>" + getAppendDisplayText();
432 }
433
434 /**
435 * @return the inputType
436 */
437 public String getInputType() {
438 return this.inputType;
439 }
440
441 /**
442 * @return the src
443 */
444 public String getSrc() {
445 return this.src;
446 }
447
448 /**
449 * @return the border
450 */
451 public String getBorder() {
452 return this.border;
453 }
454
455 /**
456 * @param border
457 * the border to set
458 */
459 public void setBorder(String border) {
460 this.border = border;
461 }
462
463 /**
464 * @return the styleClass
465 */
466 public String getStyleClass() {
467 return this.styleClass;
468 }
469
470 /**
471 * @param styleClass
472 * the styleClass to set
473 */
474 public void setStyleClass(String styleClass) {
475 this.styleClass = styleClass;
476 }
477
478 /**
479 * @param checked the checked to set
480 */
481 public void setChecked(String checked) {
482 this.checked = checked;
483 }
484
485 /**
486 * @param value the value to set
487 */
488 public void setValue(String value) {
489 this.value = value;
490 }
491
492 }
493
494 public static class MultipleAnchorHtmlData extends AnchorHtmlData {
495 protected List<AnchorHtmlData> anchorHtmlData;
496 protected static final String ANCHORS_SEPARATOR = ", ";
497
498 /**
499 * Needed by inquiry framework
500 */
501 public MultipleAnchorHtmlData(List<AnchorHtmlData> anchorHtmlData) {
502 this.anchorHtmlData = anchorHtmlData;
503 }
504
505 /**
506 *
507 * This method generates anchor tag.
508 *
509 * @see HtmlData#constructCompleteHtmlTag()
510 */
511 public String constructCompleteHtmlTag() {
512 StringBuffer completeHtmlTag = new StringBuffer();
513 for(AnchorHtmlData anchor: anchorHtmlData){
514 completeHtmlTag.append(anchor.constructCompleteHtmlTag()+",");
515 }
516 if(completeHtmlTag.toString().endsWith(ANCHORS_SEPARATOR))
517 completeHtmlTag.delete(completeHtmlTag.length()-ANCHORS_SEPARATOR.length(), completeHtmlTag.length());
518 return completeHtmlTag.toString();
519 }
520
521 /**
522 * @return the anchorHtmlData
523 */
524 public List<AnchorHtmlData> getAnchorHtmlData() {
525 return this.anchorHtmlData;
526 }
527
528 }
529
530 /**
531 * @return the maxLength
532 */
533 public int getMaxLength() {
534 try{
535 return Integer.parseInt(this.maxLength);
536 } catch(Exception ex){
537 return -1;
538 }
539 }
540
541 /**
542 * @param maxLength the maxLength to set
543 */
544 public void setMaxLength(String maxLength) {
545 this.maxLength = maxLength;
546 }
547
548 }