package ilarkesto.form;
import ilarkesto.base.BeanMap;
import ilarkesto.base.Factory;
import ilarkesto.base.Money;
import ilarkesto.base.Str;
import ilarkesto.base.time.Date;
import ilarkesto.base.time.Time;
import ilarkesto.base.time.TimePeriod;
import ilarkesto.core.logging.Log;
import ilarkesto.email.EmailAddress;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class BeanForm<O> extends Form {
private static final Log LOG = Log.get(BeanForm.class);
private O bean;
private List<FormField> beanFields = new ArrayList<FormField>();
private BeanMap beanMap;
public void setBean(O bean) {
this.bean = bean;
beanMap = new BeanMap(bean);
}
public MultiComplexFormField addMultiComplexProperty(String name, Class<? extends BeanForm> elementFormClass,
Factory itemFactory) {
MultiComplexFormField field = addMultiComplex(name, elementFormClass);
field.setItemFactory(itemFactory);
beanFields.add(field);
Collection value = (Collection) beanMap.get(name);
if (value != null) {
Set<Object> set = new HashSet<Object>(value);
field.setValue(set);
}
return field;
}
public OutputFormField addOutputProperty(String name) {
OutputFormField field = addOutput(name);
Object value = beanMap.get(name);
if (value != null) field.setText(value.toString());
return field;
}
public RadioSelectFormField addRadioSelectProperty(String name, Collection options) {
RadioSelectFormField field = addRadioSelect(name);
beanFields.add(field);
field.setOptions(options);
Object value = beanMap.get(name);
if (value != null) field.setValue(value.toString());
return field;
}
public UploadFormField addUploadProperty(String name) {
UploadFormField field = addUpload(name);
beanFields.add(field);
return field;
}
public FileFormField addFileProperty(String name) {
FileFormField field = addFile(name);
beanFields.add(field);
field.setValue((File) beanMap.get(name));
return field;
}
public MultiItemFormField addMultiItemProperty(String name, Collection selectableItems) {
MultiItemFormField field = addMultiItem(name);
field.setSelectableItems(selectableItems);
beanFields.add(field);
Collection value = (Collection) beanMap.get(name);
if (value != null) {
Set l = new HashSet(value);
field.setValue(l);
}
return field;
}
public ItemFormField addItemProperty(String name, Collection selectableItems) {
ItemFormField field = addItem(name);
field.setSelectableItems(selectableItems);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) {
field.setValue(value);
}
return field;
}
public DropdownFormField addDropdownProperty(String name, Object[] selectableItems) {
Collection items = new ArrayList(selectableItems.length);
for (Object item : selectableItems)
items.add(item);
return addDropdownProperty(name, items);
}
public DropdownFormField addDropdownProperty(String name, Collection selectableItems) {
DropdownFormField field = addDropdown(name);
beanFields.add(field);
field.setSelectableItems(selectableItems);
Object value = beanMap.get(name);
if (value != null) field.setValue(value);
return field;
}
public CheckboxFormField addCheckboxProperty(String name) {
CheckboxFormField field = addCheckbox(name);
beanFields.add(field);
Object value = beanMap.get(name);
field.setChecked((Boolean) value);
return field;
}
public TextFormField addTextProperty(String name) {
TextFormField field = addText(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue(value.toString());
return field;
}
public FloatFormField addFloatProperty(String name) {
FloatFormField field = addFloat(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((Float) value);
return field;
}
public PasswordFormField addPasswordProperty(String name) {
PasswordFormField field = addPassword(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue(value.toString());
return field;
}
public IntegerFormField addIntegerProperty(String name) {
IntegerFormField field = addInteger(name);
beanFields.add(field);
Integer value = (Integer) beanMap.get(name);
if (value != null) field.setValue(value);
return field;
}
public TextareaFormField addTextareaProperty(String name, boolean html) {
TextareaFormField field = addTextarea(name);
field.setHtml(html);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue(value.toString());
return field;
}
public MoneyFormField addMoneyProperty(String name) {
MoneyFormField field = addMoney(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((Money) value);
return field;
}
public EmailAddressFormField addEmailAddressProperty(String name) {
EmailAddressFormField field = addEmailAddress(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((EmailAddress) value);
return field;
}
public DateFormField addDateProperty(String name) {
DateFormField field = addDate(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((Date) value);
return field;
}
public TimeFormField addTimeProperty(String name) {
TimeFormField field = addTime(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((Time) value);
return field;
}
public TimePeriodFormField addTimePeriodProperty(String name) {
TimePeriodFormField field = addTimePeriod(name);
beanFields.add(field);
Object value = beanMap.get(name);
if (value != null) field.setValue((TimePeriod) value);
return field;
}
@Override
public void validate() throws ValidationException {
super.validate();
for (FormField field : beanFields) {
if (field instanceof DateFormField) {
try {
beanMap.put(field.getName(), ((DateFormField) field).getValueAsDate());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof TimeFormField) {
try {
beanMap.put(field.getName(), ((TimeFormField) field).getValueAsTime());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof TimePeriodFormField) {
try {
beanMap.put(field.getName(), ((TimePeriodFormField) field).getValueAsTimePeriod());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof MoneyFormField) {
try {
beanMap.put(field.getName(), ((MoneyFormField) field).getValueAsMoney());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof ItemFormField) {
try {
beanMap.put(field.getName(), ((ItemFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Auswahl ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof MultiItemFormField) {
try {
beanMap.put(field.getName(), ((MultiItemFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Auswahl ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof MultiComplexFormField) {
try {
beanMap.put(field.getName(), ((MultiComplexFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Auswahl ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof UploadFormField) {
File file = ((UploadFormField) field).getValue();
beanMap.put(field.getName(), file);
} else if (field instanceof FileFormField) {
beanMap.put(field.getName(), ((FileFormField) field).getValue());
} else if (field instanceof CheckboxFormField) {
beanMap.put(field.getName(), ((CheckboxFormField) field).isChecked());
} else if (field instanceof MultiCheckboxFormField) {
beanMap.put(field.getName(), ((MultiCheckboxFormField) field).getValue());
} else if (field instanceof RadioSelectFormField) {
try {
beanMap.put(field.getName(), ((RadioSelectFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof IntegerFormField) {
try {
beanMap.put(field.getName(), ((IntegerFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof FloatFormField) {
try {
beanMap.put(field.getName(), ((FloatFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else if (field instanceof DropdownFormField) {
try {
beanMap.put(field.getName(), ((DropdownFormField) field).getValue());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.format(ex));
throw new ValidationException(ERROR_MSG);
}
} else {
try {
beanMap.put(field.getName(), field.getValueAsString());
} catch (Throwable ex) {
LOG.debug(ex);
field.setErrorMessage("Eingabe ung\u00FCltig: " + Str.getRootCauseMessage(ex));
throw new ValidationException(ERROR_MSG);
}
}
}
}
public O getBean() {
return bean;
}
}