Fork me on GitHub

Demo 1: Solr Search Engine Integration

Overview

Route name Description
Route-HippoEventBus-to-File Receives an HippoEventBus event and store it into a file under the inbox folder.

Hippo Event to File

Route name Description
Route-File-to-Rest Polls the inbox folder to read a JSON message file and invokes the specified REST service URL.

Hippo Event to File

Install and Run Apache Solr locally

To test this scenario, it is required to run Apache Solr locally.

The demo project expects the Apache Solr running at port 8983 by default.

To install Apache Solr, you can follow the following simplified steps for testing purpose only.

  1. Download the latest version of Apache Solr at http://lucene.apache.org/solr/.
  2. Extract the archive file into the project root folder. So, for example, you will have 'solr-x.x.x' subfolder in the project root folder.
  3. Start Apache Solr:

    $ cd ./solr-*/
    $ ./bin/solr start

  4. For demo purpose, add a new core in the Solr Core Admin UI with the name, collection1, and the instanceDir, collection1 with the other fields with the default setting.
  5. Or optionally you can create the demo core manually by creating the server/solr/collection1 folder under the 'solr-x.x.x' subfolder. And copy all the files and directories in server/solr/configsets/_default/conf/ folder to the server/solr/collection1/ folder.
    Note: This manual creation might not work in the latet version of Apache Solr.
  6. Visit http://localhost:8983/solr/, and select the collection1 core.

Running the Demo

You can build and install the module first with Maven.

$ mvn clean install
        

To test this scenario, execute the following in the demo project's root folder:

$ cd demo
$ mvn clean verify
$ mvn -P cargo.run -Dcargo.jvm.args="-Dsearch.engine=solr"
        

Testing the Demo

In CMS UI, try to open a published document and take it offline and re-publish the document.

Publishsing a document in CMS

Now, try to search the content in the Search Engine frontend UI (http://localhost:8983/solr/).

Querying in Search Engine Frontend

Retry to take a document offline or publish an unpublished document and see those synchronized in the search engines properly.

Camel Context Configuration in the demo project

The CamelContext configuration is placed in cms/WEB-INF/camel/routes-with-file.xml like the following example which is initiated by org.springframework.web.context.ContextLoaderListener defined in a <listener> element in cms/WEB-INF/web.xml.

  <camelContext xmlns="http://camel.apache.org/schema/spring">

    <route id="Route-HippoEventBus-to-File">

      <!-- Subscribe publish/depublish events as JSON from HippoEventBus. -->
      <from uri="hippoevent:?category=workflow&amp;action=publish,depublish" />

      <!-- Convert the JSON message to String. -->
      <convertBodyTo type="java.lang.String" />

      <!-- Store the JSON string to a file in the 'inbox' folder. -->
      <to uri="file:inbox?autoCreate=true&amp;charset=utf-8" />

    </route>

    <route id="Route-File-to-REST">

      <!-- Subscribe file events from the 'inbox' folder. -->
      <from uri="file:inbox?autoCreate=true&amp;charset=utf-8&amp;preMove=.processing&amp;delete=true&amp;moveFailed=.error" />

      <!-- Convert the file message to String. -->
      <convertBodyTo type="java.lang.String" />

      <!-- Convert the JSON string to JSON object. -->
      <convertBodyTo type="net.sf.json.JSON" />

      <!-- Set HTTP header to 'POST'. -->
      <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
      </setHeader>

      <!-- Set HTTP query string based on the workflow event message. -->
      <choice>
        <when>
          <simple>${body[action]} == 'publish'</simple>
          <setHeader headerName="CamelHttpQuery">
            <simple>action=index&amp;id=${body[subjectId]}</simple>
          </setHeader>
        </when>
        <when>
          <simple>${body[action]} == 'depublish'</simple>
          <setHeader headerName="CamelHttpQuery">
            <simple>action=delete&amp;id=${body[subjectId]}</simple>
          </setHeader>
        </when>
      </choice>

      <!-- Invoke the Search Index synchronization REST service. -->
      <to uri="http4://localhost:8080/site/restapi/{{search.engine}}/update/" />

    </route>

  </camelContext>