ported to lR 62

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portal/social-mail-servlet@128670 82a268e6-3cf1-43bd-a215-b396298e98cf
Feature/21689
Massimiliano Assante 8 years ago
parent d682008289
commit 3348311331

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="jst.web" version="2.3"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.7"/>
<installed facet="jst.jaxrs" version="2.0"/>

@ -11,13 +11,13 @@
<groupId>org.gcube.portal</groupId>
<artifactId>social-mail-servlet</artifactId>
<packaging>war</packaging>
<version>1.4.0-SNAPSHOT</version>
<version>2.0.0-SNAPSHOT</version>
<name>social-mail-servlet Webapp</name>
<description>This component read periodically email replies from user wanting to reply to a post via email</description>
<properties>
<java-version>1.7</java-version>
<liferay-version>6.0.6</liferay-version>
<liferay-version>6.2.5</liferay-version>
<distroDirectory>${project.basedir}/distro</distroDirectory>
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
<distroDirectory>distro</distroDirectory>

@ -4,6 +4,7 @@ import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@ -18,16 +19,26 @@ import org.gcube.common.encryption.StringEncrypter;
import org.gcube.common.portal.PortalContext;
import org.gcube.common.resources.gcore.ServiceEndpoint;
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
import org.gcube.common.resources.gcore.utils.Group;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portal.databook.server.DBCassandraAstyanaxImpl;
import org.gcube.portal.databook.server.DatabookStore;
import org.gcube.portal.socialmail.EmailPopAccount;
import org.gcube.portal.socialmail.PeriodicTask;
import org.gcube.resources.discovery.client.api.DiscoveryClient;
import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.model.CustomAttributeKeys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.VirtualHost;
import com.liferay.portal.service.LayoutSetLocalServiceUtil;
import com.liferay.portal.service.VirtualHostLocalServiceUtil;
@SuppressWarnings("serial")
public class PortalSchedulerService extends HttpServlet {
@ -35,52 +46,105 @@ public class PortalSchedulerService extends HttpServlet {
private static final Logger _log = LoggerFactory.getLogger(PortalSchedulerService.class);
private static final String POP3_SERVER_NAME = "Pop3MailServer";
private static final int POP3_MINUTES_DELAY = 1;
private static DatabookStore store;
private String portalName;
private String pop3Server;
private String pop3user;
private String pop3password;
public void init() {
store = new DBCassandraAstyanaxImpl();
portalName = PortalContext.getPortalInstanceName();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Group site;
EmailPopAccount popAccount = null;
try {
site = getSiteFromServletRequest(request);
popAccount = getPopAccountData(site);
} catch (Exception e) {
e.printStackTrace();
}
ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1);
pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(store, popAccount, request), 0, POP3_MINUTES_DELAY, TimeUnit.MINUTES);
String toReturn = "<DIV>Check Notification Email Started ... </DIV>";
response.setContentType("text/html");
response.getWriter().write(toReturn);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
/**
*
* @param request
* @return the current Group instance based on the request
* @throws PortalException
* @throws SystemException
*/
private Group getSiteFromServletRequest(final HttpServletRequest request) throws PortalException, SystemException {
String serverName = request.getServerName();
_log.debug("currentHost is " + serverName);
Group site = null;
List<VirtualHost> vHosts = VirtualHostLocalServiceUtil.getVirtualHosts(0, VirtualHostLocalServiceUtil.getVirtualHostsCount());
for (VirtualHost virtualHost : vHosts) {
_log.debug("Found " + virtualHost.getHostname());
if (virtualHost.getHostname().compareTo("localhost") != 0 &&
virtualHost.getLayoutSetId() != 0 &&
virtualHost.getHostname().compareTo(serverName) == 0) {
long layoutSetId = virtualHost.getLayoutSetId();
site = LayoutSetLocalServiceUtil.getLayoutSet(layoutSetId).getGroup();
_log.debug("Found match! Your site is " + site.getName());
return site;
}
}
return null;
}
private EmailPopAccount getPopAccountData(Group site) throws GroupRetrievalFault {
_log.debug("Found site for vhost, name " + site.getName() + " reading custom field: " + CustomAttributeKeys.GATEWAY_SITE_NAME);
String gatewayName = (String) new LiferayGroupManager().readCustomAttr(site.getGroupId(), CustomAttributeKeys.GATEWAY_SITE_NAME.getKeyName());
//set the scope for the query
String curScope = ScopeProvider.instance.get();
PortalContext context = PortalContext.getConfiguration();
String scope = "/" + context.getInfrastructureName();
ScopeProvider.instance.set(scope);
String scope2Set = "/" + context.getInfrastructureName();
ScopeProvider.instance.set(scope2Set);
EmailPopAccount toReturn = new EmailPopAccount();
toReturn.setPortalName(gatewayName);
SimpleQuery query = queryFor(ServiceEndpoint.class);
query.addCondition("$resource/Profile/Category/text() eq 'Portal'");
query.addCondition("$resource/Profile/Name/text() eq '" + portalName + "'");
query.addCondition("$resource/Profile/Name/text() eq '" + gatewayName + "'");
DiscoveryClient<ServiceEndpoint> client = clientFor(ServiceEndpoint.class);
List<ServiceEndpoint> list = client.submit(query);
if (list == null || list.isEmpty()) {
_log.error("Could not find any Service endpoint registred in the infrastructure for this portal: " + portalName);
_log.error("Could not find any Service endpoint registred in the infrastructure for this gateway: " + gatewayName);
return null;
}
else if (list.size() > 1) {
_log.warn("Found more than one Service endpoint registred in the infrastructure for this portal: " + portalName);
_log.warn("Found more than one Service endpoint registred in the infrastructure for this gateway: " + gatewayName);
return null;
}
else {
for (ServiceEndpoint res : list) {
Group<AccessPoint> apGroup = res.profile().accessPoints();
org.gcube.common.resources.gcore.utils.Group<AccessPoint> apGroup = res.profile().accessPoints();
AccessPoint[] accessPoints = (AccessPoint[]) apGroup.toArray(new AccessPoint[apGroup.size()]);
for (int i = 0; i < accessPoints.length; i++) {
if (accessPoints[i].name().compareTo(POP3_SERVER_NAME) == 0) {
_log.info("Found credentials for " + POP3_SERVER_NAME);
AccessPoint found = accessPoints[i];
pop3Server = found.address();
pop3user = found.username();
toReturn.setPop3Server(found.address());
toReturn.setPop3user(found.username());
String encrPassword = found.password();
try {
pop3password = StringEncrypter.getEncrypter().decrypt( encrPassword);
toReturn.setPop3password(StringEncrypter.getEncrypter().decrypt( encrPassword));
} catch (Exception e) {
_log.error("Something went wrong while decrypting password for " + POP3_SERVER_NAME);
e.printStackTrace();
@ -89,18 +153,12 @@ public class PortalSchedulerService extends HttpServlet {
}
}
}
//set the previous scope
ScopeProvider.instance.set(curScope);
return toReturn;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1);
pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(store, portalName, pop3Server, pop3user, pop3password), 0, POP3_MINUTES_DELAY, TimeUnit.MINUTES);
String toReturn = "<DIV>Check Notification Email Started ... </DIV>";
response.setContentType("text/html");
response.getWriter().write(toReturn);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

@ -0,0 +1,53 @@
package org.gcube.portal.socialmail;
import java.io.Serializable;
@SuppressWarnings("serial")
public class EmailPopAccount implements Serializable {
private String portalName;
private String pop3Server;
private String pop3user;
private String pop3password;
public EmailPopAccount() {
this.portalName = "";
this.pop3Server = "";
this.pop3user = "";
this.pop3password = "";
}
public EmailPopAccount(String portalName, String pop3Server,
String pop3user, String pop3password) {
super();
this.portalName = portalName;
this.pop3Server = pop3Server;
this.pop3user = pop3user;
this.pop3password = pop3password;
}
public String getPortalName() {
return portalName;
}
public void setPortalName(String portalName) {
this.portalName = portalName;
}
public String getPop3Server() {
return pop3Server;
}
public void setPop3Server(String pop3Server) {
this.pop3Server = pop3Server;
}
public String getPop3user() {
return pop3user;
}
public void setPop3user(String pop3user) {
this.pop3user = pop3user;
}
public String getPop3password() {
return pop3password;
}
public void setPop3password(String pop3password) {
this.pop3password = pop3password;
}
}

@ -19,6 +19,7 @@ import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.http.HttpServletRequest;
import org.gcube.application.framework.core.session.ASLSession;
import org.gcube.application.framework.core.session.SessionManager;
@ -26,7 +27,8 @@ import org.gcube.application.framework.core.util.GenderType;
import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager;
import org.gcube.applicationsupportlayer.social.NotificationsManager;
import org.gcube.applicationsupportlayer.social.mailing.AppType;
import org.gcube.applicationsupportlayer.social.mailing.EmailPlugin;
import org.gcube.applicationsupportlayer.social.mailing.SocialMailingUtil;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser;
import org.gcube.common.homelibrary.home.HomeLibrary;
import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException;
@ -37,7 +39,6 @@ import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNot
import org.gcube.common.homelibrary.home.workspace.sharing.WorkspaceMessage;
import org.gcube.common.homelibrary.home.workspace.sharing.WorkspaceMessageManager;
import org.gcube.common.portal.PortalContext;
import org.gcube.portal.custom.communitymanager.OrganizationsUtil;
import org.gcube.portal.databook.server.DatabookStore;
import org.gcube.portal.databook.shared.Comment;
import org.gcube.portal.databook.shared.Feed;
@ -50,13 +51,12 @@ import org.gcube.portal.notifications.bean.GenericItemBean;
import org.gcube.portal.notifications.thread.CommentNotificationsThread;
import org.gcube.portal.notifications.thread.LikeNotificationsThread;
import org.gcube.portal.notifications.thread.MessageNotificationsThread;
import org.gcube.vomanagement.usermanagement.UserManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.sun.mail.util.MailSSLSocketFactory;
/**
@ -68,24 +68,24 @@ public class PeriodicTask implements Runnable {
private static final Logger _log = LoggerFactory.getLogger(PeriodicTask.class);
private DatabookStore socialStore;
private String host;
private String mailserver_username;
private String password;
private String portalName;
private EmailPopAccount popAccount;
private SocialNetworkingSite site;
public PeriodicTask(DatabookStore store, String portalName, String host, String mailserver_username, String password) {
public PeriodicTask(DatabookStore store, EmailPopAccount popAccount, HttpServletRequest request) {
super();
this.socialStore = store;
this.portalName = portalName;
this.host = host;
this.mailserver_username = mailserver_username;
this.password = password;
this.popAccount = popAccount;
this.site = new SocialNetworkingSite(request);
String serverName = request.getServerName();
//needed because the servlet is called via http
this.site.setSiteURL("https://"+serverName);
_log.debug("PeriodicTask instanciated, request serverName=" + serverName);
}
@Override
public void run() {
check(portalName, host, mailserver_username, password);
check(popAccount.getPortalName(), popAccount.getPop3Server(), popAccount.getPop3user(), popAccount.getPop3password());
}
/**
@ -95,19 +95,17 @@ public class PeriodicTask implements Runnable {
String sessionID = UUID.randomUUID().toString();
PortalContext context = PortalContext.getConfiguration();
String scope = "/" + context.getInfrastructureName();
String username = "";
long companyId;
try {
companyId = OrganizationsUtil.getCompany().getCompanyId();
User user = UserLocalServiceUtil.getUserByEmailAddress(companyId, emailAddress);
username = user.getScreenName();
UserManager um = new LiferayUserManager();
GCubeUser user = um.getUserByEmail(emailAddress);
username = user.getUsername();
SessionManager.getInstance().getASLSession(sessionID, username).setScope(scope);
//add the social information needed by apps
String fullName = user.getFirstName() + " " + user.getLastName();
String email = user.getEmailAddress();
String thumbnailURL = "/image/user_male_portrait?img_id="+user.getPortraitId();
String email = user.getEmail();
String thumbnailURL = user.getUserAvatarURL();
boolean isMale = user.isMale();
SessionManager.getInstance().getASLSession(sessionID, username).setUserFullName(fullName);
@ -117,7 +115,7 @@ public class PeriodicTask implements Runnable {
_log.debug("Created fakesession for user " + username + " email="+emailAddress);
} catch (PortalException | SystemException e) {
} catch (Exception e) {
_log.error("Exception while trying to get the user from email address: " + e.getMessage());
return null;
}
@ -264,10 +262,11 @@ public class PeriodicTask implements Runnable {
_log.debug("Message with subject: " + subject, " hase been sent, returned id: " + newMessageId);
if (newMessageId != null) {
_log.debug("Sending message notifications ... ");
_log.debug("Sending message notifications ... site server URL= " + site.getSiteURL());
List<GenericItemBean> recipients = getUsersbyUserId(recipientIds);
NotificationsManager nm = new ApplicationNotificationsManager(
site,
fakeSession.getScope(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId())
);
@ -298,11 +297,11 @@ public class PeriodicTask implements Runnable {
private List<GenericItemBean> getUsersbyUserId(List<String> recipientIds) {
List<GenericItemBean> recipients = new ArrayList<GenericItemBean>();
for (String userid : recipientIds) {
com.liferay.portal.model.User user;
GCubeUser user;
try {
user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), userid);
recipients.add(new GenericItemBean(""+user.getUserId(), user.getScreenName(), user.getFullName(), ""));
} catch (PortalException | SystemException e) {
user = new LiferayUserManager().getUserByUsername(userid);
recipients.add(new GenericItemBean(""+user.getUserId(), user.getUsername(), user.getFullname(), ""));
} catch (Exception e) {
e.printStackTrace();
}
}
@ -320,7 +319,7 @@ public class PeriodicTask implements Runnable {
private void handlePostReply(String portalName, String feedId, Message message, ASLSession fakeSession) throws Exception {
String commentText = extractText(portalName, feedId, message);
_log.info("Extracted id: " + feedId + " text=" + commentText);
String escapedCommentText = Utils.escapeHtmlAndTransformUrl(commentText);
String escapedCommentText = org.gcube.portal.socialmail.Utils.escapeHtmlAndTransformUrl(commentText);
String subject = message.getSubject();
if (escapedCommentText.trim().compareTo("") == 0) {//it is a favorite/subscription
@ -377,6 +376,7 @@ public class PeriodicTask implements Runnable {
boolean isAppFeed = feed.isApplicationFeed();
NotificationsManager nm = new ApplicationNotificationsManager(
site,
fakeSession.getScope(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId())
);
@ -407,6 +407,7 @@ public class PeriodicTask implements Runnable {
//if the user who commented this post is not the user who posted it notifies the poster user (Feed owner)
NotificationsManager nm = new ApplicationNotificationsManager(
site,
fakeSession.getScope(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId())
);
@ -473,7 +474,7 @@ public class PeriodicTask implements Runnable {
try {
messageContent = message.getContent();
String toParse = null;
final String SEPARATOR = EmailPlugin.WRITE_ABOVE_TO_REPLY.substring(0, 23);
final String SEPARATOR = SocialMailingUtil.WRITE_ABOVE_TO_REPLY.substring(0, 23);
// Check if content is pure text/html or in parts
if (messageContent instanceof Multipart) {
_log.debug("Checking if isValidReply, found Multipart Message, getting text part ... looking for separator " + SEPARATOR);
@ -512,7 +513,7 @@ public class PeriodicTask implements Runnable {
private static String extractText(String portalName, String subjectId, Message message) throws Exception {
Object messageContent = message.getContent();
String toParse = null;
final String SEPARATOR = EmailPlugin.WRITE_ABOVE_TO_REPLY.substring(0, 23);
final String SEPARATOR = SocialMailingUtil.WRITE_ABOVE_TO_REPLY.substring(0, 23);
// Check if content is pure text/html or in parts
if (messageContent instanceof Multipart) {
_log.debug("Found Multipart Message, getting text part ... looking for separator " + SEPARATOR);

@ -1,8 +1,9 @@
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<web-app>
<display-name>Email Comments Reader Webapp</display-name>
<servlet>

Loading…
Cancel
Save