All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.vgregion.webbisar.presentation.WebbisarFlowSupportBean Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2010 Västra Götalandsregionen
 *
 *   This library is free software; you can redistribute it and/or modify
 *   it under the terms of version 2.1 of the GNU Lesser General Public
 *   License as published by the Free Software Foundation.
 *
 *   This library is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public
 *   License along with this library; if not, write to the
 *   Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 *   Boston, MA 02111-1307  USA
 *
 */

package se.vgregion.webbisar.presentation;

import java.io.File;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.webflow.context.ExternalContext;
import org.springframework.webflow.core.collection.LocalParameterMap;

import se.vgregion.webbisar.presentation.exceptions.WebbisNotFoundException;
import se.vgregion.webbisar.svc.Configuration;
import se.vgregion.webbisar.svc.WebbisService;
import se.vgregion.webbisar.types.Webbis;

public class WebbisarFlowSupportBean {

    private static final Log LOGGER = LogFactory.getLog(WebbisarFlowSupportBean.class);

    private static final Pattern RFC2822_MAIL_PATTERN = Pattern
            .compile("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");

    private static final String ENCODING_UTF8 = "UTF-8";
    private static final int NUMBER_OF_WEBBIS_ON_BROWSE_PAGE = 6;
    private WebbisService webbisService;
    private Configuration cfg;
    private JavaMailSender mailSender;
    private VelocityEngine velocityEngine;

    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void setVelocityEngine(VelocityEngine velocityEngine) {
        this.velocityEngine = velocityEngine;
    }

    public WebbisService getAddressService() {
        return webbisService;
    }

    public void setWebbisService(WebbisService webbisService) {
        this.webbisService = webbisService;
    }

    public void setConfiguration(Configuration cfg) {
        this.cfg = cfg;
    }

    public boolean shouldShowWebbis(String webbisId) {
        return !StringUtils.isBlank(webbisId);
    }

    public WebbisPageBean loadPage(WebbisPageBean o) {
        int pageNumber = (o == null) ? 0 : (o).getPageNumber();
        return internalLoadPage(pageNumber);
    }

    public WebbisPageBean loadNextPage(WebbisPageBean o) {
        int pageNumber = (o == null) ? 0 : (o).getPageNumber() + 1;
        return internalLoadPage(pageNumber);
    }

    public WebbisPageBean loadPrevPage(WebbisPageBean o) {
        int pageNumber = (o == null) ? 0 : ((o).getPageNumber() == 0) ? 0 : (o).getPageNumber() - 1;

        return internalLoadPage(pageNumber);
    }

    protected WebbisPageBean internalLoadPage(int pageNumber) {
        long numberOfWebbisar = webbisService.getNumberOfWebbisar();

        long numberOfPages = numberOfWebbisar / NUMBER_OF_WEBBIS_ON_BROWSE_PAGE
                + ((numberOfWebbisar % NUMBER_OF_WEBBIS_ON_BROWSE_PAGE) != 0 ? 1 : 0);

        List webbisar = webbisService.getWebbisar(pageNumber * NUMBER_OF_WEBBIS_ON_BROWSE_PAGE,
                NUMBER_OF_WEBBIS_ON_BROWSE_PAGE);

        List list = new ArrayList();
        for (Webbis webbis : webbisar) {
            list.add(new WebbisBean(cfg.getMultimediaFileBaseUrl(), webbis, 0));
        }
        return new WebbisPageBean(pageNumber, pageNumber == 0, pageNumber == (numberOfPages - 1), list);
    }

    public WebbisBean getWebbis(final Long webbisId, final Integer selectedImage,
            final ExternalContext externalContext, LocalParameterMap parameterMap,
            SearchCriteriaBean searchCriteria) throws WebbisNotFoundException {
        int imageId = (selectedImage == null) ? 0 : selectedImage;

        // Get webbis
        Webbis webbis = webbisService.getById(webbisId);

        // No webbis found, set 404 and throw error
        if (webbis == null) {
            if (externalContext != null && externalContext.getNativeResponse() instanceof HttpServletResponse) {
                ((HttpServletResponse) externalContext.getNativeResponse())
                        .setStatus(HttpServletResponse.SC_NOT_FOUND);
            }
            throw new WebbisNotFoundException("Webbis med id " + webbisId + " finns inte.");
        }

        // Create bean
        WebbisBean webbisBean = new WebbisBean(cfg.getMultimediaFileBaseUrl(), webbis, imageId);

        // If we came here via search engine direct link, also populate serachCriteria
        if (parameterMap != null && parameterMap.contains("q")) {
            StringBuilder searchEngineQuerySB = getSearchEngineQueryString(parameterMap);

            searchCriteria.setSearchEngineQueryParameters(searchEngineQuerySB.toString());
        }

        return webbisBean;
    }

