4.3. Twitter sample

4.3.1. Overview

We will examine how a simple HTML page can interact with Unomi to enrich a user’s profile. The use case we will followis a rather simple one: we use a Twitter button to record the number of times the visitor tweeted (as a tweetNb profileinteger property) as well as the URLs they tweeted from (as a tweetedFrom multi-valued string profile property).A javascript script will use the Twitter API to react to clicks on this buttonand update the user profile using a ContextServlet request triggering a custom event. This event will, in turn,trigger a Unomi action on the server implemented using a Unomi plugin, a standard extension point for the server.

Building the tweet button samples

In your local copy of the Unomi repository and run:

  1. cd samples/tweet-button-plugin
  2. mvn clean install

This will compile and create the OSGi bundle that can be deployed on Unomi to extend it.

Deploying the tweet button samples

In standard Karaf fashion, you will need to copy the samples bundle to your Karaf deploy directory.

If you are using the packaged version of Unomi (as opposed to deploying it to your own Karaf version), you can simply run, assuming your current directory is samples/tweet-button-plugin and that you uncompressed the archive in the directory it was created:

  1. cp target/tweet-button-plugin-1.0.0-incubating-SNAPSHOT.jar ../../package/target/unomi-1.0.0-incubating-SNAPSHOT/deploy
Testing the samples

You can now go to http://localhost:8181/index.html to test the samples code. The page is very simple, you will see a Twitter button, which, once clicked, will open a new window to tweet about the current page. The original page should be updated with the new values of the properties coming from Unomi. Additionnally, the raw JSON response is displayed.

We will now explain in greater details some concepts and see how the example works.

4.3.2. Interacting with the context server

There are essentially two modalities to interact with the context server, reflecting different types of Unomi users: context server clients and context server integrators.

Context server clients are usually web applications or content management systems. They interact with Unomi by providing raw, uninterpreted contextual data in the form of events and associated metadata. That contextual data is then processed by the context server to be fed to clients once actionable. In that sense context server clients are both consumers and producers of contextual data. Context server clients will mostly interact with Unomi using a single entry point called the ContextServlet, requesting context for the current user and providing any triggered events along the way.

On the other hand, context server integrators provide ways to feed more structured data to the context server either to integrate with third party services or to provide analysis of the uninterpreted data provided by context server clients. Such integration will mostly be done using Unomi’s API either directly using Unomi plugins or via the provided REST APIs. However, access to REST APIs is restricted due for security reasons, requiring privileged access to the Unomi server, making things a little more complex to set up.

For simplicity’s sake, this document will focus solely on the first use case and will interact only with the context servlet.

4.3.3. Retrieving context information from Unomi using the context servlet

Unomi provides two ways to retrieve context: either as a pure JSON object containing strictly context information or as a couple of JSON objects augmented with javascript functions that can be used to interact with the Unomi server using the <context server base URL>/context.json or <context server base URL>/context.js URLs, respectively.

Below is an example of asynchronously loading the initial context using the javascript version, assuming a default Unomi install running on http://localhost:8181:

  1. // Load context from Unomi asynchronously
  2. (function (document, elementToCreate, id) {
  3. var js, fjs = document.getElementsByTagName(elementToCreate)[0];
  4. if (document.getElementById(id)) return;
  5. js = document.createElement(elementToCreate);
  6. js.id = id;
  7. js.src = 'http://localhost:8181/context.js';
  8. fjs.parentNode.insertBefore(js, fjs);
  9. }(document, 'script', 'context'));

This initial context results in a javascript file providing some functions to interact with the context server from javascript along with two objects: a cxs object containinginformation about the context for the current user and a digitalData object that is injected into the browser’s window object (leveraging theCustomer Experience Digital Data Layer standard). Note that this last object is not under control of the context server and clients are free to use it or not. Our example will not make use of it.

On the other hand, the cxs top level object contains interesting contextual information about the current user:

  1. {
  2. "profileId":<identifier of the profile associated with the current user>,
  3. "sessionId":<identifier of the current user session>,
  4. "profileProperties":<requested profile properties, if any>,
  5. "sessionProperties":<requested session properties, if any>,
  6. "profileSegments":<segments the profile is part of if requested>,
  7. "filteringResults":<result of the evaluation of personalization filters>,
  8. "trackedConditions":<tracked conditions in the source page, if any>
  9. }

We will look at the details of the context request and response later.