001/* 002 * Copyright 2015 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.web.clientsideelement; 017 018import java.util.ArrayList; 019import java.util.HashMap; 020import java.util.HashSet; 021import java.util.List; 022import java.util.Map; 023import java.util.Set; 024 025import javax.mail.MessagingException; 026 027import org.apache.avalon.framework.service.ServiceException; 028import org.apache.avalon.framework.service.ServiceManager; 029import org.apache.commons.lang.StringUtils; 030 031import org.ametys.core.group.Group; 032import org.ametys.core.group.GroupIdentity; 033import org.ametys.core.group.GroupManager; 034import org.ametys.core.ui.Callable; 035import org.ametys.core.ui.ClientSideElement; 036import org.ametys.core.user.User; 037import org.ametys.core.user.UserIdentity; 038import org.ametys.core.user.UserManager; 039import org.ametys.core.util.I18nUtils; 040import org.ametys.core.util.mail.SendMailHelper; 041import org.ametys.plugins.core.user.UserHelper; 042import org.ametys.runtime.config.Config; 043import org.ametys.runtime.i18n.I18nizableTextParameter; 044import org.ametys.runtime.i18n.I18nizableText; 045import org.ametys.web.repository.page.Page; 046import org.ametys.web.repository.site.Site; 047 048/** 049 * This {@link ClientSideElement} creates a button that will be enabled if page and its hierarchy is valid. 050 * 051 */ 052public class LivePageClientSideElement extends AbstractPageClientSideElement 053{ 054 /** The {@link UserManager} */ 055 private UserManager _userManager; 056 057 /** The {@link UserManager} for front-end users */ 058 private UserManager _foUsersManager; 059 060 /** The {@link GroupManager} for front-end groups */ 061 private GroupManager _foGroupsManager; 062 063 /** The {@link I18nUtils} */ 064 private I18nUtils _i18nUtils; 065 066 private UserHelper _userHelper; 067 068 @Override 069 public void service(ServiceManager smanager) throws ServiceException 070 { 071 super.service(smanager); 072 _userManager = (UserManager) smanager.lookup(UserManager.ROLE); 073 _foUsersManager = (UserManager) smanager.lookup(UserManager.ROLE); 074 _foGroupsManager = (GroupManager) smanager.lookup(GroupManager.ROLE); 075 _i18nUtils = (I18nUtils) smanager.lookup(I18nUtils.ROLE); 076 _userHelper = (UserHelper) smanager.lookup(UserHelper.ROLE); 077 } 078 079 /** 080 * Send a notification for online pages. 081 * @param pageIds the ids of the pages 082 * @param users the users that will be notified 083 * @param groups the groups that will be notified 084 * @param comment the comment of the notifier 085 * @return true 086 */ 087 @Callable 088 public boolean sendOnlineNotification(List<String> pageIds, List<Map<String, String>> users, List<Map<String, String>> groups, String comment) 089 { 090 UserIdentity userIdentity = _currentUserProvider.getUser(); 091 User notifier = _userManager.getUser(userIdentity.getPopulationId(), userIdentity.getLogin()); 092 093 List<UserIdentity> userIdentities = new ArrayList<>(); 094 for (Map<String, String> user : users) 095 { 096 UserIdentity ui = _userHelper.json2userIdentity(user); 097 if (ui != null) 098 { 099 userIdentities.add(ui); 100 } 101 } 102 List<GroupIdentity> groupIdentities = new ArrayList<>(); 103 for (Map<String, String> group : groups) 104 { 105 String id = group.get("groupId"); 106 String groupDirectory = group.get("groupDirectory"); 107 groupIdentities.add(new GroupIdentity(id, groupDirectory)); 108 } 109 Set<User> distinctUsers = _getDistinctUsers (userIdentities, groupIdentities); 110 111 for (String pageId : pageIds) 112 { 113 Page page = _resolver.resolveById(pageId); 114 115 String from = _getSender(notifier, page); 116 String subject = _getSubject (notifier, page); 117 118 for (User user : distinctUsers) 119 { 120 if (StringUtils.isNotEmpty(user.getEmail())) 121 { 122 try 123 { 124 String body = _getBody(notifier, user, page, comment); 125 SendMailHelper.sendMail(subject, null, body, user.getEmail(), from); 126 } 127 catch (MessagingException e) 128 { 129 getLogger().error("Unable to send mail to user " + user.getEmail(), e); 130 } 131 } 132 } 133 } 134 135 return true; 136 } 137 138 /** 139 * Get the email sender 140 * @param sender The user responsible for the action 141 * @param page The published page 142 * @return The sender 143 */ 144 private String _getSender (User sender, Page page) 145 { 146 if (sender != null && sender.getEmail() != null) 147 { 148 return sender.getFullName() + " <" + sender.getEmail() + ">"; 149 } 150 151 Site site = page.getSite(); 152 String defaultFromValue = Config.getInstance().getValue("smtp.mail.from"); 153 return site.getValue("site-mail-from", false, defaultFromValue); 154 } 155 156 /** 157 * Get the email subject 158 * @param sender The user responsible for the notification 159 * @param page The published page 160 * @return The email subject 161 */ 162 private String _getSubject (User sender, Page page) 163 { 164 Site site = page.getSite(); 165 166 Map<String, I18nizableTextParameter> subjectI18nParameters = new HashMap<>(); 167 subjectI18nParameters.put("user", new I18nizableText(sender.getFullName())); 168 subjectI18nParameters.put("siteTitle", new I18nizableText(site.getTitle())); 169 subjectI18nParameters.put("pageTitle", new I18nizableText(page.getTitle())); 170 171 I18nizableText msg = new I18nizableText("plugin.web", "PLUGINS_WEB_PAGE_NOTIFY_ONLINE_PUBLICATION_MAIL_SUBJECT", subjectI18nParameters); 172 173 return _i18nUtils.translate(msg, page.getSitemapName()); 174 } 175 176 /** 177 * Get the email body 178 * @param sender The user responsible for the notification 179 * @param user The recipient of the notification 180 * @param page The published page 181 * @param comment The user's comment. Can be empty or null. 182 * @return The email body 183 */ 184 private String _getBody (User sender, User user, Page page, String comment) 185 { 186 Site site = page.getSite(); 187 188 Map<String, I18nizableTextParameter> bodyI18nParameters = new HashMap<>(); 189 bodyI18nParameters.put("sender", new I18nizableText(sender.getFullName())); 190 bodyI18nParameters.put("user", new I18nizableText(user.getFullName())); 191 bodyI18nParameters.put("siteTitle", new I18nizableText(site.getTitle())); 192 bodyI18nParameters.put("siteUrl", new I18nizableText(site.getUrl())); 193 bodyI18nParameters.put("pageTitle", new I18nizableText(page.getTitle())); 194 bodyI18nParameters.put("pageUrl", new I18nizableText(site.getUrl() + "/" + page.getSitemap().getName() + "/" + page.getPathInSitemap() + ".html")); 195 196 I18nizableText msg = null; 197 if (StringUtils.isNotEmpty(comment)) 198 { 199 bodyI18nParameters.put("comment", new I18nizableText(comment)); 200 msg = new I18nizableText("plugin.web", "PLUGINS_WEB_PAGE_NOTIFY_ONLINE_PUBLICATION_MAIL_BODY_WITH_COMMENT", bodyI18nParameters); 201 } 202 else 203 { 204 msg = new I18nizableText("plugin.web", "PLUGINS_WEB_PAGE_NOTIFY_ONLINE_PUBLICATION_MAIL_BODY", bodyI18nParameters); 205 } 206 207 return _i18nUtils.translate(msg, page.getSitemapName()); 208 } 209 210 private Set<User> _getDistinctUsers (List<UserIdentity> userIdentities, List<GroupIdentity> groupIdentities) 211 { 212 Set<User> users = new HashSet<>(); 213 214 for (UserIdentity userIdentity : userIdentities) 215 { 216 if (userIdentity != null && StringUtils.isNotEmpty(userIdentity.getLogin()) && StringUtils.isNotEmpty(userIdentity.getPopulationId())) 217 { 218 User user = _foUsersManager.getUser(userIdentity.getPopulationId(), userIdentity.getLogin()); 219 if (user != null) 220 { 221 users.add(user); 222 } 223 } 224 } 225 226 for (GroupIdentity groupIdentity : groupIdentities) 227 { 228 if (groupIdentity != null && StringUtils.isNotEmpty(groupIdentity.getId()) && StringUtils.isNotEmpty(groupIdentity.getDirectoryId())) 229 { 230 Group group = _foGroupsManager.getGroup(groupIdentity.getDirectoryId(), groupIdentity.getId()); 231 if (group != null) 232 { 233 Set<UserIdentity> groupUsers = group.getUsers(); 234 for (UserIdentity userIdentity : groupUsers) 235 { 236 User user = _foUsersManager.getUser(userIdentity.getPopulationId(), userIdentity.getLogin()); 237 if (user != null) 238 { 239 users.add(user); 240 } 241 } 242 } 243 } 244 } 245 246 return users; 247 } 248}