com.atlassian.jira.plugins.mail.handlers
Class AbstractMessageHandler

java.lang.Object
  extended by com.atlassian.jira.plugins.mail.handlers.AbstractMessageHandler
All Implemented Interfaces:
MessageHandler
Direct Known Subclasses:
AbstractCommentHandler, CreateIssueHandler, CreateOrCommentHandler, CVSLogHandler

Deprecated. traditionally this class has been used as a base class by custom handlers. However as of JIRA 5.0 we recommend not deriving from it and instead implementing directly MessageHandler and use composition instead and use such helper classes like MailUtils and MessageUserProcessor.

@PublicSpi
@Deprecated
public abstract class AbstractMessageHandler
extends Object
implements MessageHandler

An AbstractMessageHandler that stores the parameter map.

TODO Insert summary about other responsibilities/ features of this class.

Attachment processing

This class does a number of things including the processing of parts that need to be saved as attachments within the saveAttachmentIfNecessary(javax.mail.Part, javax.mail.Message, com.atlassian.crowd.embedded.api.User, Issue, com.atlassian.jira.service.util.handler.MessageHandlerContext) )} method.

This method eventually calls others which attempt to locate all parts that are possible candidates and should be kept after it is categorised a part as a particular type. These types are

A few protected methods within this class that are intended for overriding if behaviour needs to be customised. These methods of interest are

The two abstract attachXXX methods are implemented by sub classes.

Numerous helper methods are available upon the MailUtils class to assist with simple tests.


Field Summary
protected  ApplicationProperties applicationProperties
          Deprecated.  
 String bulk
          Deprecated. How to handle emails with header: "Precedence: bulk"
 String catchEmail
          Deprecated. New issues without this recipient are ignored.
protected static String CONTENT_TYPE_TEXT
          Deprecated.  
 boolean createUsers
          Deprecated. Whether to create users if they do not exist
protected  boolean deleteEmail
          Deprecated. This is a silly protected field that indicates whether the email should be deleted BUT only after the canHandleMessage() method is called.
protected static String HEADER_IN_REPLY_TO
          Deprecated.  
protected static String HEADER_MESSAGE_ID
          Deprecated.  
static String KEY_BULK
          Deprecated.  
static String KEY_CATCHEMAIL
          Deprecated.  
static String KEY_CREATEUSERS
          Deprecated.  
static String KEY_FINGER_PRINT
          Deprecated.  
static String KEY_NOTIFYUSERS
          Deprecated.  
static String KEY_REPORTER
          Deprecated.  
protected  org.apache.log4j.Logger log
          Deprecated.  
protected  MessageUserProcessor messageUserProcessor
          Deprecated.  
 boolean notifyUsers
          Deprecated.  
protected  Map<String,String> params
          Deprecated.  
 String reporteruserName
          Deprecated. Username of default reporter, if sender not recognized.
protected  UserManager userManager
          Deprecated.  
static String VALUE_BULK_DELETE
          Deprecated.  
static String VALUE_BULK_FORWARD
          Deprecated.  
static String VALUE_BULK_IGNORE
          Deprecated.  
static String VALUE_FINGER_PRINT_ACCEPT
          Deprecated. Value for parameter KEY_FINGER_PRINT which matches legacy behaviour, accepting emails even if this JIRA sent them.
static String VALUE_FINGER_PRINT_FORWARD
          Deprecated. Default value for parameter KEY_FINGER_PRINT which matches forwards emails if this JIRA sent them, falling back to VALUE_FINGER_PRINT_IGNORE if the forward email address is missing.
static String VALUE_FINGER_PRINT_IGNORE
          Deprecated. Value for parameter KEY_FINGER_PRINT which makes this handler ignore emails detected to have been sent by this instance of JIRA.
 
Constructor Summary
protected AbstractMessageHandler()
          Deprecated. use instead AbstractMessageHandler(com.atlassian.jira.user.util.UserManager, com.atlassian.jira.config.properties.ApplicationProperties, com.atlassian.jira.JiraApplicationContext, com.atlassian.jira.mail.MailLoggingManager, MessageUserProcessor). We should promote dependency injection everywhere we can.
