package is.idega.idegaweb.egov.bpm.cases.email.parsers; import is.idega.idegaweb.egov.bpm.cases.email.bean.BPMEmailMessage; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import javax.mail.Message; import org.jbpm.graph.exe.ProcessInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.block.email.bean.FoundMessagesInfo; import com.idega.block.email.bean.MessageParserType; import com.idega.block.email.client.business.ApplicationEmailEvent; import com.idega.block.email.client.business.EmailParams; import com.idega.block.email.parser.DefaultMessageParser; import com.idega.block.email.parser.EmailParser; import com.idega.core.messaging.EmailMessage; import com.idega.idegaweb.egov.bpm.data.CaseProcInstBind; import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO; import com.idega.util.ListUtil; import com.idega.util.StringUtil; @Service @Scope(BeanDefinition.SCOPE_SINGLETON) public class AttachedMessagesParser extends DefaultMessageParser implements EmailParser { private static final Logger LOGGER = Logger.getLogger(AttachedMessagesParser.class.getName()); @Autowired private CasesBPMDAO casesBPMDAO; @Override protected EmailMessage getNewMessage() { return new BPMEmailMessage(); } @Override public Map<String, Collection<? extends EmailMessage>> getParsedMessages(Map<String, FoundMessagesInfo> messagesInfo, EmailParams params) { if (messagesInfo == null || messagesInfo.isEmpty()) { return null; } List<String> identifiersToResolve = new ArrayList<String>(); for (String identifier: messagesInfo.keySet()) { if (!StringUtil.isEmpty(identifier) && !identifiersToResolve.contains(identifier)) { identifiersToResolve.add(identifier); } } if (ListUtil.isEmpty(identifiersToResolve)) { return null; } Map<String, Long> identifiers = getResolvedProcessesInstances(identifiersToResolve); if (identifiers == null || identifiers.isEmpty()) { return null; } Map<String, Collection<? extends EmailMessage>> parsedMessages = new HashMap<String, Collection<? extends EmailMessage>>(); for (Entry<String, FoundMessagesInfo> messagesEntry: messagesInfo.entrySet()) { String identifier = messagesEntry.getKey(); FoundMessagesInfo info = messagesEntry.getValue(); if (info.getParserType() != getMessageParserType()) { continue; } for (Message message: info.getMessages()) { EmailMessage parsedMessage = null; try { parsedMessage = getParsedMessage(message, params); } catch(Exception e) { LOGGER.log(Level.WARNING, "Error parsing message", e); } if (parsedMessage instanceof BPMEmailMessage) { BPMEmailMessage bpmMessage = (BPMEmailMessage) parsedMessage; bpmMessage.setProcessInstanceId(identifiers.get(identifier)); @SuppressWarnings("unchecked") Collection<BPMEmailMessage> messagesByProcess = (Collection<BPMEmailMessage>) parsedMessages.get(identifier); if (messagesByProcess == null) { messagesByProcess = new ArrayList<BPMEmailMessage>(); messagesByProcess.add(bpmMessage); parsedMessages.put(identifier, messagesByProcess); } else { messagesByProcess.add(bpmMessage); } } } } return parsedMessages; } private Map<String, Long> getResolvedProcessesInstances(List<String> identifiers) { if (ListUtil.isEmpty(identifiers)) { return null; } List<Object[]> cps = getCasesBPMDAO().getCaseProcInstBindProcessInstanceByCaseIdentifier(identifiers); if (ListUtil.isEmpty(cps)) { return null; } Map<String, Long> resolvedIdentifiers = new HashMap<String, Long>(cps.size()); for (Object[] objects : cps) { CaseProcInstBind cp = (CaseProcInstBind) objects[0]; ProcessInstance pi = (ProcessInstance) objects[1]; resolvedIdentifiers.put(cp.getCaseIdentifier(), pi.getId()); } return resolvedIdentifiers; } public CasesBPMDAO getCasesBPMDAO() { return casesBPMDAO; } public void setCasesBPMDAO(CasesBPMDAO casesBPMDAO) { this.casesBPMDAO = casesBPMDAO; } public MessageParserType getMessageParserType() { return MessageParserType.BPM; } @Override public Collection<? extends EmailMessage> getParsedMessages(ApplicationEmailEvent emailEvent) { return null; } }