Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #27 from slide/master
Fix JENKINS-11683, JENKINS-1144, JENKINS-11665
  • Loading branch information
slide committed Mar 3, 2012
2 parents 3789acf + 2544cb8 commit 09296a6
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 37 deletions.
Expand Up @@ -70,7 +70,6 @@
* @author kyle.sweeney@valtech.com
*/
public class EmailExtensionPlugin extends Plugin {

@Override
public void start() throws Exception {
//We are adding different Content plugins to the list of content types.
Expand Down
18 changes: 9 additions & 9 deletions src/main/java/hudson/plugins/emailext/EmailRecepientUtils.java
@@ -1,7 +1,7 @@
package hudson.plugins.emailext;

import hudson.EnvVars;
import hudson.tasks.Mailer;
import hudson.tasks.Mailer;
import hudson.util.FormValidation;
import org.apache.commons.lang.StringUtils;

Expand All @@ -23,15 +23,15 @@ public Set<InternetAddress> convertRecipientString(String recipientList, EnvVars

final String expandedRecipientList = envVars.expand(recipientList);
final String[] addresses = StringUtils.trim(expandedRecipientList).split(COMMA_SEPARATED_SPLIT_REGEXP);
final String defaultSuffix = Mailer.descriptor().getDefaultSuffix();
final String defaultSuffix = Mailer.descriptor().getDefaultSuffix();
for (String address : addresses) {
if (address.trim().length() > 0) {
// if not a valid address, check if there is a default suffix (@something.com) provided
if (!address.contains("@") && defaultSuffix != null && defaultSuffix.contains("@")) {
address += defaultSuffix;
}
internetAddresses.add(new InternetAddress(address));
}
if(!StringUtils.isBlank(address.trim())) {
// if not a valid address, check if there is a default suffix (@something.com) provided
if (!address.contains("@") && defaultSuffix != null && defaultSuffix.contains("@")) {
address += defaultSuffix;
}
internetAddresses.add(new InternetAddress(address));
}
}

return internetAddresses;
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/hudson/plugins/emailext/EmailType.java
Expand Up @@ -110,10 +110,18 @@ public boolean getHasRecipients() {
}

public String getRecipientList() {
return recipientList;
return recipientList != null ? recipientList.trim() : recipientList;
}

public void setRecipientList(String recipientList) {
this.recipientList = recipientList.trim();
}

public Object readResolve() {
if(this.recipientList != null) {
// get rid of PROJECT_DEFAULT_RECIPIENTS stuff
this.recipientList = this.recipientList.replaceAll("\\$\\{?PROJECT_DEFAULT_RECIPIENTS\\}?", "");
}
return this;
}
}
28 changes: 16 additions & 12 deletions src/main/java/hudson/plugins/emailext/ExtendedEmailPublisher.java
Expand Up @@ -26,6 +26,8 @@
import hudson.tasks.Publisher;
import hudson.tasks.Mailer;

import org.apache.commons.lang.StringUtils;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
Expand Down Expand Up @@ -62,6 +64,8 @@ public class ExtendedEmailPublisher extends Notifier implements MatrixAggregatab
private static final String CONTENT_TRANSFER_ENCODING = System.getProperty(ExtendedEmailPublisher.class.getName() + ".Content-Transfer-Encoding");

public static final Map<String, EmailTriggerDescriptor> EMAIL_TRIGGER_TYPE_MAP = new HashMap<String, EmailTriggerDescriptor>();

public static final String DEFAULT_RECIPIENTS_TEXT = "";

public static final String DEFAULT_SUBJECT_TEXT = "$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!";

Expand Down Expand Up @@ -111,7 +115,7 @@ public static List<EmailTrigger> getTriggersForNonConfiguredInstance() {
/**
* A comma-separated list of email recipient that will be used for every trigger.
*/
public String recipientList;
public String recipientList = "";

/** This is the list of email triggers that the project has configured */
public List<EmailTrigger> configuredTriggers = new ArrayList<EmailTrigger>();
Expand All @@ -136,7 +140,7 @@ public static List<EmailTrigger> getTriggersForNonConfiguredInstance() {
*/
public String attachmentsPattern;

private MatrixTriggerMode matrixTriggerMode;
private MatrixTriggerMode matrixTriggerMode;

/**
* Get the list of configured email triggers for this project.
Expand Down Expand Up @@ -354,12 +358,12 @@ private MimeMessage createMail(EmailType type, AbstractBuild<?, ?> build, BuildL
}

//Get the list of recipients that are uniquely specified for this type of email
if (type.getRecipientList() != null && type.getRecipientList().trim().length() > 0) {
addAddressesFromRecipientList(recipientAddresses, getRecipientList(type, build, type.getRecipientList().trim(), charset), env, listener);
if (!StringUtils.isBlank(type.getRecipientList())) {
addAddressesFromRecipientList(recipientAddresses, getRecipientList(type, build, type.getRecipientList(), charset), env, listener);
}

String emergencyReroute = ExtendedEmailPublisher.DESCRIPTOR.getEmergencyReroute();
boolean isEmergencyReroute = emergencyReroute != null && emergencyReroute.trim().length() > 0;
boolean isEmergencyReroute = !StringUtils.isBlank(emergencyReroute);

if (isEmergencyReroute) {
recipientAddresses.clear();
Expand Down Expand Up @@ -455,16 +459,16 @@ private void setSubject(final EmailType type, final AbstractBuild<?, ?> build, M
}

private String getRecipientList(final EmailType type, final AbstractBuild<?, ?> build, String recipients, String charset)
throws MessagingException {
final String recipientsTransformed = new ContentBuilder().transformText(recipients, this, type, build);
return recipientsTransformed;
}
public boolean isExecuteOnMatrixNodes() {
throws MessagingException {
final String recipientsTransformed = StringUtils.isBlank(recipients) ? "" : new ContentBuilder().transformText(recipients, this, type, build);
return recipientsTransformed;
}

public boolean isExecuteOnMatrixNodes() {
MatrixTriggerMode mtm = getMatrixTriggerMode();
return MatrixTriggerMode.BOTH == mtm
|| MatrixTriggerMode.ONLY_CONFIGURATIONS == mtm;
}
}

private MimeBodyPart getContent(final EmailType type, final AbstractBuild<?, ?> build, MimeMessage msg, String charset)
throws MessagingException {
Expand Down
Expand Up @@ -95,6 +95,11 @@ public class ExtendedEmailPublisherDescriptor extends BuildStepDescriptor<Publis
*/
private long maxAttachmentSize = -1;

/*
* This is a global default recipient list for sending emails.
*/
private String recipientList = "";

private boolean overrideGlobalSettings;

/**
Expand Down Expand Up @@ -218,7 +223,11 @@ public long getMaxAttachmentSize() {
}

public long getMaxAttachmentSizeMb() {
return maxAttachmentSize / (1024 * 1024);
return maxAttachmentSize / (1024 * 1024);
}

public String getDefaultRecipients() {
return recipientList;
}

public boolean getOverrideGlobalSettings() {
Expand Down Expand Up @@ -280,11 +289,10 @@ private EmailType createMailType(JSONObject formData, String mailType) {
public ExtendedEmailPublisherDescriptor() {
super(ExtendedEmailPublisher.class);
load();

if (defaultBody == null && defaultSubject == null && emergencyReroute == null) {
defaultBody = ExtendedEmailPublisher.DEFAULT_BODY_TEXT;
defaultSubject = ExtendedEmailPublisher.DEFAULT_SUBJECT_TEXT;
emergencyReroute = ExtendedEmailPublisher.DEFAULT_EMERGENCY_REROUTE_TEXT;
emergencyReroute = ExtendedEmailPublisher.DEFAULT_EMERGENCY_REROUTE_TEXT;
}
}

Expand Down Expand Up @@ -335,7 +343,9 @@ public boolean configure(StaplerRequest req, JSONObject formData)

// convert the value into megabytes (1024 * 1024 bytes)
maxAttachmentSize = nullify(req.getParameter("ext_mailer_max_attachment_size")) != null ?
(Long.parseLong(req.getParameter("ext_mailer_max_attachment_size")) * 1024 * 1024) : -1;
(Long.parseLong(req.getParameter("ext_mailer_max_attachment_size")) * 1024 * 1024) : -1;
recipientList = nullify(req.getParameter("ext_mailer_default_recipients")) != null ?
req.getParameter("ext_mailer_default_recipients") : "";

overrideGlobalSettings = req.getParameter("ext_mailer_override_global_settings") != null;

Expand Down
Expand Up @@ -32,6 +32,8 @@ public class ContentBuilder {

private static final String DEFAULT_SUBJECT = "\\$DEFAULT_SUBJECT|\\$\\{DEFAULT_SUBJECT\\}";

private static final String DEFAULT_RECIPIENTS = "\\$DEFAULT_RECIPIENTS|\\$\\{DEFAULT_RECIPIENTS\\}";

private static final String PROJECT_DEFAULT_BODY = "\\$PROJECT_DEFAULT_CONTENT|\\$\\{PROJECT_DEFAULT_CONTENT\\}";

private static final String PROJECT_DEFAULT_SUBJECT = "\\$PROJECT_DEFAULT_SUBJECT|\\$\\{PROJECT_DEFAULT_SUBJECT\\}";
Expand Down Expand Up @@ -62,8 +64,8 @@ public static Collection<EmailContent> getEmailContentTypes() {
}

public String transformText(String origText, ExtendedEmailPublisher publisher, EmailType type, AbstractBuild<?, ?> build) {
String newText = origText.replaceAll(PROJECT_DEFAULT_BODY, Matcher.quoteReplacement(publisher.defaultContent)).replaceAll(PROJECT_DEFAULT_SUBJECT, Matcher.quoteReplacement(publisher.defaultSubject)).replaceAll(DEFAULT_BODY, Matcher.quoteReplacement(ExtendedEmailPublisher.DESCRIPTOR.getDefaultBody())).replaceAll(DEFAULT_SUBJECT, Matcher.quoteReplacement(ExtendedEmailPublisher.DESCRIPTOR.getDefaultSubject()));

String recipientList = publisher.recipientList == null ? "" : publisher.recipientList;
String newText = origText.replaceAll(PROJECT_DEFAULT_BODY, Matcher.quoteReplacement(publisher.defaultContent)).replaceAll(PROJECT_DEFAULT_SUBJECT, Matcher.quoteReplacement(publisher.defaultSubject)).replaceAll(DEFAULT_BODY, Matcher.quoteReplacement(ExtendedEmailPublisher.DESCRIPTOR.getDefaultBody())).replaceAll(DEFAULT_SUBJECT, Matcher.quoteReplacement(ExtendedEmailPublisher.DESCRIPTOR.getDefaultSubject())).replaceAll(DEFAULT_RECIPIENTS, Matcher.quoteReplacement(ExtendedEmailPublisher.DESCRIPTOR.getDefaultRecipients()));
newText = replaceTokensWithContent(newText, publisher, type, build);
return newText;
}
Expand Down
Expand Up @@ -13,14 +13,14 @@
<script type="text/javascript">var emailExtInit = new Array();</script>
</st:once>

<!-- This is the global recipent list entry. -->
<f:entry title="${%Global Recipient List}"
description="${%Comma-separated list of email address that should receive notifications.}"
<!-- This is the project recipent list entry. -->
<f:entry title="${%Project Recipient List}"
description="${%Comma-separated list of email address that should receive notifications for this project.}"
help="/plugin/email-ext/help/projectConfig/globalRecipientList.html">

<j:choose>
<j:when test="${instance.configured}">
<input class="setting-input validated" name="recipientlist_recipients"
<j:when test="${instance.configured}">
<input class="setting-input validated" name="recipientlist_recipients"
type="text" value="${instance.recipientList}"
checkUrl="'${rootURL}/publisher/ExtendedEmailPublisher/recipientListRecipientsCheck?value='+encodeURIComponent(this.value)"/>
</j:when>
Expand Down
Expand Up @@ -52,6 +52,7 @@ public void setUp()
publisher.defaultSubject = "%DEFAULT_SUBJECT";
publisher.defaultContent = "%DEFAULT_CONTENT";
publisher.attachmentsPattern = "";
publisher.recipientList = "%DEFAULT_RECIPIENTS";

project = createFreeStyleProject();
project.getPublishersList().add( publisher );
Expand Down
Expand Up @@ -31,6 +31,10 @@ public void setUp()
f = ExtendedEmailPublisherDescriptor.class.getDeclaredField( "defaultSubject" );
f.setAccessible( true );
f.set( ExtendedEmailPublisher.DESCRIPTOR, "Nigerian needs your help!" );

f = ExtendedEmailPublisherDescriptor.class.getDeclaredField( "recipientList" );
f.setAccessible( true );
f.set( ExtendedEmailPublisher.DESCRIPTOR, "ashlux@gmail.com" );
}

public void testTokenizer1() {
Expand Down Expand Up @@ -161,10 +165,11 @@ public void testTokenizer12() {
{
assertEquals(publisher.defaultSubject, new ContentBuilder().transformText( "$PROJECT_DEFAULT_SUBJECT", publisher, null,
mock( AbstractBuild.class ) ));
assertEquals(publisher.defaultSubject, new ContentBuilder().transformText( "${PROJECT_DEFAULT_SUBJECT}", publisher, null,
assertEquals(publisher.defaultSubject, new ContentBuilder().transformText( "${PROJECT_DEFAULT_SUBJECT}", publisher, null,
mock( AbstractBuild.class ) ));
}

}


public void testTransformText_shouldExpand_$DEFAULT_CONTENT()
throws IOException, InterruptedException
{
Expand All @@ -186,4 +191,15 @@ public void testTokenizer12() {
new ContentBuilder().transformText( "${DEFAULT_SUBJECT}", publisher, null,
mock( AbstractBuild.class ) ) );
}

public void testTransformText_shouldExpand_$DEFAULT_RECIPIENT_LIST()
throws IOException, InterruptedException
{
assertEquals( ExtendedEmailPublisher.DESCRIPTOR.getDefaultRecipients(),
new ContentBuilder().transformText( "$DEFAULT_RECIPIENTS", publisher, null,
mock( AbstractBuild.class ) ) );
assertEquals( ExtendedEmailPublisher.DESCRIPTOR.getDefaultRecipients(),
new ContentBuilder().transformText( "${DEFAULT_RECIPIENTS}", publisher, null,
mock( AbstractBuild.class ) ) );
}
}

0 comments on commit 09296a6

Please sign in to comment.