You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by js...@apache.org on 2022/08/25 14:47:38 UTC
[unomi] 01/01: UNOMI-623 : store ids and types of events in session when it's created
This is an automated email from the ASF dual-hosted git repository.
jsinovassinnaik pushed a commit to branch UNOMI-623-store-event-creation-ids
in repository https://gitbox.apache.org/repos/asf/unomi.git
commit f5feb8f0ef496bbad868bff179c567368d40e079
Author: jsinovassin <js...@jahia.com>
AuthorDate: Thu Aug 25 16:47:15 2022 +0200
UNOMI-623 : store ids and types of events in session when it's created
---
.../main/java/org/apache/unomi/api/Session.java | 40 ++++++++++++++++++++++
.../org/apache/unomi/itests/ContextServletIT.java | 31 +++++++++++++++++
.../resources/META-INF/cxs/mappings/session.json | 2 +-
.../unomi/rest/endpoints/ContextJsonEndpoint.java | 4 ++-
.../rest/endpoints/EventsCollectorEndpoint.java | 20 ++++++-----
.../unomi/rest/service/RestServiceUtils.java | 4 +--
.../rest/service/impl/RestServiceUtilsImpl.java | 11 ++++--
7 files changed, 96 insertions(+), 16 deletions(-)
diff --git a/api/src/main/java/org/apache/unomi/api/Session.java b/api/src/main/java/org/apache/unomi/api/Session.java
index 7260e9ec3..fc622ab7c 100644
--- a/api/src/main/java/org/apache/unomi/api/Session.java
+++ b/api/src/main/java/org/apache/unomi/api/Session.java
@@ -19,6 +19,7 @@ package org.apache.unomi.api;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -52,6 +53,9 @@ public class Session extends Item implements TimestampedItem {
private int duration = 0;
+ private List<String> originEventTypes;
+ private List<String> originEventIds;
+
/**
* Instantiates a new Session.
*/
@@ -224,4 +228,40 @@ public class Session extends Item implements TimestampedItem {
public void setScope(String scope) {
this.scope = scope;
}
+
+ /**
+ * Get the events types which causes the session creation
+ *
+ * @return List of event types
+ */
+ public List<String> getOriginEventTypes() {
+ return originEventTypes;
+ }
+
+ /**
+ * Set the events types which causes the session creation
+ *
+ * @param originEventTypes List of event types
+ */
+ public void setOriginEventTypes(List<String> originEventTypes) {
+ this.originEventTypes = originEventTypes;
+ }
+
+ /**
+ * Get the events ids which causes the session creation
+ *
+ * @return event ids
+ */
+ public List<String> getOriginEventIds() {
+ return originEventIds;
+ }
+
+ /**
+ * Set the events ids which causes the session creation
+ *
+ * @param originEventIds List of event ids
+ */
+ public void setOriginEventIds(List<String> originEventIds) {
+ this.originEventIds = originEventIds;
+ }
}
diff --git a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
index 75931756b..5717fbc83 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
@@ -57,6 +57,7 @@ import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -188,6 +189,36 @@ public class ContextServletIT extends BaseIT {
assertEquals(2, event.getVersion().longValue());
}
+ @Test
+ public void testCallingContextWithSessionCreation() throws Exception {
+ //Arrange
+ String eventId = "test-event-id-" + System.currentTimeMillis();
+ String sessionId = "test-session-id";
+ Profile profile = new Profile(TEST_PROFILE_ID);
+ profileService.save(profile);
+
+ keepTrying("Profile " + TEST_PROFILE_ID + " not found in the required time", () -> profileService.load(TEST_PROFILE_ID),
+ Objects::nonNull, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES);
+
+ //Act
+ Event event = new Event(eventId, TEST_EVENT_TYPE, null, profile, TEST_SCOPE, null, null, new Date());
+
+ ContextRequest contextRequest = new ContextRequest();
+ contextRequest.setSessionId(sessionId);
+ contextRequest.setEvents(Collections.singletonList(event));
+ HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
+ request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
+ request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
+ TestUtils.executeContextJSONRequest(request, sessionId);
+
+ keepTrying("Event " + eventId + " not saved in the required time", () -> eventService.getEvent(eventId), Objects::nonNull, DEFAULT_TRYING_TIMEOUT,
+ DEFAULT_TRYING_TRIES);
+
+ Session session = profileService.loadSession(sessionId, null);
+ assertEquals(TEST_EVENT_TYPE, session.getOriginEventTypes().get(0));
+ assertEquals(eventId, session.getOriginEventIds().get(0));
+ }
+
@Test
public void testUpdateEventFromContextUnAuthorizedThirdParty_Fail() throws Exception {
//Arrange
diff --git a/persistence-elasticsearch/core/src/main/resources/META-INF/cxs/mappings/session.json b/persistence-elasticsearch/core/src/main/resources/META-INF/cxs/mappings/session.json
index 1a0fd6eae..e28657c67 100644
--- a/persistence-elasticsearch/core/src/main/resources/META-INF/cxs/mappings/session.json
+++ b/persistence-elasticsearch/core/src/main/resources/META-INF/cxs/mappings/session.json
@@ -70,4 +70,4 @@
"type": "date"
}
}
-}
\ No newline at end of file
+}
diff --git a/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java b/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
index 6207845f8..42e64183a 100644
--- a/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
+++ b/rest/src/main/java/org/apache/unomi/rest/endpoints/ContextJsonEndpoint.java
@@ -157,15 +157,17 @@ public class ContextJsonEndpoint {
// init ids
String profileId = null;
String scope = null;
+ List<Event> events = Collections.emptyList();
if (contextRequest != null) {
scope = contextRequest.getSource() != null ? contextRequest.getSource().getScope() : scope;
sessionId = contextRequest.getSessionId() != null ? contextRequest.getSessionId() : sessionId;
profileId = contextRequest.getProfileId();
+ events = contextRequest.getEvents();
}
// build public context, profile + session creation/anonymous etc ...
EventsRequestContext eventsRequestContext = restServiceUtils.initEventsRequest(scope, sessionId, profileId,
- personaId, invalidateProfile, invalidateSession, request, response, timestamp);
+ personaId, invalidateProfile, invalidateSession, request, response, timestamp, events);
// Build response
ContextResponse contextResponse = new ContextResponse();
diff --git a/rest/src/main/java/org/apache/unomi/rest/endpoints/EventsCollectorEndpoint.java b/rest/src/main/java/org/apache/unomi/rest/endpoints/EventsCollectorEndpoint.java
index f727b352f..81007d812 100644
--- a/rest/src/main/java/org/apache/unomi/rest/endpoints/EventsCollectorEndpoint.java
+++ b/rest/src/main/java/org/apache/unomi/rest/endpoints/EventsCollectorEndpoint.java
@@ -42,6 +42,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Date;
+import java.util.List;
@WebService
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
@@ -51,6 +52,7 @@ import java.util.Date;
@Component(service = EventsCollectorEndpoint.class, property = "osgi.jaxrs.resource=true")
public class EventsCollectorEndpoint {
+ public static final String SYSTEMSCOPE = "systemscope";
@Reference
private RestServiceUtils restServiceUtils;
@@ -68,7 +70,7 @@ public class EventsCollectorEndpoint {
@GET
@Path("/eventcollector")
public EventCollectorResponse collectAsGet(@QueryParam("payload") EventsCollectorRequest eventsCollectorRequest,
- @QueryParam("timestamp") Long timestampAsString) {
+ @QueryParam("timestamp") Long timestampAsString) {
return doEvent(eventsCollectorRequest, timestampAsString);
}
@@ -95,15 +97,15 @@ public class EventsCollectorEndpoint {
String profileId = eventsCollectorRequest.getProfileId();
// Get the first available scope that is not equal to systemscope otherwise systemscope will be used
- String scope = "systemscope";
- for (Event event : eventsCollectorRequest.getEvents()) {
+ String scope = SYSTEMSCOPE;
+ List<Event> events = eventsCollectorRequest.getEvents();
+ for (Event event : events) {
if (StringUtils.isNotBlank(event.getEventType())) {
- if (StringUtils.isNotBlank(event.getScope()) && !event.getScope().equals("systemscope")) {
+ if (StringUtils.isNotBlank(event.getScope()) && !event.getScope().equals(SYSTEMSCOPE)) {
scope = event.getScope();
break;
- } else if (event.getSource() != null &&
- StringUtils.isNotBlank(event.getSource().getScope()) &&
- !event.getSource().getScope().equals("systemscope")) {
+ } else if (event.getSource() != null && StringUtils.isNotBlank(event.getSource().getScope()) && !event.getSource()
+ .getScope().equals(SYSTEMSCOPE)) {
scope = event.getSource().getScope();
break;
}
@@ -111,8 +113,8 @@ public class EventsCollectorEndpoint {
}
// build public context, profile + session creation/anonymous etc ...
- EventsRequestContext eventsRequestContext = restServiceUtils.initEventsRequest(scope, sessionId, profileId,
- null, false, false, request, response, timestamp);
+ EventsRequestContext eventsRequestContext = restServiceUtils.initEventsRequest(scope, sessionId, profileId, null, false, false,
+ request, response, timestamp, events);
// process events
eventsRequestContext = restServiceUtils.performEventsRequest(eventsCollectorRequest.getEvents(), eventsRequestContext);
diff --git a/rest/src/main/java/org/apache/unomi/rest/service/RestServiceUtils.java b/rest/src/main/java/org/apache/unomi/rest/service/RestServiceUtils.java
index 0e6a9ba11..6024a36b8 100644
--- a/rest/src/main/java/org/apache/unomi/rest/service/RestServiceUtils.java
+++ b/rest/src/main/java/org/apache/unomi/rest/service/RestServiceUtils.java
@@ -47,13 +47,13 @@ public interface RestServiceUtils {
* @param request the current request
* @param response the current request response
* @param timestamp the current date, for timestamp the current visitor data
- *
+ * @param events list of events sent with the request
* @return the built EventsRequestContext
*/
EventsRequestContext initEventsRequest(String scope, String sessionId, String profileId, String personaId,
boolean invalidateProfile, boolean invalidateSession,
HttpServletRequest request, HttpServletResponse response,
- Date timestamp);
+ Date timestamp, List<Event> events);
/**
* Execute the list of events using the dedicated eventsRequestContext
diff --git a/rest/src/main/java/org/apache/unomi/rest/service/impl/RestServiceUtilsImpl.java b/rest/src/main/java/org/apache/unomi/rest/service/impl/RestServiceUtilsImpl.java
index 75a98d1e1..c18fad5e3 100644
--- a/rest/src/main/java/org/apache/unomi/rest/service/impl/RestServiceUtilsImpl.java
+++ b/rest/src/main/java/org/apache/unomi/rest/service/impl/RestServiceUtilsImpl.java
@@ -40,6 +40,7 @@ import javax.ws.rs.BadRequestException;
import java.util.Date;
import java.util.List;
import java.util.UUID;
+import java.util.stream.Collectors;
@Component(service = RestServiceUtils.class)
public class RestServiceUtilsImpl implements RestServiceUtils {
@@ -87,7 +88,8 @@ public class RestServiceUtilsImpl implements RestServiceUtils {
@Override
public EventsRequestContext initEventsRequest(String scope, String sessionId, String profileId, String personaId,
boolean invalidateProfile, boolean invalidateSession,
- HttpServletRequest request, HttpServletResponse response, Date timestamp) {
+ HttpServletRequest request, HttpServletResponse response, Date timestamp,
+ List<Event> events) {
// Build context
EventsRequestContext eventsRequestContext = new EventsRequestContext(timestamp, null, null, request, response);
@@ -182,9 +184,12 @@ public class RestServiceUtilsImpl implements RestServiceUtils {
if (StringUtils.isNotBlank(sessionId)) {
// Only save session and send event if a session id was provided, otherwise keep transient session
- eventsRequestContext.setSession(new Session(sessionId, sessionProfile, timestamp, scope));
- eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
+ Session session = new Session(sessionId, sessionProfile, timestamp, scope);
+ session.setOriginEventTypes(events.stream().map(Event::getEventType).collect(Collectors.toList()));
+ session.setOriginEventIds(events.stream().map(Item::getItemId).collect(Collectors.toList()));
+ eventsRequestContext.setSession(session);
+ eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
Event event = new Event("sessionCreated", eventsRequestContext.getSession(), eventsRequestContext.getProfile(),
scope, null, eventsRequestContext.getSession(), null, timestamp, false);
if (sessionProfile.isAnonymousProfile()) {