in progress notification plugin
This commit is contained in:
parent
b422fc8b56
commit
b502ad0c2d
|
@ -16,6 +16,76 @@ This module is expected to contain plugin definitions for the generations of not
|
|||
## Documentation
|
||||
[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities.
|
||||
|
||||
This plugin requires a configuration of type:
|
||||
|
||||
```json
|
||||
{
|
||||
"subscribeNotifications": [
|
||||
{
|
||||
"event": "EVENT_NAME",
|
||||
"notificationFor": [
|
||||
{
|
||||
"roles": [
|
||||
"USER_ROLE"
|
||||
],
|
||||
"when": [
|
||||
{
|
||||
"target_phase": [
|
||||
"TARGET_PHASE"
|
||||
],
|
||||
"last_invoked_step": LAST_INVOKED_STEP_1,
|
||||
"notify": [
|
||||
{
|
||||
"type": "NOTIFICATION_TYPE",
|
||||
"send": "true/false",
|
||||
"placeholder_msg": "PLACEHOLDER_MESSAGE_1",
|
||||
"export_as_pdf": {
|
||||
"placeholder_msg": "Export as PDF placeholder",
|
||||
"export": true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"target_phase": [
|
||||
"TARGET_PHASE"
|
||||
],
|
||||
"last_invoked_step": LAST_INVOKED_STEP_2,
|
||||
"notify": [
|
||||
{
|
||||
"type": "NOTIFICATION_TYPE",
|
||||
"send": "true/false",
|
||||
"placeholder_msg": "PLACEHOLDER_MESSAGE_2",
|
||||
"export_as_pdf": {
|
||||
"placeholder_msg": "Export as PDF placeholder",
|
||||
"export": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"enabled":true/false,
|
||||
"link_to_notifications_messages" (mandatory): "link to file containg the messages as properties like PLACEHOLDER_MESSAGE_{N} = value"
|
||||
}
|
||||
```
|
||||
|
||||
Where:
|
||||
|
||||
* `enabled`: (optional) can be true/false. Default is true. It enables or not the plugin.
|
||||
* `link_to_notifications_messages`: it is the URL to Notifications Messages file with placeholder values. A property file like PLACEHOLDER_MESSAGE_{N} = value
|
||||
|
||||
and
|
||||
|
||||
* `EVENT_NAME` (mandatory) can be: `PROJECT_CREATED`, `PROJECT_UPDATED`, `PROJECT_DELETED`, `LIFECYCLE_STEP_PERFORMED`.
|
||||
* `USER_ROLE` (mandatory) can be: `Data-Manager`, `Data-Editor`, `Member"`, `Item_Creator`, `Any`;
|
||||
* `TARGET_PHASE` (mandatory) can be: `DRAFT`, `Pending Approval`, `Published`, `Any`;
|
||||
* `LAST_INVOKED_STEP` (optional) can be: `SUBMIT-FOR-REVIEW`, `APPROVE-SUBMITTED`, `REJECT-DRAFT`, `UNPUBLISH`;
|
||||
* `NOTIFICATION_TYPE` (mandatory) can be: `USER_POST`, `VRE_POST`, `EMAIL`;
|
||||
|
||||
|
||||
## Change log
|
||||
|
||||
|
|
|
@ -14,4 +14,5 @@ public class NotificationEventsSubscribedConfig {
|
|||
UseCaseDescriptor ucd;
|
||||
List<SubscribeNotificationEvent> listNotificationEventSubscribed;
|
||||
String linkToNotificationsMessages;
|
||||
boolean enabled = true;
|
||||
}
|
||||
|
|
|
@ -316,7 +316,9 @@ public class NotificationsPlugin extends AbstractPlugin implements EventListener
|
|||
notificationMapPerContext
|
||||
.setListNotificationEventSubscribed(listNotificationEventsSubscribedPerUCD);
|
||||
String linkToMessages = profileConfiguration.get("link_to_notifications_messages", String.class);
|
||||
Boolean enabledNotifications = profileConfiguration.get("enabled", Boolean.class);
|
||||
notificationMapPerContext.setLinkToNotificationsMessages(linkToMessages);
|
||||
notificationMapPerContext.setEnabled(enabledNotifications);
|
||||
}
|
||||
setNotificationBindingMapPerContext(context, useCaseDescriptor, notificationMapPerContext);
|
||||
|
||||
|
@ -352,7 +354,7 @@ public class NotificationsPlugin extends AbstractPlugin implements EventListener
|
|||
@Override
|
||||
public void doAction(ItemObserved<Project> itemObserved) {
|
||||
log.debug("doAction called...");
|
||||
|
||||
|
||||
boolean isSubscribedEvent = checkIfSubscribedEvent(itemObserved);
|
||||
|
||||
log.info("Is the event {} subscribed in notification plugin configured in the UCD: {} ",
|
||||
|
@ -366,35 +368,34 @@ public class NotificationsPlugin extends AbstractPlugin implements EventListener
|
|||
NotificationEventsSubscribedConfig subscribedConfig = notificationMapPerContext
|
||||
.get(itemObserved.getUCD_Id());
|
||||
|
||||
String linkToFileWithMessages = subscribedConfig.getLinkToNotificationsMessages();
|
||||
List<SubscribeNotificationEvent> list = subscribedConfig.getListNotificationEventSubscribed();
|
||||
boolean subscribeNotificationsEnabled = subscribedConfig.isEnabled();
|
||||
|
||||
//Filtering list of SubscribeNotificationEvent for itemObserved Event
|
||||
List<SubscribeNotificationEvent> filterList = list.stream()
|
||||
.filter(sne -> sne.getEvent().equals(itemObserved.getEvent())).collect(Collectors.toList());
|
||||
log.info("subscribeNotifications enabled: {}", subscribeNotificationsEnabled);
|
||||
|
||||
if (subscribeNotificationsEnabled) {
|
||||
|
||||
String linkToFileWithMessages = subscribedConfig.getLinkToNotificationsMessages();
|
||||
List<SubscribeNotificationEvent> list = subscribedConfig.getListNotificationEventSubscribed();
|
||||
|
||||
// Filtering list of SubscribeNotificationEvent for itemObserved Event
|
||||
List<SubscribeNotificationEvent> filterList = list.stream()
|
||||
.filter(sne -> sne.getEvent().equals(itemObserved.getEvent())).collect(Collectors.toList());
|
||||
|
||||
log.debug(linkToFileWithMessages);
|
||||
NMessagesPlaceholdersSubstitutorUtil nMPlaceholdersSUtil = null;
|
||||
try {
|
||||
nMPlaceholdersSUtil = new NMessagesPlaceholdersSubstitutorUtil(linkToFileWithMessages);
|
||||
} catch (IOException e) {
|
||||
log.error("Error instancing the {}. Please check the URL {}. Returning!!",
|
||||
NMessagesPlaceholdersSubstitutorUtil.class.getSimpleName(), linkToFileWithMessages);
|
||||
return;
|
||||
}
|
||||
|
||||
ManageDoActionNotification mdoact = new ManageDoActionNotification(itemObserved, nMPlaceholdersSUtil,
|
||||
filterList);
|
||||
mdoact.manage();
|
||||
|
||||
log.debug(linkToFileWithMessages);
|
||||
NMessagesPlaceholdersSubstitutorUtil nMPlaceholdersSUtil = null;
|
||||
try {
|
||||
nMPlaceholdersSUtil = new NMessagesPlaceholdersSubstitutorUtil(linkToFileWithMessages);
|
||||
} catch (IOException e) {
|
||||
log.error("Error instancing the {}. Please check the URL {}. Returning!!", NMessagesPlaceholdersSubstitutorUtil.class.getSimpleName(), linkToFileWithMessages);
|
||||
return;
|
||||
}
|
||||
|
||||
ManageDoActionNotification mdoact = new ManageDoActionNotification(itemObserved, nMPlaceholdersSUtil, filterList);
|
||||
mdoact.manage();
|
||||
|
||||
// for (SubscribeNotificationEvent subscribeNotificationEvent : filterList) {
|
||||
// List<NotificationFor> listNotificationFor = subscribeNotificationEvent.getNotificationFor();
|
||||
//
|
||||
// UserUtils.getCurrent().getRoles();
|
||||
//
|
||||
// for (NotificationFor notificationFor : listNotificationFor) {
|
||||
// notificationFor.getRoles();
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,18 +6,6 @@ import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
|
|||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* Instantiates a new notify.
|
||||
*
|
||||
*
|
||||
{
|
||||
"type": "NOTIFICATION_TYPE",
|
||||
"send": "true/false",
|
||||
"placeholder_msg": "PLACEHOLDER_MESSAGE_1",
|
||||
"export_as_pdf": "ExportAsPDF"
|
||||
}
|
||||
*
|
||||
*/
|
||||
@Data
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class Notify {
|
||||
|
|
|
@ -7,62 +7,6 @@ import org.gcube.com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
|||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
||||
*
|
||||
* Jan 30, 2024
|
||||
*/
|
||||
|
||||
/**
|
||||
* Instantiates a new subscribe notification config.
|
||||
*
|
||||
{
|
||||
"subscribeNotifications": [
|
||||
{
|
||||
"event": "EVENT_NAME",
|
||||
"notificationFor": [
|
||||
{
|
||||
"roles": [
|
||||
"USER_ROLE"
|
||||
],
|
||||
"when": [
|
||||
{
|
||||
"target_phase": [
|
||||
"TARGET_PHASE"
|
||||
],
|
||||
"notify": [
|
||||
{
|
||||
"type": "NOTIFICATION_TYPE",
|
||||
"send": "true/false",
|
||||
"attach_pdf_document": "true/false",
|
||||
"message": "PLACEHOLDER_MESSAGE_1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"target_phase": [
|
||||
"TARGET_PHASE"
|
||||
],
|
||||
"notify": [
|
||||
{
|
||||
"type": "NOTIFICATION_TYPE",
|
||||
"send": "true/false",
|
||||
"attach_pdf_document": "true/false",
|
||||
"message": "PLACEHOLDER_MESSAGE_2"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"link_to_messages": "link to file containing the messages as properties like ID_MESSAGE_{N} = value"
|
||||
}
|
||||
*
|
||||
*/
|
||||
|
||||
@Data
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class SubscribeNotificationEvent {
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
package org.gcube.application.cms.notifications.config.serviceaccount;
|
||||
|
||||
import java.util.AbstractMap.SimpleEntry;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.ws.rs.InternalServerErrorException;
|
||||
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
import org.gcube.common.authorization.utils.secret.JWTSecret;
|
||||
import org.gcube.common.authorization.utils.secret.Secret;
|
||||
import org.gcube.common.keycloak.KeycloakClientFactory;
|
||||
import org.gcube.common.keycloak.model.TokenResponse;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class GeoportalServiceAccount {
|
||||
|
||||
//geoportal service account config property file
|
||||
protected static final String CLIENT_ID_PROPERTY_NAME = "clientId";
|
||||
|
||||
private static String clientId = "geoportal";
|
||||
|
||||
private static Entry<String, String> getClientIdAndClientSecret(String context) {
|
||||
try {
|
||||
IAMClientCredentials credentials = IAMClientCredentialsReader.getCredentials();
|
||||
|
||||
clientId = credentials.getClientId()==null?clientId:credentials.getClientId();
|
||||
String clientSecret = credentials.getClientSecret();
|
||||
SimpleEntry<String, String> entry = new SimpleEntry<String, String>(clientId, clientSecret);
|
||||
return entry;
|
||||
} catch(Exception e) {
|
||||
throw new InternalServerErrorException(
|
||||
"Unable to retrieve Application Token for context " + SecretManagerProvider.instance.get().getContext(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private static TokenResponse getJWTAccessToken() throws Exception {
|
||||
String context = SecretManagerProvider.instance.get().getContext();
|
||||
Entry<String,String> entry = getClientIdAndClientSecret(context);
|
||||
TokenResponse tr = KeycloakClientFactory.newInstance().queryUMAToken(context, entry.getKey(), entry.getValue(), context, null);
|
||||
return tr;
|
||||
}
|
||||
|
||||
public static Secret getGeoportalSecret() throws Exception {
|
||||
TokenResponse tr = getJWTAccessToken();
|
||||
Secret secret = new JWTSecret(tr.getAccessToken());
|
||||
return secret;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
package org.gcube.application.cms.notifications.config.serviceaccount;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* The Class IAMClientCredentials.
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
||||
*
|
||||
* Sep 23, 2021
|
||||
*/
|
||||
public class IAMClientCredentials implements Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 7242909633989611318L;
|
||||
private String clientId;
|
||||
private String clientSecret;
|
||||
|
||||
/**
|
||||
* Instantiates a new IAM client credentials.
|
||||
*/
|
||||
public IAMClientCredentials() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new IAM client credentials.
|
||||
*
|
||||
* @param clientId the client id
|
||||
* @param clientSecret the client secret
|
||||
*/
|
||||
public IAMClientCredentials(String clientId, String clientSecret) {
|
||||
this.clientId = clientId;
|
||||
this.clientSecret = clientSecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the client id.
|
||||
*
|
||||
* @return the client id
|
||||
*/
|
||||
public String getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the client secret.
|
||||
*
|
||||
* @return the client secret
|
||||
*/
|
||||
public String getClientSecret() {
|
||||
return clientSecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the client id.
|
||||
*
|
||||
* @param clientId the new client id
|
||||
*/
|
||||
public void setClientId(String clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the client secret.
|
||||
*
|
||||
* @param clientSecret the new client secret
|
||||
*/
|
||||
public void setClientSecret(String clientSecret) {
|
||||
this.clientSecret = clientSecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* To string.
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("IAMClientCredentials [clientId=");
|
||||
builder.append(clientId);
|
||||
builder.append(", clientSecret=");
|
||||
builder.append(clientSecret != null ? clientSecret.subSequence(0, 5) + "_MASKED_SECRET" : null);
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package org.gcube.application.cms.notifications.config.serviceaccount;
|
||||
|
||||
import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
|
||||
import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
import org.gcube.common.encryption.StringEncrypter;
|
||||
import org.gcube.common.resources.gcore.ServiceEndpoint;
|
||||
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
|
||||
import org.gcube.resources.discovery.client.api.DiscoveryClient;
|
||||
import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* The Class GNABaseMapsResourceReader.
|
||||
*
|
||||
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
|
||||
*
|
||||
* Sep 23, 2021
|
||||
*/
|
||||
@Slf4j
|
||||
public class IAMClientCredentialsReader {
|
||||
|
||||
private static final String SE_PROFILE_NAME = "geoportal";
|
||||
private static final String SE_CATEGORY_NAME = "SystemClient";
|
||||
|
||||
/**
|
||||
* Gets the credentials.
|
||||
*
|
||||
* @return the credentials
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
public static IAMClientCredentials getCredentials() throws Exception {
|
||||
|
||||
String currentContext = SecretManagerProvider.instance.get().getContext();
|
||||
|
||||
log.info("Searching SE in the scope: " + currentContext + " with profile name: " + SE_PROFILE_NAME
|
||||
+ " and category name: " + SE_CATEGORY_NAME);
|
||||
|
||||
SimpleQuery query = queryFor(ServiceEndpoint.class);
|
||||
query.addCondition("$resource/Profile/Name/text() eq '" + SE_PROFILE_NAME + "'");
|
||||
query.addCondition("$resource/Profile/Category/text() eq '" + SE_CATEGORY_NAME + "'");
|
||||
|
||||
DiscoveryClient<ServiceEndpoint> client = clientFor(ServiceEndpoint.class);
|
||||
List<ServiceEndpoint> resources = client.submit(query);
|
||||
|
||||
if (resources.size() > 0)
|
||||
log.info("The query returned " + resources.size() + " ServiceEndpoint/s");
|
||||
else
|
||||
throw new RuntimeException("ServiceEndpoint not found. Searching for profile name '" + SE_PROFILE_NAME
|
||||
+ "' and category name '" + SE_CATEGORY_NAME + "' in the scope: " + currentContext);
|
||||
|
||||
ServiceEndpoint se = resources.get(0);
|
||||
Collection<AccessPoint> theAccessPoints = se.profile().accessPoints().asCollection();
|
||||
String clientId = null;
|
||||
String secredPwd = null;
|
||||
for (AccessPoint accessPoint : theAccessPoints) {
|
||||
clientId = accessPoint.username();
|
||||
secredPwd = accessPoint.password();
|
||||
log.debug("Found clientId: " + clientId + " and encrypted secret: " + secredPwd);
|
||||
// decrypting the pwd
|
||||
try {
|
||||
if (secredPwd != null) {
|
||||
secredPwd = StringEncrypter.getEncrypter().decrypt(secredPwd);
|
||||
log.debug("Secret decrypted is: " + secredPwd.substring(0, secredPwd.length() / 2)
|
||||
+ "_MASKED_TOKEN_");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error on decrypting the pwd: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
log.info("Returning keycloack credentials for SE {} read from SE", SE_PROFILE_NAME);
|
||||
return new IAMClientCredentials(clientId, secredPwd);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -87,7 +87,7 @@ public class ManageDoActionNotification {
|
|||
String lastInvokedStep = lInfo.getLastInvokedStep();
|
||||
log.debug("ItemObserved phase is: {}, lastInvokedStep is: {}", itemPhase, lastInvokedStep);
|
||||
|
||||
//final SecretManager cm = SecretManagerProvider.instance.get();
|
||||
// final SecretManager cm = SecretManagerProvider.instance.get();
|
||||
|
||||
for (final NotificationFor notificationFor : listNotificationFor) {
|
||||
// Filtering notifications on 'phase' and 'lastInvokedStep' according to item
|
||||
|
@ -100,16 +100,17 @@ public class ManageDoActionNotification {
|
|||
|
||||
if (notificationsCompliantToPhase != null && notificationsCompliantToPhase.size() > 0) {
|
||||
// GET LIST USER COMPLIANT TO ROLES
|
||||
List<User> notifyUsers = getListUserCompliantToRoles(notificationFor, itemObserved, true);
|
||||
List<User> notifyUsers = getListUserCompliantToRoles(notificationFor, itemObserved, false);
|
||||
final SocialClients socialClients = new SocialClients();
|
||||
CatalogueEventType catalogueEventType = MappingToCatalogue.toCatalogueEventType(itemPhase, lastInvokedStep);
|
||||
|
||||
CatalogueEventType catalogueEventType = MappingToCatalogue.toCatalogueEventType(itemPhase,
|
||||
lastInvokedStep);
|
||||
|
||||
if (notifyUsers.size() > 0) {
|
||||
log.info("Users compliant to role are: {}", notifyUsers.size());
|
||||
if (log.isDebugEnabled()) {
|
||||
notifyUsers.stream().forEach(u -> log.debug("notifying user: " + u));
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
NotifyUsers mnu = new NotifyUsers(socialClients, notificationsCompliantToPhase,
|
||||
nMPlaceholdersS, notifyUsers, catalogueEventType);
|
||||
|
@ -125,8 +126,9 @@ public class ManageDoActionNotification {
|
|||
}
|
||||
|
||||
public static List<NotificationWhen> matchNotificationsAccordingItemStatus(NotificationFor notificationFor,
|
||||
String itemPhase, String lastInvokedStep) {
|
||||
log.info("Filtering notifications according to phase: {}, lastInvokedStep: {}", itemPhase, lastInvokedStep);
|
||||
final String itemPhase, final String lastInvokedStep) {
|
||||
log.info("Filtering notifications according to item status [phase: {}, lastInvokedStep: {}]", itemPhase,
|
||||
lastInvokedStep);
|
||||
|
||||
List<NotificationWhen> filteredList = new ArrayList<NotificationWhen>();
|
||||
|
||||
|
@ -136,20 +138,29 @@ public class ManageDoActionNotification {
|
|||
notificationWhen.getTarget_phase(), notificationWhen.getLast_invoked_step());
|
||||
if (notificationWhen.getTarget_phase().contains(itemPhase) || notificationWhen.getTarget_phase()
|
||||
.contains(NotificationGenericConstants.CUSTOM_TARGET_PHASE.Any.name())) {
|
||||
if (notificationWhen.getLast_invoked_step() == null) {
|
||||
log.debug("target phase: {} - matched", itemPhase);
|
||||
|
||||
String lastInvokedStepConfig = notificationWhen.getLast_invoked_step().trim();
|
||||
log.debug("last_invoked_step read in config is {}", lastInvokedStepConfig);
|
||||
if (lastInvokedStepConfig == null) {
|
||||
log.debug("last_invoked_step is null or empty - {} matched", lastInvokedStep);
|
||||
// no filtering on lastInvokedStep
|
||||
filteredList.add(notificationWhen);
|
||||
|
||||
} else if (notificationWhen.getLast_invoked_step().compareToIgnoreCase(lastInvokedStep) == 0) {
|
||||
}else if (lastInvokedStepConfig.contentEquals(lastInvokedStep)) {
|
||||
log.debug("last_invoked_step: {} - matched", lastInvokedStep);
|
||||
// matching the lastInvokedStep
|
||||
filteredList.add(notificationWhen);
|
||||
} else {
|
||||
log.debug("last_invoked_step {} - NOT matched", lastInvokedStep);
|
||||
}
|
||||
} else {
|
||||
log.debug("target phase: {} - NOT matched", itemPhase);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
log.info("returning filtered list with {} object {}. If 0 returned no notifications is sent", filteredList.size(),
|
||||
NotificationWhen.class.getSimpleName());
|
||||
log.info("returning filtered list with {} object {} (if 0 returned no notifications is sent)",
|
||||
filteredList.size(), NotificationWhen.class.getSimpleName());
|
||||
return filteredList;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,11 +7,13 @@ import java.util.stream.Collectors;
|
|||
|
||||
import org.gcube.application.cms.notifications.config.NotificationWhen;
|
||||
import org.gcube.application.cms.notifications.config.Notify;
|
||||
import org.gcube.application.cms.notifications.config.serviceaccount.GeoportalServiceAccount;
|
||||
import org.gcube.application.cms.notifications.social.SocialClients;
|
||||
import org.gcube.application.cms.notifications.substitutor.NMessagesPlaceholdersSubstitutorUtil;
|
||||
import org.gcube.application.geoportal.common.model.document.accounting.User;
|
||||
import org.gcube.common.authorization.utils.manager.SecretManager;
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
import org.gcube.common.authorization.utils.secret.Secret;
|
||||
import org.gcube.portal.databook.shared.Post;
|
||||
import org.gcube.social_networking.social_networking_client_library.NotificationClient;
|
||||
import org.gcube.social_networking.socialnetworking.model.beans.PostInputBean;
|
||||
|
@ -30,7 +32,8 @@ public class NotifyUsers {
|
|||
private CatalogueEventType catalogueEventType;
|
||||
|
||||
public NotifyUsers(SocialClients socialClients, List<NotificationWhen> listWhen,
|
||||
NMessagesPlaceholdersSubstitutorUtil nMPlaceholdersSUtil, List<User> recipientUsers, CatalogueEventType catalogueEventType) {
|
||||
NMessagesPlaceholdersSubstitutorUtil nMPlaceholdersSUtil, List<User> recipientUsers,
|
||||
CatalogueEventType catalogueEventType) {
|
||||
this.socialClients = socialClients;
|
||||
this.listNotificationWhen = listWhen;
|
||||
this.recipientUsers = recipientUsers;
|
||||
|
@ -38,7 +41,6 @@ public class NotifyUsers {
|
|||
this.catalogueEventType = catalogueEventType;
|
||||
}
|
||||
|
||||
|
||||
public void sendNotification() throws Exception {
|
||||
log.info("send notification...");
|
||||
List<Notify> listNotifies = toNotify();
|
||||
|
@ -51,14 +53,14 @@ public class NotifyUsers {
|
|||
log.debug("Building message...");
|
||||
String subject = "Message";
|
||||
String body = null;
|
||||
|
||||
|
||||
subject = nMPlaceholdersSUtil.replacePlaceholder(notify.getPlaceholder_title());
|
||||
body = nMPlaceholdersSUtil.replacePlaceholder(notify.getPlaceholder_msg());
|
||||
|
||||
|
||||
log.debug("subject: {}", subject);
|
||||
log.debug("body: {}", body);
|
||||
log.info("Sending message to users: {}", recipientUsers);
|
||||
|
||||
|
||||
postMessage(subject, body, catalogueEventType);
|
||||
|
||||
}
|
||||
|
@ -80,7 +82,7 @@ public class NotifyUsers {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private List<Notify> toNotify() {
|
||||
List<Notify> listNotifies = new ArrayList<Notify>();
|
||||
for (NotificationWhen notificationWhen : listNotificationWhen) {
|
||||
|
@ -89,77 +91,83 @@ public class NotifyUsers {
|
|||
}
|
||||
return listNotifies;
|
||||
}
|
||||
|
||||
protected void postMessage(String subject, String bodyMessage, CatalogueEventType catalogueEventType) throws Exception {
|
||||
|
||||
protected void postMessage(String subject, String bodyMessage, CatalogueEventType catalogueEventType)
|
||||
throws Exception {
|
||||
CatalogueEvent catalogueEvent = getCatalogueEvent(subject, bodyMessage);
|
||||
SecretManager secretManager = SecretManagerProvider.instance.get();
|
||||
|
||||
//GET geoportal SECRET
|
||||
|
||||
// Secret secret = Constants.getCatalogueSecret();
|
||||
// if(notificationSentByGCat) {
|
||||
// secretManager.startSession(secret);
|
||||
// }
|
||||
// try {
|
||||
// sendNotification(catalogueEvent);
|
||||
// }finally {
|
||||
// if(notificationSentByGCat) {
|
||||
// secretManager.endSession();
|
||||
// }
|
||||
// }
|
||||
|
||||
//sendNotification(catalogueEvent);
|
||||
try {
|
||||
Secret geoportalSecret = GeoportalServiceAccount.getGeoportalSecret();
|
||||
secretManager.startSession(geoportalSecret);
|
||||
sendNotification(catalogueEvent);
|
||||
} catch (Exception e) {
|
||||
log.error("Error while sending notification", e);
|
||||
} finally {
|
||||
if (secretManager != null) {
|
||||
secretManager.endSession();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void sendNotification(CatalogueEvent catalogueEvent) throws Exception {
|
||||
|
||||
try {
|
||||
Thread thread = new Thread() {
|
||||
public void run() {
|
||||
try {
|
||||
log.debug("{} is going to send the following notification {}",
|
||||
SecretManagerProvider.instance.get().getUser().getUsername(), catalogueEvent);
|
||||
NotificationClient nc = socialClients.getNotificationClient();
|
||||
nc.sendCatalogueEvent(catalogueEvent);
|
||||
} catch (Exception e) {
|
||||
log.error("Error while sending notification from thread", e);
|
||||
} finally {
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
// thread.run();
|
||||
thread.start();
|
||||
} catch (Exception e) {
|
||||
log.error("Error while sending notification", e);
|
||||
}
|
||||
|
||||
// log.debug("{} is going to send the following notification {}", SecretManagerProvider.instance.get().getUser().getUsername(), catalogueEvent);
|
||||
// NotificationClient nc = socialClients.getNotificationClient();
|
||||
// nc.sendCatalogueEvent(catalogueEvent);
|
||||
}
|
||||
|
||||
protected CatalogueEvent getCatalogueEvent(String subject, String bodyMessage) throws Exception {
|
||||
CatalogueEvent catalogueEvent = new CatalogueEvent();
|
||||
catalogueEvent.setType(catalogueEventType);
|
||||
catalogueEvent.setNotifyText(bodyMessage);
|
||||
catalogueEvent.setItemId(subject);
|
||||
String itemURL = nMPlaceholdersSUtil.getPlaceholderMapValues().getGisLink();
|
||||
if(itemURL!=null) {
|
||||
if (itemURL != null) {
|
||||
catalogueEvent.setItemURL(new URL(itemURL));
|
||||
}
|
||||
|
||||
|
||||
// Adding recipient users
|
||||
String[] usersToNotify = recipientUsers.stream().map(u -> u.getUsername()).toArray(String[]::new);
|
||||
catalogueEvent.setIdsToNotify(usersToNotify);
|
||||
catalogueEvent.setIdsAsGroup(false);
|
||||
|
||||
|
||||
return catalogueEvent;
|
||||
}
|
||||
|
||||
|
||||
protected void sendNotification(CatalogueEvent catalogueEvent) throws Exception {
|
||||
Thread thread = new Thread() {
|
||||
public void run() {
|
||||
try {
|
||||
log.trace("{} is going to send the following notification {}", SecretManagerProvider.instance.get().getUser().getUsername(), catalogueEvent);
|
||||
NotificationClient nc = socialClients.getNotificationClient();
|
||||
nc.sendCatalogueEvent(catalogueEvent);
|
||||
} catch(Exception e) {
|
||||
log.error("Error while sending notification.", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
// thread.run();
|
||||
thread.start();
|
||||
}
|
||||
|
||||
protected CatalogueEvent toCatalogueEvent(CatalogueEventType catalogueEventType, String messageString, String subject, String itemURL, List<String> users) throws Exception {
|
||||
protected CatalogueEvent toCatalogueEvent(CatalogueEventType catalogueEventType, String messageString,
|
||||
String subject, String itemURL, List<String> users) throws Exception {
|
||||
CatalogueEvent catalogueEvent = new CatalogueEvent();
|
||||
catalogueEvent.setType(catalogueEventType);
|
||||
catalogueEvent.setNotifyText(messageString);
|
||||
catalogueEvent.setItemId(subject);
|
||||
if(itemURL!=null) {
|
||||
if (itemURL != null) {
|
||||
catalogueEvent.setItemURL(new URL(itemURL));
|
||||
}
|
||||
catalogueEvent.setIdsToNotify(users.toArray(new String[users.size()]));
|
||||
catalogueEvent.setIdsAsGroup(false);
|
||||
|
||||
|
||||
return catalogueEvent;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -75,11 +75,9 @@ public class CatalogueBindingPluginTest extends BasicPluginTest {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void checkNotifications() {
|
||||
//@Test
|
||||
public void checkNotifications_LIFECYCLE_STEP_PERFORMED() {
|
||||
org.junit.Assume.assumeTrue(GCubeTest.isTestInfrastructureEnabled());
|
||||
// NotificationsPlugin plugin = (NotificationsPlugin)
|
||||
// plugins.get(NotificationsPlugin.DESCRIPTOR.getId());
|
||||
UseCaseDescriptor descriptor = TestProfiles.profiles.get("profiledConcessioni");
|
||||
|
||||
NotificationEventsSubscribedConfig notificationEventsSubs;
|
||||
|
@ -93,7 +91,48 @@ public class CatalogueBindingPluginTest extends BasicPluginTest {
|
|||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
ItemObserved<Project> item = mockItemObserverd();
|
||||
|
||||
EventManager.Event event = Event.LIFECYCLE_STEP_PERFORMED;
|
||||
item.setEvent(event);
|
||||
|
||||
LifecycleInformation lifecycleInfo = item.getProject().getLifecycleInformation();
|
||||
//(Pending Approval, "SUBMIT-FOR-REVIEW")
|
||||
// lifecycleInfo.setPhase("Pending Approval");
|
||||
// lifecycleInfo.setLastInvokedStep("SUBMIT-FOR-REVIEW");
|
||||
//(DRAFT, REJECT-DRAFT)
|
||||
lifecycleInfo.setPhase("DRAFT");
|
||||
lifecycleInfo.setLastInvokedStep("REJECT-DRAFT");
|
||||
|
||||
System.out.println("By notifying event " + event + " project " + item.getProjectId());
|
||||
EventManager.getInstance().notify(event, item);
|
||||
}
|
||||
|
||||
private void sysOut(SubscribeNotificationEvent subscribeNotificationEvent) {
|
||||
System.out.println("\n#SubscribeNotificationEvent - Event: " + subscribeNotificationEvent.getEvent());
|
||||
List<NotificationFor> listNotificationFor = subscribeNotificationEvent.getNotificationFor();
|
||||
for (NotificationFor notificationFor : listNotificationFor) {
|
||||
System.out.println("\tNotificationFor - roles: " + notificationFor.getRoles());
|
||||
for (NotificationWhen notificationWhen : notificationFor.getWhen()) {
|
||||
System.out.println("\t\tNotificationWhen - Target_phase: " + notificationWhen.getTarget_phase()
|
||||
+ ", Last_invoked_step: " + notificationWhen.getLast_invoked_step());
|
||||
for (Notify notify : notificationWhen.getNotify()) {
|
||||
System.out.println("\t\t\tNotify type : " + notify.getType());
|
||||
System.out.println("\t\t\tNotify send : " + notify.getSend());
|
||||
System.out.println("\t\t\tNotify placeholder_message : " + notify.getPlaceholder_msg());
|
||||
if (notify.getExport_as_pdf() != null) {
|
||||
System.out.println("\t\t\t\tExport as PDF : " + notify.getExport_as_pdf());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ItemObserved<Project> mockItemObserverd() {
|
||||
|
||||
UseCaseDescriptor descriptor = TestProfiles.profiles.get("profiledConcessioni");
|
||||
|
||||
// notifying the Event.PROJECT_CREATED;
|
||||
ItemObserved<Project> item = new ItemObserved<Project>();
|
||||
EventManager.Event event = Event.LIFECYCLE_STEP_PERFORMED;
|
||||
|
@ -119,52 +158,51 @@ public class CatalogueBindingPluginTest extends BasicPluginTest {
|
|||
testProject.setTheDocument(theDocument);
|
||||
|
||||
LifecycleInformation lifecycleInfo = new LifecycleInformation();
|
||||
lifecycleInfo.setPhase("Pending Approval");
|
||||
lifecycleInfo.setLastInvokedStep("SUBMIT-FOR-REVIEW");
|
||||
//Pending Approval, "SUBMIT-FOR-REVIEW"
|
||||
// lifecycleInfo.setPhase("Pending Approval");
|
||||
// lifecycleInfo.setLastInvokedStep("SUBMIT-FOR-REVIEW");
|
||||
|
||||
lifecycleInfo.setPhase("DRAFT");
|
||||
lifecycleInfo.setLastInvokedStep("REJECT-DRAFT");
|
||||
|
||||
testProject.setLifecycleInformation(lifecycleInfo);
|
||||
|
||||
item.setProject(testProject);
|
||||
System.out.println("By notifying event " + event + " project " + item.getProjectId());
|
||||
EventManager.getInstance().notify(event, item);
|
||||
|
||||
}
|
||||
|
||||
private void sysOut(SubscribeNotificationEvent subscribeNotificationEvent) {
|
||||
System.out.println("\n#SubscribeNotificationEvent - Event: " + subscribeNotificationEvent.getEvent());
|
||||
List<NotificationFor> listNotificationFor = subscribeNotificationEvent.getNotificationFor();
|
||||
for (NotificationFor notificationFor : listNotificationFor) {
|
||||
System.out.println("\tNotificationFor - roles: " + notificationFor.getRoles());
|
||||
for (NotificationWhen notificationWhen : notificationFor.getWhen()) {
|
||||
System.out.println("\t\tNotificationWhen - Target_phase: " + notificationWhen.getTarget_phase()
|
||||
+ ", Last_invoked_step: " + notificationWhen.getLast_invoked_step());
|
||||
for (Notify notify : notificationWhen.getNotify()) {
|
||||
System.out.println("\t\t\tNotify type : " + notify.getType());
|
||||
System.out.println("\t\t\tNotify send : " + notify.getSend());
|
||||
System.out.println("\t\t\tNotify placeholder_message : " + notify.getPlaceholder_msg());
|
||||
if (notify.getExport_as_pdf() != null) {
|
||||
System.out.println("\t\t\t\tExport as PDF : " + notify.getExport_as_pdf());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
//@Test
|
||||
public void matchingNotificationTest() {
|
||||
org.junit.Assume.assumeTrue(GCubeTest.isTestInfrastructureEnabled());
|
||||
|
||||
String itemPhase = "Pending Approval";
|
||||
String lastInvokedStep = "SUBMIT-FOR-REVIEW";
|
||||
// String itemPhase = "Pending Approval";
|
||||
// String lastInvokedStep = "SUBMIT-FOR-REVIEW";
|
||||
|
||||
String itemPhase = "DRAFT";
|
||||
String lastInvokedStep = "REJECT-DRAFT";
|
||||
|
||||
UseCaseDescriptor descriptor = TestProfiles.profiles.get("profiledConcessioni");
|
||||
NotificationEventsSubscribedConfig notificationEventsSubs;
|
||||
List<NotificationWhen> listWhen = new ArrayList<NotificationWhen>();
|
||||
try {
|
||||
System.out.println(NotificationEventsSubscribedConfig.class.getSimpleName() + ": ");
|
||||
notificationEventsSubs = plugin.readNotificationsSubscribedFromConfigurationInTheUCD(descriptor);
|
||||
List<SubscribeNotificationEvent> events = notificationEventsSubs.getListNotificationEventSubscribed();
|
||||
for (SubscribeNotificationEvent subscribeNotificationEvent : events) {
|
||||
for (NotificationFor notificationFor : subscribeNotificationEvent.getNotificationFor()) {
|
||||
listWhen.addAll(ManageDoActionNotification.matchNotificationsAccordingItemStatus(notificationFor, itemPhase, lastInvokedStep));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
/*
|
||||
SubscribeNotificationEvent sne = mockSubscribeNotificationEvent();
|
||||
for (NotificationFor notificationFor : sne.getNotificationFor()) {
|
||||
listWhen.addAll(ManageDoActionNotification.matchNotificationsAccordingItemStatus(notificationFor, itemPhase, lastInvokedStep));
|
||||
}
|
||||
|
||||
*/
|
||||
System.out.println("Filtered notifications: "+listWhen);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// @Test
|
||||
|
@ -201,11 +239,16 @@ public class CatalogueBindingPluginTest extends BasicPluginTest {
|
|||
NotificationFor notificatioFor = new NotificationFor();
|
||||
notificatioFor.setRoles(Arrays.asList("Data-Manager"));
|
||||
|
||||
//Pending Approval, "SUBMIT-FOR-REVIEW"
|
||||
List<NotificationWhen> listWhen = new ArrayList<NotificationWhen>();
|
||||
NotificationWhen notificationWhen = new NotificationWhen();
|
||||
|
||||
notificationWhen.setTarget_phase(Arrays.asList("Pending Approval"));
|
||||
notificationWhen.setLast_invoked_step("SUBMIT-FOR-REVIEW");
|
||||
|
||||
|
||||
// notificationWhen.setTarget_phase(Arrays.asList("DRAFT"));
|
||||
// notificationWhen.setLast_invoked_step("REJECT-DRAFT");
|
||||
|
||||
Notify notify = new Notify();
|
||||
notify.setType(NOTIFICATION_TYPE.EMAIL);
|
||||
notify.setSend(true);
|
||||
|
@ -221,7 +264,7 @@ public class CatalogueBindingPluginTest extends BasicPluginTest {
|
|||
notificatioFor.setWhen(listWhen);
|
||||
|
||||
listNotificationFor.add(notificatioFor);
|
||||
|
||||
|
||||
sne.setNotificationFor(listNotificationFor);
|
||||
|
||||
return sne;
|
||||
|
|
|
@ -2,9 +2,7 @@ import java.io.BufferedInputStream;
|
|||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.text.StringSubstitutor;
|
||||
|
@ -31,7 +29,7 @@ public class StringReplacerTest {
|
|||
|
||||
public static String FILE_URL = "https://code-repo.d4science.org/gCubeSystem/gcube-cms-suite/raw/branch/event_manager/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages.properties";
|
||||
|
||||
@Test
|
||||
//@Test
|
||||
public void checkReplace() {
|
||||
org.junit.Assume.assumeTrue(GCubeTest.isTestInfrastructureEnabled());
|
||||
|
||||
|
|
Loading…
Reference in New Issue