Пакетное обновление электронной таблицы с помощью Google GData API с использованием учетной записи домена с двумя ножками OAUTH / OPEN ID
Ладно, на этом снимки выходных - вот мой последний воскресный ночной призыв к помощи.
Приложению Google Marketplace, которое должно использовать подход 2 Legged OAUTH, необходимо записать 50К записей в таблицу Google Doc. Я могу создавать, изменять размеры, переименовывать и записывать записи в электронную таблицу. Запись 100 строк по отдельности занимает около минуты, поэтому мне нужно использовать пакетное обновление. Не удается получить пакетное обновление для работы. Приведенный ниже код - моя лучшая попытка - я продолжаю получать & quot; токен недействителен - неверный токен 401 & quot ;. Весь пример кода приведен для трехногой программы, но я не могу предложить пользователю утвердить приложение, так как это приложение на торговой площадке.
Было бы здорово найти пример пакетных обновлений электронных таблиц с использованием openid и 2LO
final String SCOPE = "https://spreadsheets.google.com/feeds/spreadsheets/private/full";
SpreadsheetService spreadsheetService;
String consumerKey = getInitParameter("consumer_key");
String consumerSecret = getInitParameter("consumer_secret");
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(consumerKey);
oauthParameters.setOAuthConsumerSecret(consumerSecret);
oauthParameters.setOAuthType(OAuthParameters.OAuthType.TWO_LEGGED_OAUTH);
oauthParameters.setScope(SCOPE);
OAuthSigner signer = new OAuthHmacSha1Signer();
spreadsheetService = new SpreadsheetService("nimbits-com");
String title = entity.getName().getValue();
try {
spreadsheetService.setOAuthCredentials(oauthParameters, signer);
spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V3);
SpreadsheetQuery query = new SpreadsheetQuery(new URL(SCOPE));
query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
query.setTitleQuery(title);
SpreadsheetFeed feed = spreadsheetService.query(query, SpreadsheetFeed.class);
//works fine up to this point, I get the feed and spreadsheet.
if (feed != null && ! feed.getEntries().isEmpty()) {
com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
CellFeed batchRequest = new CellFeed();
String batchId = "R" + 2 + "C" + 1;
URL entryUrl = new URL(sheet.getCellFeedUrl().toString() + "/" + batchId);
//Invalid TOKEN error here, trying to get the entry.
CellEntry batchOperation = spreadsheetService.getEntry(entryUrl, CellEntry.class);
batchOperation.setService(spreadsheetService);
batchOperation.changeInputValueLocal("test");
BatchUtils.setBatchId(batchOperation, batchId);
BatchUtils.setBatchOperationType(batchOperation, BatchOperationType.UPDATE);
batchRequest.getEntries().add(batchOperation);
CellFeed cellFeed = spreadsheetService.getFeed(sheet.getCellFeedUrl(), CellFeed.class);
Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
URL batchUrl = new URL(batchLink.getHref());
spreadsheetService.batch(batchUrl, batchRequest);
}
} catch (MalformedURLException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (ServiceException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (IOException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (OAuthException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
}
Этот образец просто пытается записать одну запись в пакете. Я изменил размер таблицы, и она тоже выглядит нормально. Я не вижу, как установить токен или выполнить этот запрос с помощью 2LO. Я пытался добавить xoauth_requestor_id к URL-адресам.
edit since I started the bounty:
Этот фрагмент кода работает отлично и добавляет 1 строку в существующую электронную таблицу с аутентификацией 2LO, которую я имею. Мне нужно изменить его, чтобы быстро ввести 50 000 строк.
@Override
public void addSpreadsheetHeader(Entity entity) throws NimbitsException {
final User user = UserServiceFactory.getServerInstance().getHttpRequestUser(
this.getThreadLocalRequest());
SpreadsheetService spreadsheetService;
String consumerKey = getInitParameter("consumer_key");
String consumerSecret = getInitParameter("consumer_secret");
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(consumerKey);
oauthParameters.setOAuthConsumerSecret(consumerSecret);
spreadsheetService = new SpreadsheetService("nimbits-com");
// SpreadsheetEntry entry = new SpreadsheetEntry();
String title = entity.getName().getValue();
// entry.setTitle(TextConstruct.plainText(title));
try {
spreadsheetService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
SpreadsheetQuery query = new SpreadsheetQuery(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"));
query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
query.setTitleQuery(title);
SpreadsheetFeed feed = spreadsheetService.query(query, SpreadsheetFeed.class);
if (feed != null && ! feed.getEntries().isEmpty()) {
com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
URL cellFeedUrl= sheet.getCellFeedUrl ();
CellFeed cellFeed= spreadsheetService.getFeed (cellFeedUrl, CellFeed.class);
CellEntry cellEntry;
cellEntry= new CellEntry (1, 1, "Timestamp");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 2, "Value");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 3, "Latitude");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 4, "Longitude");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 5, "Annotation");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 6, "Data");
cellFeed.insert (cellEntry);
}
} catch (MalformedURLException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (ServiceException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (IOException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (OAuthException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
}
}