001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.taglib.ui;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
019    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
020    import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
021    import com.liferay.portal.kernel.util.GetterUtil;
022    import com.liferay.portal.kernel.util.HtmlUtil;
023    import com.liferay.portal.kernel.util.Http;
024    import com.liferay.portal.kernel.util.IntegerWrapper;
025    import com.liferay.portal.kernel.util.JavaConstants;
026    import com.liferay.portal.kernel.util.StringBundler;
027    import com.liferay.portal.kernel.util.StringPool;
028    import com.liferay.portal.kernel.util.StringUtil;
029    import com.liferay.portal.kernel.util.Validator;
030    import com.liferay.portal.kernel.util.WebKeys;
031    import com.liferay.portal.model.Portlet;
032    import com.liferay.portal.model.PortletApp;
033    import com.liferay.portal.model.SpriteImage;
034    import com.liferay.portal.model.Theme;
035    import com.liferay.portal.theme.ThemeDisplay;
036    import com.liferay.portal.util.PortalUtil;
037    import com.liferay.taglib.util.IncludeTag;
038    
039    import java.net.MalformedURLException;
040    import java.net.URL;
041    
042    import java.util.HashMap;
043    import java.util.Map;
044    
045    import javax.portlet.PortletResponse;
046    
047    import javax.servlet.http.HttpServletRequest;
048    
049    /**
050     * @author Brian Wing Shun Chan
051     */
052    public class IconTag extends IncludeTag {
053    
054            @Override
055            public int doStartTag() {
056                    return EVAL_BODY_INCLUDE;
057            }
058    
059            public String getCssClass() {
060                    return _cssClass;
061            }
062    
063            public void setAlt(String alt) {
064                    _alt = alt;
065            }
066    
067            public void setAriaRole(String ariaRole) {
068                    _ariaRole = ariaRole;
069            }
070    
071            public void setCssClass(String cssClass) {
072                    _cssClass = cssClass;
073            }
074    
075            public void setData(Map<String, Object> data) {
076                    _data = data;
077            }
078    
079            public void setIcon(String icon) {
080                    _icon = icon;
081            }
082    
083            public void setIconCssClass(String iconCssClass) {
084                    _iconCssClass = iconCssClass;
085            }
086    
087            public void setId(String id) {
088                    _id = id;
089            }
090    
091            public void setImage(String image) {
092                    _image = image;
093            }
094    
095            public void setImageHover(String imageHover) {
096                    _imageHover = imageHover;
097            }
098    
099            public void setLabel(boolean label) {
100                    _label = label;
101            }
102    
103            public void setLang(String lang) {
104                    _lang = lang;
105            }
106    
107            public void setLinkCssClass(String linkCssClass) {
108                    _linkCssClass = linkCssClass;
109            }
110    
111            public void setLocalizeMessage(boolean localizeMessage) {
112                    _localizeMessage = localizeMessage;
113            }
114    
115            public void setMarkupView(String markupView) {
116                    _markupView = markupView;
117            }
118    
119            public void setMessage(String message) {
120                    _message = message;
121            }
122    
123            public void setMethod(String method) {
124                    _method = method;
125            }
126    
127            public void setOnClick(String onClick) {
128                    _onClick = onClick;
129            }
130    
131            public void setSrc(String src) {
132                    _src = src;
133            }
134    
135            public void setSrcHover(String srcHover) {
136                    _srcHover = srcHover;
137            }
138    
139            public void setTarget(String target) {
140                    _target = target;
141            }
142    
143            public void setToolTip(boolean toolTip) {
144                    _toolTip = toolTip;
145            }
146    
147            public void setUrl(String url) {
148                    _url = url;
149            }
150    
151            public void setUseDialog(boolean useDialog) {
152                    _useDialog = useDialog;
153            }
154    
155            @Override
156            protected void cleanUp() {
157                    _alt = null;
158                    _ariaRole = null;
159                    _cssClass = null;
160                    _data = null;
161                    _icon = null;
162                    _iconCssClass = null;
163                    _id = null;
164                    _image = null;
165                    _imageHover = null;
166                    _label = null;
167                    _lang = null;
168                    _linkCssClass = null;
169                    _localizeMessage = true;
170                    _markupView = null;
171                    _message = null;
172                    _method = null;
173                    _onClick = null;
174                    _src = null;
175                    _srcHover = null;
176                    _target = null;
177                    _toolTip = false;
178                    _url = null;
179                    _useDialog = false;
180            }
181    
182            protected Map<String, Object> getData() {
183                    Map<String, Object> data = null;
184    
185                    if (_data != null) {
186                            data = new HashMap<>(_data);
187                    }
188                    else {
189                            data = new HashMap<>(1);
190                    }
191    
192                    if (_useDialog && Validator.isNull(data.get("title"))) {
193                            String message = getProcessedMessage();
194    
195                            if (_localizeMessage) {
196                                    message = LanguageUtil.get(request, message);
197                            }
198    
199                            data.put("title", HtmlUtil.stripHtml(message));
200                    }
201    
202                    return data;
203            }
204    
205            protected String getDetails() {
206                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
207                            WebKeys.THEME_DISPLAY);
208    
209                    String details = null;
210    
211                    if (_alt != null) {
212                            details = " alt=\"" + LanguageUtil.get(request, _alt) + "\"";
213                    }
214                    else if (isLabel()) {
215                            details = " alt=\"\"";
216                    }
217                    else {
218                            StringBundler sb = new StringBundler(6);
219    
220                            sb.append(" alt=\"");
221                            sb.append(LanguageUtil.get(request, getProcessedMessage()));
222                            sb.append("\"");
223    
224                            if (_toolTip) {
225                                    sb.append(" onmouseover=\"Liferay.Portal.ToolTip.show(this, '");
226                                    sb.append(
227                                            UnicodeLanguageUtil.get(request, getProcessedMessage()));
228                                    sb.append("')\"");
229                            }
230                            else {
231                                    sb.append(" title=\"");
232                                    sb.append(LanguageUtil.get(request, getProcessedMessage()));
233                                    sb.append("\"");
234                            }
235    
236                            details = sb.toString();
237                    }
238    
239                    if (Validator.isNull(_src) || !themeDisplay.isThemeImagesFastLoad() ||
240                            isAUIImage()) {
241    
242                            return details;
243                    }
244    
245                    SpriteImage spriteImage = null;
246                    String spriteFileName = null;
247                    String spriteFileURL = null;
248    
249                    String imageFileName = StringUtil.replace(_src, "common/../", "");
250    
251                    if (imageFileName.contains(Http.PROTOCOL_DELIMITER)) {
252                            String portalURL = PortalUtil.getPortalURL(request);
253    
254                            if (imageFileName.startsWith(portalURL)) {
255                                    imageFileName = imageFileName.substring(portalURL.length());
256                            }
257                            else {
258                                    URL imageURL = null;
259    
260                                    try {
261                                            imageURL = new URL(imageFileName);
262    
263                                            imageFileName = imageURL.getPath();
264                                    }
265                                    catch (MalformedURLException e) {
266                                    }
267                            }
268                    }
269    
270                    Theme theme = themeDisplay.getTheme();
271    
272                    String contextPath = theme.getContextPath();
273    
274                    String imagesPath = contextPath.concat(theme.getImagesPath());
275    
276                    if (imageFileName.startsWith(imagesPath)) {
277                            spriteImage = theme.getSpriteImage(imageFileName);
278    
279                            if (spriteImage != null) {
280                                    spriteFileName = spriteImage.getSpriteFileName();
281    
282                                    if (BrowserSnifferUtil.isIe(request) &&
283                                            (BrowserSnifferUtil.getMajorVersion(request) < 7)) {
284    
285                                            spriteFileName = StringUtil.replace(
286                                                    spriteFileName, ".png", ".gif");
287                                    }
288    
289                                    String cdnBaseURL = themeDisplay.getCDNBaseURL();
290    
291                                    spriteFileURL = cdnBaseURL.concat(spriteFileName);
292                            }
293                    }
294    
295                    if (spriteImage == null) {
296                            Portlet portlet = (Portlet)request.getAttribute(
297                                    "liferay-portlet:icon_portlet:portlet");
298    
299                            if (portlet == null) {
300                                    portlet = (Portlet)request.getAttribute(WebKeys.RENDER_PORTLET);
301                            }
302    
303                            if (portlet != null) {
304                                    PortletApp portletApp = portlet.getPortletApp();
305    
306                                    spriteImage = portletApp.getSpriteImage(imageFileName);
307    
308                                    if (spriteImage != null) {
309                                            spriteFileName = spriteImage.getSpriteFileName();
310    
311                                            if (BrowserSnifferUtil.isIe(request) &&
312                                                    (BrowserSnifferUtil.getMajorVersion(request) < 7)) {
313    
314                                                    spriteFileName = StringUtil.replace(
315                                                            spriteFileName, ".png", ".gif");
316                                            }
317    
318                                            String cdnBaseURL = themeDisplay.getCDNBaseURL();
319    
320                                            spriteFileURL = cdnBaseURL.concat(spriteFileName);
321                                    }
322                            }
323                    }
324    
325                    if (spriteImage != null) {
326                            String themeImagesPath = themeDisplay.getPathThemeImages();
327    
328                            _src = themeImagesPath.concat("/spacer.png");
329    
330                            StringBundler sb = new StringBundler(10);
331    
332                            sb.append(details);
333                            sb.append(" style=\"background-image: url('");
334                            sb.append(spriteFileURL);
335                            sb.append("'); background-position: 50% -");
336                            sb.append(spriteImage.getOffset());
337                            sb.append("px; background-repeat: no-repeat; height: ");
338                            sb.append(spriteImage.getHeight());
339                            sb.append("px; width: ");
340                            sb.append(spriteImage.getWidth());
341                            sb.append("px;\"");
342    
343                            details = sb.toString();
344                    }
345    
346                    return details;
347            }
348    
349            protected String getId() {
350                    if (Validator.isNotNull(_id)) {
351                            return _id;
352                    }
353    
354                    String id = (String)request.getAttribute("liferay-ui:icon-menu:id");
355    
356                    String message = _message;
357    
358                    if (Validator.isNull(message)) {
359                            message = _image;
360                    }
361    
362                    if (Validator.isNotNull(id) && Validator.isNotNull(message)) {
363                            id = id.concat(StringPool.UNDERLINE).concat(
364                                    FriendlyURLNormalizerUtil.normalize(message));
365    
366                            PortletResponse portletResponse =
367                                    (PortletResponse)request.getAttribute(
368                                            JavaConstants.JAVAX_PORTLET_RESPONSE);
369    
370                            String namespace = StringPool.BLANK;
371    
372                            if (portletResponse != null) {
373                                    namespace = portletResponse.getNamespace();
374                            }
375    
376                            id = PortalUtil.getUniqueElementId(
377                                    getOriginalServletRequest(), namespace, id);
378                    }
379                    else {
380                            id = PortalUtil.generateRandomKey(request, IconTag.class.getName());
381                    }
382    
383                    return id;
384            }
385    
386            protected String getImage() {
387                    return _image;
388            }
389    
390            protected String getMessage() {
391                    return _message;
392            }
393    
394            protected String getMethod() {
395                    if (Validator.isNotNull(_method)) {
396                            return _method;
397                    }
398    
399                    String url = getUrl();
400    
401                    if (url.contains("p_p_lifecycle=0")) {
402                            return "get";
403                    }
404    
405                    return "post";
406            }
407    
408            protected String getOnClick() {
409                    String onClick = StringPool.BLANK;
410    
411                    if (Validator.isNotNull(_onClick)) {
412                            onClick = _onClick;
413    
414                            if (!onClick.endsWith(StringPool.SEMICOLON)) {
415                                    onClick = onClick + StringPool.SEMICOLON;
416                            }
417                    }
418    
419                    if (isForcePost()) {
420                            StringBundler sb = new StringBundler(8);
421    
422                            sb.append("event.preventDefault();");
423                            sb.append(onClick);
424                            sb.append("submitForm(document.hrefFm, '");
425                            sb.append(getUrl());
426                            sb.append("')");
427    
428                            onClick = sb.toString();
429                    }
430    
431                    return onClick;
432            }
433    
434            @Override
435            protected String getPage() {
436                    return "/html/taglib/ui/icon/page.jsp";
437            }
438    
439            protected String getProcessedMessage() {
440                    if (_message != null) {
441                            return _message;
442                    }
443    
444                    return StringUtil.replace(
445                            _image, new String[] {StringPool.UNDERLINE, _AUI_PATH},
446                            new String[] {StringPool.DASH, StringPool.BLANK});
447            }
448    
449            protected String getProcessedUrl() {
450                    if (isForcePost()) {
451                            return "javascript:;";
452                    }
453    
454                    return _url;
455            }
456    
457            protected String getSrc() {
458                    if (Validator.isNotNull(_src)) {
459                            return _src;
460                    }
461    
462                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
463                            WebKeys.THEME_DISPLAY);
464    
465                    if (isAUIImage()) {
466                            return themeDisplay.getPathThemeImages().concat("/spacer.png");
467                    }
468                    else if (Validator.isNotNull(_image)) {
469                            StringBundler sb = new StringBundler(4);
470    
471                            sb.append(themeDisplay.getPathThemeImages());
472                            sb.append("/common/");
473                            sb.append(_image);
474                            sb.append(".png");
475    
476                            return StringUtil.replace(sb.toString(), "common/../", "");
477                    }
478    
479                    return StringPool.BLANK;
480            }
481    
482            protected String getSrcHover() {
483                    if (Validator.isNotNull(_srcHover) || Validator.isNull(_imageHover)) {
484                            return _srcHover;
485                    }
486    
487                    StringBundler sb = new StringBundler(4);
488    
489                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
490                            WebKeys.THEME_DISPLAY);
491    
492                    sb.append(themeDisplay.getPathThemeImages());
493    
494                    sb.append("/common/");
495                    sb.append(_imageHover);
496                    sb.append(".png");
497    
498                    return sb.toString();
499            }
500    
501            protected String getUrl() {
502                    return GetterUtil.getString(_url);
503            }
504    
505            protected boolean isAUIImage() {
506                    if ((_image != null) && _image.startsWith(_AUI_PATH)) {
507                            return true;
508                    }
509    
510                    return false;
511            }
512    
513            @Override
514            protected boolean isCleanUpSetAttributes() {
515                    return _CLEAN_UP_SET_ATTRIBUTES;
516            }
517    
518            protected boolean isForcePost() {
519                    String method = getMethod();
520    
521                    if (method.equals("post")) {
522                            String url = getUrl();
523    
524                            if (url.startsWith(Http.HTTP_WITH_SLASH) ||
525                                    url.startsWith(Http.HTTPS_WITH_SLASH)) {
526    
527                                    return true;
528                            }
529                    }
530    
531                    return false;
532            }
533    
534            protected boolean isLabel() {
535                    if (_label != null) {
536                            return _label;
537                    }
538    
539                    IntegerWrapper iconListIconCount = (IntegerWrapper)request.getAttribute(
540                            "liferay-ui:icon-list:icon-count");
541    
542                    Boolean iconListSingleIcon = (Boolean)request.getAttribute(
543                            "liferay-ui:icon-list:single-icon");
544    
545                    if ((iconListIconCount != null) || (iconListSingleIcon != null)) {
546                            _label = true;
547    
548                            return _label;
549                    }
550    
551                    IntegerWrapper iconMenuIconCount = (IntegerWrapper)request.getAttribute(
552                            "liferay-ui:icon-menu:icon-count");
553    
554                    Boolean iconMenuSingleIcon = (Boolean)request.getAttribute(
555                            "liferay-ui:icon-menu:single-icon");
556    
557                    if ((iconMenuIconCount != null) || (iconMenuSingleIcon != null)) {
558                            _label = true;
559    
560                            return _label;
561                    }
562    
563                    _label = false;
564    
565                    return _label;
566            }
567    
568            @Override
569            protected void setAttributes(HttpServletRequest request) {
570                    request.setAttribute("liferay-ui:icon:alt", _alt);
571                    request.setAttribute("liferay-ui:icon:ariaRole", _ariaRole);
572                    request.setAttribute(
573                            "liferay-ui:icon:auiImage", String.valueOf(isAUIImage()));
574                    request.setAttribute("liferay-ui:icon:cssClass", _cssClass);
575                    request.setAttribute("liferay-ui:icon:data", getData());
576                    request.setAttribute("liferay-ui:icon:details", getDetails());
577                    request.setAttribute("liferay-ui:icon:icon", _icon);
578                    request.setAttribute("liferay-ui:icon:iconCssClass", _iconCssClass);
579                    request.setAttribute("liferay-ui:icon:id", getId());
580                    request.setAttribute("liferay-ui:icon:image", _image);
581                    request.setAttribute("liferay-ui:icon:imageHover", _imageHover);
582                    request.setAttribute(
583                            "liferay-ui:icon:forcePost", String.valueOf(isForcePost()));
584                    request.setAttribute(
585                            "liferay-ui:icon:label", String.valueOf(isLabel()));
586                    request.setAttribute("liferay-ui:icon:lang", _lang);
587                    request.setAttribute("liferay-ui:icon:linkCssClass", _linkCssClass);
588                    request.setAttribute(
589                            "liferay-ui:icon:localizeMessage",
590                            String.valueOf(_localizeMessage));
591                    request.setAttribute("liferay-ui:icon:markupView", _markupView);
592                    request.setAttribute("liferay-ui:icon:message", getProcessedMessage());
593                    request.setAttribute("liferay-ui:icon:method", getMethod());
594                    request.setAttribute("liferay-ui:icon:onClick", getOnClick());
595                    request.setAttribute("liferay-ui:icon:src", getSrc());
596                    request.setAttribute("liferay-ui:icon:srcHover", getSrcHover());
597                    request.setAttribute("liferay-ui:icon:target", _target);
598                    request.setAttribute(
599                            "liferay-ui:icon:toolTip", String.valueOf(_toolTip));
600                    request.setAttribute("liferay-ui:icon:url", getProcessedUrl());
601                    request.setAttribute(
602                            "liferay-ui:icon:useDialog", String.valueOf(_useDialog));
603            }
604    
605            private static final String _AUI_PATH = "../aui/";
606    
607            private static final boolean _CLEAN_UP_SET_ATTRIBUTES = true;
608    
609            private String _alt;
610            private String _ariaRole;
611            private String _cssClass;
612            private Map<String, Object> _data;
613            private String _icon;
614            private String _iconCssClass;
615            private String _id;
616            private String _image;
617            private String _imageHover;
618            private Boolean _label;
619            private String _lang;
620            private String _linkCssClass;
621            private boolean _localizeMessage = true;
622            private String _markupView;
623            private String _message;
624            private String _method;
625            private String _onClick;
626            private String _src;
627            private String _srcHover;
628            private String _target = "_self";
629            private boolean _toolTip;
630            private String _url;
631            private boolean _useDialog = false;
632    
633    }