/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.message.service;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.hibernate.proxy.HibernateProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.axelor.apps.message.db.EmailAddress;
import com.axelor.apps.message.db.Message;
import com.axelor.apps.message.db.Template;
import com.axelor.apps.message.db.repo.EmailAddressRepository;
import com.axelor.apps.message.db.repo.MessageRepository;
import com.axelor.apps.message.exception.IExceptionMessage;
import com.axelor.db.EntityHelper;
import com.axelor.db.JPA;
import com.axelor.db.Model;
import com.axelor.db.Query;
import com.axelor.dms.db.DMSFile;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.i18n.I18n;
import com.axelor.inject.Beans;
import com.axelor.meta.db.MetaFile;
import com.axelor.tool.template.TemplateMaker;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
public class TemplateMessageServiceImpl implements TemplateMessageService {
private static final String RECIPIENT_SEPARATOR = ";|,";
private static final char TEMPLATE_DELIMITER = '$';
private final Logger log = LoggerFactory.getLogger( getClass() );
protected TemplateMaker maker;
protected MessageService messageService;
protected EmailAddressRepository emailAddressRepo;
@Inject
public TemplateMessageServiceImpl( MessageService messageService, EmailAddressRepository emailAddressRepo ){
this.messageService = messageService;
this.emailAddressRepo = emailAddressRepo;
}
@Override
public Message generateMessage(Model model, Template template) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, IOException {
Class<?> klass = model.getClass();
if ( model instanceof HibernateProxy ) { klass = ( (HibernateProxy) model ).getHibernateLazyInitializer().getPersistentClass(); }
return generateMessage( model.getId(), klass.getCanonicalName(), klass.getSimpleName(), template);
}
@Override
@Transactional
public Message generateMessage( long objectId, String model, String tag, Template template ) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, IOException {
if ( !model.equals( template.getMetaModel().getFullName() ) ){
throw new AxelorException( I18n.get(IExceptionMessage.TEMPLATE_SERVICE_3 ), IException.INCONSISTENCY, template.getMetaModel().getFullName() );
}
log.debug("model : {}", model);
log.debug("tag : {}", tag);
log.debug("object id : {}", objectId);
log.debug("template : {}", template);
initMaker(objectId, model, tag);
String content = "", subject = "", from= "", replyToRecipients = "", toRecipients = "", ccRecipients = "", bccRecipients = "", addressBlock= "";
int mediaTypeSelect;
if ( !Strings.isNullOrEmpty( template.getContent() ) ) {
//Set template
maker.setTemplate(template.getContent());
content = maker.make();
}
if( !Strings.isNullOrEmpty( template.getAddressBlock() ) ) {
maker.setTemplate(template.getAddressBlock());
//Make it
addressBlock = maker.make();
}
if ( !Strings.isNullOrEmpty( template.getSubject() ) ) {
maker.setTemplate(template.getSubject());
subject = maker.make();
log.debug( "Subject :::", subject );
}
if( !Strings.isNullOrEmpty( template.getFromAdress() ) ) {
maker.setTemplate(template.getFromAdress());
from = maker.make();
log.debug( "From :::", from );
}
if( !Strings.isNullOrEmpty( template.getReplyToRecipients() ) ) {
maker.setTemplate(template.getReplyToRecipients());
replyToRecipients = maker.make();
log.debug( "Reply to :::", replyToRecipients );
}
if(template.getToRecipients() != null) {
maker.setTemplate(template.getToRecipients());
toRecipients = maker.make();
log.debug( "To :::", toRecipients );
}
if(template.getCcRecipients() != null) {
maker.setTemplate(template.getCcRecipients());
ccRecipients = maker.make();
log.debug( "CC :::", ccRecipients );
}
if(template.getBccRecipients() != null) {
maker.setTemplate(template.getBccRecipients());
bccRecipients = maker.make();
log.debug( "BCC :::", bccRecipients );
}
mediaTypeSelect = template.getMediaTypeSelect();
log.debug( "Media :::", mediaTypeSelect );
log.debug( "Content :::", content );
Message message = messageService.createMessage( model, Long.valueOf(objectId).intValue(), subject, content, getEmailAddress(from), getEmailAddresses(replyToRecipients),
getEmailAddresses(toRecipients), getEmailAddresses(ccRecipients), getEmailAddresses(bccRecipients),
null, addressBlock, mediaTypeSelect );
message = Beans.get(MessageRepository.class).save(message);
messageService.attachMetaFiles(message, getMetaFiles(template));
return message;
}
public Set<MetaFile> getMetaFiles( Template template ) throws AxelorException, IOException {
List<DMSFile> metaAttachments = Query.of( DMSFile.class ).filter( "self.relatedId = ?1 AND self.relatedModel = ?2", template.getId(), EntityHelper.getEntityClass(template).getName() ).fetch();
Set<MetaFile> metaFiles = Sets.newHashSet();
for ( DMSFile metaAttachment: metaAttachments )
{
if(!metaAttachment.getIsDirectory()) metaFiles.add( metaAttachment.getMetaFile() );
}
log.debug("Metafile to attach: {}", metaFiles);
return metaFiles;
}
@SuppressWarnings("unchecked")
public TemplateMaker initMaker( long objectId, String model, String tag ) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//Init the maker
this.maker = new TemplateMaker( Locale.FRENCH, TEMPLATE_DELIMITER, TEMPLATE_DELIMITER);
Class<? extends Model> myClass = (Class<? extends Model>) Class.forName( model );
maker.setContext( JPA.find( myClass, objectId), tag );
return maker;
}
protected List<EmailAddress> getEmailAddresses( String recipients ) {
List<EmailAddress> emailAddressList = Lists.newArrayList();
if ( Strings.isNullOrEmpty( recipients ) ) { return emailAddressList; }
for ( String recipient : recipients.split(RECIPIENT_SEPARATOR) ) { emailAddressList.add( getEmailAddress( recipient ) ); }
return emailAddressList;
}
protected EmailAddress getEmailAddress( String recipient ) {
if ( Strings.isNullOrEmpty(recipient) ) { return null; }
EmailAddress emailAddress = emailAddressRepo.findByAddress(recipient);
if ( emailAddress == null ) {
Map<String, Object> values = new HashMap<String,Object>();
values.put("address", recipient);
emailAddress = emailAddressRepo.create(values);
}
return emailAddress;
}
}