001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kns.lookup;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.core.api.config.property.ConfigContext;
020import org.kuali.rice.core.web.format.DateFormatter;
021import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions;
022import org.kuali.rice.kns.document.authorization.FieldRestriction;
023import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
024import org.kuali.rice.kns.service.KNSServiceLocator;
025import org.kuali.rice.kns.util.KNSConstants;
026import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
027import org.kuali.rice.krad.util.KRADConstants;
028import org.kuali.rice.krad.util.ObjectUtils;
029
030import java.io.Serializable;
031import java.sql.Date;
032import java.util.HashMap;
033import java.util.Iterator;
034import java.util.List;
035import 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
044public 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}