Stavo dando una mano ad una collega per realizzare un ADT con Velocity e mi sono reso conto che l'operazione era più complicata del previsto a causa del codice che avrei dovuto scrivere.
Così mi sono detto che sarebbe stato molto bello se avessi potuto iniettare nel contesto di Velocity una mia classe di utility che facesse quello che serviva a me. Ho fatto un pò di ricerche, un pò di prove e questa è la soluzione!
Innanzitutto dovete realizzare un plugin di tipo hook oppure aggiungere il suddetto hook all'interno di un plugin portlet già esistente, in modo da poter gestire il vostro file portal.properties.
A questo punto realizzate la vostra classe di utility contenente tutti i metodi (statici) che vi servono; supponiamo che l'abbiate chiamata it.dvel.velocity.util.MyVelocityUtil
. Non sto qui a spiegarvi come implementare una classe di utility...
Dopodichè realizzate una classe che estenda com.liferay.portal.kernel.events.Action
e che si occuperà materialmente di iniettare la vostra classe nel contesto di Velocity:
package it.dvel.velocity.action;
import com.liferay.portal.kernel.events.Action;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.util.WebKeys;
import it.dvel.velocity.util.MyVelocityUtil;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomVelocityAction extends Action {
@Override
public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException {
Map<String, Object> variables = (Map<String, Object>) request.getAttribute(WebKeys.VM_VARIABLES);
Map<String, Object> customVariables = new HashMap<String, Object>();
// Qui vanno aggiunte tutte le classi da usare in Velocity
customVariables.put("myVelocityUtil", new MyVelocityUtil());
if (variables == null)
variables = customVariables;
else
variables.putAll(customVariables);
request.setAttribute(WebKeys.VM_VARIABLES, variables);
}
}
A questo punto rimane da dire a Liferay di utilizzare questa classe e lo facciamo grazie al nostro hook, aggiungendo la seguente property nel file portal.properties
del plugin:
servlet.service.events.pre=it.dvel.velocity.action.CustomVelocityAction
Abbiamo finito! Deployate il vostro hook, dopodiché potrete invocare la vostra classe di utility all'interno di un ADT usando il nome che avete specificato sopra:
$myVelocityUtil.metodo1(...)
#set ($variabile = $myVelocityUtil.metodo2(...))