package railo.runtime.tag; import java.io.IOException; import javax.servlet.jsp.tagext.Tag; import railo.commons.lang.StringUtil; import railo.commons.pdf.PDFPageMark; import railo.runtime.exp.ApplicationException; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.BodyTagImpl; import railo.runtime.op.Caster; public final class DocumentItem extends BodyTagImpl { private static final int TYPE_PAGE_BREAK = 0; private static final int TYPE_HEADER = 1; private static final int TYPE_FOOTER = 2; private static final int TYPE_BOOKMARK = 3; private int type; private String name; private PDFPageMark body; private boolean evalAtPrint; @Override public void release() { super.release(); this.body=null; name=null; } /** * @param type the type to set * @throws ApplicationException */ public void setType(String strType) throws ApplicationException { strType=StringUtil.toLowerCase(strType.trim()); if("pagebreak".equals(strType)) type=TYPE_PAGE_BREAK; else if("header".equals(strType)) type=TYPE_HEADER; else if("footer".equals(strType)) type=TYPE_FOOTER; else if("bookmark".equals(strType)) type=TYPE_BOOKMARK; else throw new ApplicationException("invalid type ["+strType+"], valid types are [pagebreak,header,footer,bookmark]"); //else throw new ApplicationException("invalid type ["+strType+"], valid types are [pagebreak,header,footer]"); } public void setEvalatprint(boolean evalAtPrint){ this.evalAtPrint=evalAtPrint; } @Override public int doStartTag() { return EVAL_BODY_BUFFERED; } @Override public void doInitBody() {} @Override public int doAfterBody() { if(TYPE_HEADER==type || TYPE_FOOTER==type) { body=new PDFPageMark(-1,translate(bodyContent.getString())); } return SKIP_BODY; } private String translate(String html) { html=StringUtil.replace(html.trim(), "{currentsectionpagenumber}", "${page}", false); html=StringUtil.replace(html, "{totalsectionpagecount}", "${total}", false); html=StringUtil.replace(html.trim(), "{currentpagenumber}", "${page}", false); html=StringUtil.replace(html, "{totalpagecount}", "${total}", false); //cfdoc.setEL("currentpagenumber", "{currentpagenumber}"); //cfdoc.setEL("totalpagecount", "{totalpagecount}"); return html; } @Override public int doEndTag() throws PageException { try { _doEndTag(); } catch (Exception e) { throw Caster.toPageException(e); } return EVAL_PAGE; } private void _doEndTag() throws IOException, ApplicationException { if(TYPE_PAGE_BREAK==type) { pageContext.forceWrite("<pd4ml:page.break>"); return; } else if(TYPE_BOOKMARK==type) { if(StringUtil.isEmpty(name)) throw new ApplicationException("attribute [name] is required when type is [bookmark]"); pageContext.forceWrite("<pd4ml:bookmark>"+name+"</pd4ml:bookmark>"); } else if(body!=null) { provideDocumentItem(); } } private void provideDocumentItem() { // get Document Tag Tag parent=getParent(); while(parent!=null && !(parent instanceof Document) && !(parent instanceof DocumentSection)) { parent=parent.getParent(); } if(parent instanceof Document) { Document doc = (Document)parent; if(TYPE_HEADER==type)doc.setHeader(body); else if(TYPE_FOOTER==type)doc.setFooter(body); return ; } else if(parent instanceof DocumentSection) { DocumentSection doc = (DocumentSection)parent; if(TYPE_HEADER==type)doc.setHeader(body); else if(TYPE_FOOTER==type)doc.setFooter(body); return ; } } /** * sets if has body or not * @param hasBody */ public void hasBody(boolean hasBody) { } /** * @param name the name to set */ public void setName(String name) { this.name = name; } }