Compare commits

..

1 Commits

Author SHA1 Message Date
Ahmed Salah Tawfik Ibrahim c3f9453653 Compatible with social model 2.0.0 2024-02-01 17:17:23 +01:00
7 changed files with 132 additions and 234 deletions

1
.gitignore vendored
View File

@ -1,2 +1 @@
/target/ /target/
/deploy.sh

View File

@ -1,19 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0"> <?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="social-mail-servlet"> <wb-module deploy-name="social-mail-servlet">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/> <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/> <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="context-root" value="social-mail-servlet"/> <property name="context-root" value="social-mail-servlet"/>
<property name="java-output-path" value="/social-mail-servlet/target/classes"/> <property name="java-output-path" value="/social-mail-servlet/target/classes"/>
</wb-module> </wb-module>
</project-modules> </project-modules>

View File

@ -4,16 +4,14 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v3.0.0] - 2024-04-18
- Removed social networking lib dep
## [v2.5.0] - 2021-06-22 ## [v2.5.0] - 2021-06-22
- Feature #21689 Social Mail Servlet to StorageHub migration - Feature #21689 Social Mail Servlet to StorageHub migration
- Removed HomeLibrary Dependency - Removed HomeLibrary Dependency
- Feature #26536 Removed social networking library dependency
## [v2.4.0] - 2019-12-30 ## [v2.4.0] - 2019-12-30
- Ported to git - Ported to git

View File

@ -32,11 +32,18 @@ See [Releases](https://code-repo.d4science.org/gCubeSystem/oauth-service/release
This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details. This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details.
## About the gCube Framework ## About the gCube Framework
This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an
open-source software toolkit used for building and operating Data open-source software toolkit used for building and operating Hybrid Data
Infrastructures enabling the dynamic deployment of Virtual Research Environments Infrastructures enabling the dynamic deployment of Virtual Research Environments
by favouring the realisation of reuse oriented policies. by favouring the realisation of reuse oriented policies.
The projects leading to this software have received funding from a series of European Union programmes see [FUNDING.md](FUNDING.md) The projects leading to this software have received funding from a series of European Union programmes including:
- the Sixth Framework Programme for Research and Technological Development
- DILIGENT (grant no. 004260);
- the Seventh Framework Programme for research, technological development and demonstration
- D4Science (grant no. 212488), D4Science-II (grant no.239019), ENVRI (grant no. 283465), EUBrazilOpenBio (grant no. 288754), iMarine(grant no. 283644);
- the H2020 research and innovation programme
- BlueBRIDGE (grant no. 675680), EGIEngage (grant no. 654142), ENVRIplus (grant no. 654182), Parthenos (grant no. 654119), SoBigData (grant no. 654024),DESIRA (grant no. 818194), ARIADNEplus (grant no. 823914), RISIS2 (grant no. 824091), PerformFish (grant no. 727610), AGINFRAplus (grant no. 731001);

48
pom.xml
View File

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>org.gcube.tools</groupId> <groupId>org.gcube.tools</groupId>
<artifactId>maven-parent</artifactId> <artifactId>maven-parent</artifactId>
<version>1.2.0</version> <version>1.1.0</version>
<relativePath /> <relativePath />
</parent> </parent>
@ -12,7 +12,7 @@
<groupId>org.gcube.portal</groupId> <groupId>org.gcube.portal</groupId>
<artifactId>social-mail-servlet</artifactId> <artifactId>social-mail-servlet</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<version>3.0.0</version> <version>2.5.0</version>
<scm> <scm>
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</connection> <connection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</connection>
<developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</developerConnection> <developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</developerConnection>
@ -37,7 +37,7 @@
<dependency> <dependency>
<groupId>org.gcube.distribution</groupId> <groupId>org.gcube.distribution</groupId>
<artifactId>maven-portal-bom</artifactId> <artifactId>maven-portal-bom</artifactId>
<version>3.7.0</version> <version>3.6.3</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
@ -66,27 +66,27 @@
<artifactId>aslcore</artifactId> <artifactId>aslcore</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!--needs to be provided -->
<dependency> <dependency>
<groupId>org.gcube.applicationsupportlayer</groupId> <groupId>org.gcube.social-networking</groupId>
<artifactId>aslsocial</artifactId> <artifactId>social-service-model</artifactId>
<scope>provided</scope> <version>[1.2.0-SNAPSHOT, 2.0.0)</version>
</dependency>
<dependency>
<groupId>org.gcube.portal</groupId>
<artifactId>social-networking-library</artifactId>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.gcube.social-networking</groupId> <groupId>org.gcube.social-networking</groupId>
<artifactId>social-service-client</artifactId> <artifactId>social-service-client</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0)</version> <version>[2.0.0-SNAPSHOT, 3.0.0)</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>org.gcube.applicationsupportlayer</groupId>
<artifactId>okhttp</artifactId> <artifactId>aslsocial</artifactId>
<version>4.9.3</version> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>storagehub-client-library</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
@ -116,13 +116,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.mail</groupId> <groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId> <artifactId>javax.mail</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -177,6 +171,14 @@
<webappDirectory>${webappDirectory}</webappDirectory> <webappDirectory>${webappDirectory}</webappDirectory>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>

