package org.entermedia.email;
import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.openedit.data.SearcherManager;
import org.openedit.repository.ContentItem;
import org.openedit.util.DateStorageUtil;
import com.openedit.OpenEditException;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.users.User;
import com.openedit.users.UserManager;
import com.openedit.util.IntCounter;
import com.openedit.util.URLUtilities;
import com.openedit.util.XmlUtil;
public class XmlEmailArchive implements EmailArchive {
protected PageManager fieldPageManager;
protected XmlUtil fieldXmlUtil;
protected UserManager fieldUserManager;
protected SearcherManager fieldSearcherManager;
protected EmailSearcher fieldEmailSearcher;
protected String fieldCatalogId;
protected PostMail fieldPostMail;
protected IntCounter fieldIdCounter;
protected File fieldRoot;
public SearcherManager getSearcherManager() {
return fieldSearcherManager;
}
public void setSearcherManager(SearcherManager inSearcherManager) {
fieldSearcherManager = inSearcherManager;
}
public UserManager getUserManager() {
return fieldUserManager;
}
public void setUserManager(UserManager inUserManager) {
fieldUserManager = inUserManager;
}
public PageManager getPageManager() {
return fieldPageManager;
}
public void setPageManager(PageManager inPageManager) {
fieldPageManager = inPageManager;
}
public XmlUtil getXmlUtil() {
if (fieldXmlUtil == null) {
fieldXmlUtil = new XmlUtil();
}
return fieldXmlUtil;
}
public void setXmlUtil(XmlUtil inXmlUtil) {
fieldXmlUtil = inXmlUtil;
}
public File getRoot() {
return fieldRoot;
}
public void setRoot(File inRoot) {
fieldRoot = inRoot;
}
public String getCatalogId() {
return fieldCatalogId;
}
public void setCatalogId(String inCatalogId) {
fieldCatalogId = inCatalogId;
}
public void setIdCounter(IntCounter inIdCounter) {
fieldIdCounter = inIdCounter;
}
public PostMail getPostMail() {
return fieldPostMail;
}
public void setPostMail(PostMail inPostMail) {
fieldPostMail = inPostMail;
}
public void clear() {
// TODO Auto-generated method stub
}
public TemplateWebEmail createEmail(String inId) throws OpenEditException {
TemplateWebEmail email = getPostMail().getTemplateWebEmail();
email.setId(inId);
return email;
}
public int createId() {
int count = getIdCounter().incrementCount();
return count;
}
//This is a sourcepath now.
public TemplateWebEmail loadEmail(String inId) throws OpenEditException {
Page page = getPageManager().getPage(getEmailPath() + inId + ".xml");
getPageManager().clearCache(page);
if (!page.exists()) {
return null;
}
TemplateWebEmail email = getPostMail().getTemplateWebEmail();
Element root = getXmlUtil().getXml(page.getReader(), "UTF-8");
email.setId(root.attributeValue("id"));
email.setFrom(root.elementText("from"));
ArrayList to = new ArrayList();
for (Iterator iterator = root.elementIterator("to"); iterator.hasNext();) {
Element property = (Element) iterator.next();
String value = property.getText();
Recipient r = new Recipient();
r.setEmailAddress(property.attributeValue("email"));
r.setFirstName(property.attributeValue("firstname"));
r.setLastName(property.attributeValue("lastname"));
to.add(r);
}
email.setRecipients(to);
email.setSubject(root.elementText("subject"));
email.setAlternativeMessage(URLUtilities.xmlUnescape(root.elementText("alternative")));
email.setMessage(URLUtilities.xmlUnescape(root.elementText("message")));
email.setMailTemplatePath(root.elementText("templatepath"));
Element properties = root.element("properties");
if(properties != null){
for (Iterator iterator = properties.elementIterator("property"); iterator.hasNext();) {
Element property = (Element) iterator.next();
String id = property.attributeValue("id");
String value = property.getText();
email.setProperty(id, value);
}
}
ArrayList files = new ArrayList();
for (Iterator iterator = root.elementIterator("file"); iterator.hasNext();) {
Element file = (Element) iterator.next();
String filename = file.getText();
files.add(filename);
}
email.setFileAttachments(files);
String datestring = root.elementText("sent-date");
if (datestring != null && datestring.length() > 0)
{
Date date = DateStorageUtil.getStorageUtil().parseFromStorage(datestring);
email.setSendDate(date);
}
String sent = root.elementText("sent");
email.setSent(Boolean.parseBoolean(sent));
String userId = root.elementText("user");
if (userId != null) {
User user = getUserManager().getUser(userId);
email.setUser(user);
}
email.setSourcePath(inId);
email.setProperty("sourcepath", inId);
return email;
}
public String getEmailPath() {
return "/WEB-INF/data/" + getCatalogId() + "/email/";
}
public void saveEmail(TemplateWebEmail inEmail, User inUser) {
if(inEmail.getId() == null){
int id = getIdCounter().incrementCount();
inEmail.setId(String.valueOf(id));
}
Element root = DocumentHelper.createElement("email");
root.addAttribute("id", inEmail.getId());
if (inEmail.getFrom() != null) {
root.addElement("from").setText(inEmail.getFrom());
}
if (inEmail.getFromName() != null) {
root.addElement("from-name").setText(inEmail.getFromName());
}
if (inEmail.getRecipients() != null) {
List recipients = inEmail.getRecipients();
for (Iterator iterator = recipients.iterator(); iterator.hasNext();) {
Recipient recip = (Recipient) iterator.next();
Element to = root.addElement("to");
if (recip.getEmailAddress() != null) {
to.addAttribute("email", recip.getEmailAddress());
}
if (recip.getFirstName() != null) {
to.addAttribute("firstname", recip.getFirstName());
}
if (recip.getLastName() != null) {
to.addAttribute("lastname", recip.getLastName());
}
}
}
if (inEmail.getSubject() != null) {
root.addElement("subject").setText(inEmail.getSubject());
}
if (inEmail.getAlternativeMessage() != null) {
root.addElement("alternative").setText(URLUtilities.xmlEscape(inEmail.getAlternativeMessage()));
}
if (inEmail.getMessage() != null) {
root.addElement("message").setText(URLUtilities.xmlEscape(inEmail.getMessage()));
}
if (inEmail.getMailTemplatePath() != null) {
root.addElement("templatepath").setText(inEmail.getMailTemplatePath());
}
if(inEmail.getProperties().size() >0){
Element properties = root.addElement("properties");
for (Iterator iterator = inEmail.getProperties().keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
String val = inEmail.getProperty(key);
if(val != null){
Element property = properties.addElement("property");
property.addAttribute("id", key);
property.setText(val);
}
if (inEmail.getSendDate() != null) {
Element property = properties.addElement("property");
property.addAttribute("id", "sent-date");
property.setText(inEmail.getFormattedSendDate());
}
}
}
if (inEmail.getSendDate() != null) {
root.addElement("sent-date").setText(inEmail.getFormattedSendDate());
}
for (Iterator iterator = inEmail.getFileAttachments().iterator(); iterator.hasNext();) {
String filename = (String) iterator.next();
root.addElement("file").setText(filename);
}
root.addElement("sent").setText(Boolean.toString(inEmail.isSent()));
if (inEmail.getUser() != null) {
root.addElement("user").setText(inEmail.getFormattedSendDate());
}
Page page = getPageManager().getPage(getEmailPath() + inEmail.getId() + ".xml");
OutputStream out = getPageManager().saveToStream(page);
getXmlUtil().saveXml(root, out, "UTF-8");
}
public IntCounter getIdCounter() {
if (fieldIdCounter == null) {
fieldIdCounter = new IntCounter();
ContentItem item = getPageManager().getRepository().get("/" + getCatalogId() + "/data/sentemail.properties");
File upload = new File(item.getAbsolutePath());
upload.getParentFile().mkdirs();
fieldIdCounter.setCounterFile(upload);
}
return fieldIdCounter;
}
public List getAllEmailIds() {
ArrayList ids = new ArrayList();
List strings = getPageManager().getChildrenPaths(getEmailPath(), false);
for (Iterator iterator = strings.iterator(); iterator.hasNext();) {
String path = (String) iterator.next();
if(path.endsWith(".xml")){
String id = path.substring(path.lastIndexOf("/")+1,path.indexOf(".xml"));
ids.add(id);
}
}
return ids;
}
public String getEmailArchiveHome() {
return "/" + getCatalogId();
}
public EmailSearcher getEmailSearcher() {
if (fieldEmailSearcher == null) {
fieldEmailSearcher = (EmailSearcher) getSearcherManager().getSearcher(getCatalogId(), "email");
fieldEmailSearcher.setEmailArchive(this);
}
return fieldEmailSearcher;
}
}