This guide provides a tutorial for creating a Groovy Preferences Validator.
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);
}
}
} 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>
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());
}
}
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);
}
}