/**
* 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.aui;
import com.liferay.portal.kernel.model.ModelHintsUtil;
import com.liferay.portal.kernel.servlet.taglib.aui.ValidatorTag;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.LocalizationUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.TextFormatter;
import com.liferay.portal.kernel.util.Tuple;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.taglib.aui.base.BaseInputTag;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
/**
* @author Julio Camarero
* @author Jorge Ferrer
* @author Brian Wing Shun Chan
*/
public class InputTag extends BaseInputTag {
@Override
public int doEndTag() throws JspException {
updateFormCheckboxNames();
return super.doEndTag();
}
@Override
public int doStartTag() throws JspException {
addModelValidatorTags();
if (getRequired()) {
addRequiredValidatorTag();
}
return super.doStartTag();
}
public String getBaseType() {
Class<?> model = getModel();
String type = getType();
String baseType = null;
if ((model != null) && Validator.isNull(type)) {
baseType = ModelHintsUtil.getType(model.getName(), getField());
}
else if (Validator.isNotNull(type)) {
if (Objects.equals(type, "checkbox") ||
Objects.equals(type, "radio") ||
Objects.equals(type, "resource")) {
baseType = type;
}
else if (Objects.equals(type, "toggle-card") ||
Objects.equals(type, "toggle-switch")) {
baseType = "checkbox";
}
}
if (Validator.isNull(baseType)) {
baseType = "text";
}
return baseType;
}
@Override
public String getField() {
String field = super.getField();
if (Validator.isNull(field)) {
field = getName();
}
return field;
}
@Override
public String getInputName() {
String inputName = getName();
Class<?> model = getModel();
String type = getType();
if ((model != null) && Validator.isNull(type)) {
String fieldParam = getFieldParam();
if (Validator.isNotNull(fieldParam)) {
inputName = fieldParam;
}
}
return inputName;
}
@Override
public Class<?> getModel() {
Class<?> model = super.getModel();
if (model == null) {
model = (Class<?>)pageContext.getAttribute(
"aui:model-context:model");
}
return model;
}
protected void addModelValidatorTags() {
Class<?> model = getModel();
if ((model == null) || Validator.isNotNull(getType())) {
return;
}
List<Tuple> modelValidators = ModelHintsUtil.getValidators(
model.getName(), getField());
if (modelValidators == null) {
return;
}
for (Tuple modelValidator : modelValidators) {
String validatorName = (String)modelValidator.getObject(1);
String validatorErrorMessage = (String)modelValidator.getObject(2);
String validatorValue = (String)modelValidator.getObject(3);
boolean customValidator = (Boolean)modelValidator.getObject(4);
ValidatorTag validatorTag = new ValidatorTagImpl(
validatorName, validatorErrorMessage, validatorValue,
customValidator);
addValidatorTag(validatorName, validatorTag);
}
}
@Override
protected boolean isCleanUpSetAttributes() {
return _CLEAN_UP_SET_ATTRIBUTES;
}
@Override
protected void setAttributes(HttpServletRequest request) {
super.setAttributes(request);
Object bean = getBean();
if (bean == null) {
bean = pageContext.getAttribute("aui:model-context:bean");
}
Class<?> model = getModel();
String defaultLanguageId = getDefaultLanguageId();
if (Validator.isNull(defaultLanguageId)) {
defaultLanguageId = (String)pageContext.getAttribute(
"aui:model-context:defaultLanguageId");
}
if (Validator.isNull(defaultLanguageId)) {
if ((model != null) &&
ModelHintsUtil.hasField(model.getName(), "groupId")) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
defaultLanguageId = LocaleUtil.toLanguageId(
themeDisplay.getSiteDefaultLocale());
}
}
if (Validator.isNull(defaultLanguageId)) {
Locale defaultLocale = LocaleUtil.getDefault();
defaultLanguageId = LocaleUtil.toLanguageId(defaultLocale);
}
String name = getName();
int pos = name.indexOf(StringPool.DOUBLE_DASH);
if (pos != -1) {
name = name.substring(pos + 2, name.length() - 2);
}
String field = getField();
if (Validator.isNull(field)) {
field = getName();
}
String formName = getFormName();
if (formName == null) {
FormTag formTag = (FormTag)findAncestorWithClass(
this, FormTag.class);
if (formTag != null) {
formName = formTag.getName();
}
}
String id = getId();
String type = getType();
if (Validator.isNull(id)) {
String fieldParam = getFieldParam();
if ((model != null) && Validator.isNull(type) &&
Validator.isNotNull(fieldParam)) {
id = AUIUtil.normalizeId(fieldParam);
}
else if (!Objects.equals(type, "assetTags") &&
!Objects.equals(type, "radio")) {
id = AUIUtil.normalizeId(name);
}
else {
id = PortalUtil.getUniqueElementId(
request, StringPool.BLANK, AUIUtil.normalizeId(name));
}
}
String forLabel = id;
if (Objects.equals(type, "assetTags")) {
forLabel = forLabel.concat("assetTagNames");
}
String languageId = getLanguageId();
if (Validator.isNotNull(languageId)) {
forLabel = LocalizationUtil.getLocalizedName(forLabel, languageId);
}
String label = getLabel();
if (label == null) {
label = TextFormatter.format(name, TextFormatter.K);
}
String title = getTitle();
if ((title == null) &&
(Validator.isNull(label) || Objects.equals(type, "image"))) {
title = TextFormatter.format(name, TextFormatter.K);
}
boolean wrappedField = getWrappedField();
FieldWrapperTag fieldWrapper = (FieldWrapperTag)findAncestorWithClass(
this, FieldWrapperTag.class);
if (fieldWrapper != null) {
wrappedField = true;
}
setNamespacedAttribute(request, "baseType", getBaseType());
setNamespacedAttribute(request, "bean", bean);
setNamespacedAttribute(request, "defaultLanguageId", defaultLanguageId);
setNamespacedAttribute(request, "field", field);
setNamespacedAttribute(request, "forLabel", forLabel);
setNamespacedAttribute(request, "formName", formName);
setNamespacedAttribute(request, "id", id);
setNamespacedAttribute(request, "label", label);
setNamespacedAttribute(request, "model", model);
setNamespacedAttribute(request, "title", String.valueOf(title));
setNamespacedAttribute(request, "wrappedField", wrappedField);
request.setAttribute(getAttributeNamespace() + "value", getValue());
Map<String, ValidatorTag> validatorTags = getValidatorTags();
if ((validatorTags != null) &&
(validatorTags.get("required") != null)) {
setNamespacedAttribute(
request, "required", Boolean.TRUE.toString());
}
}
protected void updateFormCheckboxNames() {
if (!Objects.equals(getBaseType(), "checkbox")) {
return;
}
List<String> checkboxNames = (List<String>)request.getAttribute(
"LIFERAY_SHARED_aui:form:checkboxNames");
if (checkboxNames != null) {
String inputName = getInputName();
String languageId = getLanguageId();
if (Validator.isNotNull(languageId)) {
inputName = LocalizationUtil.getLocalizedName(
inputName, languageId);
}
checkboxNames.add(inputName);
}
}
private static final boolean _CLEAN_UP_SET_ATTRIBUTES = true;
}