/*********************************************************************************
* The contents of this file are subject to the Common Public Attribution
* License Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.openemm.org/cpal1.html. The License is based on the Mozilla
* Public License Version 1.1 but Sections 14 and 15 have been added to cover
* use of software over a computer network and provide for limited attribution
* for the Original Developer. In addition, Exhibit A has been modified to be
* consistent with Exhibit B.
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is OpenEMM.
* The Original Developer is the Initial Developer.
* The Initial Developer of the Original Code is AGNITAS AG. All portions of
* the code written by AGNITAS AG are Copyright (c) 2007 AGNITAS AG. All Rights
* Reserved.
*
* Contributor(s): AGNITAS AG.
********************************************************************************/
package org.agnitas.web;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.agnitas.beans.Mailing;
import org.agnitas.beans.MailingComponent;
import org.agnitas.beans.impl.MailingComponentImpl;
import org.agnitas.dao.MailingComponentDao;
import org.agnitas.dao.MailingDao;
import org.agnitas.dao.TargetDao;
import org.agnitas.util.AgnUtils;
import org.agnitas.web.forms.MailingAttachmentsForm;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.apache.commons.lang.StringUtils;
import org.springframework.dao.TransientDataAccessResourceException;
/**
* Implementation of <strong>Action</strong> that validates a user logon.
*
* @author Martin Helff
*/
public final class MailingAttachmentsAction extends StrutsActionBase {
private static final transient Logger logger = Logger.getLogger(MailingAttachmentsAction.class);
// --------------------------------------------------------- Public Methods
ActionMessages errors;
private MailingDao mailingDao;
private TargetDao targetDao;
private MailingComponentDao componentDao;
/**
* Process the specified HTTP request, and create the corresponding HTTP
* response (or forward to another web component that will create it).
* Return an <code>ActionForward</code> instance describing where and how
* control should be forwarded, or <code>null</code> if the response has
* already been completed.
* <br>
* ACTION_LIST: loads mailing data into form, <br>
* loads attachments list into request, <br>
* loads target groups list into request, <br>
* forwards to list page
* <br><br>
* ACTION_SAVE: if attachment file is not empty and its size is lower than max allowed size - adds it to
* the mailing, and saves mailing to database; <br>
* if request has parameter like "delete" + componentID - deletes component with that ID; <br>
* saves changed target groups of components (gets that from request parameters "target" + componentID); <br>
* loads mailing data into form; <br>
* loads attachments list into request; <br>
* loads target groups list into request; <br>
* if there wasn't file selected while adding new components - shows error messages; <br>
* forwards to list page
* <br><br>
* @param form the optional ActionForm bean for this request (if any)
* @param req HTTP request
* @param res HTTP response
* @param mapping The ActionMapping used to select this instance
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet exception occurs
* @return destination
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res)
throws IOException, ServletException {
// Validate the request parameters specified by the user
MailingAttachmentsForm aForm=null;
errors = new ActionMessages();
ActionMessages messages = new ActionMessages();
ActionForward destination=null;
if(!AgnUtils.isUserLoggedIn(req)) {
return mapping.findForward("logon");
}
aForm=(MailingAttachmentsForm)form;
if(!allowed("mailing.attachments.show", req)) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.permissionDenied"));
saveErrors(req, errors);
return null;
}
try {
switch(aForm.getAction()) {
case MailingAttachmentsAction.ACTION_LIST:
loadMailing(aForm, req);
loadAttachments(aForm, req);
loadTargetGroups(req);
aForm.setAction(MailingAttachmentsAction.ACTION_SAVE);
destination=mapping.findForward("list");
break;
case MailingAttachmentsAction.ACTION_SAVE:
destination=mapping.findForward("list");
loadMailing(aForm, req);
try {
saveAttachment(aForm, req);
}
catch (TransientDataAccessResourceException e) {
AgnUtils.logger().error("execute: " + e + "\n" + AgnUtils.getStackTrace(e));
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.hibernate.attachmentTooLarge"));
}
loadAttachments(aForm, req);
loadTargetGroups(req);
aForm.setAction(MailingAttachmentsAction.ACTION_SAVE);
Enumeration parameterNames = req.getParameterNames();
boolean aComponentWasJustAdded = false;
while (parameterNames.hasMoreElements()) {
Object parameter = parameterNames.nextElement();
if (parameter instanceof String) {
String parameterString = (String) parameter;
if (parameterString.startsWith("add") && AgnUtils.parameterNotEmpty(req,parameterString)) {
aComponentWasJustAdded = true;
break;
}
}
}
if(errors.isEmpty()){
if (aComponentWasJustAdded && (aForm.getNewAttachment() == null || aForm.getNewAttachment().getFileName() == null || "".equals(aForm.getNewAttachment().getFileName()))) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("mailing.errors.no_attachment_file"));
} else {
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
}
}
break;
}
} catch (Exception e) {
logger.error("execute: "+e+"\n"+AgnUtils.getStackTrace(e));
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.exception"));
}
// Report any errors we have discovered back to the original form
if (!errors.isEmpty()) {
saveErrors(req, errors);
}
// Report any message (non-errors) we have discovered
if (!messages.isEmpty()) {
saveMessages(req, messages);
}
return destination;
}
private void loadAttachments(MailingAttachmentsForm aForm, HttpServletRequest request) {
Vector<MailingComponent> attachments = componentDao.getMailingComponents(aForm.getMailingID(), getCompanyID(request), MailingComponent.TYPE_ATTACHMENT);
request.setAttribute("attachments", attachments);
}
private void loadTargetGroups(HttpServletRequest request) {
List targets = targetDao.getTargets(getCompanyID(request));
request.setAttribute("targets", targets);
}
/**
* Loads mailing
*/
protected void loadMailing(MailingAttachmentsForm aForm, HttpServletRequest req) throws Exception {
Mailing aMailing=mailingDao.getMailing(aForm.getMailingID(), this.getCompanyID(req));
aForm.setShortname(aMailing.getShortname());
aForm.setDescription(aMailing.getDescription());
aForm.setIsTemplate(aMailing.isIsTemplate());
aForm.setWorldMailingSend(aMailing.isWorldMailingSend());
logger.info("loadMailing: mailing loaded");
}
/**
* Saves attachement
*/
protected void saveAttachment(MailingAttachmentsForm aForm, HttpServletRequest req) {
MailingComponent aComp;
String aParam;
Vector deleteEm=new Vector();
Mailing aMailing=mailingDao.getMailing(aForm.getMailingID(), this.getCompanyID(req));
FormFile newAttachment=aForm.getNewAttachment();
try {
double size = newAttachment.getFileSize();
int attachmentMaxSize = Integer.parseInt(AgnUtils.getDefaultValue("attachment.maxSize"));
if(size != 0 && size < attachmentMaxSize) {
aComp= new MailingComponentImpl();
aComp.setCompanyID(this.getCompanyID(req));
aComp.setMailingID(aForm.getMailingID());
aComp.setType(MailingComponent.TYPE_ATTACHMENT);
aComp.setComponentName(aForm.getNewAttachmentName());
aComp.setBinaryBlock(newAttachment.getFileData());
aComp.setEmmBlock(aComp.makeEMMBlock());
aComp.setMimeType(newAttachment.getContentType());
aComp.setTargetID(aForm.getAttachmentTargetID());
aMailing.addComponent(aComp);
} else if(size >= attachmentMaxSize) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.attachment", AgnUtils.getDefaultValue("attachment.maxSize")));
}
} catch(Exception e) {
logger.error("saveAttachment: "+e);
}
Iterator it=aMailing.getComponents().values().iterator();
while (it.hasNext()) {
aComp=(MailingComponent)it.next();
switch(aComp.getType()) {
case MailingComponent.TYPE_ATTACHMENT:
aParam=req.getParameter("delete"+aComp.getId());
if(!StringUtils.isEmpty(aParam)) {
deleteEm.add(aComp);
}
aParam=req.getParameter("target"+aComp.getId());
if(aParam!=null) {
aComp.setTargetID(Integer.parseInt(aParam));
}
break;
}
}
Enumeration en=deleteEm.elements();
while(en.hasMoreElements()) {
aMailing.getComponents().remove(((MailingComponent)en.nextElement()).getComponentName());
}
mailingDao.saveMailing(aMailing);
}
public void setMailingDao(MailingDao mailingDao) {
this.mailingDao = mailingDao;
}
public MailingDao getMailingDao() {
return mailingDao;
}
public void setTargetDao(TargetDao targetDao) {
this.targetDao = targetDao;
}
public TargetDao getTargetDao() {
return targetDao;
}
public void setComponentDao(MailingComponentDao componentDao) {
this.componentDao = componentDao;
}
public MailingComponentDao getComponentDao() {
return componentDao;
}
}