From 9bb4c11602b8a1bd31548ce05d81c27f16b860f8 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Fri, 25 Mar 2022 18:38:26 +0100 Subject: [PATCH] Adding message facilities --- pom.xml | 4 +- .../thread/FakeModerationThread.java | 3 + .../thread/MessageModerationThread.java | 61 ++++++++++ .../org/gcube/gcat/rest/RequestFilter.java | 58 +++++++++ .../java/org/gcube/gcat/social/Message.java | 43 +++++++ .../org/gcube/gcat/social/SocialMessage.java | 112 ++++++++++++++++++ 6 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/gcube/gcat/moderation/thread/MessageModerationThread.java create mode 100644 src/main/java/org/gcube/gcat/rest/RequestFilter.java create mode 100644 src/main/java/org/gcube/gcat/social/Message.java create mode 100644 src/main/java/org/gcube/gcat/social/SocialMessage.java diff --git a/pom.xml b/pom.xml index 6b41c16..d5733da 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.gcube.data-catalogue gcat war - 2.2.0-SNAPSHOT + 2.2.0 gCube Catalogue (gCat) Service This service allows any client to publish on the gCube Catalogue. @@ -35,7 +35,7 @@ org.gcube.distribution gcube-smartgears-bom - 2.2.0-SNAPSHOT + 2.1.1 pom import diff --git a/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java b/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java index 7f83175..e7922e2 100644 --- a/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java +++ b/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java @@ -14,12 +14,14 @@ public class FakeModerationThread extends ModerationThread { @Override protected void postMessage(CMItemStatus cmItemStatus, String message) throws Exception { + logger.info("gCat is sending a message to the {} for item '{}' (id={}). ItemStatus={}, Message=\"{}\"", ModerationThread.class.getSimpleName(), itemName, itemID, cmItemStatus, message); } @Override public void postUserMessage(CMItemStatus cmItemStatus, String userMessage) throws Exception { + logger.info("{} is sending a message to the {} for item '{}' (id={}). ItemStatus={}, Message=\"{}\"", SecretManagerProvider.instance.get().getUser().getUsername(), ModerationThread.class.getSimpleName(), itemName, itemID, cmItemStatus, userMessage); @@ -27,6 +29,7 @@ public class FakeModerationThread extends ModerationThread { @Override protected void createModerationThread() throws Exception { + logger.info("Creating {} for item '{}' (id={})", ModerationThread.class.getSimpleName(), itemName, itemID); } diff --git a/src/main/java/org/gcube/gcat/moderation/thread/MessageModerationThread.java b/src/main/java/org/gcube/gcat/moderation/thread/MessageModerationThread.java new file mode 100644 index 0000000..971037c --- /dev/null +++ b/src/main/java/org/gcube/gcat/moderation/thread/MessageModerationThread.java @@ -0,0 +1,61 @@ +package org.gcube.gcat.moderation.thread; + +import java.io.StringWriter; +import java.util.Set; + +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; +import org.gcube.gcat.api.moderation.CMItemStatus; +import org.gcube.gcat.api.moderation.Moderated; +import org.gcube.gcat.social.Message; +import org.gcube.gcat.social.SocialUsers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) + */ +public class MessageModerationThread extends ModerationThread { + + private static final Logger logger = LoggerFactory.getLogger(MessageModerationThread.class); + + protected String getSubject(CMItemStatus cmItemStatus) { + StringWriter stringWriter = new StringWriter(); + stringWriter.append(cmItemStatus.getFancyValue()); + stringWriter.append(itemName); + stringWriter.append(itemID); + + return stringWriter.toString(); + } + + protected Message getMessage(CMItemStatus cmItemStatus, String messageString) throws Exception { + Message message = new Message(); + message.setMessage(messageString); + message.setSubject(getSubject(cmItemStatus)); + Set moderators = SocialUsers.getUsernamesByRole(Moderated.CATALOGUE_MODERATOR); + + message.setUsers(moderators); + + return message; + } + + + @Override + protected void postMessage(CMItemStatus cmItemStatus, String message) throws Exception { + + + + } + + @Override + public void postUserMessage(CMItemStatus cmItemStatus, String userMessage) throws Exception { + logger.info("{} is sending a message to the {} for item '{}' (id={}). ItemStatus={}, Message=\"{}\"", + SecretManagerProvider.instance.get().getUser().getUsername(), + ModerationThread.class.getSimpleName(), itemName, itemID, cmItemStatus, userMessage); + } + + @Override + protected void createModerationThread() throws Exception { + // Nothing to do + } + +} diff --git a/src/main/java/org/gcube/gcat/rest/RequestFilter.java b/src/main/java/org/gcube/gcat/rest/RequestFilter.java new file mode 100644 index 0000000..66c5fa2 --- /dev/null +++ b/src/main/java/org/gcube/gcat/rest/RequestFilter.java @@ -0,0 +1,58 @@ +package org.gcube.gcat.rest; + +import java.io.IOException; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.ext.Provider; + +import org.gcube.common.authorization.library.provider.AccessTokenProvider; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.utils.manager.SecretManager; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; +import org.gcube.common.authorization.utils.secret.GCubeSecret; +import org.gcube.common.authorization.utils.secret.JWTSecret; +import org.gcube.common.authorization.utils.secret.Secret; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +@PreMatching +public class RequestFilter implements ContainerRequestFilter, ContainerResponseFilter { + + private final static Logger logger = LoggerFactory.getLogger(RequestFilter.class); + + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + logger.trace("PreMatching RequestFilter"); + + SecretManagerProvider.instance.reset(); + SecretManager secretManager = new SecretManager(); + + String token = AccessTokenProvider.instance.get(); + if(token!=null) { + Secret secret = new JWTSecret(token); + secretManager.addSecret(secret); + } + + token = SecurityTokenProvider.instance.get(); + if(token!=null) { + Secret secret = new GCubeSecret(token); + secretManager.addSecret(secret); + } + + SecretManagerProvider.instance.set(secretManager); + + } + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) + throws IOException { + logger.trace("ResponseFilter"); + SecretManagerProvider.instance.reset(); + } + +} diff --git a/src/main/java/org/gcube/gcat/social/Message.java b/src/main/java/org/gcube/gcat/social/Message.java new file mode 100644 index 0000000..70e5c2e --- /dev/null +++ b/src/main/java/org/gcube/gcat/social/Message.java @@ -0,0 +1,43 @@ +package org.gcube.gcat.social; + +import java.util.Collection; + +/** + * @author Luca Frosini (ISTI-CNR) + */ +public class Message { + + protected String message; + protected String subject; + protected Collection users; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public Collection getUsers() { + return users; + } + + public void setUsers(Collection users) { + this.users = users; + } + + @Override + public String toString() { + return "Message [message=" + message + ", subject=" + subject + ", users=" + users + "]"; + } + +} diff --git a/src/main/java/org/gcube/gcat/social/SocialMessage.java b/src/main/java/org/gcube/gcat/social/SocialMessage.java new file mode 100644 index 0000000..a13355c --- /dev/null +++ b/src/main/java/org/gcube/gcat/social/SocialMessage.java @@ -0,0 +1,112 @@ +package org.gcube.gcat.social; + +import java.io.StringWriter; +import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; + +import org.gcube.com.fasterxml.jackson.databind.JsonNode; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; +import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; +import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; +import org.gcube.common.authorization.utils.socialservice.SocialService; +import org.gcube.common.gxhttp.request.GXHTTPStringRequest; +import org.gcube.gcat.api.configuration.CatalogueConfiguration; +import org.gcube.gcat.configuration.CatalogueConfigurationFactory; +import org.gcube.gcat.persistence.ckan.CKANUserCache; +import org.gcube.gcat.utils.Constants; +import org.gcube.gcat.utils.HTTPUtility; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) + */ +public class SocialMessage extends Thread { + + private static final Logger logger = LoggerFactory.getLogger(SocialMessage.class); + + public static final String ITEM_URL = "Item URL"; + + // https://wiki.gcube-system.org/gcube/Social_Networking_Service#Send_a_message + protected static final String SOCIAL_SERVICE_SEND_MESSAGE_PATH = "/2/messages/write-message"; + + protected static final String RESPONSE_SUCCESS_KEY = "success"; + protected static final String RESPONSE_MESSAGE_KEY = "message"; + + protected final ObjectMapper objectMapper; + + protected Message message; + protected String itemURL; + protected String itemTitle; + + public SocialMessage() throws Exception { + super(); + this.objectMapper = new ObjectMapper(); + } + + public Message getMessage() { + return message; + } + + public void setMessage(Message message) { + this.message = message; + } + + @Override + public void run() { + + try { + + CatalogueConfiguration instance = CatalogueConfigurationFactory.getInstance(); + + logger.info("Going to send Message about the Item {} available at {}", message, itemURL); + + // write message + sendSocialMessage(); + + } catch(Exception e) { + logger.error("Error while executing post creation actions", e); + } + } + + public void sendSocialMessage() { + + try { + String basePath = SocialService.getSocialService().getServiceBasePath(); + if(basePath == null) { + logger.info("Unable to send a message because there is no social networking service available"); + return; + } + basePath = basePath.endsWith("/") ? basePath : basePath + "/"; + + logger.debug("The message that is going to be send is\n{}", message); + + String messageString = objectMapper.writeValueAsString(message); + + GXHTTPStringRequest gxhttpStringRequest = GXHTTPStringRequest.newRequest(basePath); + gxhttpStringRequest.from(Constants.CATALOGUE_NAME); + gxhttpStringRequest.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + gxhttpStringRequest.setSecurityToken(Constants.getCatalogueSecret().getToken()); + gxhttpStringRequest.path(SOCIAL_SERVICE_SEND_MESSAGE_PATH); + + HttpURLConnection httpURLConnection = gxhttpStringRequest.post(messageString); + String ret = HTTPUtility.getResultAsString(httpURLConnection); + JsonNode jsonNode = objectMapper.readTree(ret); + if(jsonNode.get(RESPONSE_SUCCESS_KEY).asBoolean()) { + logger.info("Message sent : {}", messageString); + } else { + logger.info("Failed to write the message {}. Reason {}", messageString, + jsonNode.get(RESPONSE_MESSAGE_KEY).asText()); + } + } catch(Exception e) { + logger.error("Unable to send the message : " + message.toString(), e); + } + + } + +} \ No newline at end of file