ChannelManagerImpl.java
- /*
- * Copyright (C) 2003-2014 eXo Platform SAS.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 org.exoplatform.commons.notification.channel;
- import groovy.text.GStringTemplateEngine;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Map;
- import org.exoplatform.commons.api.notification.channel.AbstractChannel;
- import org.exoplatform.commons.api.notification.channel.ChannelManager;
- import org.exoplatform.commons.api.notification.channel.template.AbstractTemplateBuilder;
- import org.exoplatform.commons.api.notification.channel.template.TemplateProvider;
- import org.exoplatform.commons.api.notification.lifecycle.AbstractNotificationLifecycle;
- import org.exoplatform.commons.api.notification.model.ChannelKey;
- import org.exoplatform.commons.api.notification.model.PluginKey;
- import org.exoplatform.commons.notification.template.TemplateUtils;
- import org.exoplatform.services.log.ExoLogger;
- import org.exoplatform.services.log.Log;
- import org.picocontainer.Startable;
- /**
- * Created by The eXo Platform SAS
- * Author : eXoPlatform
- * thanhvc@exoplatform.com
- * Dec 12, 2014
- */
- public class ChannelManagerImpl implements ChannelManager, Startable {
- /** logger */
- private static final Log LOG = ExoLogger.getLogger(ChannelManagerImpl.class);
- /** Defines the channels: key = channelId and Channel*/
- private final Map<ChannelKey, AbstractChannel> channels;
- private List<TemplateProvider> providers;
- private GStringTemplateEngine gTemplateEngine;
- public ChannelManagerImpl() {
- channels = new HashMap<ChannelKey, AbstractChannel>();
- providers = new LinkedList<TemplateProvider>();
- gTemplateEngine = new GStringTemplateEngine();
- }
-
- /**
- * Register new channel
- * @param channel
- */
- @Override
- public void register(AbstractChannel channel) {
- channels.put(ChannelKey.key(channel.getId()), channel);
- }
- /**
- * Unregister the specified channel
- *
- * @param channel
- */
- @Override
- public void unregister(AbstractChannel channel) {
- channels.remove(channel.getId());
- }
- /**
- * Register the template provider
- *
- * @param provider
- */
- @Override
- public void registerTemplateProvider(TemplateProvider provider) {
- providers.add(provider);
- }
-
- /**
- * Register and override the template provider
- *
- * @param provider
- */
- @Override
- public void registerOverrideTemplateProvider(TemplateProvider provider) {
- providers.add(provider);
- AbstractChannel channel = channels.get(provider.getChannelKey());
- if (channel != null) {
- channel.registerTemplateProvider(addTemplateEngine(provider));
- } else {
- LOG.warn("Register the new TemplateProvider is unsucessful");
- }
- }
- @Override
- public AbstractChannel getChannel(ChannelKey key) {
- return channels.get(key);
- }
-
- @Override
- public AbstractNotificationLifecycle getLifecycle(ChannelKey key) {
- return getChannel(key).getLifecycle();
- }
- /**
- * Gets size of channels has been registered
- *
- * @return
- */
- @Override
- public int sizeChannels() {
- return channels.size();
- }
- @Override
- public List<AbstractChannel> getChannels() {
- List<AbstractChannel> channels = new LinkedList<AbstractChannel>();
- AbstractChannel emailChannel = getChannel(ChannelKey.key(MailChannel.ID));
- if (emailChannel != null) {
- channels.add(emailChannel);
- }
- for (AbstractChannel channel : this.channels.values()) {
- if (MailChannel.ID.equals(channel.getId())) {
- continue;
- }
- channels.add(channel);
- }
- return Collections.unmodifiableList(channels);
- }
- @Override
- public void start() {
- for (TemplateProvider provider : providers) {
- AbstractChannel channel = channels.get(provider.getChannelKey());
- if (channel != null) {
- channel.registerTemplateProvider(addTemplateEngine(provider));
- } else {
- LOG.warn("Register the new TemplateProvider is unsucessful");
- }
- }
- }
- @Override
- public void stop() {
- }
- /**
- * Makes the template file to Groovy template.
- * It's ready to generate the message.
- *
- * Why needs to do this way?
- * - TemplateBuilder and TemplateProvider can be extensible or override. So only final list to make the template.
- * - Don't waste time to build the template for useless template.
-
- * @param provider
- * @return
- */
- private TemplateProvider addTemplateEngine(TemplateProvider provider) {
- Map<PluginKey, AbstractTemplateBuilder> builders = provider.getTemplateBuilder();
- Map<PluginKey, String> configs = provider.getTemplateFilePathConfigs();
- for (PluginKey plugin : configs.keySet()) {
- String templatePath = configs.get(plugin);
- if (templatePath != null && templatePath.length() > 0) {
- try {
- AbstractTemplateBuilder builder = builders.get(plugin);
- if (builder != null) {
- String template = TemplateUtils.loadGroovyTemplate(templatePath);
- builder.setTemplateEngine(gTemplateEngine.createTemplate(template));
- }
- } catch (Exception e) {
- LOG.warn("Failed to build groovy template engine for: " + plugin.getId() + " templatePath: " + templatePath, e);
- }
- }
- }
- return provider;
- }
- }