    public MailMessageResultBean sendWebbis(final Long webbisId, final MailMessageBean mailMessageBean)
            throws WebbisNotFoundException {

        // Validate email adresses first
        MailMessageResultBean result = validateEmailAddresses(mailMessageBean);
        if (Boolean.FALSE.equals(result.getSuccess())) {
            return result;
        }
        // Validate sender name
        if (StringUtils.isBlank(mailMessageBean.getSenderName())) {
            result.setSuccess(Boolean.FALSE);
            result.setMessage("Namn på avsändare måste anges.");
            return result;
        }

        // use this map to store the information that will be merged into the html template
        Map emailInformation = new HashMap();
        WebbisBean webbisBean = getWebbis(webbisId, null, null, null, null);
        Map webbisarIdNames = webbisBean.getMultipleBirthSiblingIdsAndNames();

        String messageText = mailMessageBean.getMessage();
        if (!StringUtils.isEmpty(messageText)) {
            messageText = messageText.replace("\r", "").replace("\n", "
"); } // add the current webbis to the list of siblings so that // we have them all in the same Map webbisarIdNames.put(webbisBean.getId(), webbisBean.getName()); // add the message and the base url for html links emailInformation.put("baseUrl", cfg.getExternalBaseUrl()); emailInformation.put("message", messageText); emailInformation.put("senderName", mailMessageBean.getSenderName()); emailInformation.put("senderAddress", mailMessageBean.getSenderAddress()); VelocityContext context = new VelocityContext(); context.put("emailInfo", emailInformation); context.put("webbisInfo", webbisarIdNames); Template template = null; StringWriter msgWriter = null; try { velocityEngine.init(); template = velocityEngine.getTemplate(cfg.getMailTemplate()); msgWriter = new StringWriter(); template.merge(context, msgWriter); } catch (Exception e1) { LOGGER.error("Failed to get/merge velocity template.", e1); result.setSuccess(Boolean.FALSE); result.setMessage("Internt fel, webbis kunde inte skickas."); return result; } String msgText = msgWriter.toString(); // Seems OK, try to send mail... try { InternetAddress fromAddress = null; MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, ENCODING_UTF8); try { fromAddress = new InternetAddress(cfg.getMailFromAddress(), cfg.getMailFromAddressName()); } catch (UnsupportedEncodingException e) { fromAddress = new InternetAddress(cfg.getMailFromAddress()); } helper.setTo(mailMessageBean.getRecipientAddresses().split(",")); helper.setFrom(fromAddress); helper.setSubject(mailMessageBean.getSubject()); helper.setText(msgText, true); // include the vgr logo String logoPath = cfg.getMultimediaFileBaseDir() + "/" + cfg.getMailLogo(); FileSystemResource res = new FileSystemResource(new File(logoPath)); helper.addInline("imageIdentifier", res); mailSender.send(mimeMessage); } catch (MailException ex) { LOGGER.error("Failed to create/send mail.", ex); result.setSuccess(Boolean.FALSE); result.setMessage("Internt fel, webbis kunde inte skickas."); return result; } catch (MessagingException e) { LOGGER.error("Failed to create/send mail.", e); result.setSuccess(Boolean.FALSE); result.setMessage("Internt fel, webbis kunde inte skickas."); return result; } // ...and all was well... result.setSuccess(Boolean.TRUE); result.setMessage("Webbis skickad!"); return result; } /** * Will add q= before search engine query string if not already included * * @param searchCriteria * @return SearchCriteriaBean with search engine query URL parameters * @throws UnsupportedEncodingException */ public SearchCriteriaBean search(SearchCriteriaBean searchCriteria) throws UnsupportedEncodingException { // Copy to searchEngineQueryParameters, a hidden field that will not be displayed if (!StringUtils.isBlank(searchCriteria.getText())) { searchCriteria.setSearchEngineQueryParameters(searchCriteria.getText()); } // Ensure we have q= before search string query parameter if (searchCriteria.getSearchEngineQueryParameters() != null && !searchCriteria.getSearchEngineQueryParameters().contains("q=")) { searchCriteria.setSearchEngineQueryParameters("q=" + searchCriteria.getSearchEngineQueryParameters()); } return searchCriteria; } @SuppressWarnings("unchecked") private StringBuilder getSearchEngineQueryString(LocalParameterMap parameterMap) { String parmName = null; String parmValue = null; StringBuilder searchEngineQuerySB = new StringBuilder(); Iterator> i = parameterMap.asMap().entrySet().iterator(); while (i.hasNext()) { Map.Entry entry = i.next(); parmName = entry.getKey(); if ("webbisId".equals(parmName)) { // Don't append webbisId, that is not part of the search engine query continue; } parmValue = entry.getValue(); if (searchEngineQuerySB.length() > 0) { searchEngineQuerySB.append("&"); } searchEngineQuerySB.append(parmName); searchEngineQuerySB.append("="); try { parmValue = URLEncoder.encode(parmValue, ENCODING_UTF8); } catch (UnsupportedEncodingException e) { LOGGER.error("Failed to URL encode search engine parameter value = " + parmValue, e); } searchEngineQuerySB.append(parmValue); } return searchEngineQuerySB; } private MailMessageResultBean validateEmailAddresses(MailMessageBean mailMessageBean) { MailMessageResultBean result = new MailMessageResultBean(); result.setSuccess(Boolean.TRUE); // Do proper validation if (StringUtils.isBlank(mailMessageBean.getRecipientAddresses())) { // No recipient(s) supplied result.setSuccess(Boolean.FALSE); result.setMessage("Minst en mottagare måste anges."); } else if (StringUtils.isBlank(mailMessageBean.getSenderAddress())) { // No sender supplied result.setSuccess(Boolean.FALSE); result.setMessage("Avsändaradress måste anges."); } else { // Validate format for email addresses String[] mailAddresses = mailMessageBean.getRecipientAddresses().split(","); for (String mailAddress : mailAddresses) { if (!RFC2822_MAIL_PATTERN.matcher(mailAddress).matches()) { result.setSuccess(Boolean.FALSE); result.setMessage("Mottagaradressen " + mailAddress + " är inte en giltig mailadress."); break; } } if (!RFC2822_MAIL_PATTERN.matcher(mailMessageBean.getSenderAddress()).matches()) { result.setSuccess(Boolean.FALSE); result.setMessage("Avsändaradressen " + mailMessageBean.getSenderAddress() + " är inte en giltig mailadress."); } } return result; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy