/*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.myfaces.component.html.ext;
import java.util.Iterator;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.apache.myfaces.component.DisplayValueOnlyCapable;
import org.apache.myfaces.component.UserRoleAware;
import org.apache.myfaces.component.UserRoleUtils;
import org.apache.myfaces.component.html.util.HtmlComponentUtils;
import org.apache.myfaces.util.MessageUtils;
/**
* @author Manfred Geiler (latest modification by $Author: mbr $)
* @version $Revision: 292442 $ $Date: 2005-09-29 10:48:07 -0400 (Thu, 29 Sep 2005) $
*/
public class HtmlSelectOneRadio
extends javax.faces.component.html.HtmlSelectOneRadio
implements UserRoleAware, DisplayValueOnlyCapable
{
public String getClientId(FacesContext context)
{
String clientId = HtmlComponentUtils.getClientId(this, getRenderer(context), context);
if (clientId == null)
{
clientId = super.getClientId(context);
}
return clientId;
}
/**
* Overridden method, as with extended seletOne, value doesn't necessaraly
* have to be contained within select list, for example, when forceId="true" and
* forceIdIndex="false" then component may be used in datatable.
*/
protected void validateValue(FacesContext context, Object value)
{
//Is this radio button used within a datatable (forceId=true and forceIdIndex=false)
Boolean forceId = (Boolean) this.getAttributes().get("forceId");
Boolean forceIdIndex = (Boolean) this.getAttributes().get("forceIdIndex");
boolean dataTable = forceId != null && forceId.booleanValue()
&& !(forceIdIndex != null && forceIdIndex.booleanValue());
if (!dataTable)
{
super.validateValue(context, value);
}
else
{
//Specific behavior for data tables, or other scenarios where forceId is
//true and forceIdIndex is false
//Check if empty
boolean empty = value == null
|| (value instanceof String && ((String) value).length() == 0);
//Check required and empty
if (isRequired() && empty)
{
//Only add this message once, not for every radio button in set
String clientId = this.getClientId(context);
Iterator messages = context.getMessages(clientId);
boolean messageExists = messages.hasNext();
if(!messageExists)
{
//Add message
FacesMessage message = MessageUtils.getMessage(REQUIRED_MESSAGE_ID, new Object[]{clientId});
message.setSeverity(FacesMessage.SEVERITY_WARN);
context.addMessage(clientId, message);
setValid(false);
}
return;
}
//Call validators
if (!empty)
{
callValidators(context, this, value);
}
}
}
private static void callValidators(FacesContext context, UIInput input, Object convertedValue)
{
Validator[] validators = input.getValidators();
for (int i = 0; i < validators.length; i++)
{
Validator validator = validators[i];
try
{
validator.validate(context, input, convertedValue);
}
catch (ValidatorException e)
{
input.setValid(false);
FacesMessage facesMessage = e.getFacesMessage();
if (facesMessage != null)
{
facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(input.getClientId(context), facesMessage);
}
}
}
MethodBinding validatorBinding = input.getValidator();
if (validatorBinding != null)
{
try
{
validatorBinding.invoke(context, new Object[] {context, input, convertedValue});
}
catch (EvaluationException e)
{
input.setValid(false);
Throwable cause = e.getCause();
if (cause instanceof ValidatorException)
{
FacesMessage facesMessage = ((ValidatorException) cause).getFacesMessage();
if (facesMessage != null)
{
facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(input.getClientId(context), facesMessage);
}
}
else
{
throw e;
}
}
}
}
//------------------ GENERATED CODE BEGIN (do not modify!) --------------------
public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlSelectOneRadio";
private static final boolean DEFAULT_DISPLAYVALUEONLY = false;
private String _enabledOnUserRole = null;
private String _visibleOnUserRole = null;
private Boolean _displayValueOnly = null;
private String _displayValueOnlyStyle = null;
private String _displayValueOnlyStyleClass = null;
public HtmlSelectOneRadio()
{
}
public void setEnabledOnUserRole(String enabledOnUserRole)
{
_enabledOnUserRole = enabledOnUserRole;
}
public String getEnabledOnUserRole()
{
if (_enabledOnUserRole != null) return _enabledOnUserRole;
ValueBinding vb = getValueBinding("enabledOnUserRole");
return vb != null ? (String)vb.getValue(getFacesContext()) : null;
}
public void setVisibleOnUserRole(String visibleOnUserRole)
{
_visibleOnUserRole = visibleOnUserRole;
}
public String getVisibleOnUserRole()
{
if (_visibleOnUserRole != null) return _visibleOnUserRole;
ValueBinding vb = getValueBinding("visibleOnUserRole");
return vb != null ? (String)vb.getValue(getFacesContext()) : null;
}
public boolean isSetDisplayValueOnly() {
if (_displayValueOnly != null) return true;
ValueBinding vb = getValueBinding("displayValueOnly");
Boolean v = vb != null ? (Boolean)vb.getValue(getFacesContext()) : null;
return v != null;
}
public boolean isDisplayValueOnly() {
if (_displayValueOnly != null) return _displayValueOnly.booleanValue();
ValueBinding vb = getValueBinding("displayValueOnly");
Boolean v = vb != null ? (Boolean)vb.getValue(getFacesContext()) : null;
return v != null ? v.booleanValue() : DEFAULT_DISPLAYVALUEONLY;
}
public void setDisplayValueOnly(boolean displayValueOnly) {
_displayValueOnly = Boolean.valueOf(displayValueOnly);
}
public String getDisplayValueOnlyStyle() {
if (_displayValueOnlyStyle != null) return _displayValueOnlyStyle;
ValueBinding vb = getValueBinding("displayValueOnlyStyle");
return vb != null ? (String)vb.getValue(getFacesContext()) : null;
}
public void setDisplayValueOnlyStyle(String displayValueOnlyStyle) {
_displayValueOnlyStyle = displayValueOnlyStyle;
}
public String getDisplayValueOnlyStyleClass() {
if (_displayValueOnlyStyleClass != null) return _displayValueOnlyStyleClass;
ValueBinding vb = getValueBinding("displayValueOnlyStyleClass");
return vb != null ? (String)vb.getValue(getFacesContext()) : null;
}
public void setDisplayValueOnlyStyleClass(String displayValueOnlyStyleClass) {
_displayValueOnlyStyleClass = displayValueOnlyStyleClass;
}
public boolean isRendered()
{
if (!UserRoleUtils.isVisibleOnUserRole(this)) return false;
return super.isRendered();
}
public Object saveState(FacesContext context)
{
Object values[] = new Object[6];
values[0] = super.saveState(context);
values[1] = _enabledOnUserRole;
values[2] = _visibleOnUserRole;
values[3] = _displayValueOnly;
values[4] = _displayValueOnlyStyle;
values[5] = _displayValueOnlyStyleClass;
return ((Object) (values));
}
public void restoreState(FacesContext context, Object state)
{
Object values[] = (Object[])state;
super.restoreState(context, values[0]);
_enabledOnUserRole = (String)values[1];
_visibleOnUserRole = (String)values[2];
_displayValueOnly = (Boolean)values[3];
_displayValueOnlyStyle = (String)values[4];
_displayValueOnlyStyleClass = (String)values[5];
}
//------------------ GENERATED CODE END ---------------------------------------
}