/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.taglib.ui;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.PortletApp;
import com.liferay.portal.kernel.model.SpriteImage;
import com.liferay.portal.kernel.model.Theme;
import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.IntegerWrapper;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.taglib.util.IncludeTag;
import com.liferay.taglib.util.TagResourceBundleUtil;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import javax.portlet.PortletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* @author Brian Wing Shun Chan
*/
public class IconTag extends IncludeTag {
@Override
public int doStartTag() {
return EVAL_BODY_INCLUDE;
}
public String getCssClass() {
return _cssClass;
}
public String getIcon() {
return _icon;
}
public void setAlt(String alt) {
_alt = alt;
}
public void setAriaRole(String ariaRole) {
_ariaRole = ariaRole;
}
public void setCssClass(String cssClass) {
_cssClass = cssClass;
}
public void setData(Map<String, Object> data) {
_data = data;
}
public void setIcon(String icon) {
_icon = icon;
}
public void setIconCssClass(String iconCssClass) {
_iconCssClass = iconCssClass;
}
public void setId(String id) {
_id = id;
}
public void setImage(String image) {
_image = image;
}
public void setImageHover(String imageHover) {
_imageHover = imageHover;
}
public void setLabel(boolean label) {
_label = label;
}
public void setLang(String lang) {
_lang = lang;
}
public void setLinkCssClass(String linkCssClass) {
_linkCssClass = linkCssClass;
}
public void setLocalizeMessage(boolean localizeMessage) {
_localizeMessage = localizeMessage;
}
public void setMarkupView(String markupView) {
_markupView = markupView;
}
public void setMessage(String message) {
_message = message;
}
public void setMethod(String method) {
_method = method;
}
public void setOnClick(String onClick) {
_onClick = onClick;
}
public void setSrc(String src) {
_src = src;
}
public void setSrcHover(String srcHover) {
_srcHover = srcHover;
}
public void setTarget(String target) {
_target = target;
}
public void setToolTip(boolean toolTip) {
_toolTip = toolTip;
}
public void setUrl(String url) {
_url = url;
}
public void setUseDialog(boolean useDialog) {
_useDialog = useDialog;
}
@Override
protected void cleanUp() {
_alt = null;
_ariaRole = null;
_cssClass = null;
_data = null;
_icon = null;
_iconCssClass = null;
_id = null;
_image = null;
_imageHover = null;
_label = null;
_lang = null;
_linkCssClass = null;
_localizeMessage = true;
_markupView = null;
_message = null;
_method = null;
_onClick = null;
_src = null;
_srcHover = null;
_target = "_self";
_toolTip = null;
_url = null;
_useDialog = false;
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected Map<String, Object> getData() {
ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle(
pageContext);
return _getData(resourceBundle);
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected String getDetails() {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle(
pageContext);
return _getDetails(themeDisplay, resourceBundle);
}
protected String getId() {
if (Validator.isNotNull(_id)) {
return _id;
}
String id = (String)request.getAttribute("liferay-ui:icon-menu:id");
String message = _message;
if (Validator.isNull(message)) {
message = _image;
}
if (Validator.isNotNull(id) && Validator.isNotNull(message)) {
id = id.concat(StringPool.UNDERLINE).concat(
FriendlyURLNormalizerUtil.normalize(message));
PortletResponse portletResponse =
(PortletResponse)request.getAttribute(
JavaConstants.JAVAX_PORTLET_RESPONSE);
String namespace = StringPool.BLANK;
if (portletResponse != null) {
namespace = portletResponse.getNamespace();
}
id = PortalUtil.getUniqueElementId(
getOriginalServletRequest(), namespace, id);
}
else {
id = PortalUtil.generateRandomKey(request, IconTag.class.getName());
}
id = HtmlUtil.getAUICompatibleId(id);
return id;
}
protected String getImage() {
return _image;
}
protected String getMessage() {
return _message;
}
protected String getMethod() {
if (Validator.isNotNull(_method)) {
return _method;
}
if (_url == null) {
return "post";
}
if (_url.contains("p_p_lifecycle=0")) {
return "get";
}
return "post";
}
protected String getOnClick() {
String onClick = StringPool.BLANK;
if (Validator.isNotNull(_onClick)) {
onClick = _onClick;
if (!onClick.endsWith(StringPool.SEMICOLON)) {
onClick = onClick + StringPool.SEMICOLON;
}
}
if (isForcePost()) {
StringBundler sb = new StringBundler(5);
sb.append("event.preventDefault();");
sb.append(onClick);
sb.append("submitForm(document.hrefFm, '");
sb.append(getUrl());
sb.append("')");
onClick = sb.toString();
}
return onClick;
}
@Override
protected String getPage() {
return "/html/taglib/ui/icon/page.jsp";
}
protected String getProcessedMessage() {
if (_message != null) {
return _message;
}
return StringUtil.replace(
_image, new String[] {StringPool.UNDERLINE, _AUI_PATH},
new String[] {StringPool.DASH, StringPool.BLANK});
}
protected String getProcessedUrl() {
if (isForcePost()) {
return "javascript:;";
}
return _url;
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected String getSrc() {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
return _getSrc(themeDisplay);
}
/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected String getSrcHover() {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
return _getSrcHover(themeDisplay);
}
protected String getUrl() {
return GetterUtil.getString(_url);
}
protected boolean isAUIImage() {
if ((_image != null) && _image.startsWith(_AUI_PATH)) {
return true;
}
return false;
}
@Override
protected boolean isCleanUpSetAttributes() {
return _CLEAN_UP_SET_ATTRIBUTES;
}
protected boolean isForcePost() {
if (StringUtil.equalsIgnoreCase(_target, "_blank")) {
return false;
}
if (_url == null) {
return false;
}
String method = getMethod();
if (method.equals("post") &&
(_url.startsWith(Http.HTTP_WITH_SLASH) ||
_url.startsWith(Http.HTTPS_WITH_SLASH))) {
return true;
}
return false;
}
protected boolean isLabel() {
if (_label != null) {
return _label;
}
IntegerWrapper iconListIconCount = (IntegerWrapper)request.getAttribute(
"liferay-ui:icon-list:icon-count");
if (iconListIconCount != null) {
_label = true;
return true;
}
IntegerWrapper iconMenuIconCount = (IntegerWrapper)request.getAttribute(
"liferay-ui:icon-menu:icon-count");
if (iconMenuIconCount != null) {
_label = true;
return true;
}
Boolean iconListSingleIcon = (Boolean)request.getAttribute(
"liferay-ui:icon-list:single-icon");
if (iconListSingleIcon != null) {
_label = true;
return true;
}
Boolean iconMenuSingleIcon = (Boolean)request.getAttribute(
"liferay-ui:icon-menu:single-icon");
if (iconMenuSingleIcon != null) {
_label = true;
return true;
}
_label = false;
return false;
}
@Override
protected void setAttributes(HttpServletRequest request) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle(
pageContext);
request.setAttribute("liferay-ui:icon:alt", _alt);
request.setAttribute("liferay-ui:icon:ariaRole", _ariaRole);
request.setAttribute(
"liferay-ui:icon:auiImage", String.valueOf(isAUIImage()));
request.setAttribute("liferay-ui:icon:cssClass", _cssClass);
request.setAttribute("liferay-ui:icon:data", _getData(resourceBundle));
request.setAttribute(
"liferay-ui:icon:details",
_getDetails(themeDisplay, resourceBundle));
request.setAttribute(
"liferay-ui:icon:forcePost", String.valueOf(isForcePost()));
request.setAttribute("liferay-ui:icon:icon", _icon);
request.setAttribute("liferay-ui:icon:iconCssClass", _iconCssClass);
request.setAttribute("liferay-ui:icon:id", getId());
request.setAttribute("liferay-ui:icon:image", _image);
request.setAttribute("liferay-ui:icon:imageHover", _imageHover);
request.setAttribute(
"liferay-ui:icon:label", String.valueOf(isLabel()));
request.setAttribute("liferay-ui:icon:lang", _lang);
request.setAttribute("liferay-ui:icon:linkCssClass", _linkCssClass);
request.setAttribute(
"liferay-ui:icon:localizeMessage",
String.valueOf(_localizeMessage));
request.setAttribute("liferay-ui:icon:markupView", _markupView);
request.setAttribute("liferay-ui:icon:message", getProcessedMessage());
request.setAttribute("liferay-ui:icon:method", getMethod());
request.setAttribute("liferay-ui:icon:onClick", getOnClick());
request.setAttribute("liferay-ui:icon:src", _getSrc(themeDisplay));
request.setAttribute(
"liferay-ui:icon:srcHover", _getSrcHover(themeDisplay));
request.setAttribute("liferay-ui:icon:target", _target);
boolean toolTip = false;
if (_toolTip != null) {
toolTip = _toolTip.booleanValue();
}
else if (!isLabel() && Validator.isNotNull(getProcessedMessage())) {
toolTip = true;
}
request.setAttribute(
"liferay-ui:icon:toolTip", String.valueOf(toolTip));
request.setAttribute("liferay-ui:icon:url", getProcessedUrl());
request.setAttribute(
"liferay-ui:icon:useDialog", String.valueOf(_useDialog));
}
private Map<String, Object> _getData(ResourceBundle resourceBundle) {
Map<String, Object> data = null;
if (_data != null) {
data = new HashMap<>(_data);
}
else {
data = new HashMap<>(1);
}
if (_useDialog && Validator.isNull(data.get("title"))) {
String message = getProcessedMessage();
if (_localizeMessage) {
message = LanguageUtil.get(resourceBundle, message);
}
data.put("title", HtmlUtil.stripHtml(message));
}
return data;
}
private String _getDetails(
ThemeDisplay themeDisplay, ResourceBundle resourceBundle) {
String details = null;
if (_alt != null) {
details = " alt=\"" + LanguageUtil.get(resourceBundle, _alt) + "\"";
}
else if (isLabel()) {
details = " alt=\"\"";
}
else {
StringBundler sb = new StringBundler(5);
String localizedProcessedMessage = LanguageUtil.get(
resourceBundle, getProcessedMessage());
sb.append(" alt=\"");
sb.append(localizedProcessedMessage);
sb.append("\" title=\"");
sb.append(localizedProcessedMessage);
sb.append("\"");
details = sb.toString();
}
if (Validator.isNull(_src) || !themeDisplay.isThemeImagesFastLoad() ||
isAUIImage()) {
return details;
}
SpriteImage spriteImage = null;
String spriteFileName = null;
String spriteFileURL = null;
String imageFileName = StringUtil.replace(_src, "common/../", "");
if (imageFileName.contains(Http.PROTOCOL_DELIMITER)) {
String portalURL = PortalUtil.getPortalURL(request);
if (imageFileName.startsWith(portalURL)) {
imageFileName = imageFileName.substring(portalURL.length());
}
else {
URL imageURL = null;
try {
imageURL = new URL(imageFileName);
imageFileName = imageURL.getPath();
}
catch (MalformedURLException murle) {
}
}
}
Theme theme = themeDisplay.getTheme();
String contextPath = theme.getContextPath();
String imagesPath = contextPath.concat(theme.getImagesPath());
if (imageFileName.startsWith(imagesPath)) {
spriteImage = theme.getSpriteImage(imageFileName);
if (spriteImage != null) {
spriteFileName = spriteImage.getSpriteFileName();
if (BrowserSnifferUtil.isIe(request) &&
(BrowserSnifferUtil.getMajorVersion(request) < 7)) {
spriteFileName = StringUtil.replace(
spriteFileName, ".png", ".gif");
}
String cdnBaseURL = themeDisplay.getCDNBaseURL();
spriteFileURL = cdnBaseURL.concat(spriteFileName);
}
}
if (spriteImage == null) {
Portlet portlet = (Portlet)request.getAttribute(
"liferay-portlet:icon_portlet:portlet");
if (portlet == null) {
portlet = (Portlet)request.getAttribute(WebKeys.RENDER_PORTLET);
}
if (portlet != null) {
PortletApp portletApp = portlet.getPortletApp();
spriteImage = portletApp.getSpriteImage(imageFileName);
if (spriteImage != null) {
spriteFileName = spriteImage.getSpriteFileName();
if (BrowserSnifferUtil.isIe(request) &&
(BrowserSnifferUtil.getMajorVersion(request) < 7)) {
spriteFileName = StringUtil.replace(
spriteFileName, ".png", ".gif");
}
String cdnBaseURL = themeDisplay.getCDNBaseURL();
spriteFileURL = cdnBaseURL.concat(spriteFileName);
}
}
}
if (spriteImage != null) {
String themeImagesPath = themeDisplay.getPathThemeImages();
_src = themeImagesPath.concat("/spacer.png");
StringBundler sb = new StringBundler(10);
sb.append(details);
sb.append(" style=\"background-image: url('");
sb.append(spriteFileURL);
sb.append("'); background-position: 50% -");
sb.append(spriteImage.getOffset());
sb.append("px; background-repeat: no-repeat; height: ");
sb.append(spriteImage.getHeight());
sb.append("px; width: ");
sb.append(spriteImage.getWidth());
sb.append("px;\"");
details = sb.toString();
}
return details;
}
private String _getSrc(ThemeDisplay themeDisplay) {
if (Validator.isNotNull(_src)) {
return _src;
}
if (isAUIImage()) {
return themeDisplay.getPathThemeImages().concat("/spacer.png");
}
else if (Validator.isNotNull(_image)) {
StringBundler sb = new StringBundler(4);
sb.append(themeDisplay.getPathThemeImages());
sb.append("/common/");
sb.append(_image);
sb.append(".png");
return StringUtil.replace(sb.toString(), "common/../", "");
}
return StringPool.BLANK;
}
private String _getSrcHover(ThemeDisplay themeDisplay) {
if (Validator.isNotNull(_srcHover) || Validator.isNull(_imageHover)) {
return _srcHover;
}
StringBundler sb = new StringBundler(4);
sb.append(themeDisplay.getPathThemeImages());
sb.append("/common/");
sb.append(_imageHover);
sb.append(".png");
return sb.toString();
}
private static final String _AUI_PATH = "../aui/";
private static final boolean _CLEAN_UP_SET_ATTRIBUTES = true;
private String _alt;
private String _ariaRole;
private String _cssClass;
private Map<String, Object> _data;
private String _icon;
private String _iconCssClass;
private String _id;
private String _image;
private String _imageHover;
private Boolean _label;
private String _lang;
private String _linkCssClass;
private boolean _localizeMessage = true;
private String _markupView;
private String _message;
private String _method;
private String _onClick;
private String _src;
private String _srcHover;
private String _target = "_self";
private Boolean _toolTip;
private String _url;
private boolean _useDialog;
}