org.agnitas.web.MailingAttachmentsAction.java Source code

Java tutorial

Introduction

Here is the source code for org.agnitas.web.MailingAttachmentsAction.java

Source

/*********************************************************************************
 * 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;
    }
}