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