Latest Article

  • Generate a Google access token from a JSON service account file in PDI transformation step

    Overview

    This article explains how to generate an access token from a service account JSON file using User Defined Java Class (UDJC) step. Once a token is generated then you can use it to access Google APIs using Pentaho Rest Client or other steps.

    Prerequisites

    1. Create a project in Google Cloud Platform.
    2. Activate the API you want to query
    3. Create a Google Service Account and download the key as JSON file.

    Steps

    • Create a UDJC step and the following code:
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;
    import org.pentaho.di.core.variables.Variables;
    
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    
    import com.google.api.services.drive.DriveScopes;
    String googleAccessToken = "";
    String fileName = "";
    public boolean init(StepMetaInterface stepMetaInterface, StepDataInterface stepDataInterface) 
    throws FileNotFoundException, IOException, GeneralSecurityException {
    fileName = getParameter(“GOOGLE_APPLICATION_CREDENTIALS”);
    
    googleAccessToken = getGoogleAccessToken(fileName);
    logBasic("Token: " + googleAccessToken);
    return parent.initImpl(stepMetaInterface, stepDataInterface);
    }
    
    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
    Object[] r = getRow();
    if (r == null) {
      setOutputDone();
      return false;
    }
    if (first) {
      first = false;
    }
    Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
    get(Fields.Out, “googleAccessToken”).setValue(outputRow, googleAccessToken);
    putRow(data.outputRowMeta, outputRow);
    return true;
    }
    
    public static String getGoogleAccessToken(String jsonKeyFilePath)
    throws FileNotFoundException, IOException, GeneralSecurityException {
    GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(jsonKeyFilePath))
    .createScoped(Collections.singleton(DriveScopes.DRIVE));
    credential.refreshToken();
    return credential.getAccessToken();
    }
    • Add the following jar files into Pentaho lib folder:
    google-api-client-1.19.0.jar
    jackson-core-2.x.x.jar
    google-oauth-client-1.19.0.jar
    google-http-client-jackson2-1.19.0.jar
    google-http-client-1.19.0.jar
    google-api-services-drive-v3-rev122-1.23.0.jar
    Example of PDI transformation
    Displaying the content after reading the Google spreadsheet