Making A Transaction Filter

To make a transaction filter, create a Java class that extends the abstract class neo.xredsys.api.services.TransactionFilterService. This is a convenience class containing empty "do nothing" implementations of the methods defined in the neo.xredsys.api.TransactionFilter interface:

doCreate(object)

which is executed immediately before a new object is saved.

doUpdate(object)

which is executed immediately before changes to an existing object are saved.

doStagedUpdate(object)

which is executed immediately before changes to an existing staged object are saved. For an explanation of staging, see Content Item Staging.

Note that you cannot change the state of a staged object to published in a transaction filter. Any attempt to do so will result in an exception.

doDelete(object)

which is executed immediately before an existing object is deleted.

isEnabled()

which is called by the Content Store to determine whether or not the filter is currently enabled.

All you need to do in your class is re-implement the "do" method(s) that you are interested in. The object parameter passed in to these methods is a neo.xredsys.api.IOTransaction object and represents the object being created, updated or deleted. You can both query this object and modify it. In the case of create and update transactions, any changes you make to it will be reflected in the saved object.

Here is an example transaction filter called com.mycompany.transactionFilters.WordCount that:

  • Counts the words in the body of a newly-created or updated content item

  • Writes the word count to one of the content item's fields (called wordcount - the example assumes that the content item has a field with this name)

package com.mycompany.transactionFilters;

import java.util.*;
import neo.xredsys.api.*;
import neo.xredsys.api.services.*;

public class WordCount extends TransactionFilterService {

  public WordCount() {
  }

  public void doCreate(IOTransaction pObject) throws FilterException {
    if (pObject instanceof ArticleTransaction) {
      countWords((ArticleTransaction)pObject);
    }
  }

  public void doUpdate(IOTransaction pObject) throws FilterException {
    if (pObject instanceof ArticleTransaction) {
      countWords((ArticleTransaction)pObject);
    }
  }

  public void doStagedUpdate(IOTransaction pObject) throws FilterException {
    if (pObject instanceof ArticleTransaction) {
      countWords((ArticleTransaction)pObject);
    }
  }

  public void countWords(ArticleTransaction pArticle) {
    String original = pArticle.getElementText("body");
    int count = new StringTokenizer(original).countTokens();
    pArticle.setElementText("wordcount", Integer.toString(count));
  }

}

Only update and create operations are of interest here, so the class does not contain an implementation of doDelete(). The doCreate() and doUpdate() methods are identical: they simply check if the transaction object is a content item and if it is, call countWords(). countWords() counts the words in the content item's body field and writes the result to the wordcount field.

This version of the filter cannot easily be re-used because the field names body and wordcount are hard-coded. It is better to create properties for these field names:

  private String mFieldToCount = "body";
  private String mFieldToUpdate = "wordcount";

  public void setFieldToCount(String pFieldToCount) {
    mFieldToCount = pFieldToCount;
  }

  public String getFieldToCount() {
    return mFieldToCount;
  }

  public void setFieldToUpdate(String pFieldToUpdate) {
    mFieldToUpdate = pFieldToUpdate;
  }

  public String getFieldToUpdate() {
    return mFieldToUpdate;
  }

and modify the countWords() method accordingly:

  public void countWords(ArticleTransaction pArticle) {
    String original = pArticle.getElementText(getFieldToCount());
    int count = new StringTokenizer(original).countTokens();
    pArticle.setElementText(getFieldToUpdate(), Integer.toString(count));
  }

If you do this, then the field names can be configured externally by setting parameters - see Using A Transaction Filter for further information.

The countWords() method is a very rudimentary word counter and not recommended for real use.

Before a transaction filter can be used it must be:

  • Compiled

  • Added to the Content Store's classpath

To compile a transaction filter you need the CUE JAR file engine-core-7.1.1-1.jar and the corresponding current version of common-nursery-version-number.jar in your classpath.