in tobago-core/src/main/java/org/apache/myfaces/tobago/facelets/AttributeHandler.java [78:277]
public void apply(final FaceletContext faceletContext, final UIComponent parent) throws ELException {
if (parent == null) {
throw new TagException(tag, "Parent UIComponent was null");
}
if (ComponentHandler.isNew(parent)) {
if (mode != null) {
if ("isNotSet".equals(mode.getValue())) {
boolean result = false;
String expressionString = value.getValue();
if (!value.isLiteral()) {
while (isSimpleExpression(expressionString)) {
if (isMethodOrValueExpression(expressionString)) {
final ValueExpression expression
= faceletContext.getVariableMapper().resolveVariable(removeElParenthesis(expressionString));
if (expression == null) {
result = true;
break;
} else {
expressionString = expression.getExpressionString();
}
} else {
result = false;
break;
}
}
} else {
result = StringUtils.isEmpty(expressionString);
}
parent.getAttributes().put(name.getValue(), result);
} else if ("isSet".equals(mode.getValue())) {
boolean result = true;
String expressionString = value.getValue();
if (!value.isLiteral()) {
while (isSimpleExpression(expressionString)) {
if (isMethodOrValueExpression(expressionString)) {
final ValueExpression expression
= faceletContext.getVariableMapper().resolveVariable(removeElParenthesis(expressionString));
if (expression == null) {
result = false;
break;
} else {
expressionString = expression.getExpressionString();
}
} else {
result = true;
break;
}
}
} else {
result = StringUtils.isNotEmpty(expressionString);
}
parent.getAttributes().put(name.getValue(), result);
} else if ("action".equals(mode.getValue())) {
String expressionString = value.getValue();
while (isSimpleExpression(expressionString)) {
if (isMethodOrValueExpression(expressionString)) {
final ValueExpression expression
= faceletContext.getVariableMapper().resolveVariable(removeElParenthesis(expressionString));
if (expression == null) {
// when the action hasn't been set while using a composition.
if (LOG.isDebugEnabled()) {
LOG.debug("Variable can't be resolved: value='" + expressionString + "'");
}
expressionString = null;
break;
} else {
expressionString = expression.getExpressionString();
}
} else {
break;
}
}
if (expressionString != null) {
final ExpressionFactory expressionFactory = faceletContext.getExpressionFactory();
final MethodExpression action = new TagMethodExpression(value, expressionFactory.createMethodExpression(
faceletContext, expressionString, String.class, ComponentUtils.ACTION_ARGS));
((ActionSource2) parent).setActionExpression(action);
}
} else if ("actionListener".equals(mode.getValue())) {
String expressionString = value.getValue();
while (isSimpleExpression(expressionString)) {
if (isMethodOrValueExpression(expressionString)) {
final ValueExpression expression
= faceletContext.getVariableMapper().resolveVariable(removeElParenthesis(expressionString));
if (expression == null) {
if (LOG.isDebugEnabled()) {
// when the action hasn't been set while using a composition.
LOG.debug("Variable can't be resolved: value='" + expressionString + "'");
}
expressionString = null;
break;
} else {
expressionString = expression.getExpressionString();
}
} else {
LOG.warn("Only expressions are supported mode=actionListener value='" + expressionString + "'");
expressionString = null;
break;
}
}
if (expressionString != null) {
final ExpressionFactory expressionFactory = faceletContext.getExpressionFactory();
final MethodExpression actionListener
= new TagMethodExpression(value, expressionFactory.createMethodExpression(
faceletContext, expressionString, null, ComponentUtils.ACTION_LISTENER_ARGS));
((ActionSource) parent).addActionListener(new MethodExpressionActionListener(actionListener));
}
} else if ("actionFromValue".equals(mode.getValue())) {
if (!value.isLiteral()) {
final String result = value.getValue(faceletContext);
parent.getAttributes().put(name.getValue(), new ConstantMethodExpression(result));
}
} else if ("valueIfSet".equals(mode.getValue())) {
String expressionString = value.getValue();
String lastExpressionString = null;
while (isMethodOrValueExpression(expressionString) && isSimpleExpression(expressionString)) {
final ValueExpression expression
= faceletContext.getVariableMapper().resolveVariable(removeElParenthesis(expressionString));
if (expression != null) {
lastExpressionString = expressionString;
expressionString = expression.getExpressionString();
} else {
// restore last value
expressionString = lastExpressionString;
break;
}
}
if (expressionString != null) {
final String attributeName = name.getValue(faceletContext);
if (containsMethodOrValueExpression(expressionString)) {
final ValueExpression expression = value.getValueExpression(faceletContext, Object.class);
parent.setValueExpression(attributeName, expression);
} else {
final Object literalValue = getValue(faceletContext, parent, expressionString, attributeName);
parent.getAttributes().put(attributeName, literalValue);
}
}
} else {
throw new FacesException("Type " + mode + " not supported");
}
} else {
final Attributes nameValue = Attributes.valueOfFailsafe(name.getValue(faceletContext));
if (Attributes.rendered == nameValue) {
if (value.isLiteral()) {
parent.setRendered(value.getBoolean(faceletContext));
} else {
parent.setValueExpression(nameValue.getName(), value.getValueExpression(faceletContext, Boolean.class));
}
} else if (Attributes.markup == nameValue) {
if (parent instanceof Visual) {
if (value.isLiteral()) {
((Visual) parent).setMarkup(Markup.valueOf(value.getValue()));
} else {
final ValueExpression expression = value.getValueExpression(faceletContext, Object.class);
parent.setValueExpression(nameValue.getName(), expression);
}
} else {
LOG.error("Component is not instanceof Visual. Instance is: " + parent.getClass().getName());
}
} else if (parent instanceof EditableValueHolder && Attributes.validator == nameValue) {
final MethodExpression methodExpression
= getMethodExpression(faceletContext, null, ComponentUtils.VALIDATOR_ARGS);
if (methodExpression != null) {
((EditableValueHolder) parent).addValidator(new MethodExpressionValidator(methodExpression));
}
} else if (parent instanceof EditableValueHolder && Attributes.valueChangeListener == nameValue) {
final MethodExpression methodExpression =
getMethodExpression(faceletContext, null, ComponentUtils.VALUE_CHANGE_LISTENER_ARGS);
if (methodExpression != null) {
((EditableValueHolder) parent).addValueChangeListener(
new MethodExpressionValueChangeListener(methodExpression));
}
} else if (parent instanceof ValueHolder && Attributes.converter == nameValue) {
setConverter(faceletContext, parent, nameValue.getName());
} else if (parent instanceof ActionSource && Attributes.action.equals(nameValue)) {
final MethodExpression action = getMethodExpression(faceletContext, String.class, ComponentUtils.ACTION_ARGS);
if (action != null) {
((ActionSource2) parent).setActionExpression(action);
}
} else if (parent instanceof ActionSource && Attributes.actionListener == nameValue) {
final MethodExpression action
= getMethodExpression(faceletContext, null, ComponentUtils.ACTION_LISTENER_ARGS);
if (action != null) {
((ActionSource) parent).addActionListener(new MethodExpressionActionListener(action));
}
} else if (nameValue != null && !parent.getAttributes().containsKey(nameValue.getName())) {
if (value.isLiteral()) {
parent.getAttributes().put(nameValue.getName(), value.getValue());
} else {
parent.setValueExpression(nameValue.getName(), value.getValueExpression(faceletContext, Object.class));
}
} else if (nameValue == null) {
LOG.warn("Null value for {}", name);
}
}
}
}