/*
* � Copyright IBM Corp. 2010
*
* 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 com.ibm.xsp.extlib.validator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.validator.ValidatorException;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.extlib.component.picker.AbstractPicker;
import com.ibm.xsp.extlib.component.picker.data.IPickerData;
import com.ibm.xsp.extlib.component.picker.data.IPickerEntry;
import com.ibm.xsp.util.FacesUtil;
import com.ibm.xsp.validator.AbstractValidator;
/**
* Validate a value based on a data provider.
* <p>
* The data provider can be assigned to the
* </p>
*/
public class PickerValidator extends AbstractValidator {
private IPickerData dataProvider;
private String _for;
public PickerValidator() {
}
public IPickerData getDataProvider() {
return this.dataProvider;
}
public void setDataProvider(IPickerData dataProvider) {
this.dataProvider = dataProvider;
}
public String getFor() {
if (null != this._for) {
return this._for;
}
ValueBinding _vb = getValueBinding("for"); //$NON-NLS-1$
if (_vb != null) {
return (java.lang.String) _vb.getValue(FacesContext.getCurrentInstance());
} else {
return null;
}
}
public void setFor(String _for) {
this._for = _for;
}
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// An empty value is considered as ok
if(isEmpty(value)) {
return;
}
// Else, look into the list
// No data provider means ok
IPickerData dp = findDataProvider();
if(dp==null) {
return;
}
List<IPickerEntry> val = dp.loadEntries(new Object[]{value}, null);
if(val!=null && val.size() > 0 && val.get(0)!=null) {
return;
}
Severity severity = FacesMessage.SEVERITY_ERROR;
String summary = getInvalidMessage();
addInputInvalidMessage(context, component, severity, summary);
}
protected boolean isEmpty(Object value) {
if (value == null) {
return true;
}
if ((value instanceof String) && StringUtil.isEmpty((String)value)) {
return true;
}
return false;
}
protected IPickerData findDataProvider() {
IPickerData d = getDataProvider();
if(d!=null) {
return d;
}
String control = getFor();
if(StringUtil.isNotEmpty(control)) {
UIComponent c = FacesUtil.getComponentFor(getComponent(), control);
if(c instanceof AbstractPicker) {
return ((AbstractPicker)c).getDataProvider();
}
}
return null;
}
public String getInvalidMessage() {
String msg = getMessage();
if( null == msg ){
msg = "Entered value is not in list."; // $NLS-PickerValidator.Enteredvalueisnotinlist-1$
}
return msg;
}
@Override
public Object saveState(FacesContext context) {
Object values[] = new Object[3];
values[0] = super.saveState(context);
values[1] = FacesUtil.objectToSerializable(context, dataProvider);
values[2] = _for;
return values;
}
@Override
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[])state;
super.restoreState(context, values[0]);
this.dataProvider = (IPickerData) FacesUtil.objectFromSerializable(context, getComponent(), values[1]);
this._for = (String)values[2];
}
}