View File

@ -17,18 +17,16 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.gcube.application.framework.core.session.SessionManager;
import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.encryption.StringEncrypter;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint;
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
import org.gcube.common.scope.api.ScopeProvider; 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.EmailPopAccount;
import org.gcube.portal.socialmail.PeriodicTask; import org.gcube.portal.socialmail.PeriodicTask;
import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.api.DiscoveryClient;
import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
import org.gcube.social_networking.social_networking_client_library.LibClient;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.model.CustomAttributeKeys; import org.gcube.vomanagement.usermanagement.model.CustomAttributeKeys;
@ -52,13 +50,14 @@ public class PortalSchedulerService extends HttpServlet {
private static final String POP3_SERVER_NAME = "Pop3MailServer"; private static final String POP3_SERVER_NAME = "Pop3MailServer";
private static DatabookStore store; private static LibClient libClient;
public void init() { public void init() {
PortalContext context = PortalContext.getConfiguration(); try {
String scope = "/" + context.getInfrastructureName(); libClient = new LibClient();
ScopeProvider.instance.set(scope); } catch (Exception e) {
store = new DBCassandraAstyanaxImpl(); throw new RuntimeException(e);
}
} }
@ -78,10 +77,10 @@ public class PortalSchedulerService extends HttpServlet {
int pollingInterval = getPollingInterval(); int pollingInterval = getPollingInterval();
ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1); ScheduledExecutorService pop3Scheduler = Executors.newScheduledThreadPool(1);
pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(store, popAccount, request), 0, pollingInterval, TimeUnit.MINUTES); pop3Scheduler.scheduleAtFixedRate(new PeriodicTask(libClient, popAccount, request), 0, pollingInterval, TimeUnit.MINUTES);
String portalName = "unknown"; String portalName = "unknown";
try { try {
portalName = popAccount.getPortalName() ; popAccount.getPortalName() ;
} }
catch (NullPointerException e){ catch (NullPointerException e){
_log.warn("Could not read popAccount data portal name", e); _log.warn("Could not read popAccount data portal name", e);

View File

@ -2,18 +2,26 @@ package org.gcube.portal.socialmail;
import static org.gcube.common.authorization.client.Constants.authorizationService; import static org.gcube.common.authorization.client.Constants.authorizationService;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.UUID; import java.util.UUID;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
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 javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringEscapeUtils;
@ -26,52 +34,34 @@ import org.gcube.applicationsupportlayer.social.mailing.AppType;
import org.gcube.applicationsupportlayer.social.mailing.SocialMailingUtil; import org.gcube.applicationsupportlayer.social.mailing.SocialMailingUtil;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite;
import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser;
import org.gcube.common.authorization.library.provider.AccessTokenProvider;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.authorization.library.provider.UserInfo; import org.gcube.common.authorization.library.provider.UserInfo;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portal.databook.server.DatabookStore; import org.gcube.common.storagehub.client.plugins.AbstractPlugin;
import org.gcube.portal.databook.shared.Comment; import org.gcube.common.storagehub.client.proxies.MessageManagerClient;
import org.gcube.portal.databook.shared.Feed; import org.gcube.common.storagehub.model.exceptions.IdNotFoundException;
import org.gcube.portal.databook.shared.Like; import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException; import org.gcube.social_networking.socialnetworking.model.shared.Comment;
import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException; import org.gcube.social_networking.socialnetworking.model.shared.Post;
import org.gcube.portal.databook.shared.ex.FeedTypeNotFoundException; import org.gcube.social_networking.socialnetworking.model.shared.Like;
import org.gcube.portal.databook.shared.ex.PrivacyLevelTypeNotFoundException; import org.gcube.social_networking.socialnetworking.model.shared.exceptions.ColumnNameNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PostIDNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PostTypeNotFoundException;
import org.gcube.social_networking.socialnetworking.model.shared.exceptions.PrivacyLevelTypeNotFoundException;
import org.gcube.portal.notifications.bean.GenericItemBean; import org.gcube.portal.notifications.bean.GenericItemBean;
import org.gcube.portal.notifications.thread.CommentNotificationsThread; import org.gcube.portal.notifications.thread.CommentNotificationsThread;
import org.gcube.portal.notifications.thread.LikeNotificationsThread; import org.gcube.portal.notifications.thread.LikeNotificationsThread;
import org.gcube.portal.notifications.thread.MessageNotificationsThread; import org.gcube.portal.notifications.thread.MessageNotificationsThread;
import org.gcube.social_networking.social_networking_client_library.MessageClient; import org.gcube.social_networking.social_networking_client_library.LibClient;
import org.gcube.social_networking.socialnetworking.model.beans.MessageInbox;
import org.gcube.social_networking.socialnetworking.model.beans.MessageInputBean;
import org.gcube.social_networking.socialnetworking.model.beans.Recipient;
import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.UserManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.sun.mail.util.MailSSLSocketFactory; import com.sun.mail.util.MailSSLSocketFactory;
import jakarta.mail.Address;
import jakarta.mail.BodyPart;
import jakarta.mail.Flags;
import jakarta.mail.Folder;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Multipart;
import jakarta.mail.NoSuchProviderException;
import jakarta.mail.Session;
import jakarta.mail.Store;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage.RecipientType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.ResponseBody;
/** /**
* *
* @author Massimiliano Assante, CNR-ISTI * @author Massimiliano Assante, CNR-ISTI
@ -80,15 +70,14 @@ import okhttp3.ResponseBody;
public class PeriodicTask implements Runnable { public class PeriodicTask implements Runnable {
private static final Log _log = LogFactoryUtil.getLog(PeriodicTask.class); private static final Log _log = LogFactoryUtil.getLog(PeriodicTask.class);
private static final String APP_ID_NEWSFEED = "org.gcube.portlets.user.newsfeed.server.NewsServiceImpl"; private static final String APP_ID_NEWSFEED = "org.gcube.portlets.user.newsfeed.server.NewsServiceImpl";
private static final String SHUB_MESSAGES_ENDPOINT = "workspace/messages/";
private DatabookStore socialStore; private LibClient libClient;
private EmailPopAccount popAccount; private EmailPopAccount popAccount;
private SocialNetworkingSite site; private SocialNetworkingSite site;
public PeriodicTask(DatabookStore store, EmailPopAccount popAccount, HttpServletRequest request) { public PeriodicTask(LibClient libClient, EmailPopAccount popAccount, HttpServletRequest request) {
super(); super();
this.socialStore = store; this.libClient = libClient;
this.popAccount = popAccount; this.popAccount = popAccount;
this.site = new SocialNetworkingSite(request); this.site = new SocialNetworkingSite(request);
String serverName = request.getServerName(); String serverName = request.getServerName();
@ -147,20 +136,6 @@ public class PeriodicTask implements Runnable {
} }
return toReturn; return toReturn;
} }
private static String generateAuthorizationToken(String username, String scope) {
List<String> userRoles = new ArrayList<>();
userRoles.add(DEFAULT_ROLE);
String token;
try {
token = authorizationService().generateUserToken(new UserInfo(username, userRoles), scope);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return token;
}
private final static String DEFAULT_ROLE = "OrganizationMember"; private final static String DEFAULT_ROLE = "OrganizationMember";
private static void setAuthorizationToken(ASLSession session) throws Exception { private static void setAuthorizationToken(ASLSession session) throws Exception {
@ -229,8 +204,8 @@ public class PeriodicTask implements Runnable {
if (fakeSession != null && subAddressField != null) { if (fakeSession != null && subAddressField != null) {
if (subAddressField.endsWith(AppType.POST.toString()) || subAddressField.endsWith(AppType.POST.toString().toLowerCase())) { //it is a post, a comment on a post or a mention if (subAddressField.endsWith(AppType.POST.toString()) || subAddressField.endsWith(AppType.POST.toString().toLowerCase())) { //it is a post, a comment on a post or a mention
_log.debug("Looks like a post, a comment on a post or a mention to me"); _log.debug("Looks like a post, a comment on a post or a mention to me");
String feedId = extractIdentifier(subAddressField); String postId = extractIdentifier(subAddressField);
handlePostReply(portalName, feedId, message, fakeSession); handlePostReply(portalName, postId, message, fakeSession);
} }
else if (subAddressField.endsWith(AppType.MSG.toString()) || subAddressField.endsWith(AppType.MSG.toString().toLowerCase())) { //it is a message else if (subAddressField.endsWith(AppType.MSG.toString()) || subAddressField.endsWith(AppType.MSG.toString().toLowerCase())) { //it is a message
_log.debug("Looks like a message reply to me"); _log.debug("Looks like a message reply to me");
@ -275,16 +250,6 @@ public class PeriodicTask implements Runnable {
* @throws Exception * @throws Exception
*/ */
private void handleMessageReply(String portalName, String messageId, Message message, ASLSession fakeSession) { private void handleMessageReply(String portalName, String messageId, Message message, ASLSession fakeSession) {
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
String subject = ""; String subject = "";
String messageText = ""; String messageText = "";
try { try {
@ -296,23 +261,34 @@ public class PeriodicTask implements Runnable {
_log.debug("Found message reply, subject: " + subject + " body: " + messageText); _log.debug("Found message reply, subject: " + subject + " body: " + messageText);
String newMessageId = null; String newMessageId = null;
ArrayList<String> recipientIds = new ArrayList<String>(); List<String> recipientIds = new ArrayList<>();
try { try {
String username = fakeSession.getUsername(); String username = fakeSession.getUsername();
String context = fakeSession.getScope(); String scope = fakeSession.getScope();
ScopeProvider.instance.set(context); ScopeProvider.instance.set(scope);
_log.debug("calling service token on context " + context); _log.debug("calling service token on scope " + scope);
List<String> userRoles = new ArrayList<>(); List<String> userRoles = new ArrayList<>();
userRoles.add(DEFAULT_ROLE); userRoles.add(DEFAULT_ROLE);
fakeSession.setSecurityToken(null); fakeSession.setSecurityToken(null);
String token = authorizationService().generateUserToken(new UserInfo(username, userRoles), context); String token = authorizationService().generateUserToken(new UserInfo(username, userRoles), scope);
SecurityTokenProvider.instance.set(token); SecurityTokenProvider.instance.set(token);
MessageInbox theMessage = null; MessageManagerClient mmClient = AbstractPlugin.messages().build();
_log.info("Looking for Message with id "+ messageId); org.gcube.common.storagehub.model.messages.Message theMessage = null;
String messagesEndpoint = getStorageHubURLFromContext(context)+SHUB_MESSAGES_ENDPOINT; try {
theMessage = getMessageWSById(messagesEndpoint, messageId, token); theMessage = mmClient.get(messageId);
_log.info("Got Message = " + theMessage.toString()); }
catch (IdNotFoundException e) {
_log.warn("Message with id "+ messageId + " could not be found, trying by name ...");
List<org.gcube.common.storagehub.model.messages.Message> messages = mmClient.getReceivedMessages();
Collections.reverse(messages); //the messages are returned in chronological order, but the messages we look for is one of the newests
_log.warn("Messages size="+messages.size());
for(org.gcube.common.storagehub.model.messages.Message msg: messages) {
if (msg.getName().equals(messageId)) {
theMessage = msg;
break;
}
}
}
if (theMessage != null) { if (theMessage != null) {
String[] addresses = theMessage.getAddresses(); String[] addresses = theMessage.getAddresses();
for (int i = 0; i < addresses.length; i++) { for (int i = 0; i < addresses.length; i++) {
@ -326,20 +302,17 @@ public class PeriodicTask implements Runnable {
recipientIds.remove(fakeSession.getUsername()); recipientIds.remove(fakeSession.getUsername());
_log.debug("Message Recipients:"); _log.debug("Message Recipients:");
ArrayList<Recipient> recipients = new ArrayList<Recipient>();
for (String rec : recipientIds) { for (String rec : recipientIds) {
recipients.add(new Recipient(rec));
_log.debug(rec); _log.debug(rec);
} }
_log.debug("Constructing reply message"); _log.debug("Constructing reply message");
messageText += getReplyHeaderMessage(sender, originalSentTime, originalText); messageText += getReplyHeaderMessage(sender, originalSentTime, originalText);
_log.debug("Trying to send message with subject: " + subject + " to: " + recipientIds.toString()); _log.debug("Trying to send message with subject: " + subject + " to: " + recipientIds.toString());
MessageInputBean message2Send = new MessageInputBean(messageText, subject, recipients); newMessageId = mmClient.sendMessage(recipientIds, subject, messageText, new ArrayList<String>());
MessageClient messagesClient = new MessageClient(); } else {
newMessageId = messagesClient.writeMessage(message2Send); _log.error("Message with id "+ messageId + " could not be found even iterating by name, exiting.");
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -363,48 +336,6 @@ public class PeriodicTask implements Runnable {
} }
} }
/**
* temporary method that get the URL of the Shub based on the context
* @param context
* @return the url
*/
private String getStorageHubURLFromContext(String context) {
String toReturn = "";
if (context.startsWith("/d4science")) {
toReturn = "https://api.d4science.org/";
} else if (context.startsWith("/gcube")) {
toReturn = "https://api.dev.d4science.org/";
} else {
toReturn = "https://api.pre.d4science.org/";
}
return toReturn;
}
/**
* read a message from shub given the id
* @param urlString
* @param token
* @return
* @throws IOException
*/
private static MessageInbox getMessageWSById(String uri, String messageId, String token) throws IOException {
String urlString = uri+messageId;
_log.info("***** getMessageWSById urlString = " + urlString);
OkHttpClient client = new OkHttpClient().newBuilder().build();
Request request = new Request.Builder()
.url(urlString)
.addHeader("gcube-token", token)
.build();
ResponseBody responseBody = client.newCall(request).execute().body();
String json = responseBody.string();
_log.info("***** getMessageWSById Response = " + json);
ObjectMapper objectMapper = new ObjectMapper();
MessageInbox theMessage = objectMapper.readValue(json, MessageInbox.class);
return theMessage;
}
private String getReplyHeaderMessage(String senderId, Date date, String message) { private String getReplyHeaderMessage(String senderId, Date date, String message) {
List<String> toPass = new ArrayList<String>(); List<String> toPass = new ArrayList<String>();
toPass.add(senderId); toPass.add(senderId);
@ -439,21 +370,12 @@ public class PeriodicTask implements Runnable {
/** /**
* this method manages the replies coming from post notifications * this method manages the replies coming from post notifications
* @param portalName * @param portalName
* @param postId the identifier in the System managing the feeds * @param postId the identifier in the System managing the posts
* @param message the javax mail Message instance * @param message the javax mail Message instance
* @param fakeSession * @param fakeSession
* @throws Exception * @throws Exception
*/ */
private void handlePostReply(String portalName, String postId, Message message, ASLSession fakeSession) throws Exception { private void handlePostReply(String portalName, String postId, Message message, ASLSession fakeSession) throws Exception {
String token = AccessTokenProvider.instance.get();
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
String commentText = extractText(portalName, postId, message); String commentText = extractText(portalName, postId, message);
_log.info("Extracted id: " + postId + " text=" + commentText); _log.info("Extracted id: " + postId + " text=" + commentText);
String escapedCommentText = org.gcube.portal.socialmail.Utils.escapeHtmlAndTransformUrl(commentText); String escapedCommentText = org.gcube.portal.socialmail.Utils.escapeHtmlAndTransformUrl(commentText);
@ -464,19 +386,13 @@ public class PeriodicTask implements Runnable {
likePost(postId, fakeSession); likePost(postId, fakeSession);
} }
else { else {
Comment comment = new Comment(UUID.randomUUID().toString(), fakeSession.getUsername(), Comment comment = new Comment(UUID.randomUUID().toString(), fakeSession.getUsername(),
new Date(), postId, escapedCommentText, fakeSession.getUserFullName(), fakeSession.getUserAvatarId()); new Date(), postId, escapedCommentText, fakeSession.getUserFullName(), fakeSession.getUserAvatarId());
_log.debug("The EscapedCommentText =>" + escapedCommentText); _log.debug("The EscapedCommentText =>" + escapedCommentText);
boolean commentCommitResult = false; boolean commentCommitResult = false;
try { if (libClient.addCommentLib(comment))
if (socialStore.addComment(comment)) commentCommitResult = true;
commentCommitResult = true;
} catch (FeedIDNotFoundException e) {
_log.error("Related post not found for this comment " + e.getMessage());
e.printStackTrace();
}
if (commentCommitResult) { //the notifications should start if (commentCommitResult) { //the notifications should start
notifyUsersInvolved(comment, escapedCommentText, postId, fakeSession); notifyUsersInvolved(comment, escapedCommentText, postId, fakeSession);
} }
@ -490,46 +406,32 @@ public class PeriodicTask implements Runnable {
* @param fakeSession * @param fakeSession
*/ */
private void likePost(String postId, ASLSession fakeSession) { private void likePost(String postId, ASLSession fakeSession) {
String token = AccessTokenProvider.instance.get();
String legacyToken = SecurityTokenProvider.instance.get();
_log.info("*****username=" + fakeSession.getUsername());
_log.info("*****context=" + fakeSession.getScope());
legacyToken = generateAuthorizationToken(fakeSession.getUsername(), fakeSession.getScope());
SecurityTokenProvider.instance.set(legacyToken);
if (postId == null || postId.compareTo("") == 0) { if (postId == null || postId.compareTo("") == 0) {
_log.warn("Found email with no feedId from " + fakeSession.getUserEmailAddress() + ". Going to trash it"); _log.warn("Found email with no postId from " + fakeSession.getUserEmailAddress() + ". Going to trash it");
return; return;
} }
Like like = new Like(UUID.randomUUID().toString(), fakeSession.getUsername(), Like like = new Like(UUID.randomUUID().toString(), fakeSession.getUsername(),
new Date(), postId, fakeSession.getUserFullName(), fakeSession.getUserAvatarId()); new Date(), postId, fakeSession.getUserFullName(), fakeSession.getUserAvatarId());
boolean likeCommitResult = false; boolean likeCommitResult = false;
try { if (libClient.likeLib(like));
if (socialStore.like(like)); likeCommitResult = true;
likeCommitResult = true;
} catch (FeedIDNotFoundException e) {
_log.error("Related post not found for this like " + e.getMessage());
e.printStackTrace();
}
if (likeCommitResult) { //the notification should be delivered to the post owner if (likeCommitResult) { //the notification should be delivered to the post owner
try { try {
Feed post = socialStore.readFeed(postId); Post post = libClient.readPostLib(postId);
String feedOwnerId = post.getEntityId(); String postOwnerId = post.getEntityId();
boolean isAppFeed = post.isApplicationFeed(); boolean isApppost = post.isApplicationPost();
NotificationsManager nm = new ApplicationNotificationsManager( NotificationsManager nm = new ApplicationNotificationsManager(
site, site,
post.getVreid(), fakeSession.getScope(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()), new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()),
APP_ID_NEWSFEED APP_ID_NEWSFEED
); );
if (! fakeSession.getUsername().equals(feedOwnerId) && (!isAppFeed)) { if (! fakeSession.getUsername().equals(postOwnerId) && (!isApppost)) {
boolean result = nm.notifyLikedFeed(feedOwnerId, postId, ""); boolean result = nm.notifyLikedPost(postOwnerId, postId, "");
_log.trace("Like Notification to post owner added? " + result); _log.trace("Like Notification to post owner added? " + result);
} }
} }
@ -541,48 +443,48 @@ public class PeriodicTask implements Runnable {
/** /**
* this method take care of notify all the users that need to be notified when someone comment * this method take care of notify all the users that need to be notified when someone comment
* @param comment * @param comment
* @param feedId * @param postId
* @param fakeSession * @param fakeSession
* @throws PrivacyLevelTypeNotFoundException * @throws PrivacyLevelTypeNotFoundException
* @throws FeedTypeNotFoundException * @throws PostTypeNotFoundException
* @throws FeedIDNotFoundException * @throws PostIDNotFoundException
* @throws ColumnNameNotFoundException * @throws ColumnNameNotFoundException
*/ */
private void notifyUsersInvolved(Comment comment, String commentText, String feedId, ASLSession fakeSession) throws PrivacyLevelTypeNotFoundException, FeedTypeNotFoundException, FeedIDNotFoundException, ColumnNameNotFoundException { private void notifyUsersInvolved(Comment comment, String commentText, String postId, ASLSession fakeSession) throws PrivacyLevelTypeNotFoundException, PostTypeNotFoundException, PostIDNotFoundException, ColumnNameNotFoundException {
Feed post = socialStore.readFeed(feedId); Post post = libClient.readPostLib(postId);
String feedOwnerId = post.getEntityId(); String postOwnerId = post.getEntityId();
boolean isAppFeed = post.isApplicationFeed(); boolean isApppost = post.isApplicationPost();
//if the user who commented this post is not the user who posted it notifies the poster user (Feed owner) //if the user who commented this post is not the user who posted it notifies the poster user (post owner)
NotificationsManager nm = new ApplicationNotificationsManager( NotificationsManager nm = new ApplicationNotificationsManager(
site, site,
post.getVreid(), post.getVreid(),
new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()), new SocialNetworkingUser(fakeSession.getUsername(), fakeSession.getUserEmailAddress(), fakeSession.getUserFullName(), fakeSession.getUserAvatarId()),
APP_ID_NEWSFEED APP_ID_NEWSFEED
); );
if (! fakeSession.getUsername().equals(feedOwnerId) && (!isAppFeed)) { if (! fakeSession.getUsername().equals(postOwnerId) && (!isApppost)) {
boolean result = nm.notifyOwnCommentReply(feedOwnerId, feedId, commentText, comment.getKey()); boolean result = nm.notifyOwnCommentReply(postOwnerId, postId, commentText, comment.getKey());
_log.trace("Comment Notification to post owner added? " + result); _log.trace("Comment Notification to post owner added? " + result);
} }
//if there are users who liked this post they get notified, asynchronously with this thread //if there are users who liked this post they get notified, asynchronously with this thread
ArrayList<Like> likes = getAllLikesByFeed(feedId); ArrayList<Like> likes = getAllLikesByPost(postId);
Thread likesThread = new Thread(new LikeNotificationsThread(commentText, nm, likes, feedOwnerId, comment.getKey())); Thread likesThread = new Thread(new LikeNotificationsThread(commentText, nm, likes, postOwnerId, comment.getKey()));
likesThread.start(); likesThread.start();
UserManager userManager = new LiferayUserManager(); UserManager userManager = new LiferayUserManager();
//notify the other users who commented this post (excluding the ones above) //notify the other users who commented this post (excluding the ones above)
Thread commentsNotificationthread = new Thread(new CommentNotificationsThread(socialStore, userManager, fakeSession.getUsername(), comment.getFeedid(), commentText, nm, feedOwnerId, comment.getKey(), likes)); Thread commentsNotificationthread = new Thread(new CommentNotificationsThread(userManager, fakeSession.getUsername(), comment.getPostid(), commentText, nm, postOwnerId, comment.getKey(), likes));
commentsNotificationthread.start(); commentsNotificationthread.start();
} }
/** /**
* *
* @param feedid * @param postid
* @return * @return
*/ */
public ArrayList<Like> getAllLikesByFeed(String feedid) { public ArrayList<Like> getAllLikesByPost(String postid) {
_log.trace("Asking likes for " + feedid); _log.trace("Asking likes for " + postid);
ArrayList<Like> toReturn = (ArrayList<Like>) socialStore.getAllLikesByFeed(feedid); ArrayList<Like> toReturn = (ArrayList<Like>) libClient.getAllLikesByPostLib(postid);
return toReturn; return toReturn;
} }
/** /**