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.core.ResourceLoader;
import org.jboss.seam.document.ByteArrayDocumentData;
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
{
log.info("Loading template #0", getURL());
if (getURL().indexOf("://") < 0)
{
reader = new PdfReader(ResourceLoader.instance().getResourceAsStream(getURL()));
}
else
{
reader = new PdfReader(new URL(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 = Pages.getCurrentBaseName();
DocumentStore store = DocumentStore.instance();
DocumentType documentType = new DocumentData.DocumentType("pdf", "application/pdf");
DocumentData documentData = new ByteArrayDocumentData(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);
}
@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;
}
}