/* * Copyright (C) 2003-2012 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.platform.portlet.juzu.notificationsAdmin; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import juzu.Path; import juzu.Resource; import juzu.Response; import juzu.View; import juzu.impl.common.JSON; import juzu.request.ApplicationContext; import juzu.request.UserContext; import juzu.template.Template; import org.exoplatform.commons.api.notification.channel.AbstractChannel; import org.exoplatform.commons.api.notification.channel.ChannelManager; import org.exoplatform.commons.api.notification.model.GroupProvider; import org.exoplatform.commons.api.notification.plugin.NotificationPluginUtils; import org.exoplatform.commons.api.notification.plugin.config.PluginConfig; import org.exoplatform.commons.api.notification.service.setting.PluginSettingService; import org.exoplatform.commons.api.settings.SettingService; import org.exoplatform.commons.api.settings.SettingValue; import org.exoplatform.commons.api.settings.data.Scope; import org.exoplatform.commons.juzu.ajax.Ajax; import org.exoplatform.commons.notification.NotificationUtils; import org.exoplatform.commons.notification.impl.DigestDailyPlugin; import org.exoplatform.commons.notification.template.TemplateUtils; import org.exoplatform.commons.utils.CommonsUtils; import org.exoplatform.container.PortalContainer; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.web.application.JavascriptManager; import org.exoplatform.webui.application.WebuiRequestContext; public class NotificationsAdministration { private static final Log LOG = ExoLogger.getLogger(NotificationsAdministration.class); @Inject @Path("index.gtmpl") Template index; @Inject ResourceBundle bundle; @Inject PluginSettingService pluginSettingService; @Inject SettingService settingService; @Inject ChannelManager channelManager; private Locale locale = Locale.ENGLISH; @View public Response index(ApplicationContext applicationContext, UserContext userContext){ //Redirect yo the home's page when the feature is off if (! CommonsUtils.isFeatureActive(NotificationUtils.FEATURE_NAME)) { return redirectToHomePage(); } this.locale = userContext.getLocale(); ResourceBundle rs = applicationContext.resolveBundle(this.locale); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("_ctx", new Context(rs)); List<GroupProvider> groups = pluginSettingService.getGroupPlugins(); parameters.put("groups", groups); // parameters.put("channels", getChannels()); //try to get sender name and email from database. If fail, get default value from properties file SettingValue<?> senderName = settingService.get(org.exoplatform.commons.api.settings.data.Context.GLOBAL, Scope.GLOBAL, NotificationPluginUtils.NOTIFICATION_SENDER_NAME); SettingValue<?> senderEmail = settingService.get(org.exoplatform.commons.api.settings.data.Context.GLOBAL, Scope.GLOBAL, NotificationPluginUtils.NOTIFICATION_SENDER_EMAIL); parameters.put("senderName", senderName != null ? (String)senderName.getValue() : System.getProperty("exo.notifications.portalname", "eXo")); parameters.put("senderEmail", senderEmail != null ? (String)senderEmail.getValue() : System.getProperty("gatein.email.smtp.from", "noreply@exoplatform.com")); return index.ok(parameters); } private List<String> getChannels() { List<String> channels = new ArrayList<String>(); for (AbstractChannel channel : channelManager.getChannels()) { channels.add(channel.getId()); } return channels; } private Response redirectToHomePage() { PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); HttpServletRequest currentServletRequest = portalRequestContext.getRequest(); StringBuilder sb = new StringBuilder(); sb.append(currentServletRequest.getScheme()).append("://") .append(currentServletRequest.getServerName()) .append(":").append(currentServletRequest.getServerPort()) .append("/").append(PortalContainer.getCurrentPortalContainerName()) .append("/").append(Util.getPortalRequestContext().getPortalOwner()); WebuiRequestContext ctx = WebuiRequestContext.getCurrentInstance(); JavascriptManager jsManager = ctx.getJavascriptManager(); jsManager.addJavascript("try { window.location.href='" + sb.toString() + "' } catch(e) {" + "window.location.href('" + sb.toString() + "') }"); return Response.redirect(sb.toString()); } @Ajax @Resource public Response saveActivePlugin(String pluginId, String inputs) { JSON data = new JSON(); try { Map<String, String> datas = parserParams(inputs); for (String channelId : datas.keySet()) { pluginSettingService.saveActivePlugin(channelId, pluginId, Boolean.valueOf(datas.get(channelId))); } data.set("status", "ok"); data.set("result", datas); } catch (Exception e) { LOG.error("Failed to save settings", e); data.set("status", "false"); data.set("error", "Exception: " + e.getMessage()); } return Response.ok(data.toString()).withMimeType("application/json"); } @Ajax @Resource public Response saveSender(String name, String email) { JSON data = new JSON(); data.set("name", name); data.set("email",email); if(name != null && name.length() > 0 && NotificationUtils.isValidEmailAddresses(email)) { settingService.set(org.exoplatform.commons.api.settings.data.Context.GLOBAL, Scope.GLOBAL, NotificationPluginUtils.NOTIFICATION_SENDER_NAME, SettingValue.create(name)); settingService.set(org.exoplatform.commons.api.settings.data.Context.GLOBAL, Scope.GLOBAL, NotificationPluginUtils.NOTIFICATION_SENDER_EMAIL, SettingValue.create(email)); data.set("status","OK"); } else { data.set("status","NOK"); } return Response.ok(data.toString()).withMimeType("application/json"); } private Map<String, String> parserParams(String params) { Map<String, String> datas = new HashMap<String, String>(); String[] arrays = params.split("&"); for (int i = 0; i < arrays.length; i++) { String[] data = arrays[i].split("="); datas.put(data[0], data[1]); } return datas; } public class Context { ResourceBundle rs; public Context(ResourceBundle rs) { this.rs = rs; } public String appRes(String key) { try { return rs.getString(key).replaceAll("'", "'").replaceAll("\"", """); } catch (java.util.MissingResourceException e) { LOG.debug("Can't find resource for bundle key " + key); if(key.indexOf("NotificationAdmin.label.channel.") == 0) { return appRes("NotificationAdmin.label.default.channel") .replace("{0}", capitalizeFirstLetter(key.replace("NotificationAdmin.label.channel.", ""))); } } catch (Exception e) { LOG.debug("Error when get resource bundle key " + key, e); } return capitalizeFirstLetter(key.substring(key.lastIndexOf(".") + 1)); } private String getBundlePath(String id) { PluginConfig pluginConfig = pluginSettingService.getPluginConfig(id); if (pluginConfig != null) { return pluginConfig.getBundlePath(); } // if (GroupProvider.defaultGroupIds.contains(id)) { return pluginSettingService.getPluginConfig(DigestDailyPlugin.ID).getBundlePath(); } // List<GroupProvider> groups = pluginSettingService.getGroupPlugins(); for (GroupProvider groupProvider : groups) { if (groupProvider.getGroupId().equals(id)) { return groupProvider.getPluginInfos().get(0).getBundlePath(); } } return ""; } public String pluginRes(String key, String id) { String path = getBundlePath(id); return TemplateUtils.getResourceBundle(key, locale, path); } public String getChannelKey(String channelId) { return channelId.replace("_CHANNEL", "").toLowerCase(); } public String capitalizeFirstLetter(String original) { return original.length() <= 1 ? original : original.substring(0, 1).toUpperCase() + original.substring(1); } } }