From bdfdc9c65c5eb2786b7dd8e33ba8a12a3bafe86d Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Nov 2013 11:05:51 -0500
Subject: [PATCH] Extract NotificationManager from GitBlit singleton

---
 src/main/java/com/gitblit/manager/INotificationManager.java |    2 
 src/main/java/com/gitblit/DaggerModule.java                 |    5 
 src/main/java/com/gitblit/GitBlit.java                      |  130 --------------------
 src/main/java/com/gitblit/manager/NotificationManager.java  |  181 ++++++++++++++++++++++++++++++
 4 files changed, 190 insertions(+), 128 deletions(-)

diff --git a/src/main/java/com/gitblit/DaggerModule.java b/src/main/java/com/gitblit/DaggerModule.java
index 840ba60..2f060c0 100644
--- a/src/main/java/com/gitblit/DaggerModule.java
+++ b/src/main/java/com/gitblit/DaggerModule.java
@@ -28,6 +28,7 @@
 import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.manager.ISessionManager;
 import com.gitblit.manager.IUserManager;
+import com.gitblit.manager.NotificationManager;
 import com.gitblit.manager.RuntimeManager;
 import com.gitblit.wicket.GitBlitWebApp;
 import com.gitblit.wicket.GitblitWicketFilter;
@@ -95,8 +96,8 @@
 		return new RuntimeManager(settings);
 	}
 
