package org.jboss.seam.pdf.ui; import java.io.IOException; import java.util.Iterator; import java.util.Map; import javax.faces.FacesException; import javax.faces.context.FacesContext; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.Interpolator; import org.jboss.seam.log.Log; import org.jboss.seam.log.Logging; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.AcroFields; import com.lowagie.text.pdf.PdfStamper; public class UIField extends FormComponent { public static final String COMPONENT_FAMILY = "org.jboss.seam.pdf.UIField"; private static Log log = Logging.getLog(FormComponent.class); private String name; private Object value; private Boolean readOnly = Boolean.TRUE; @Override public void encodeBegin(FacesContext facesContext) throws IOException { AcroFields fields = (AcroFields) Contexts.getEventContext().get(FIELDS_KEY); String theName = getName(); Object theValue = getValue(); if (theValue == null) { return; } Boolean readOnly = getReadOnly(); try { log.debug("Setting field '#0' to value '#1'", theName, theValue); boolean success = false; if (theValue instanceof String) { success = fields.setField(theName, (String) theValue); } else if (theValue instanceof String[]){ String[] stringValue = (String[])theValue; if (stringValue.length>0) { success = fields.setField(theName, stringValue[0]); } else { success = true; } } else { String message = Interpolator.instance().interpolate("Field #0 expected String or String[] but got #0", getName(), theValue.getClass().getName()); throw new IllegalArgumentException(message); } if (!success) { warnNotFound(fields, theName, theValue); } else { if (readOnly.booleanValue()) { PdfStamper stamper = (PdfStamper) Contexts.getEventContext().get(STAMPER_KEY); stamper.partialFormFlattening(theName); } } } catch (DocumentException e) { String message = Interpolator.instance().interpolate("Could not set field '#0' to '#1'", theName, theValue); throw new FacesException(message, e); } } private void warnNotFound(AcroFields fields, String theName, Object theValue) { log.warn("Could not set field '#0' to '#1'", theName, theValue); Map fieldMap = fields.getFields(); if (!fieldMap.containsKey(theName)) { log.warn("Could not find field '#0'. Found fields are", theName); for (Iterator i = fieldMap.keySet().iterator(); i.hasNext();) { log.warn(i.next()); } return; } String[] options = fields.getListOptionExport(theName); String[] values = fields.getListOptionDisplay(theName); log.warn("Valid values for #0 are", theName); for (int i = 0; i < options.length; i++) { log.warn("'#0' : '#1'", options[i], values[i]); } } @Override public String getFamily() { return COMPONENT_FAMILY; } public String getName() { return (String) valueOf("name", name); } public void setName(String name) { this.name = name; } public Object getValue() { return valueOf("value", value); } public void setValue(Object value) { this.value = value; } public Boolean getReadOnly() { return (Boolean) valueOf("readOnly", readOnly); } public void setReadOnly(Boolean readOnly) { this.readOnly = readOnly; } }