Groovy Bridge

## Jetspeed Groovy PreferencesValidator Guide

This guide provides a tutorial for creating a Groovy Preferences Validator.

### 1. The Groovy PreferencesValidator Class

Create the file HelloGroovyValidator.groovy in a directory called groovy-simplest/WEB-INF/classes:

    import javax.portlet.PortletPreferences;
    import javax.portlet.PreferencesValidator;
    import javax.portlet.ValidatorException;

    public class HelloGroovyValidator implements PreferencesValidator
    {
        public void validate(PortletPreferences preferences)
        {
            String message = preferences.getValue("message", null);

            if (message == null || "".equals(message.trim()))
            {
                def failedKeys = [ "message" ];
                throw new ValidatorException("message must be set!", failedKeys);
            }
        }
    }

### 2. The portlet.xml

Edit the file portlet.xml in the groovy-simplest/WEB-INF directory to add Groovy PreferencesValidator. In this case, <portlet-preferences> element is added to the previous example.

    <?xml version="1.0" encoding="UTF-8"?>
    <portlet-app id="velocitysimplest" version="1.0">
      <portlet id="HelloGroovy">
        <portlet-name>HelloGroovy</portlet-name>
        <display-name>Hello Groovy Display Name</display-name>
        <portlet-class>org.apache.portals.bridges.groovy.GroovyPortlet</portlet-class>
        <init-param>
          <name>script-source</name>
          <!-- Note: You can set script source in three ways.
                     The first is to use relative path uri,
                     the second is to use file: url,
                     and the last is to classpath: uri -->
          <!--
          <value>/WEB-INF/groovy/HelloGroovy.groovy</value>
          <value>file:/C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/demo/WEB-INF/groovy/HelloGroovy.groovy</value>
          -->
          <value>classpath:HelloGroovy.groovy</value>
        </init-param>
        <!-- If auto-refresh is true, then a modification of script source applies instantly. -->
        <init-param>
          <name>auto-refresh</name>
          <value>true</value>
        </init-param>
        <supports>
          <mime-type>text/html</mime-type>
          <portlet-mode>VIEW</portlet-mode>
          <portlet-mode>EDIT</portlet-mode>
          <portlet-mode>HELP</portlet-mode>
        </supports>
        <supported-locale>en</supported-locale>
        <portlet-info>
          <title>Hello Groovy Title</title>
          <short-title>Hello Groovy Short Title</short-title>
        </portlet-info>
        <portlet-preferences>
          <preference>
            <name>validator-script-source</name>
            <!-- Note: You can set script source in two ways.
                       The first is to use classpath: path uri,
                       and the other is to file: url.
                       Note that relative path uri is not supported for preferences validator. -->
            <value>classpath:HelloGroovyValidator.groovy</value>
            <!--
            <value>file:/C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/demo/WEB-INF/groovy/HelloGroovyValidator.groovy</value>
            -->
            <read-only>true</read-only>
          </preference>
          <preference>
            <name>validator-auto-refresh</name>
            <!-- If validator-auto-refresh is true,
                 then a modification of script source applies instantly. -->
            <value>true</value>
            <read-only>true</read-only>
          </preference>
          <preferences-validator>org.apache.portals.bridges.groovy.GroovyPreferencesValidator</preferences-validator>
        </portlet-preferences>
      </portlet>
    </portlet-app>

### 3. How to handle validation exception

If you set a preferences validator, you should handle a validation exception in your portlet code like the following example. The HelloGroovy.groovy in the previous example now handles validation exception during PortletPreferences.store() call.

        public void processAction(ActionRequest request, ActionResponse response)
        {
            String message = request.getParameter("message");

            PortletPreferences prefs = request.getPreferences();
            prefs.setValue("message", message);

            try {
                prefs.store();
            } catch (ValidatorException e) {
                // send this error information to the rendering phase.
                response.setRenderParameter("errorMessage", e.getMessage());
            }
        }

### 4. Additional Notes

In groovy, you can use powerful regular expressions like the following example:

        public void validate(PortletPreferences preferences)
        {
            // Let's assume that we have a preference for an email address.
            String email = preferences.getValue("email", "");

            if (!(email ==~ /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/))
            {
                def failedKeys = [ "email" ];
                throw new ValidatorException("message must be set!", failedKeys);
            }
        }