juil 20

[Pentaho] Lancer une transformation depuis un servlet

Catégorie(s): Développement,JavaSébastien @ 21:13

J’aime bien les outils de Pentaho : ils sont simple à prendre en main et performant. De plus, le fait d’utiliser les différents éléments composant la suite permet de les faire communiquer sans peine. On peut par exemple lancer des transformations crées sous Data Integration directement depuis BI Server sans avoir besoin de passer par DI. Très pratique pour réaliser certaines tâches à déclencher manuellement. Pour cela, il suffit simplement de créer un fichier xaction qui se charge de lancer le transformation. Le soucis c’est que peut importe comment j’essayais, ça ne fonctionnait pas.

Au final, la solution la plus simple que j’ai trouvé est de créer une classe qui se charge de lancer la transformation que je souhaite quand elle est appelée par un servlet par exemple. Voici un exemple tout bête :

package net.delistage.pentaho;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.lang.NullArgumentException;
import org.pentaho.di.core.JndiUtil;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.JobEntryLoader;
import org.pentaho.di.trans.StepLoader;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
public class DataIntegrationTrans {
    private String transFile = "";
    private HashMap<String, String> params = null;
    /**
     * Constructor, set the transformation file path
     *
     * @param transFile
     * @throws KettleException
     */
    public DataIntegrationTrans(String transFile) throws KettleException {
        this.transFile = transFile;
    }
    /**
     * Initialize StepLoader by initializing the Kettle environment, StepLoader and JobEntry.
     * If you use a JNDI connection into your transformation, initiliaze JndiUtil too.
     * @throws KettleException
     */
    public void initTrans() throws KettleException {
        EnvUtil.environmentInit();
        JndiUtil.initJNDI();
        StepLoader.init();
        JobEntryLoader.init();
    }
    /**
     * Set parameters for the transformation
     *
     * @param name
     *            : the name of the parameter
     * @param value
     *            : its value
     */
    public void setParameterValue(String name, String value) {
        if (params == null) {
            params = new HashMap<String, String>();
        }
        params.put(name, value);
        System.out.println("DataIntegrationTransManager> New parameter: '"
                + name + "'=\"" + value + "\"");
    }
    /**
     * Execute the transformation
     *
     * @throws KettleException
     */
    public void execute() throws KettleException {
        execute(transFile);
    }
    /**
     * Execute the transformation
     *
     * @param transf
     *            : the transfile
     * @throws KettleException
     */
    public void execute(String transf) throws KettleException {
        if (transf.length() > 0) {
            initTrans();
            // TransMeta : Import the structure of the transformation
            TransMeta tm = new TransMeta(transf);
            // Create the transformation
            Trans trans = new Trans(tm);
            // Set the parameters
            if (params != null && params.size() > 0) {
                Set<String> keys = params.keySet();
                Iterator<String> it = keys.iterator();
                String k = "";
                while (it.hasNext()) {
                    k = it.next();
                    trans.setParameterValue(k, params.get(k));
                }
            }
            // Execute the transformation
            trans.execute(null);
            trans.waitUntilFinished();
        } else {
            throw new NullArgumentException(
                    "transFile can't be empty. Please set it before execute the transformation.");
        }
    }
    /**
     * Main is here only for testing our class before using it into a servlet.
     */
    public static void main(String[] args) throws KettleException {
        DataIntegrationTrans ditm = new DataIntegrationTrans("mytrans.ktr");
        ditm.setParameterValue("DATE", "2009-07-01");
        ditm.execute();
    }
}

Je vous laisse vous référer aux commentaires dans le code pour savoir ce qu’il fait, je pense l’avoir assez bien détaillé. S’il reste des zones d’ombre, les commentaires sont à votre disposition.

Articles sur le même sujet :

  1. [Java] HttpClient 4 et authentification HTTP
  2. [PDI] Récupérer la valeur du noeud XML que l’on parcourt
  3. [Pentaho BI Server] Personnaliser le menu
  4. [Java / Pentaho BI Server] Déployer ses propres JSP et servlet
  5. [Java] Apache HttpClient et SSL non valide

2 Responses to “[Pentaho] Lancer une transformation depuis un servlet”

  1. Ludo

    Putain ça pique les yeux, ça fait longtemps que j’ai pas vu de code, du java qui plus est, des classes et tout le toutim :)
    On se cale cette semaine avec le Nico (sauf jeudi, vendredi et samedi… donc demain ??)
    ++

  2. Sébastien

    Ce bout de code c’est une histoire gosse comparé à ce que je viens de pondre pour générer un fichier XLS. ^^’

    On se calle quand vous voulez, j’ai rien de prévu. Mais je remarque qu’on a trop de choix dans la date. :D

Laisser un commentaire