protected AbstractMessageHandler(ApplicationProperties applicationProperties, JiraApplicationContext jiraApplicationContext)
          Deprecated. Use AbstractMessageHandler(UserManager, ApplicationProperties, JiraApplicationContext, MailLoggingManager, MessageUserProcessor) instead. Since v5.0.
protected AbstractMessageHandler(UserManager userManager, ApplicationProperties applicationProperties, JiraApplicationContext jiraApplicationContext, MailLoggingManager mailLoggingManager, MessageUserProcessor messageUserProcessor)
          Deprecated.  
 
Method Summary
protected  boolean attachAttachmentsParts(javax.mail.Part part)
          Deprecated. Only attach an attachment part if it's content is not empty and if it is not a signature part.
protected abstract  boolean attachHtmlParts(javax.mail.Part part)
          Deprecated. This method determines whether or not HTML parts should be attached.
protected  boolean attachInlineParts(javax.mail.Part part)
          Deprecated. Only attach an inline part if it's content is not empty and if it is not a signature part.
protected  boolean attachMessagePart(javax.mail.Part messagePart, javax.mail.Message containingMessage)
          Deprecated. JRA-15133: if this part is an attached message, skip it if: the option to ignore attached messages is set to true, OR this message is in reply to the attached one (redundant info), OR if the message is not in reply to the attached one, skip if the content is empty