-	@Provides @Singleton INotificationManager provideNotificationManager() {
-		return gitblit;
+	@Provides @Singleton INotificationManager provideNotificationManager(IStoredSettings settings) {
+		return new NotificationManager(settings);
 	}
 
 	@Provides @Singleton IUserManager provideUserManager() {
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 91a44b7..4e77974 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -56,10 +56,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMultipart;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
@@ -166,8 +162,7 @@
  */
 @WebListener
 public class GitBlit extends DaggerContextListener
-					 implements INotificationManager,
-								IUserManager,
+					 implements IUserManager,
 								ISessionManager,
 								IRepositoryManager,
 								IProjectManager,
@@ -210,8 +205,6 @@
 	private IUserService userService;
 
 	private IStoredSettings settings;
-
-	private MailExecutor mailExecutor;
 
 	private LuceneExecutor luceneExecutor;
 
@@ -2860,7 +2853,7 @@
 		}
 
 		// send an email, if possible
-		sendMailToAdministrators("Federation proposal from " + proposal.url,
+		getManager(INotificationManager.class).sendMailToAdministrators("Federation proposal from " + proposal.url,
 				"Please review the proposal @ " + gitblitUrl + "/proposal/" + proposal.token);
 		return true;
 	}
@@ -3156,110 +3149,6 @@
 	}
 
 	/**
-	 * Notify the administrators by email.
-	 *
-	 * @param subject
-	 * @param message
-	 */
-	@Override
-	public void sendMailToAdministrators(String subject, String message) {
-		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
-		sendMail(subject, message, toAddresses);
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendMail(String subject, String message, Collection<String> toAddresses) {
-		this.sendMail(subject, message, toAddresses.toArray(new String[0]));
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendMail(String subject, String message, String... toAddresses) {
-		if (toAddresses == null || toAddresses.length == 0) {
-			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
-			return;
-		}
-		try {
-			Message mail = mailExecutor.createMessage(toAddresses);
-			if (mail != null) {
-				mail.setSubject(subject);
-
-				MimeBodyPart messagePart = new MimeBodyPart();
-				messagePart.setText(message, "utf-8");
-				messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
-				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
-
-				MimeMultipart multiPart = new MimeMultipart();
-				multiPart.addBodyPart(messagePart);
-				mail.setContent(multiPart);
-
-				mailExecutor.queue(mail);
-			}
-		} catch (MessagingException e) {
-			logger.error("Messaging error", e);
-		}
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
-		this.sendHtmlMail(subject, message, toAddresses.toArray(new String[0]));
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendHtmlMail(String subject, String message, String... toAddresses) {
-		if (toAddresses == null || toAddresses.length == 0) {
-			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
-			return;
-		}
-		try {
-			Message mail = mailExecutor.createMessage(toAddresses);
-			if (mail != null) {
-				mail.setSubject(subject);
-
-				MimeBodyPart messagePart = new MimeBodyPart();
-				messagePart.setText(message, "utf-8");
-				messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
-				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
-
-				MimeMultipart multiPart = new MimeMultipart();
-				multiPart.addBodyPart(messagePart);
-				mail.setContent(multiPart);
-
-				mailExecutor.queue(mail);
-			}
-		} catch (MessagingException e) {
-			logger.error("Messaging error", e);
-		}
-	}
-
-	/**
 	 * Parse the properties file and aggregate all the comments by the setting
 	 * key. A setting model tracks the current value, the default value, the
 	 * description of the setting and and directives about the setting.
@@ -3325,15 +3214,6 @@
 			logger.error("Failed to load resource copy of gitblit.properties");
 		}
 		return settingsModel;
-	}
-
-	protected void configureMailExecutor() {
-		if (mailExecutor.isReady()) {
-			logger.info("Mail executor is scheduled to process the message queue every 2 minutes.");
-			scheduledExecutor.scheduleAtFixedRate(mailExecutor, 1, 2, TimeUnit.MINUTES);
-		} else {
-			logger.warn("Mail server is not properly configured.  Mail services disabled.");
-		}
 	}
 
 	protected void configureLuceneIndexing() {
@@ -3440,7 +3320,7 @@
 				// HACK temporary pending manager separation and injection
 				Gitblit gitblit = new Gitblit(
 						getManager(IRuntimeManager.class),
-						this,
+						getManager(INotificationManager.class),
 						this,
 						this,
 						this,
@@ -3549,13 +3429,14 @@
 		runtime.getStatus().isGO = goSettings != null;
 		runtime.getStatus().servletContainer = context.getServerInfo();
 
+		startManager(injector, INotificationManager.class);
+
 		repositoriesFolder = getRepositoriesFolder();
 
 		logger.info("Gitblit base folder     = " + baseFolder.getAbsolutePath());
 		logger.info("Git repositories folder = " + repositoriesFolder.getAbsolutePath());
 
 		// prepare service executors
-		mailExecutor = new MailExecutor(runtimeSettings);
 		luceneExecutor = new LuceneExecutor(runtimeSettings, getManager(IRepositoryManager.class));
 		gcExecutor = new GCExecutor(runtimeSettings, getManager(IRepositoryManager.class));
 		mirrorExecutor = new MirrorExecutor(runtimeSettings, getManager(IRepositoryManager.class));
@@ -3592,7 +3473,6 @@
 		projectConfigs = new FileBasedConfig(runtime.getFileOrFolder(Keys.web.projectsFile, "${baseFolder}/projects.conf"), FS.detect());
 		getProjectConfigs();
 
-		configureMailExecutor();
 		configureLuceneIndexing();
 		configureGarbageCollector();
 		configureMirrorExecutor();
diff --git a/src/main/java/com/gitblit/manager/INotificationManager.java b/src/main/java/com/gitblit/manager/INotificationManager.java
index f53ae68..29d8f54 100644
--- a/src/main/java/com/gitblit/manager/INotificationManager.java
+++ b/src/main/java/com/gitblit/manager/INotificationManager.java
@@ -17,7 +17,7 @@
 
 import java.util.Collection;
 
-public interface INotificationManager {
+public interface INotificationManager extends IManager {
 
 	/**
 	 * Notify the administrators by email.
diff --git a/src/main/java/com/gitblit/manager/NotificationManager.java b/src/main/java/com/gitblit/manager/NotificationManager.java
new file mode 100644
index 0000000..eae563f
--- /dev/null
+++ b/src/main/java/com/gitblit/manager/NotificationManager.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2013 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.manager;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.gitblit.IStoredSettings;
+import com.gitblit.Keys;
+import com.gitblit.MailExecutor;
+
+/**
+ * The notification manager dispatches notifications.  Currently, email is the
+ * only supported transport, however there is no reason why other transports
+ * could be supported (tweets, irc, sms, etc).
+ *
+ * @author James Moger
+ *
+ */
+public class NotificationManager implements INotificationManager {
+
+	private final Logger logger = LoggerFactory.getLogger(getClass());
+
+	private final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);
+
+	private final IStoredSettings settings;
+
+	private final MailExecutor mailExecutor;
+
+	public NotificationManager(IStoredSettings settings) {
+		this.settings = settings;
+		this.mailExecutor = new MailExecutor(settings);
+	}
+
+	@Override
+	public IManager setup() {
+		if (mailExecutor.isReady()) {
+			logger.info("Mail executor is scheduled to process the message queue every 2 minutes.");
+			scheduledExecutor.scheduleAtFixedRate(mailExecutor, 1, 2, TimeUnit.MINUTES);
+		} else {
+			logger.warn("Mail server is not properly configured.  Mail services disabled.");
+		}
+		return this;
+	}
+
+	@Override
+	public IManager stop() {
+		scheduledExecutor.shutdownNow();
+		return this;
+	}
+
+	/**
+	 * Notify the administrators by email.
+	 *
+	 * @param subject
+	 * @param message
+	 */
+	@Override
+	public void sendMailToAdministrators(String subject, String message) {
+		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
+		sendMail(subject, message, toAddresses);
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendMail(String subject, String message, Collection<String> toAddresses) {
+		this.sendMail(subject, message, toAddresses.toArray(new String[0]));
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendMail(String subject, String message, String... toAddresses) {
+		if (toAddresses == null || toAddresses.length == 0) {
+			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
+			return;
+		}
+		try {
+			Message mail = mailExecutor.createMessage(toAddresses);
+			if (mail != null) {
+				mail.setSubject(subject);
+
+				MimeBodyPart messagePart = new MimeBodyPart();
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+
+				mailExecutor.queue(mail);
+			}
+		} catch (MessagingException e) {
+			logger.error("Messaging error", e);
+		}
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
+		this.sendHtmlMail(subject, message, toAddresses.toArray(new String[0]));
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendHtmlMail(String subject, String message, String... toAddresses) {
+		if (toAddresses == null || toAddresses.length == 0) {
+			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
+			return;
+		}
+		try {
+			Message mail = mailExecutor.createMessage(toAddresses);
+			if (mail != null) {
+				mail.setSubject(subject);
+
+				MimeBodyPart messagePart = new MimeBodyPart();
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+
+				mailExecutor.queue(mail);
+			}
+		} catch (MessagingException e) {
+			logger.error("Messaging error", e);
+		}
+	}
+
+}

--
Gitblit v1.9.1