package org.openedit.entermedia.modules;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.entermedia.email.EmailSearcher;
import org.entermedia.email.PostMail;
import org.entermedia.email.Recipient;
import org.entermedia.email.TemplateWebEmail;
import org.openedit.data.PropertyDetail;
import org.openedit.data.SearcherManager;
import org.openedit.entermedia.Asset;
import org.openedit.entermedia.MediaArchive;
import org.openedit.repository.ContentItem;
import org.openedit.util.DateStorageUtil;
import com.openedit.OpenEditRuntimeException;
import com.openedit.WebPageRequest;
import com.openedit.hittracker.HitTracker;
import com.openedit.users.Group;
import com.openedit.users.User;
public class MediaEmailModule extends BaseMediaModule
{
private static final Log log = LogFactory.getLog(MediaEmailModule.class);
protected PostMail fieldPostMail;
protected SearcherManager fieldSearcherManager;
public PostMail getPostMail()
{
return fieldPostMail;
}
public void setPostMail(PostMail inPostMail)
{
fieldPostMail = inPostMail;
}
/*
* Accepts a list of groups, emails and usernames through the
* webPageRequest. To use usernames only, you must also have a value for
* "specifydomain" which will be appended to the usernames.
*/
public void sendAssetNotification(WebPageRequest inReq) throws Exception
{
String[] groups = inReq.getRequestParameters("groupid");
List grouplist = new ArrayList();
if (groups != null)
{
grouplist = Arrays.asList(groups);
}
String othergroups = inReq.findValue("groups");
if (othergroups != null)
{
String[] ids = othergroups.split(",");
List temp = Arrays.asList(ids);
grouplist.addAll(temp);
}
String addresses = inReq.getRequestParameter("email");
TemplateWebEmail email = getPostMail().getTemplateWebEmail();
email.loadSettings(inReq);
List recipients = new ArrayList();
if (grouplist != null)
{
StringBuffer gbuff = new StringBuffer();
for (Iterator groupiter = grouplist.iterator(); groupiter.hasNext();)
{
String id = (String) groupiter.next();
Group group = getUserManager().getGroup(id);
if (group != null)
{
gbuff.append(id);
gbuff.append(",");
HitTracker users = getUserManager().getUsersInGroup(group);
for (Iterator iterator = users.iterator(); iterator.hasNext();)
{
User user = (User) iterator.next();
String target = user.getEmail();
if (email != null)
{
Recipient recipient = new Recipient();
recipient.setEmailAddress(target);
recipient.setFirstName(user.getFirstName());
recipient.setLastName(user.getLastName());
recipients.add(recipient);
}
}
}
}
email.setProperty("groups", gbuff.toString());
}
if (addresses != null)
{
String[] to = addresses.split("[,;]|\\s");
for( String address: to )
{
if( address.contains("@") )
{
Recipient rec = new Recipient();
rec.setEmailAddress(address.trim());
recipients.add(rec);
}
else // This is a username
{
User user = getUserManager().getUser(address.trim());
if( user != null && user.getEmail() != null && user.getEmail().contains("@") )
{
Recipient rec = new Recipient();
rec.setFirstName(user.getFirstName());
rec.setLastName(user.getLastName());
rec.setEmailAddress(user.getEmail());
recipients.add(rec);
}
}
}
email.setRecipients(recipients);
// we don't know if the address string contains comma seperated or semicolon seperated values or both
email.setProperty("emails", addresses);
}
MediaArchive mediaArchive = getMediaArchive(inReq);
String assetSourcePath = inReq.findValue("sourcepath");
Asset asset = mediaArchive.getAssetBySourcePath(assetSourcePath);
String[] paths = inReq.getRequestParameters("file");
List attachments = new ArrayList();
if (paths != null)
{
for (int i = 0; i < paths.length; i++)
{
String path = paths[i];
ContentItem item = getPageManager().getRepository().getStub(path);
File target = new File(item.getAbsolutePath());
if (target.exists())
{
attachments.add(target.getAbsolutePath());
}
else
{
log.info("file: " + target.getAbsolutePath() + " did not exist");
}
}
if (attachments.size() > 0)
{
email.setFileAttachments(attachments);
}
}
email.setProperty("assetid", asset.getId());
email.setProperty("senderuserid", inReq.getUser().getId());
email.setProperty("senderfirstname", inReq.getUser().getFirstName());
email.setProperty("senderlastname", inReq.getUser().getLastName());
User user = inReq.getUser();
if (user.getEmail() != null)
{
email.setFrom(user.getEmail());
email.setFromName(user.toString());
}
email.setRecipients(recipients);
try
{
email.send();
updateNotificationDate(asset, inReq);
EmailSearcher searcher = (EmailSearcher) getSearcherManager().getSearcher(mediaArchive.getCatalogId(), "email");
// PropertyDetail sentdate = searcher.getDetail("sent-date");
// if( sentdate != null && sentdate.getDateFormat() != null )
// {
// email.setDateFormat(sentdate.getDateFormat());
// }
searcher.saveData(email, inReq.getUser());
}
catch(Exception e)
{
inReq.putPageValue("emailerror", e.getMessage());
}
}
protected void updateNotificationDate(Asset inAsset, WebPageRequest inReq)
{
String datefield = inReq.findValue("datefield");
MediaArchive mediaArchive = getMediaArchive(inReq);
if (datefield != null)
{
PropertyDetail detail = mediaArchive.getAssetSearcher().getDetail(datefield);
if (!detail.isDataType("date"))
{
throw new OpenEditRuntimeException("Date Field isn't a date");
}
String date = DateStorageUtil.getStorageUtil().formatForStorage(new Date());
inAsset.setProperty(datefield, date);
mediaArchive.saveAsset(inAsset,inReq.getUser());
}
}
}