This is required to handle the behaviour of some mail clients (e.g.

protected abstract  boolean attachPlainTextParts(javax.mail.Part part)
          Deprecated. This method determines whether or not plain text parts should be attached.
protected  boolean attachRelatedPart(javax.mail.Part part)
          Deprecated. JRA-15670: if this part is contained within a multipart/related message, keep it, as it may be a legitimate attachment, but without the content disposition set to a sensible value (e.g.
protected  boolean canHandleMessage(javax.mail.Message message, MessageHandlerExecutionMonitor monitor)
          Deprecated. Validation call to be made at the start of handleMessage().
It sets a global boolean deleteEmail, whether the email should be deleted if it cannot be handled.
protected  Collection<ChangeItemBean> createAttachmentsForMessage(javax.mail.Message message, Issue issue, MessageHandlerContext context)
          Deprecated. Loops through all the Parts, and for each one of type Part.ATTACHMENT, call createAttachmentWithPart(javax.mail.Part, com.atlassian.crowd.embedded.api.User, Issue, MessageHandlerContext).
protected  ChangeItemBean createAttachmentWithPart(javax.mail.Part part, com.atlassian.crowd.embedded.api.User reporter, Issue issue, MessageHandlerContext context)
          Deprecated. Create an attachment for a particular mime-part.
protected  com.atlassian.crowd.embedded.api.User createUserForReporter(javax.mail.Message message, MessageHandlerContext context)
          Deprecated. Tries to create a user using the details provided by the reporter.
protected  Issue getAssociatedIssue(javax.mail.Message message)
          Deprecated.  
protected  File getFileFromPart(javax.mail.Part part, String issueKey)
          Deprecated.  
protected  String getFilenameForAttachment(javax.mail.Part part)
          Deprecated. Handy method which takes a number of strategies when attempting to give a filename for a particular part.
protected  I18nHelper getI18nBean()
          Deprecated.  
protected  MessageUserProcessor getMessageUserProcessor()
          Deprecated.  
protected  String getPrecedenceHeader(javax.mail.Message message)
          Deprecated. Extract the 'Precedence' header value from the message
protected  com.atlassian.crowd.embedded.api.User getReporter(javax.mail.Message message, MessageHandlerContext context)
          Deprecated. Get the reporter from the email address who sent the message, or else create a new user if creating users is set to true, or use the default reporter if one is specified.
abstract  boolean handleMessage(javax.mail.Message message, MessageHandlerContext context)
          Deprecated. Perform the specific work of this handler for the given message.
 void init(Map<String,String> params, MessageHandlerErrorCollector errorCollector)
          Deprecated. Will be called before any messages are to be handled.
protected  boolean isAutoSubmitted(javax.mail.Message message)
          Deprecated.  
protected  boolean isDeliveryStatus(javax.mail.Message message)
          Deprecated.  
protected  void recordMessageId(String type, javax.mail.Message message, Long issueId, MessageHandlerContext context)
          Deprecated.  
protected  String renameFileIfInvalid(String filename, Issue issue, com.atlassian.crowd.embedded.api.User reporter, MessageHandlerContext context)
          Deprecated. Replaces all invalid characters in the filename using FileNameCharacterCheckerUtil.replaceInvalidChars(String, char) with INVALID_CHAR_REPLACEMENT as the replacement character.
protected  boolean shouldAttach(javax.mail.Part part, javax.mail.Message containingMessage)
          Deprecated. This method determines if a particular part should be included added as an attachment to an issue.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

log

protected final org.apache.log4j.Logger log
Deprecated. 

KEY_REPORTER

public static final String KEY_REPORTER
Deprecated. 
See Also:
Constant Field Values

KEY_CATCHEMAIL

public static final String KEY_CATCHEMAIL
Deprecated. 
See Also:
Constant Field Values

KEY_CREATEUSERS

public static final String KEY_CREATEUSERS
Deprecated. 
See Also:
Constant Field Values

KEY_NOTIFYUSERS

public static final String KEY_NOTIFYUSERS
Deprecated. 
See Also:
Constant Field Values

KEY_FINGER_PRINT

public static final String KEY_FINGER_PRINT
Deprecated. 
See Also:
Constant Field Values

VALUE_FINGER_PRINT_ACCEPT

public static final String VALUE_FINGER_PRINT_ACCEPT
Deprecated. 
Value for parameter KEY_FINGER_PRINT which matches legacy behaviour, accepting emails even if this JIRA sent them.

See Also:
Constant Field Values

VALUE_FINGER_PRINT_FORWARD

public static final String VALUE_FINGER_PRINT_FORWARD
Deprecated. 
Default value for parameter KEY_FINGER_PRINT which matches forwards emails if this JIRA sent them, falling back to VALUE_FINGER_PRINT_IGNORE if the forward email address is missing.

See Also:
Constant Field Values

VALUE_FINGER_PRINT_IGNORE

public static final String VALUE_FINGER_PRINT_IGNORE
Deprecated. 
Value for parameter KEY_FINGER_PRINT which makes this handler ignore emails detected to have been sent by this instance of JIRA.

See Also:
Constant Field Values

KEY_BULK

public static final String KEY_BULK
Deprecated. 
See Also:
Constant Field Values

VALUE_BULK_IGNORE

public static final String VALUE_BULK_IGNORE
Deprecated. 
See Also:
Constant Field Values

VALUE_BULK_FORWARD

public static final String VALUE_BULK_FORWARD
Deprecated. 
See Also:
Constant Field Values

VALUE_BULK_DELETE

public static final String VALUE_BULK_DELETE
Deprecated. 
See Also:
Constant Field Values

CONTENT_TYPE_TEXT

protected static final String CONTENT_TYPE_TEXT
Deprecated. 
See Also:
Constant Field Values

HEADER_MESSAGE_ID

protected static final String HEADER_MESSAGE_ID
Deprecated. 
See Also:
Constant Field Values

HEADER_IN_REPLY_TO

protected static final String HEADER_IN_REPLY_TO
Deprecated. 
See Also:
Constant Field Values

deleteEmail

protected boolean deleteEmail
Deprecated. 
This is a silly protected field that indicates whether the email should be deleted BUT only after the canHandleMessage() method is called. It is used as a mechanism to indicate two values from from a single method call.

One say it should be lined up against the wall and shot, with a 2 value object returned instead. But in the interests of binary compatibility its left as is for the moment.


params

protected Map<String,String> params
Deprecated. 

reporteruserName

public String reporteruserName
Deprecated. 
Username of default reporter, if sender not recognized.


catchEmail

public String catchEmail
Deprecated. 
New issues without this recipient are ignored.


bulk

public String bulk
Deprecated. 
How to handle emails with header: "Precedence: bulk"


createUsers

public boolean createUsers
Deprecated. 
Whether to create users if they do not exist


notifyUsers

public boolean notifyUsers
Deprecated. 

userManager

protected final UserManager userManager
Deprecated. 

messageUserProcessor

protected final MessageUserProcessor messageUserProcessor
Deprecated. 

applicationProperties

protected final ApplicationProperties applicationProperties
Deprecated. 
Constructor Detail

AbstractMessageHandler

@Deprecated
protected AbstractMessageHandler()
Deprecated. use instead AbstractMessageHandler(com.atlassian.jira.user.util.UserManager, com.atlassian.jira.config.properties.ApplicationProperties, com.atlassian.jira.JiraApplicationContext, com.atlassian.jira.mail.MailLoggingManager, MessageUserProcessor). We should promote dependency injection everywhere we can.


AbstractMessageHandler

protected AbstractMessageHandler(ApplicationProperties applicationProperties,
                                 JiraApplicationContext jiraApplicationContext)
Deprecated. Use AbstractMessageHandler(UserManager, ApplicationProperties, JiraApplicationContext, MailLoggingManager, MessageUserProcessor) instead. Since v5.0.

Deprecated Constructor


AbstractMessageHandler

protected AbstractMessageHandler(UserManager userManager,
                                 ApplicationProperties applicationProperties,
                                 JiraApplicationContext jiraApplicationContext,
                                 MailLoggingManager mailLoggingManager,
                                 MessageUserProcessor messageUserProcessor)
Deprecated. 
Method Detail

init

public void init(Map<String,String> params,
                 MessageHandlerErrorCollector errorCollector)
Deprecated. 
Description copied from interface: MessageHandler
Will be called before any messages are to be handled.

Specified by:
init in interface MessageHandler
Parameters:
params - configuration.
errorCollector - potential problems encountered during initialization of the handler should be reported here. Depending on the run mode it may be e.g. displayed back to the user (when handler is tested from UI) or logged to the file .

handleMessage

public abstract boolean handleMessage(javax.mail.Message message,
                                      MessageHandlerContext context)
                               throws javax.mail.MessagingException
Deprecated. 
Perform the specific work of this handler for the given message.

Specified by:
handleMessage in interface MessageHandler
Parameters:
message - the message to check for handling.
context - user-friendly message handler should utilize this interface to create issue, comments, users and provide feedback information about messages being processed and problems being encountered. While MessageHandler-s are run from UI (in TEST / dry-run mode) such invocations are not mutative (they do not create any JIRA entities) and information provided by the handler is displayed back to the user as a summary of the dry-run.
Returns:
true if the message is to be deleted from the source.
Throws:
javax.mail.MessagingException - if anything went wrong.

canHandleMessage

protected boolean canHandleMessage(javax.mail.Message message,
                                   MessageHandlerExecutionMonitor monitor)
Deprecated. 
Validation call to be made at the start of handleMessage().
It sets a global boolean deleteEmail, whether the email should be deleted if it cannot be handled. ie. return deleteEmail if canHandleMessage() is false

Parameters:
message - message to check if it can be handled
Returns:
whether the message should be handled

createAttachmentsForMessage

protected Collection<ChangeItemBean> createAttachmentsForMessage(javax.mail.Message message,
                                                                 Issue issue,
                                                                 MessageHandlerContext context)
                                                          throws IOException,
                                                                 javax.mail.MessagingException
Deprecated. 
Loops through all the Parts, and for each one of type Part.ATTACHMENT, call createAttachmentWithPart(javax.mail.Part, com.atlassian.crowd.embedded.api.User, Issue, MessageHandlerContext).

Parameters:
message - The multipart message to search for attachments in
issue - The issue to create attachments in
Returns:
a collection of change items, one for each attachment added. If no attachments are added, returns and empty collection.
Throws:
IOException - If there is a problem creating the attachment
javax.mail.MessagingException - If there is a problem reading the message

shouldAttach

protected final boolean shouldAttach(javax.mail.Part part,
                                     javax.mail.Message containingMessage)
                              throws javax.mail.MessagingException,
                                     IOException
Deprecated. 
This method determines if a particular part should be included added as an attachment to an issue.

Parameters:
part - the part to potentially attach
containingMessage - the message which contained the part - may be null
Returns:
true if the part should be attached; false otherwise
Throws:
IOException - if javamail complains
javax.mail.MessagingException - if javamail complains

attachPlainTextParts

protected abstract boolean attachPlainTextParts(javax.mail.Part part)
                                         throws javax.mail.MessagingException,
                                                IOException
Deprecated. 
This method determines whether or not plain text parts should be attached.

Parameters:
part - the part to be attached - already determined to be type text/plain.
Returns:
true if the part should be attached; false otherwise
Throws:
IOException - if javamail complains
javax.mail.MessagingException - if javamail complains

attachHtmlParts

protected abstract boolean attachHtmlParts(javax.mail.Part part)
                                    throws javax.mail.MessagingException,
                                           IOException
Deprecated. 
This method determines whether or not HTML parts should be attached.

Parameters:
part - the part to be attached - already determined to be type text/html.
Returns:
true if the part should be attached; false otherwise
Throws:
IOException - if javamail complains
javax.mail.MessagingException - if javamail complains

attachInlineParts

protected boolean attachInlineParts(javax.mail.Part part)
                             throws javax.mail.MessagingException,
                                    IOException
Deprecated. 
Only attach an inline part if it's content is not empty and if it is not a signature part.

Parameters:
part - a mail part - assumed to have inline disposition
Returns:
whether or not this inline part should be attached.
Throws:
javax.mail.MessagingException - if Content-Type checks fail
IOException - if content checks fail

attachAttachmentsParts

protected boolean attachAttachmentsParts(javax.mail.Part part)
                                  throws javax.mail.MessagingException,
                                         IOException
Deprecated. 
Only attach an attachment part if it's content is not empty and if it is not a signature part.

Parameters:
part - a mail part - assumed to have attachment disposition
Returns:
whether or not this inline part should be attached.
Throws:
javax.mail.MessagingException - if Content-Type checks fail
IOException - if content checks fail

attachMessagePart

protected boolean attachMessagePart(javax.mail.Part messagePart,
                                    javax.mail.Message containingMessage)
                             throws IOException,
                                    javax.mail.MessagingException
Deprecated. 
JRA-15133: if this part is an attached message, skip it if:

This is required to handle the behaviour of some mail clients (e.g. Outlook) who, when replying to a message, include the entire original message as an attachment with content type "message/rfc822". In these cases, the attached message is redundant information, so we skip it.

Parameters:
messagePart - the Message part (already known to be of message content type)
containingMessage - the original message which contains messagePart
Returns:
true if the part should be attached, false otherwise
Throws:
IOException - if javamail complains
javax.mail.MessagingException - if javamail complains

attachRelatedPart

protected boolean attachRelatedPart(javax.mail.Part part)
                             throws IOException,
                                    javax.mail.MessagingException
Deprecated. 
JRA-15670: if this part is contained within a multipart/related message, keep it, as it may be a legitimate attachment, but without the content disposition set to a sensible value (e.g. when using Outlook 2007 and Rich Text format).

Parameters:
part - the part contained within the related message
Returns:
true if the part should be attached, false otherwise
Throws:
IOException - if javamail complains
javax.mail.MessagingException - if javamail complains

createAttachmentWithPart

protected ChangeItemBean createAttachmentWithPart(javax.mail.Part part,
                                                  com.atlassian.crowd.embedded.api.User reporter,
                                                  Issue issue,
                                                  MessageHandlerContext context)
                                           throws IOException
Deprecated. 
Create an attachment for a particular mime-part. The BodyPart must be of type Part.ATTACHMENT.

Parameters:
part - part of disposition Part.ATTACHMENT to create the attachment from
reporter - issue reporter
issue - issue to create attachments in
Returns:
A ChangeItemBean representing the added attachment, or null if no attachment was created
Throws:
IOException - If there is a problem creating the attachment in the filesystem

getFilenameForAttachment

protected String getFilenameForAttachment(javax.mail.Part part)
                                   throws javax.mail.MessagingException,
                                          IOException
Deprecated. 
Handy method which takes a number of strategies when attempting to give a filename for a particular part. The filename may already be present in the part or may need to be formulated or composed from other identifies within the part (such as a subject, content type etc).

Parameters:
part - The part being tested.
Returns:
The filename for the attachment or null if one was not present.
Throws:
javax.mail.MessagingException - relays any MessagingException thrown by a lower layer such as java mail
IOException - relays any IOExceptions

renameFileIfInvalid

protected String renameFileIfInvalid(String filename,
                                     Issue issue,
                                     com.atlassian.crowd.embedded.api.User reporter,
                                     MessageHandlerContext context)
Deprecated. 
Replaces all invalid characters in the filename using FileNameCharacterCheckerUtil.replaceInvalidChars(String, char) with INVALID_CHAR_REPLACEMENT as the replacement character.

Parameters:
filename - filename to check if its valid
issue - issue the file is to be attached
reporter - the author of the comment to add to the issue if the filename is invalid
Returns:
  • if filename is null, returns null
  • if its valid, returns filename
  • if its invalid, returns filename with all invalid characters replaced with INVALID_CHAR_REPLACEMENT

  • getFileFromPart

    protected File getFileFromPart(javax.mail.Part part,
                                   String issueKey)
                            throws IOException,
                                   javax.mail.MessagingException,
                                   org.ofbiz.core.entity.GenericEntityException
    Deprecated. 
    Throws:
    IOException
    javax.mail.MessagingException
    org.ofbiz.core.entity.GenericEntityException

    getReporter

    protected com.atlassian.crowd.embedded.api.User getReporter(javax.mail.Message message,
                                                                MessageHandlerContext context)
                                                         throws javax.mail.MessagingException
    Deprecated. 
    Get the reporter from the email address who sent the message, or else create a new user if creating users is set to true, or use the default reporter if one is specified.

    If neither of these are found, return null.

    Parameters:
    message - The email message to search through.
    Returns:
    The user who sent the email, or the default reporter, or null.
    Throws:
    javax.mail.MessagingException - If there is a problem getting the user who created the message.

    getMessageUserProcessor

    protected MessageUserProcessor getMessageUserProcessor()
    Deprecated. 

    createUserForReporter

    @Nullable
    protected com.atlassian.crowd.embedded.api.User createUserForReporter(javax.mail.Message message,
                                                                                   MessageHandlerContext context)
    Deprecated. 
    Tries to create a user using the details provided by the reporter. Fails if external user managment is turned on or, if no valid from email address was specified.

    Parameters:
    message - The original e-mail message.
    context - execution context
    Returns:
    A new user or null.

    getPrecedenceHeader

    protected String getPrecedenceHeader(javax.mail.Message message)
                                  throws javax.mail.MessagingException
    Deprecated. 
    Extract the 'Precedence' header value from the message

    Parameters:
    message - message
    Returns:
    'Precedence' header
    Throws:
    javax.mail.MessagingException - in case of extraction of the header fails

    isDeliveryStatus

    protected boolean isDeliveryStatus(javax.mail.Message message)
                                throws javax.mail.MessagingException
    Deprecated. 
    Throws:
    javax.mail.MessagingException

    isAutoSubmitted

    protected boolean isAutoSubmitted(javax.mail.Message message)
                               throws javax.mail.MessagingException
    Deprecated. 
    Throws:
    javax.mail.MessagingException

    recordMessageId

    protected void recordMessageId(String type,
                                   javax.mail.Message message,
                                   Long issueId,
                                   MessageHandlerContext context)
                            throws javax.mail.MessagingException
    Deprecated. 
    Throws:
    javax.mail.MessagingException

    getAssociatedIssue

    protected Issue getAssociatedIssue(javax.mail.Message message)
    Deprecated. 

    getI18nBean

    protected I18nHelper getI18nBean()
    Deprecated. 


    Copyright © 2002-2012 Atlassian. All Rights Reserved.