package railo.runtime.tag;
import java.io.IOException;
import javax.servlet.jsp.tagext.Tag;
import org.apache.commons.mail.EmailAttachment;
import railo.commons.io.IOUtil;
import railo.commons.io.SystemUtil;
import railo.commons.io.res.Resource;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.TagImpl;
import railo.runtime.op.Caster;
import railo.runtime.type.util.ListUtil;
/**
* Can either attach a file or add a header to a message. It is nested within a cfmail tag. You can
* use more than one cfmailparam tag within a cfmail tag.
*
*
*
**/
public final class MailParam extends TagImpl {
/** Indicates the value of the header. */
private String value="";
/** Attaches the specified file to the message. This attribute is mutually exclusive with the
** name attribute. */
private String file;
/** Specifies the name of the header. Header names are case insensitive. This attribute is mutually
** exclusive with the file attribute. */
private String name;
private String type="";
private String disposition=null;
private String contentID=null;
private Boolean remove=false;
private byte[] content=null;
@Override
public void release() {
super.release();
value="";
file=null;
name=null;
type="";
disposition=null;
contentID=null;
remove=null;
content=null;
}
/**
* @param remove the remove to set
*/
public void setRemove(boolean remove) {
this.remove = Caster.toBoolean(remove);
}
/**
* @param content the content to set
* @throws ExpressionException
*/
public void setContent(Object content) throws PageException {
if(content instanceof String)this.content = ((String)content).getBytes();
else this.content = Caster.toBinary(content);
}
/**
* @param type
*/
public void setType(String type) {
type=type.toLowerCase().trim();
if(type.equals("text"))type="text/plain";
else if(type.equals("plain"))type="text/plain";
else if(type.equals("html"))type="text/html";
this.type=type;
}
/** set the value value
* Indicates the value of the header.
* @param value value to set
**/
public void setValue(String value) {
this.value=value;
}
/** set the value file
* Attaches the specified file to the message. This attribute is mutually exclusive with the
* name attribute.
* @param strFile value to set
* @throws PageException
**/
public void setFile(String strFile) throws PageException {
this.file=strFile;
}
/** set the value name
* Specifies the name of the header. Header names are case insensitive. This attribute is mutually
* exclusive with the file attribute.
* @param name value to set
**/
public void setName(String name) {
this.name=name;
}
/**
* @param disposition The disposition to set.
* @throws ApplicationException
*/
public void setDisposition(String disposition) throws ApplicationException {
disposition=disposition.trim().toLowerCase();
if(disposition.equals("attachment")) this.disposition=EmailAttachment.ATTACHMENT;
else if(disposition.equals("inline"))this.disposition=EmailAttachment.INLINE;
else
throw new ApplicationException("disposition must have one of the following values (attachment,inline)");
}
/**
* @param contentID The contentID to set.
*/
public void setContentid(String contentID) {
this.contentID = contentID;
}
@Override
public int doStartTag() throws PageException {
if(content!=null){
required("mailparam", "file", file);
String filename = ListUtil.last(file, "/\\",true);
Resource res = SystemUtil.getTempDirectory().getRealResource(filename);
if(res.exists())ResourceUtil.removeEL(res, true);
try {
IOUtil.write(res, content);
} catch (IOException e) {
throw Caster.toPageException(e);
}
this.file=ResourceUtil.getCanonicalPathEL(res);
remove=true;
}
else if(!StringUtil.isEmpty(this.file)) {
Resource res=ResourceUtil.toResourceNotExisting(pageContext,this.file);
if(res!=null) {
if(res.exists())pageContext.getConfig().getSecurityManager().checkFileLocation(res);
this.file=ResourceUtil.getCanonicalPathEL(res);
}
}
// check attributes
boolean hasFile=!StringUtil.isEmpty(file);
boolean hasName=!StringUtil.isEmpty(name);
// both attributes
if(hasName && hasFile) {
throw new ApplicationException("Wrong Context for tag MailParam, you cannot use attribute file and name together");
}
// no attributes
if(!hasName && !hasFile) {
throw new ApplicationException("Wrong Context for tag MailParam, you must use attribute file or attribute name for this tag");
}
// get Mail Tag
Tag parent=getParent();
while(parent!=null && !(parent instanceof Mail)) {
parent=parent.getParent();
}
if(parent instanceof Mail) {
Mail mail = (Mail)parent;
mail.setParam(type,file,name,value,disposition,contentID,remove);
}
else {
throw new ApplicationException("Wrong Context, tag MailParam must be inside a Mail tag");
}
return SKIP_BODY;
}
@Override
public int doEndTag() {
return EVAL_PAGE;
}
}