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