This is an automated email from the ASF dual-hosted git repository.

dgriffon pushed a commit to branch SPIKE-simple-url-forward
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/SPIKE-simple-url-forward by 
this push:
     new 6ea2df3  move context servlet
6ea2df3 is described below

commit 6ea2df3096b608fdcbf396e1f4438d26eb538daf
Author: David Griffon <[email protected]>
AuthorDate: Tue Mar 23 00:05:49 2021 +0100

    move context servlet
---
 .../org/apache/unomi/rest/ContextJsonEndpoint.java | 233 +++++++++-
 .../java/org/apache/unomi/web/ContextServlet.java  | 511 +--------------------
 .../resources/OSGI-INF/blueprint/blueprint.xml     |  10 +-
 3 files changed, 237 insertions(+), 517 deletions(-)

diff --git a/rest/src/main/java/org/apache/unomi/rest/ContextJsonEndpoint.java 
b/rest/src/main/java/org/apache/unomi/rest/ContextJsonEndpoint.java
index ee85b7d..9b53820 100644
--- a/rest/src/main/java/org/apache/unomi/rest/ContextJsonEndpoint.java
+++ b/rest/src/main/java/org/apache/unomi/rest/ContextJsonEndpoint.java
@@ -17,18 +17,34 @@
 
 package org.apache.unomi.rest;
 
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing;
+import org.apache.unomi.api.*;
+import org.apache.unomi.api.services.EventService;
+import org.apache.unomi.api.services.PrivacyService;
+import org.apache.unomi.api.services.ProfileService;
+import org.apache.unomi.persistence.spi.CustomObjectMapper;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.jws.WebService;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import java.util.Date;
+import java.util.UUID;
 
 @WebService
 @Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
