package org.jboss.seam.pdf.ui;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Manager;
import org.jboss.seam.document.DocumentData;
import org.jboss.seam.document.DocumentStore;
import org.jboss.seam.document.DocumentData.DocumentType;
import org.jboss.seam.log.Log;
import org.jboss.seam.log.Logging;
import org.jboss.seam.navigation.Pages;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
public class UIForm extends FormComponent {
public static final String COMPONENT_FAMILY = "org.jboss.seam.pdf.UIForm";
private Log log = Logging.getLog(getClass());
private String URL;
private String filename;
private String exportKey;
PdfReader reader;
PdfStamper stamper;
AcroFields fields;
ByteArrayOutputStream buffer;
public String getURL() {
return (String) valueOf("URL", URL);
}
public void setURL(String url) {
URL = url;
}
@Override
public void encodeBegin(FacesContext facesContext) throws IOException {
if (getURL().indexOf("://") < 0) {
reader = new PdfReader(getClass().getClassLoader()
.getResourceAsStream(getURL()));
} else {
reader = new PdfReader(new URL(getURL()));
}
log.debug("Loading template #0", getURL());
buffer = new ByteArrayOutputStream();
try {
stamper = new PdfStamper(reader, buffer);
Contexts.getEventContext().set(STAMPER_KEY, stamper);
} catch (DocumentException e) {
throw new FacesException("Could not create PDF stamper", e);
}
fields = stamper.getAcroFields();
Contexts.getEventContext().set(FIELDS_KEY, fields);
}
@Override
public void encodeEnd(FacesContext facesContext) throws IOException {
stamper.setFormFlattening(true);
try {
stamper.close();
} catch (DocumentException e) {
throw new FacesException("Could not flush PDF", e);
}
if (getExportKey() == null) {
UIComponent parent = getParent();
if (parent != null && (parent instanceof ValueHolder)) {
log.debug("Storing PDF data in ValueHolder parent");
ValueHolder valueHolder = (ValueHolder) parent;
valueHolder.setValue(buffer.toByteArray());
return;
}
}
String viewId = Pages.getViewId(facesContext);
String baseName = baseNameForViewId(viewId);
DocumentStore store = DocumentStore.instance();
DocumentType documentType = new DocumentData.DocumentType("pdf",
"application/pdf");
DocumentData documentData = new DocumentData(baseName, documentType,
buffer.toByteArray());
documentData.setFilename(getFilename());
if (getExportKey() != null) {
log.debug("Exporting PDF data to event key #0", getExportKey());
Contexts.getEventContext().set(getExportKey(), documentData);
return;
}
String id = store.newId();
String url = store.preferredUrlForContent(baseName, documentType
.getExtension(), id);
url = Manager.instance().encodeConversationId(url, viewId);
store.saveData(id, documentData);
log.debug("Redirecting to #0 for PDF view", url);
facesContext.getExternalContext().redirect(url);
}
public static String baseNameForViewId(String viewId) {
int pos = viewId.lastIndexOf("/");
if (pos != -1) {
viewId = viewId.substring(pos + 1);
}
pos = viewId.lastIndexOf(".");
if (pos != -1) {
viewId = viewId.substring(0, pos);
}
return viewId;
}
@Override
public String getFamily() {
return COMPONENT_FAMILY;
}
public String getFilename() {
return (String) valueOf("filename", filename);
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getExportKey() {
return (String) valueOf("exportKey", exportKey);
}
public void setExportKey(String exportKey) {
this.exportKey = exportKey;
}
}