How can I interact with Bigquery using OAuth credentials (refresh tokens)?
I've managed to do it using classes from the com.google.api.services.bigquery
package:
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.api.client.auth.oauth2.TokenResponse;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.bigquery.Bigquery;
import com.google.api.services.bigquery.Bigquery.Datasets;
import com.google.api.services.bigquery.Bigquery.Tabledata.InsertAll;
import com.google.api.services.bigquery.model.DatasetList;
import com.google.api.services.bigquery.model.QueryRequest;
import com.google.api.services.bigquery.model.QueryResponse;
import com.google.api.services.bigquery.model.TableCell;
import com.google.api.services.bigquery.model.TableDataInsertAllRequest;
import com.google.api.services.bigquery.model.TableDataInsertAllResponse;
import com.google.api.services.bigquery.model.TableRow;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
public static void main(String[] args) throws Exception
{
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
.setJsonFactory(new JacksonFactory())
.setClientSecrets("clientId", "clientSecret")
.build()
.setFromTokenResponse(new TokenResponse().setRefreshToken("refreshToken"));
credential.refreshToken();
Bigquery bigquery = new Bigquery.Builder(new NetHttpTransport(), new JacksonFactory(), credential).setApplicationName("xxx").build();
Datasets.List datasetRequest = aBigquery.datasets().list("projectId");
DatasetList datasetList = datasetRequest.execute();
if (datasetList.getDatasets() != null)
{
List<DatasetList.Datasets> datasets = datasetList.getDatasets();
System.out.println("Available datasets\n----------------");
for (com.google.api.services.bigquery.model.DatasetList.Datasets dataset : datasets)
{
System.out.format("%s\n", dataset.getDatasetReference().getDatasetId());
}
}
}
But not using google's samples, which use classes from the com.google.cloud.bigquery
package.
So my question would be: how to specify a refresh token in this snippet?
import com.google.api.gax.paging.Page;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQuery.DatasetListOption;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
public class ListDatasets {
public static void runListDatasets() {
// TODO(developer): Replace these variables before running the sample.
String projectId = "MY_PROJECT_ID";
listDatasets(projectId);
}
public static void listDatasets(String projectId) {
try {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
Page<Dataset> datasets = bigquery.listDatasets(projectId, DatasetListOption.pageSize(100));
if (datasets == null) {
System.out.println("Dataset does not contain any models");
return;
}
datasets
.iterateAll()
.forEach(
dataset -> System.out.printf("Success! Dataset ID: %s ", dataset.getDatasetId()));
} catch (BigQueryException e) {
System.out.println("Project does not contain any datasets \n" + e.toString());
}
}
}