+@Consumes(MediaType.TEXT_PLAIN)
 @CrossOriginResourceSharing(
         allowAllOrigins = true,
         allowCredentials = true
@@ -36,9 +52,212 @@ import javax.ws.rs.core.MediaType;
 @Path("/")
 @Component(service=ContextJsonEndpoint.class,property = 
"osgi.jaxrs.resource=true")
 public class ContextJsonEndpoint {
-    @GET
+    private static final Logger logger = 
LoggerFactory.getLogger(ContextJsonEndpoint.class.getName());
+
+    @Context
+    ServletContext context;
+    @Context
+    HttpServletRequest request;
+    @Context
+    HttpServletResponse response;
+
+    @Reference
+    private ProfileService profileService;
+    @Reference
+    private PrivacyService privacyService;
+    @Reference
+    private EventService eventService;
+
+    @POST
     @Path("/context.json")
-    public String get(@HeaderParam("Accept-Language") String language) {
-        return "{\"context\":\"alive\"}";
+    public ContextResponse getContext(String contextRequestAsString, 
@CookieParam("context-profile-id") String cookieProfileId) {
+        try {
+            ObjectMapper mapper = CustomObjectMapper.getObjectMapper();
+            JsonFactory factory = mapper.getFactory();
+            ContextRequest contextRequest = null;
+            try {
+                contextRequest = 
mapper.readValue(factory.createParser(contextRequestAsString), 
ContextRequest.class);
+            } catch (Exception e) {
+                
((HttpServletResponse)response).sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
+                logger.error("Cannot read contextRequest ", e);
+                return null;
+            }
+
+            final Date timestamp = new Date();
+            if (request.getParameter("timestamp") != null) {
+                
timestamp.setTime(Long.parseLong(request.getParameter("timestamp")));
+            }
+
+            // Handle persona
+            Profile profile = null;
+            Session session = null;
+            String personaId = request.getParameter("personaId");
+            if (personaId != null) {
+                PersonaWithSessions personaWithSessions = 
profileService.loadPersonaWithSessions(personaId);
+                if (personaWithSessions == null) {
+                    logger.error("Couldn't find persona with id=" + personaId);
+                    profile = null;
+                } else {
+                    profile = personaWithSessions.getPersona();
+                    session = personaWithSessions.getLastSession();
+                }
+            }
+
+            String scope = null;
+            if (contextRequest.getSource() != null) {
+                scope = contextRequest.getSource().getScope();
+            }
+            String sessionId = contextRequest.getSessionId();
+            String profileId = contextRequest.getProfileId();
+
+            if (sessionId == null) {
+                sessionId = request.getParameter("sessionId");
+            }
+
+            if (profileId == null) {
+                // Get profile id from the cookie
+                profileId = cookieProfileId;
+            }
+
+            if (profileId == null && sessionId == null && personaId == null) {
+                
((HttpServletResponse)response).sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
+                return null;
+            }
+
+            int changes = EventService.NO_CHANGE;
+            if (profile == null) {
+                // Not a persona, resolve profile now
+                boolean profileCreated = false;
+
+                boolean invalidateProfile = 
request.getParameter("invalidateProfile") != null ?
+                        new Boolean(request.getParameter("invalidateProfile")) 
: false;
+                if (profileId == null || invalidateProfile) {
+                    // no profileId cookie was found or the profile has to be 
invalidated, we generate a new one and create the profile in the profile service
+                    profile = createNewProfile(null, response, timestamp);
+                    profileCreated = true;
+                } else {
+                    profile = profileService.load(profileId);
+                    if (profile == null) {
+                        // this can happen if we have an old cookie but have 
reset the server,
+                        // or if we merged the profiles and somehow this 
cookie didn't get updated.
+                        profile = createNewProfile(profileId, response, 
timestamp);
+                        profileCreated = true;
+                    }
+                }
+
+                Profile sessionProfile;
+                boolean invalidateSession = 
request.getParameter("invalidateSession") != null ?
+                        new Boolean(request.getParameter("invalidateSession")) 
: false;
+                if (StringUtils.isNotBlank(sessionId) && !invalidateSession) {
+                    session = profileService.loadSession(sessionId, timestamp);
+                    if (session != null) {
+                        sessionProfile = session.getProfile();
+
+                        boolean anonymousSessionProfile = 
sessionProfile.isAnonymousProfile();
+                        if (!profile.isAnonymousProfile() && 
!anonymousSessionProfile && 
!profile.getItemId().equals(sessionProfile.getItemId())) {
+                            // Session user has been switched, profile id in 
cookie is not up to date
+                            // We must reload the profile with the session ID 
as some properties could be missing from the session profile
+                            // #personalIdentifier
+                            profile = 
profileService.load(sessionProfile.getItemId());
+
+                        }
+
+                        // Handle anonymous situation
+                        Boolean requireAnonymousBrowsing = 
privacyService.isRequireAnonymousBrowsing(profile);
+                        if (requireAnonymousBrowsing && 
anonymousSessionProfile) {
+                            // User wants to browse anonymously, anonymous 
profile is already set.
+                        } else if (requireAnonymousBrowsing && 
!anonymousSessionProfile) {
+                            // User wants to browse anonymously, update the 
sessionProfile to anonymous profile
+                            sessionProfile = 
privacyService.getAnonymousProfile(profile);
+                            session.setProfile(sessionProfile);
+                            changes |= EventService.SESSION_UPDATED;
+                        } else if (!requireAnonymousBrowsing && 
anonymousSessionProfile) {
+                            // User does not want to browse anonymously 
anymore, update the sessionProfile to real profile
+                            sessionProfile = profile;
+                            session.setProfile(sessionProfile);
+                            changes |= EventService.SESSION_UPDATED;
+                        } else if (!requireAnonymousBrowsing && 
!anonymousSessionProfile) {
+                            // User does not want to browse anonymously, use 
the real profile. Check that session contains the current profile.
+                            sessionProfile = profile;
+                            if 
(!session.getProfileId().equals(sessionProfile.getItemId())) {
+                                changes |= EventService.SESSION_UPDATED;
+                            }
+                            session.setProfile(sessionProfile);
+                        }
+                    }
+                }
+
+                if (session == null || invalidateSession) {
+                    sessionProfile = 
privacyService.isRequireAnonymousBrowsing(profile) ? 
privacyService.getAnonymousProfile(profile) : profile;
+
+                    if (StringUtils.isNotBlank(sessionId)) {
+                        // Only save session and send event if a session id 
was provided, otherwise keep transient session
+                        session = new Session(sessionId, sessionProfile, 
timestamp, scope);
+                        changes |= EventService.SESSION_UPDATED;
+                        Event event = new Event("sessionCreated", session, 
profile, scope, null, session, timestamp);
+                        if (sessionProfile.isAnonymousProfile()) {
+                            // Do not keep track of profile in event
+                            event.setProfileId(null);
+                        }
+                        
event.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
+                        
event.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
+                        if (logger.isDebugEnabled()) {
+                            logger.debug("Received event {} for profile={} 
session={} target={} timestamp={}",
+                                    event.getEventType(), profile.getItemId(), 
session.getItemId(), event.getTarget(), timestamp);
+                        }
+                        changes |= eventService.send(event);
+                    }
+                }
+
+                if (profileCreated) {
+                    changes |= EventService.PROFILE_UPDATED;
+
+                    Event profileUpdated = new Event("profileUpdated", 
session, profile, scope, null, profile, timestamp);
+                    profileUpdated.setPersistent(false);
+                    
profileUpdated.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
+                    
profileUpdated.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
+
+                    if (logger.isDebugEnabled()) {
+                        logger.debug("Received event {} for profile={} {} 
target={} timestamp={}", profileUpdated.getEventType(), profile.getItemId(),
+                                " session=" + (session != null ? 
session.getItemId() : null), profileUpdated.getTarget(), timestamp);
+                    }
+                    changes |= eventService.send(profileUpdated);
+                }
+            }
+
+            ContextResponse contextResponse = new ContextResponse();
+            contextResponse.setProfileId(profile.getItemId());
+            if (session != null) {
+                contextResponse.setSessionId(session.getItemId());
+            } else if (sessionId != null) {
+                contextResponse.setSessionId(sessionId);
+            }
+
+            if ((changes & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
+                profileService.save(profile);
+                contextResponse.setProfileId(profile.getItemId());
+            }
+            if ((changes & EventService.SESSION_UPDATED) == 
EventService.SESSION_UPDATED && session != null) {
+                profileService.saveSession(session);
+                contextResponse.setSessionId(session.getItemId());
+            }
+
+            return contextResponse;
+        } catch (Throwable t) { // Here in order to return generic message 
instead of the whole stack trace in case of not caught exception
+            logger.error("ContextServlet failed to execute request", t);
+            throw  new RuntimeException(t);
+        }
     }
+
+    private Profile createNewProfile(String existingProfileId, ServletResponse 
response, Date timestamp) {
+        Profile profile;
+        String profileId = existingProfileId;
+        if (profileId == null) {
+            profileId = UUID.randomUUID().toString();
+        }
+        profile = new Profile(profileId);
+        profile.setProperty("firstVisit", timestamp);
+        return profile;
+    }
+
 }
diff --git a/wab/src/main/java/org/apache/unomi/web/ContextServlet.java 
b/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
index f1c66d7..99ad9a5 100644
--- a/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
+++ b/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
@@ -29,11 +29,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.servlet.*;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.*;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.security.Principal;
 import java.util.*;
 
 /**
@@ -61,511 +62,19 @@ public class ContextServlet extends HttpServlet {
     @Override
     public void init(ServletConfig config) throws ServletException {
         super.init(config);
-        configSharingService.setProperty("profileIdCookieName", 
profileIdCookieName);
-        configSharingService.setProperty("profileIdCookieDomain", 
profileIdCookieDomain);
-        configSharingService.setProperty("profileIdCookieMaxAgeInSeconds", 
(Integer) profileIdCookieMaxAgeInSeconds);
         logger.info("ContextServlet initialized.");
     }
 
     @Override
     public void service(HttpServletRequest request, HttpServletResponse 
response) throws IOException {
-        if (true) {
-            RequestDispatcher dispatcher = 
getServletContext().getContext("/cxs")
-                    .getRequestDispatcher("/cxs/context.json");
-            try {
-                dispatcher.forward(request, response);
-                return;
-            } catch (ServletException e) {
-               logger.error(e.getMessage());
-            }
-        }
-
+        RequestDispatcher dispatcher = getServletContext().getContext("/cxs")
+                .getRequestDispatcher("/cxs/context.json");
         try {
-            final Date timestamp = new Date();
-            if (request.getParameter("timestamp") != null) {
-                
timestamp.setTime(Long.parseLong(request.getParameter("timestamp")));
-            }
-
-            // set up CORS headers as soon as possible so that errors are not 
misconstrued on the client for CORS errors
-            HttpUtils.setupCORSHeaders(request, response);
-
-            // Handle OPTIONS request
-            String httpMethod = request.getMethod();
-            if ("options".equals(httpMethod.toLowerCase())) {
-                response.flushBuffer();
-                if (logger.isDebugEnabled()) {
-                    logger.debug("OPTIONS request received. No context will be 
returned.");
-                }
-                return;
-            }
-
-            // Handle persona
-            Profile profile = null;
-            Session session = null;
-            String personaId = request.getParameter("personaId");
-            if (personaId != null) {
-                PersonaWithSessions personaWithSessions = 
profileService.loadPersonaWithSessions(personaId);
-                if (personaWithSessions == null) {
-                    logger.error("Couldn't find persona with id=" + personaId);
-                    profile = null;
-                } else {
-                    profile = personaWithSessions.getPersona();
-                    session = personaWithSessions.getLastSession();
-                }
-            }
-
-            // Extract payload
-            ContextRequest contextRequest = null;
-            String scope = null;
-            String sessionId = null;
-            String profileId = null;
-            String stringPayload = HttpUtils.getPayload(request);
-            if (stringPayload != null) {
-                ObjectMapper mapper = CustomObjectMapper.getObjectMapper();
-                JsonFactory factory = mapper.getFactory();
-                try {
-                    contextRequest = 
mapper.readValue(factory.createParser(stringPayload), ContextRequest.class);
-                } catch (Exception e) {
-                    
((HttpServletResponse)response).sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
-                    logger.error("Cannot read payload " + stringPayload, e);
-                    return;
-                }
-                if (contextRequest.getSource() != null) {
-                    scope = contextRequest.getSource().getScope();
-                }
-                sessionId = contextRequest.getSessionId();
-                profileId = contextRequest.getProfileId();
-            }
-
-            if (sessionId == null) {
-                sessionId = request.getParameter("sessionId");
-            }
-
-            if (profileId == null) {
-                // Get profile id from the cookie
-                profileId = ServletCommon.getProfileIdCookieValue(request, 
profileIdCookieName);
-            }
-
-            if (profileId == null && sessionId == null && personaId == null) {
-                
((HttpServletResponse)response).sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
-                logger.error("Couldn't find profileId, sessionId or personaId 
in incoming request! Stopped processing request. See debug level for more 
information");
-                if (logger.isDebugEnabled()) {
-                    logger.debug("Request dump: {}", 
HttpUtils.dumpRequestInfo(request));
-                }
-                return;
-            }
-
-            int changes = EventService.NO_CHANGE;
-            if (profile == null) {
-                // Not a persona, resolve profile now
-                boolean profileCreated = false;
-
-                boolean invalidateProfile = 
request.getParameter("invalidateProfile") != null ?
-                        new Boolean(request.getParameter("invalidateProfile")) 
: false;
-                if (profileId == null || invalidateProfile) {
-                    // no profileId cookie was found or the profile has to be 
invalidated, we generate a new one and create the profile in the profile service
-                    profile = createNewProfile(null, response, timestamp);
-                    profileCreated = true;
-                } else {
-                    profile = profileService.load(profileId);
-                    if (profile == null) {
-                        // this can happen if we have an old cookie but have 
reset the server,
-                        // or if we merged the profiles and somehow this 
cookie didn't get updated.
-                        profile = createNewProfile(profileId, response, 
timestamp);
-                        profileCreated = true;
-                    } else {
-                        Changes changesObject = checkMergedProfile(response, 
profile, session);
-                        changes |= changesObject.getChangeType();
-                        profile = changesObject.getProfile();
-                    }
-                }
-
-                Profile sessionProfile;
-                boolean invalidateSession = 
request.getParameter("invalidateSession") != null ?
-                        new Boolean(request.getParameter("invalidateSession")) 
: false;
-                if (StringUtils.isNotBlank(sessionId) && !invalidateSession) {
-                    session = profileService.loadSession(sessionId, timestamp);
-                    if (session != null) {
-                        sessionProfile = session.getProfile();
-
-                        boolean anonymousSessionProfile = 
sessionProfile.isAnonymousProfile();
-                        if (!profile.isAnonymousProfile() && 
!anonymousSessionProfile && 
!profile.getItemId().equals(sessionProfile.getItemId())) {
-                            // Session user has been switched, profile id in 
cookie is not up to date
-                            // We must reload the profile with the session ID 
as some properties could be missing from the session profile
-                            // #personalIdentifier
-                            profile = 
profileService.load(sessionProfile.getItemId());
-                            if (profile != null) {
-                                HttpUtils.sendProfileCookie(profile, response, 
profileIdCookieName, profileIdCookieDomain, profileIdCookieMaxAgeInSeconds);
-                            } else {
-                                logger.warn("Couldn't load profile {} 
referenced in session {}", sessionProfile.getItemId(), session.getItemId());
-                            }
-                        }
-
-                        // Handle anonymous situation
-                        Boolean requireAnonymousBrowsing = 
privacyService.isRequireAnonymousBrowsing(profile);
-                        if (requireAnonymousBrowsing && 
anonymousSessionProfile) {
-                            // User wants to browse anonymously, anonymous 
profile is already set.
-                        } else if (requireAnonymousBrowsing && 
!anonymousSessionProfile) {
-                            // User wants to browse anonymously, update the 
sessionProfile to anonymous profile
-                            sessionProfile = 
privacyService.getAnonymousProfile(profile);
-                            session.setProfile(sessionProfile);
-                            changes |= EventService.SESSION_UPDATED;
-                        } else if (!requireAnonymousBrowsing && 
anonymousSessionProfile) {
-                            // User does not want to browse anonymously 
anymore, update the sessionProfile to real profile
-                            sessionProfile = profile;
-                            session.setProfile(sessionProfile);
-                            changes |= EventService.SESSION_UPDATED;
-                        } else if (!requireAnonymousBrowsing && 
!anonymousSessionProfile) {
-                            // User does not want to browse anonymously, use 
the real profile. Check that session contains the current profile.
-                            sessionProfile = profile;
-                            if 
(!session.getProfileId().equals(sessionProfile.getItemId())) {
-                                changes |= EventService.SESSION_UPDATED;
-                            }
-                            session.setProfile(sessionProfile);
-                        }
-                    }
-                }
-
-                if (session == null || invalidateSession) {
-                    sessionProfile = 
privacyService.isRequireAnonymousBrowsing(profile) ? 
privacyService.getAnonymousProfile(profile) : profile;
-
-                    if (StringUtils.isNotBlank(sessionId)) {
-                        // Only save session and send event if a session id 
was provided, otherwise keep transient session
-                        session = new Session(sessionId, sessionProfile, 
timestamp, scope);
-                        changes |= EventService.SESSION_UPDATED;
-                        Event event = new Event("sessionCreated", session, 
profile, scope, null, session, timestamp);
-                        if (sessionProfile.isAnonymousProfile()) {
-                            // Do not keep track of profile in event
-                            event.setProfileId(null);
-                        }
-                        
event.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
-                        
event.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
-                        if (logger.isDebugEnabled()) {
-                            logger.debug("Received event {} for profile={} 
session={} target={} timestamp={}",
-                                    event.getEventType(), profile.getItemId(), 
session.getItemId(), event.getTarget(), timestamp);
-                        }
-                        changes |= eventService.send(event);
-                    }
-                }
-
-                if (profileCreated) {
-                    changes |= EventService.PROFILE_UPDATED;
-
-                    Event profileUpdated = new Event("profileUpdated", 
session, profile, scope, null, profile, timestamp);
-                    profileUpdated.setPersistent(false);
-                    
profileUpdated.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
-                    
profileUpdated.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
-
-                    if (logger.isDebugEnabled()) {
-                        logger.debug("Received event {} for profile={} {} 
target={} timestamp={}", profileUpdated.getEventType(), profile.getItemId(),
-                                " session=" + (session != null ? 
session.getItemId() : null), profileUpdated.getTarget(), timestamp);
-                    }
-                    changes |= eventService.send(profileUpdated);
-                }
-            }
-
-            ContextResponse contextResponse = new ContextResponse();
-            contextResponse.setProfileId(profile.getItemId());
-            if (session != null) {
-                contextResponse.setSessionId(session.getItemId());
-            } else if (sessionId != null) {
-                contextResponse.setSessionId(sessionId);
-            }
-
-            if (contextRequest != null) {
-                Changes changesObject = handleRequest(contextRequest, session, 
profile, contextResponse, request, response, timestamp);
-                changes |= changesObject.getChangeType();
-                profile = changesObject.getProfile();
-            }
-
-            if ((changes & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
-                profileService.save(profile);
-                contextResponse.setProfileId(profile.getItemId());
-            }
-            if ((changes & EventService.SESSION_UPDATED) == 
EventService.SESSION_UPDATED && session != null) {
-                profileService.saveSession(session);
-                contextResponse.setSessionId(session.getItemId());
-            }
-
-            if ((changes & EventService.ERROR) == EventService.ERROR) {
-                
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            }
-
-            String extension = 
request.getRequestURI().substring(request.getRequestURI().lastIndexOf(".") + 1);
-            boolean noScript = "json".equals(extension);
-            String contextAsJSONString = 
CustomObjectMapper.getObjectMapper().writeValueAsString(contextResponse);
-            Writer responseWriter;
-            response.setCharacterEncoding("UTF-8");
-            if (noScript) {
-                responseWriter = response.getWriter();
-                response.setContentType("application/json");
-                IOUtils.write(contextAsJSONString, responseWriter);
-            } else {
-                responseWriter = response.getWriter();
-                responseWriter.append("window.digitalData = window.digitalData 
|| {};\n")
-                        .append("var cxs = ")
-                        .append(contextAsJSONString)
-                        .append(";\n");
-            }
-
-            responseWriter.flush();
-        } catch (Throwable t) { // Here in order to return generic message 
instead of the whole stack trace in case of not caught exception
-            logger.error("ContextServlet failed to execute request", t);
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
"Internal server error");
-        }
-    }
-
-    private Changes checkMergedProfile(ServletResponse response, Profile 
profile, Session session) {
-        int changes = EventService.NO_CHANGE;
-        if (profile.getMergedWith() != null && 
!privacyService.isRequireAnonymousBrowsing(profile) && 
!profile.isAnonymousProfile()) {
-            Profile currentProfile = profile;
-            String masterProfileId = profile.getMergedWith();
-            Profile masterProfile = profileService.load(masterProfileId);
-            if (masterProfile != null) {
-                logger.info("Current profile {} was merged with profile {}, 
replacing profile in session", currentProfile.getItemId(), masterProfileId);
-                profile = masterProfile;
-                if (session != null) {
-                    session.setProfile(profile);
-                    changes = EventService.SESSION_UPDATED;
-                }
-                HttpUtils.sendProfileCookie(profile, response, 
profileIdCookieName, profileIdCookieDomain, profileIdCookieMaxAgeInSeconds);
-            } else {
-                logger.warn("Couldn't find merged profile {}, falling back to 
profile {}", masterProfileId, currentProfile.getItemId());
-                profile = currentProfile;
-                profile.setMergedWith(null);
-                changes = EventService.PROFILE_UPDATED;
-            }
-        }
-
-        return new Changes(changes, profile);
-    }
-
-    private Changes handleRequest(ContextRequest contextRequest, Session 
session, Profile profile, ContextResponse data,
-                                  ServletRequest request, ServletResponse 
response, Date timestamp) {
-        Changes changes = 
ServletCommon.handleEvents(contextRequest.getEvents(), session, profile, 
request, response, timestamp,
-                privacyService, eventService);
-        data.setProcessedEvents(changes.getProcessedItems());
-
-        profile = changes.getProfile();
-
-        if (contextRequest.isRequireSegments()) {
-            data.setProfileSegments(profile.getSegments());
-        }
-
-        if (contextRequest.getRequiredProfileProperties() != null) {
-            Map<String, Object> profileProperties = new 
HashMap<>(profile.getProperties());
-            if (!contextRequest.getRequiredProfileProperties().contains("*")) {
-                
profileProperties.keySet().retainAll(contextRequest.getRequiredProfileProperties());
-            }
-            data.setProfileProperties(profileProperties);
-        }
-
-        if (session != null) {
-            data.setSessionId(session.getItemId());
-            if (contextRequest.getRequiredSessionProperties() != null) {
-                Map<String, Object> sessionProperties = new 
HashMap<>(session.getProperties());
-                if 
(!contextRequest.getRequiredSessionProperties().contains("*")) {
-                    
sessionProperties.keySet().retainAll(contextRequest.getRequiredSessionProperties());
-                }
-                data.setSessionProperties(sessionProperties);
-            }
-        }
-
-        processOverrides(contextRequest, profile, session);
-
-        List<PersonalizationService.PersonalizedContent> filterNodes = 
contextRequest.getFilters();
-        if (filterNodes != null) {
-            data.setFilteringResults(new HashMap<>());
-            for (PersonalizationService.PersonalizedContent 
personalizedContent : sanitizePersonalizedContentObjects(filterNodes)) {
-                data.getFilteringResults().put(personalizedContent.getId(), 
personalizationService.filter(profile,
-                        session, personalizedContent));
-            }
-        }
-
-        List<PersonalizationService.PersonalizationRequest> personalizations = 
contextRequest.getPersonalizations();
-        if (personalizations != null) {
-            data.setPersonalizations(new HashMap<>());
-            for (PersonalizationService.PersonalizationRequest personalization 
: sanitizePersonalizations(personalizations)) {
-                data.getPersonalizations().put(personalization.getId(), 
personalizationService.personalizeList(profile,
-                        session, personalization));
-            }
-        }
-
-        if (!(profile instanceof Persona)) {
-            
data.setTrackedConditions(rulesService.getTrackedConditions(contextRequest.getSource()));
-        } else {
-            data.setTrackedConditions(Collections.emptySet());
-        }
-
-        
data.setAnonymousBrowsing(privacyService.isRequireAnonymousBrowsing(profile));
-        data.setConsents(profile.getConsents());
-
-        return changes;
-    }
-
-    /**
-     * This function will update the profile if it is from Persona instance.
-     * The profile will be updated using the overrides attributes :
-     * - profileOverrides for profile properties, segments and scores
-     * - sessionPropertiesOverrides for session properties
-     * @param contextRequest
-     * @param profile
-     * @param session
-     */
-    private void processOverrides(ContextRequest contextRequest, Profile 
profile, Session session) {
-        if (profile instanceof Persona) {
-            if (contextRequest.getProfileOverrides() != null) {
-                if (contextRequest.getProfileOverrides().getScores()!=null) {
-                    
profile.setScores(contextRequest.getProfileOverrides().getScores());
-                }
-                if (contextRequest.getProfileOverrides().getSegments()!=null) {
-                    
profile.setSegments(contextRequest.getProfileOverrides().getSegments());
-                }
-                if 
(contextRequest.getProfileOverrides().getProperties()!=null) {
-                    
profile.setProperties(contextRequest.getProfileOverrides().getProperties());
-                }
-                if (contextRequest.getSessionPropertiesOverrides()!=null && 
session != null) {
-                    
session.setProperties(contextRequest.getSessionPropertiesOverrides());
-                }
-            }
-        }
-    }
-
-    private Profile createNewProfile(String existingProfileId, ServletResponse 
response, Date timestamp) {
-        Profile profile;
-        String profileId = existingProfileId;
-        if (profileId == null) {
-            profileId = UUID.randomUUID().toString();
-        }
-        profile = new Profile(profileId);
-        profile.setProperty("firstVisit", timestamp);
-        HttpUtils.sendProfileCookie(profile, response, profileIdCookieName, 
profileIdCookieDomain, profileIdCookieMaxAgeInSeconds);
-        return profile;
-    }
-
-
-    public void destroy() {
-        logger.info("Context servlet shutdown.");
-    }
-
-    public void setProfileService(ProfileService profileService) {
-        this.profileService = profileService;
-    }
-
-    public void setEventService(EventService eventService) {
-        this.eventService = eventService;
-    }
-
-    public void setRulesService(RulesService rulesService) {
-        this.rulesService = rulesService;
-    }
-
-    public void setProfileIdCookieDomain(String profileIdCookieDomain) {
-        this.profileIdCookieDomain = profileIdCookieDomain;
-    }
-
-    public void setProfileIdCookieName(String profileIdCookieName) {
-        this.profileIdCookieName = profileIdCookieName;
-    }
-
-    public void setProfileIdCookieMaxAgeInSeconds(int 
profileIdCookieMaxAgeInSeconds) {
-        this.profileIdCookieMaxAgeInSeconds = profileIdCookieMaxAgeInSeconds;
-    }
-
-    public void setPrivacyService(PrivacyService privacyService) {
-        this.privacyService = privacyService;
-    }
-
-    public void setPersonalizationService(PersonalizationService 
personalizationService) {
-        this.personalizationService = personalizationService;
-    }
-
-    public void setConfigSharingService(ConfigSharingService 
configSharingService) {
-        this.configSharingService = configSharingService;
-    }
-
-    private List<PersonalizationService.PersonalizedContent> 
sanitizePersonalizedContentObjects(List<PersonalizationService.PersonalizedContent>
 personalizedContentObjects) {
-        if (!sanitizeConditions) {
-            return personalizedContentObjects;
-        }
-        List<PersonalizationService.PersonalizedContent> result = new 
ArrayList<>();
-        for (PersonalizationService.PersonalizedContent 
personalizedContentObject : personalizedContentObjects) {
-            boolean foundInvalidCondition = false;
-            if (personalizedContentObject.getFilters() != null) {
-                for (PersonalizationService.Filter filter : 
personalizedContentObject.getFilters()) {
-                    if (sanitizeCondition(filter.getCondition()) == null) {
-                        foundInvalidCondition = true;
-                        break;
-                    }
-                }
-            }
-            if (!foundInvalidCondition) {
-                result.add(personalizedContentObject);
-            }
-        }
-
-        return result;
-    }
-
-    private List<PersonalizationService.PersonalizationRequest> 
sanitizePersonalizations(List<PersonalizationService.PersonalizationRequest> 
personalizations) {
-        if (!sanitizeConditions) {
-            return personalizations;
-        }
-        List<PersonalizationService.PersonalizationRequest> result = new 
ArrayList<>();
-        for (PersonalizationService.PersonalizationRequest 
personalizationRequest : personalizations) {
-            List<PersonalizationService.PersonalizedContent> 
personalizedContents = 
sanitizePersonalizedContentObjects(personalizationRequest.getContents());
-            if (personalizedContents != null && personalizedContents.size() > 
0) {
-                result.add(personalizationRequest);
-            }
-        }
-        return result;
-    }
-
-    private Condition sanitizeCondition(Condition condition) {
-        Map<String,Object> newParameterValues = new LinkedHashMap<>();
-        for (Map.Entry<String,Object> parameterEntry : 
condition.getParameterValues().entrySet()) {
-            Object sanitizedValue = sanitizeValue(parameterEntry.getValue());
-            if (sanitizedValue != null) {
-                newParameterValues.put(parameterEntry.getKey(), 
parameterEntry.getValue());
-            } else {
-                return null;
-            }
-        }
-        return condition;
-    }
 
-    private Object sanitizeValue(Object value) {
-        if (value instanceof String) {
-            String stringValue = (String) value;
-            if (stringValue.startsWith("script::") || 
stringValue.startsWith("parameter::")) {
-                logger.warn("Scripting detected in context request with value 
{}, filtering out...", value);
-                return null;
-            } else {
-                return stringValue;
-            }
-        } else if (value instanceof List) {
-            List values = (List) value;
-            List newValues = new ArrayList();
-            for (Object listObject : values) {
-                Object newObject = sanitizeValue(listObject);
-                if (newObject != null) {
-                    newValues.add(newObject);
-                }
-            }
-            return values;
-        } else if (value instanceof Map) {
-            Map<Object,Object> newMap = new LinkedHashMap<>();
-            ((Map<?, ?>) value).forEach((key, value1) -> {
-                Object newObject = sanitizeValue(value1);
-                if (newObject != null) {
-                    newMap.put(key, newObject);
-                }
-            });
-            return newMap;
-        } else if (value instanceof Condition) {
-            return sanitizeCondition((Condition) value);
-        } else {
-            return value;
+            dispatcher.forward(request, response);
+            return;
+        } catch (ServletException e) {
+            logger.error(e.getMessage());
         }
     }
 }
diff --git a/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml 
b/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 9dc06b8..53d2bf4 100644
--- a/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -41,15 +41,7 @@
 
 
     <bean id="contextServlet" class="org.apache.unomi.web.ContextServlet">
-        <property name="profileService" ref="profileService"/>
-        <property name="eventService" ref="eventService"/>
-        <property name="rulesService" ref="rulesService"/>
-        <property name="privacyService" ref="privacyService" />
-        <property name="personalizationService" ref="personalizationService"/>
-        <property name="configSharingService" ref="configSharingService"/>
-        <property name="profileIdCookieDomain" 
value="${web.contextserver.domain}" />
-        <property name="profileIdCookieName" 
value="${web.contextserver.profileIdCookieName}"/>
-        <property name="profileIdCookieMaxAgeInSeconds" 
value="${web.contextserver.profileIdCookieMaxAgeInSeconds}"/>
+
     </bean>
 
     <service id="contextServletService" ref="contextServlet">

Reply via email to