RandomSec/extensions/gdata/src/com/google/refine/extension/gdata/SpreadsheetSerializer.java
2018-03-06 18:10:54 -05:00

125 lines
4.1 KiB
Java

package com.google.refine.extension.gdata;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.model.AppendCellsRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse;
import com.google.api.services.sheets.v4.model.ExtendedValue;
import com.google.api.services.sheets.v4.model.Request;
import com.google.api.services.sheets.v4.model.RowData;
import com.google.refine.exporters.TabularSerializer;
final class SpreadsheetSerializer implements TabularSerializer {
static final Logger logger = LoggerFactory.getLogger("SpreadsheetSerializer");
private static final int BATCH_SIZE = 1000;
private Sheets service;
private String spreadsheetId;
private List<Exception> exceptions;
// A list of updates to apply to the spreadsheet.
private List<Request> requests = new ArrayList<>();
private Request batchRequest = null;
private int row = 0;
private List<RowData> rows;
SpreadsheetSerializer(Sheets service, String spreadsheetId, List<Exception> exceptions) {
this.service = service;
this.spreadsheetId = spreadsheetId;
this.exceptions = exceptions;
}
@Override
public void startFile(JSONObject options) {
}
@Override
public void endFile() {
if (batchRequest != null) {
sendBatch(rows);
}
BatchUpdateSpreadsheetRequest requestBody = new BatchUpdateSpreadsheetRequest();
requestBody.setIncludeSpreadsheetInResponse(false);
requestBody.setRequests(requests);
Sheets.Spreadsheets.BatchUpdate request;
try {
logger.debug("spreadsheetId: " + spreadsheetId);
logger.debug("requestBody:" + requestBody.toString());
request = service.spreadsheets().batchUpdate(spreadsheetId, requestBody);
BatchUpdateSpreadsheetResponse response = request.execute();
logger.debug("response:" + response.toPrettyString());
} catch (IOException e) {
exceptions.add(e);
}
}
@Override
public void addRow(List<CellData> cells, boolean isHeader) {
if (batchRequest == null) {
batchRequest = new Request();
rows = new ArrayList<RowData>(BATCH_SIZE);
}
List<com.google.api.services.sheets.v4.model.CellData> cellDatas = new ArrayList<>();
RowData rowData = new RowData();
for (int c = 0; c < cells.size(); c++) {
CellData cellData = cells.get(c);
if (cellData != null && cellData.text != null) {
cellDatas.add(cellData2sheetCellData(cellData));
}
}
rowData.setValues(cellDatas);
rows.add(rowData);
row++;
if (row % BATCH_SIZE == 0) {
sendBatch(rows);
}
}
private com.google.api.services.sheets.v4.model.CellData cellData2sheetCellData(CellData cellData) {
com.google.api.services.sheets.v4.model.CellData sheetCellData = new com.google.api.services.sheets.v4.model.CellData();
ExtendedValue ev = new ExtendedValue();
ev.setStringValue(cellData.value.toString());
sheetCellData.setUserEnteredValue(ev);
return sheetCellData;
}
private void sendBatch(List<RowData> rows) {
AppendCellsRequest acr = new AppendCellsRequest();
acr.setFields("*");
acr.setSheetId(0);
acr.setRows(rows);
batchRequest.setAppendCells(acr);
requests.add(batchRequest);
}
public String getUrl() throws UnsupportedEncodingException {
String urlString= "https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/edit#gid=0";
return URLEncoder.encode(urlString, "UTF-8");
}
}