UNOMI-660 : store correctly the ids of the events leading to the sess… (#488)

* UNOMI-660 : store correctly the ids of the events leading to the session creation
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 fc622ab..986323c 100644
--- a/api/src/main/java/org/apache/unomi/api/Session.java
+++ b/api/src/main/java/org/apache/unomi/api/Session.java
@@ -17,6 +17,7 @@
 
 package org.apache.unomi.api;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -53,8 +54,8 @@
 
     private int duration = 0;
 
-    private List<String> originEventTypes;
-    private List<String> originEventIds;
+    private List<String> originEventTypes = new ArrayList<>();
+    private List<String> originEventIds = new ArrayList<>();
 
     /**
      * Instantiates a new Session.
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 5717fbc..6559c46 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
@@ -66,6 +66,7 @@
 
 import static org.hamcrest.core.IsCollectionContaining.hasItem;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -201,7 +202,7 @@
                 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());
+        Event event = new Event(TEST_EVENT_TYPE, null, profile, TEST_SCOPE, null, null, new Date());
 
         ContextRequest contextRequest = new ContextRequest();
         contextRequest.setSessionId(sessionId);
@@ -211,12 +212,13 @@
         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,
+        Session session = keepTrying("Session with the id " + sessionId + " not saved in the required time",
+                () -> profileService.loadSession(sessionId,
+                        null), 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));
+        assertFalse(session.getOriginEventIds().isEmpty());
     }
 
     @Test
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 546ce5a..9d2a3c6 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
@@ -167,7 +167,7 @@
 
         // build public context, profile + session creation/anonymous etc ...
         EventsRequestContext eventsRequestContext = restServiceUtils.initEventsRequest(scope, sessionId, profileId,
-                personaId, invalidateProfile, invalidateSession, request, response, timestamp, events != null ? events: Collections.emptyList());
+                personaId, invalidateProfile, invalidateSession, request, response, timestamp);
 
         // 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 81007d8..c9b3109 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
@@ -114,7 +114,7 @@
 
         // build public context, profile + session creation/anonymous etc ...
         EventsRequestContext eventsRequestContext = restServiceUtils.initEventsRequest(scope, sessionId, profileId, null, false, false,
-                request, response, timestamp, events);
+                request, response, timestamp);
 
         // 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 6024a36..153b6ad 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,12 @@
      * @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, List<Event> events);
+                                           Date timestamp);
 
     /**
      * 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 c18fad5..ace630b 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
@@ -88,8 +88,7 @@
     @Override
     public EventsRequestContext initEventsRequest(String scope, String sessionId, String profileId, String personaId,
                                                   boolean invalidateProfile, boolean invalidateSession,
-                                                  HttpServletRequest request, HttpServletResponse response, Date timestamp,
-            List<Event> events) {
+                                                  HttpServletRequest request, HttpServletResponse response, Date timestamp) {
 
         // Build context
         EventsRequestContext eventsRequestContext = new EventsRequestContext(timestamp, null, null, request, response);
@@ -186,9 +185,8 @@
                     // Only save session and send event if a session id was provided, otherwise keep transient session
 
                     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.setNewSession(true);
                     eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
                     Event event = new Event("sessionCreated", eventsRequestContext.getSession(), eventsRequestContext.getProfile(),
                             scope, null, eventsRequestContext.getSession(), null, timestamp, false);
@@ -276,6 +274,10 @@
                     if ((eventsRequestContext.getChanges() & EventService.PROFILE_UPDATED) == EventService.PROFILE_UPDATED) {
                         eventsRequestContext.setProfile(eventToSend.getProfile());
                     }
+                    if (eventsRequestContext.isNewSession()) {
+                        eventsRequestContext.getSession().getOriginEventIds().add(eventToSend.getItemId());
+                        eventsRequestContext.getSession().getOriginEventTypes().add(eventToSend.getEventType());
+                    }
                     if ((eventsRequestContext.getChanges() & EventService.ERROR) == EventService.ERROR) {
                         //Don't count the event that failed
                         eventsRequestContext.setProcessedItems(eventsRequestContext.getProcessedItems() - 1);
@@ -284,6 +286,7 @@
                     }
                 }
             }
+
         }
 
         return eventsRequestContext;
diff --git a/rest/src/main/java/org/apache/unomi/utils/EventsRequestContext.java b/rest/src/main/java/org/apache/unomi/utils/EventsRequestContext.java
index 188f42d..6798875 100644
--- a/rest/src/main/java/org/apache/unomi/utils/EventsRequestContext.java
+++ b/rest/src/main/java/org/apache/unomi/utils/EventsRequestContext.java
@@ -35,6 +35,8 @@
     private Date timestamp;
     private Profile profile;
     private Session session;
+
+    private boolean newSession = false;
     private HttpServletRequest request;
     private HttpServletResponse response;
     private int changes;
@@ -79,6 +81,14 @@
         this.session = session;
     }
 
+    public boolean isNewSession() {
+        return newSession;
+    }
+
+    public void setNewSession(boolean newSession) {
+        this.newSession = newSession;
+    }
+
     public int getChanges() {
         return changes;
     }