From 3fb6883fc65d2a3e226a26fd7d3295bbee791e2a Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 29 Jun 2018 12:49:53 -0700 Subject: [PATCH 001/297] Add Google Sheets snippets --- sheets/snippets/.gitignore | 67 ++++ sheets/snippets/build.gradle | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53638 bytes sheets/snippets/settings.gradle | 19 ++ .../src/main/java/SpreadsheetPivotTables.java | 117 +++++++ .../src/main/java/SpreadsheetSnippets.java | 297 ++++++++++++++++++ sheets/snippets/src/test/java/BaseTest.java | 155 +++++++++ .../test/java/SpreadsheetSnippetsTest.java | 121 +++++++ sheets/snippets/test.sh | 3 + 9 files changed, 796 insertions(+) create mode 100644 sheets/snippets/.gitignore create mode 100644 sheets/snippets/build.gradle create mode 100644 sheets/snippets/gradle/wrapper/gradle-wrapper.jar create mode 100644 sheets/snippets/settings.gradle create mode 100644 sheets/snippets/src/main/java/SpreadsheetPivotTables.java create mode 100644 sheets/snippets/src/main/java/SpreadsheetSnippets.java create mode 100644 sheets/snippets/src/test/java/BaseTest.java create mode 100644 sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java create mode 100755 sheets/snippets/test.sh diff --git a/sheets/snippets/.gitignore b/sheets/snippets/.gitignore new file mode 100644 index 00000000..0c27b487 --- /dev/null +++ b/sheets/snippets/.gitignore @@ -0,0 +1,67 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ + +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries +# .idea/shelf + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +.gradle +build/ +bin/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# Eclipse +.project +.settings/ +.classpath diff --git a/sheets/snippets/build.gradle b/sheets/snippets/build.gradle new file mode 100644 index 00000000..5e599ff9 --- /dev/null +++ b/sheets/snippets/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' + +repositories { + // Use 'jcenter' for resolving your dependencies. + jcenter() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.22.0' + compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' + compile 'com.google.apis:google-api-services-sheets:v4-rev30-1.22.0' + testCompile 'junit:junit:4.12' +} + +test { + testLogging.showStandardStreams = true +} \ No newline at end of file diff --git a/sheets/snippets/gradle/wrapper/gradle-wrapper.jar b/sheets/snippets/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5ccda13e9cb94678ba179b32452cf3d60dc36353 GIT binary patch literal 53638 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

i1O>I_eGKr^&y;^hm-V94&lC5U~@}s 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 GfBiq ranges) throws IOException { + Sheets service = this.service; + int targetSheetId = 123; + + Request request = new Request().setUpdateCells(new UpdateCellsRequest() + .setRows(Collections.singletonList(new RowData().setValues(Collections.singletonList( + new CellData().setPivotTable( + new PivotTable().setSource( + new GridRange() + .setSheetId(SHEET_ID) + .setStartRowIndex(0) + .setEndColumnIndex(0) + .setEndRowIndex(101) + .setEndColumnIndex(8) + ).setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(6) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )).setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(3) + .setSortOrder("ASCENDING") + .setShowTotals(true) + )).setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(3) + )).setValueLayout("HORIZONTAL")) + )) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) + ) + .setFields("pivotTable") + ); + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(Collections.singletonList(request)); + BatchUpdateSpreadsheetResponse result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + + // [END batchGetValues] + return result; + } + + public BatchUpdateSpreadsheetResponse conditionalFormatting(String spreadsheetId) throws IOException { + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue() + .setUserEnteredValue("=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor(new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue() + .setUserEnteredValue("=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) + ) + ) + .setIndex(0) + ) + ); + + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest().setRequests(requests); + BatchUpdateSpreadsheetResponse result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + + return result; + } +} diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java new file mode 100644 index 00000000..655c0784 --- /dev/null +++ b/sheets/snippets/src/main/java/SpreadsheetSnippets.java @@ -0,0 +1,297 @@ +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.*; +import com.google.common.collect.Lists; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class SpreadsheetSnippets { + private Sheets service; + + public SpreadsheetSnippets(Sheets service) { + this.service = service; + } + + public String create(String title) throws IOException { + Sheets service = this.service; + // [START create] + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle(title)); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); + // [END create] + return spreadsheet.getSpreadsheetId(); + } + + public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String title, + String find, String replacement) + throws IOException { + Sheets service = this.service; + // [START batchUpdate] + List requests = new ArrayList<>(); + // Change the spreadsheet's title. + requests.add(new Request() + .setUpdateSpreadsheetProperties(new UpdateSpreadsheetPropertiesRequest() + .setProperties(new SpreadsheetProperties() + .setTitle(title)) + .setFields("title"))); + // Find and replace text. + requests.add(new Request() + .setFindReplace(new FindReplaceRequest() + .setFind(find) + .setReplacement(replacement) + .setAllSheets(true))); + // Add additional requests (operations) ... + + BatchUpdateSpreadsheetRequest body = + new BatchUpdateSpreadsheetRequest().setRequests(requests); + BatchUpdateSpreadsheetResponse response = + service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); + System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); + // [END batchUpdate] + return response; + } + + public ValueRange getValues(String spreadsheetId, String range) throws IOException { + Sheets service = this.service; + // [START getValues] + ValueRange result = service.spreadsheets().values().get(spreadsheetId, range).execute(); + int numRows = result.getValues() != null ? result.getValues().size() : 0; + System.out.printf("%d rows retrieved.", numRows); + // [END getValues] + return result; + } + + public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) + throws IOException { + Sheets service = this.service; + // [START batchGetValues] + List ranges = Arrays.asList( + //Range names ... + ); + // [START_EXCLUDE silent] + ranges = _ranges; + // [END_EXCLUDE] + BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) + .setRanges(ranges).execute(); + System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); + // [END batchGetValues] + return result; + } + public UpdateValuesResponse updateValues(String spreadsheetId, String range, + String valueInputOption, List> _values) + throws IOException { + Sheets service = this.service; + // [START updateValues] + List> values = Arrays.asList( + Arrays.asList( + // Cell values ... + ) + // Additional rows ... + ); + // [START_EXCLUDE silent] + values = _values; + // [END_EXCLUDE] + ValueRange body = new ValueRange() + .setValues(values); + UpdateValuesResponse result = + service.spreadsheets().values().update(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells updated.", result.getUpdatedCells()); + // [END updateValues] + return result; + } + + public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String range, + String valueInputOption, + List> _values) + throws IOException { + Sheets service = this.service; + // [START batchUpdateValues] + List> values = Arrays.asList( + Arrays.asList( + // Cell values ... + ) + // Additional rows ... + ); + // [START_EXCLUDE silent] + values = _values; + // [END_EXCLUDE] + List data = new ArrayList(); + data.add(new ValueRange() + .setRange(range) + .setValues(values)); + // Additional ranges to update ... + + BatchUpdateValuesRequest body = new BatchUpdateValuesRequest() + .setValueInputOption(valueInputOption) + .setData(data); + BatchUpdateValuesResponse result = + service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); + System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); + // [END batchUpdateValues] + return result; + } + + public AppendValuesResponse appendValues(String spreadsheetId, String range, + String valueInputOption, List> _values) + throws IOException { + Sheets service = this.service; + // [START appendValues] + List> values = Arrays.asList( + Arrays.asList( + // Cell values ... + ) + // Additional rows ... + ); + // [START_EXCLUDE silent] + values = _values; + // [END_EXCLUDE] + ValueRange body = new ValueRange() + .setValues(values); + AppendValuesResponse result = + service.spreadsheets().values().append(spreadsheetId, range, body) + .setValueInputOption(valueInputOption) + .execute(); + System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); + // [END appendValues] + return result; + } + + public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws IOException { + Sheets service = this.service; + + // Create two sheets for our pivot table. + List sheetsRequests = new ArrayList<>(); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest())); + + BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(sheetsRequests); + BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets() + .batchUpdate(spreadsheetId, createSheetsBody).execute(); + int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties() + .getSheetId(); + int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() + .getSheetId(); + + // [START pivot_tables] + PivotTable pivotTable = new PivotTable() + .setSource( + new GridRange() + .setSheetId(sourceSheetId) + .setStartRowIndex(0) + .setStartColumnIndex(0) + .setEndRowIndex(20) + .setEndColumnIndex(7) + ) + .setRows(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(1) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setColumns(Collections.singletonList( + new PivotGroup() + .setSourceColumnOffset(4) + .setShowTotals(true) + .setSortOrder("ASCENDING") + )) + .setValues(Collections.singletonList( + new PivotValue() + .setSummarizeFunction("COUNTA") + .setSourceColumnOffset(4) + )); + List requests = Lists.newArrayList(); + Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest() + .setFields("*") + .setRows(Collections.singletonList( + new RowData().setValues( + Collections.singletonList( + new CellData().setPivotTable(pivotTable)) + ) + )) + .setStart(new GridCoordinate() + .setSheetId(targetSheetId) + .setRowIndex(0) + .setColumnIndex(0) + + )); + + requests.add(updateCellsRequest); + BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + BatchUpdateSpreadsheetResponse result = service.spreadsheets() + .batchUpdate(spreadsheetId, updateCellsBody).execute(); + // [END pivot_tables] + return result; + } + + public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) + throws IOException { + // [START conditionalFormat] + List ranges = Collections.singletonList(new GridRange() + .setSheetId(0) + .setStartRowIndex(1) + .setEndRowIndex(11) + .setStartColumnIndex(0) + .setEndColumnIndex(4) + ); + List requests = Arrays.asList( + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=GT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setTextFormat( + new TextFormat().setForegroundColor( + new Color().setRed(0.8f)) + )) + ) + ) + .setIndex(0) + ), + new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() + .setRule(new ConditionalFormatRule() + .setRanges(ranges) + .setBooleanRule(new BooleanRule() + .setCondition(new BooleanCondition() + .setType("CUSTOM_FORMULA") + .setValues(Collections.singletonList( + new ConditionValue().setUserEnteredValue( + "=LT($D2,median($D$2:$D$11))") + )) + ) + .setFormat(new CellFormat().setBackgroundColor( + new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) + )) + ) + ) + .setIndex(0) + ) + ); + + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + BatchUpdateSpreadsheetResponse result = service.spreadsheets() + .batchUpdate(spreadsheetId, body) + .execute(); + System.out.printf("%d cells updated.", result.getReplies().size()); + // [END conditionalFormat] + return result; + } +} diff --git a/sheets/snippets/src/test/java/BaseTest.java b/sheets/snippets/src/test/java/BaseTest.java new file mode 100644 index 00000000..6db7e518 --- /dev/null +++ b/sheets/snippets/src/test/java/BaseTest.java @@ -0,0 +1,155 @@ +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.drive.Drive; +import com.google.api.services.drive.DriveScopes; +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.CellData; +import com.google.api.services.sheets.v4.model.ExtendedValue; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.RepeatCellRequest; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import org.junit.After; +import org.junit.Before; + +public class BaseTest { + static { + enableLogging(); + } + + protected Sheets service; + protected Drive driveService; + protected Set filesToDelete = new HashSet(); + + public static void enableLogging() { + Logger logger = Logger.getLogger(HttpTransport.class.getName()); + logger.setLevel(Level.INFO); + logger.addHandler(new Handler() { + + @Override + public void close() throws SecurityException { + } + + @Override + public void flush() { + } + + @Override + public void publish(LogRecord record) { + // default ConsoleHandler will print >= INFO to System.err + if (record.getLevel().intValue() < Level.INFO.intValue()) { + System.out.println(record.getMessage()); + } + } + }); + } + + public GoogleCredential getCredential() throws IOException { + return GoogleCredential.getApplicationDefault() + .createScoped(Arrays.asList(DriveScopes.DRIVE)); + } + + public Sheets buildService(GoogleCredential credential) throws IOException, + GeneralSecurityException { + return new Sheets.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JacksonFactory.getDefaultInstance(), + credential) + .setApplicationName("Sheets API Snippets") + .build(); + } + + public Drive buildDriveService(GoogleCredential credential) + throws IOException, GeneralSecurityException { + return new Drive.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JacksonFactory.getDefaultInstance(), + credential) + .setApplicationName("Sheets API Snippets") + .build(); + } + + @Before + public void setup() throws IOException, GeneralSecurityException { + GoogleCredential credential = getCredential(); + this.service = buildService(credential); + this.driveService = buildDriveService(credential); + this.filesToDelete.clear(); + } + + @After + public void cleanupFiles() { + for(String id : filesToDelete) { + try { + this.driveService.files().delete(id).execute(); + } catch (IOException e) { + System.err.println("Unable to cleanup file " + id); + } + } + } + + protected void deleteFileOnCleanup(String id) { + filesToDelete.add(id); + } + + protected String createTestSpreadsheet() throws IOException { + Spreadsheet spreadsheet = new Spreadsheet() + .setProperties(new SpreadsheetProperties() + .setTitle("Test Spreadsheet")); + spreadsheet = service.spreadsheets().create(spreadsheet) + .setFields("spreadsheetId") + .execute(); + return spreadsheet.getSpreadsheetId(); + } + + protected void populateValuesWithStrings(String spreadsheetId) throws IOException { + List requests = new ArrayList<>(); + requests.add(new Request().setRepeatCell(new RepeatCellRequest() + .setRange(new GridRange() + .setSheetId(0) + .setStartRowIndex(0) + .setEndRowIndex(10) + .setStartColumnIndex(0) + .setEndColumnIndex(10)) + .setCell(new CellData() + .setUserEnteredValue(new ExtendedValue() + .setStringValue("Hello"))) + .setFields("userEnteredValue"))); + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + } + + protected void populateValuesWithNumbers(String spreadsheetId) throws IOException { + List requests = new ArrayList<>(); + requests.add(new Request().setRepeatCell(new RepeatCellRequest() + .setRange(new GridRange() + .setSheetId(0) + .setStartRowIndex(0) + .setEndRowIndex(10) + .setStartColumnIndex(0) + .setEndColumnIndex(10)) + .setCell(new CellData() + .setUserEnteredValue(new ExtendedValue() + .setNumberValue(1337D))) + .setFields("userEnteredValue"))); + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest() + .setRequests(requests); + service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); + } +} diff --git a/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java b/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java new file mode 100644 index 00000000..9e632720 --- /dev/null +++ b/sheets/snippets/src/test/java/SpreadsheetSnippetsTest.java @@ -0,0 +1,121 @@ +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import com.google.api.services.sheets.v4.model.*; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +public class SpreadsheetSnippetsTest extends BaseTest { + private SpreadsheetSnippets snippets; + + @Before + public void createSnippets() { + this.snippets = new SpreadsheetSnippets(this.service); + } + + @Test + public void testCreate() throws IOException { + String id = this.snippets.create("Title"); + assertNotNull(id); + this.deleteFileOnCleanup(id); + } + + @Test + public void testBatchUpdate() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + this.populateValuesWithStrings(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + this.snippets.batchUpdate(spreadsheetId, "New Title", "Hello", "Goodbye"); + List replies = response.getReplies(); + assertEquals(2, replies.size()); + FindReplaceResponse findReplaceResponse = replies.get(1).getFindReplace(); + assertEquals(100, findReplaceResponse.getOccurrencesChanged().intValue()); + } + + @Test + public void testConditionalFormat() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + this.populateValuesWithNumbers(spreadsheetId); + BatchUpdateSpreadsheetResponse response = + this.snippets.conditionalFormat(spreadsheetId); + assertEquals(spreadsheetId, response.getSpreadsheetId()); + assertEquals(2, response.getReplies().size()); + } + + @Test + public void testGetValues() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + this.populateValuesWithStrings(spreadsheetId); + ValueRange result = this.snippets.getValues(spreadsheetId, "A1:C2"); + List> values = result.getValues(); + assertEquals(2, values.size()); + assertEquals(3, values.get(0).size()); + } + + @Test + public void testBatchGetValues() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + this.populateValuesWithStrings(spreadsheetId); + List ranges = Arrays.asList("A1:A3", "B1:C1"); + BatchGetValuesResponse result = this.snippets.batchGetValues(spreadsheetId, ranges); + List valueRanges = result.getValueRanges(); + assertEquals(2, valueRanges.size()); + List> values = valueRanges.get(0).getValues(); + assertEquals(3, values.size()); + } + + @Test + public void testUpdateValues() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + UpdateValuesResponse result = + this.snippets.updateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); + assertEquals(2, result.getUpdatedRows().intValue()); + assertEquals(2, result.getUpdatedColumns().intValue()); + assertEquals(4, result.getUpdatedCells().intValue()); + } + + @Test + public void testBatchUpdateValues() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + BatchUpdateValuesResponse result = + this.snippets.batchUpdateValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); + assertEquals(1, result.getResponses().size()); + assertEquals(2, result.getTotalUpdatedRows().intValue()); + assertEquals(2, result.getTotalUpdatedColumns().intValue()); + assertEquals(4, result.getTotalUpdatedCells().intValue()); + } + + @Test + public void testAppendValues() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + this.populateValuesWithStrings(spreadsheetId); + List> values = Arrays.asList( + Arrays.asList("A", "B"), + Arrays.asList("C", "D")); + AppendValuesResponse result = + this.snippets.appendValues(spreadsheetId, "A1:B2", "USER_ENTERED", values); + assertEquals("Sheet1!A1:J10", result.getTableRange()); + UpdateValuesResponse updates = result.getUpdates(); + assertEquals(2, updates.getUpdatedRows().intValue()); + assertEquals(2, updates.getUpdatedColumns().intValue()); + assertEquals(4, updates.getUpdatedCells().intValue()); + } + + @Test + public void testPivotTable() throws IOException { + String spreadsheetId = this.createTestSpreadsheet(); + BatchUpdateSpreadsheetResponse result = this.snippets.pivotTables(spreadsheetId); + assertNotNull(result); + } +} diff --git a/sheets/snippets/test.sh b/sheets/snippets/test.sh new file mode 100755 index 00000000..49d2c9e8 --- /dev/null +++ b/sheets/snippets/test.sh @@ -0,0 +1,3 @@ +#!/bin/bash +export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/../application_credentials.json"; +./gradlew test --rerun-tasks # --rerun-tasks forces UP-TO-DATE tests to re-run From 070d449b9ccd9247b71f14b0d204974b680ed714 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 29 Jun 2018 12:58:24 -0700 Subject: [PATCH 002/297] Add sheets snippets and ignore properties files --- .gitignore | 4 + calendar/sync/logging.properties | 10 -- .../src/main/java/SpreadsheetPivotTables.java | 117 ------------------ .../src/main/java/SpreadsheetSnippets.java | 36 +++--- 4 files changed, 22 insertions(+), 145 deletions(-) delete mode 100644 calendar/sync/logging.properties delete mode 100644 sheets/snippets/src/main/java/SpreadsheetPivotTables.java diff --git a/.gitignore b/.gitignore index 140812bc..4dfb4934 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ client_secret.json hs_err_pid* .DS_Store +.settings/ +.classpath +.project +properties \ No newline at end of file diff --git a/calendar/sync/logging.properties b/calendar/sync/logging.properties deleted file mode 100644 index c831eebb..00000000 --- a/calendar/sync/logging.properties +++ /dev/null @@ -1,10 +0,0 @@ -# Properties file which configures the operation of the JDK logging facility. -# The system will look for this config file to be specified as a system property: -# -Djava.util.logging.config.file=${project_loc:calendar-cmd-line-sample}/logging.properties - -# Set up the console handler (uncomment "level" to show more fine-grained messages) -handlers = java.util.logging.ConsoleHandler -#java.util.logging.ConsoleHandler.level = CONFIG - -# Set up logging of HTTP requests and responses (uncomment "level" to show) -#com.google.api.client.http.level = CONFIG diff --git a/sheets/snippets/src/main/java/SpreadsheetPivotTables.java b/sheets/snippets/src/main/java/SpreadsheetPivotTables.java deleted file mode 100644 index 7c87cb86..00000000 --- a/sheets/snippets/src/main/java/SpreadsheetPivotTables.java +++ /dev/null @@ -1,117 +0,0 @@ -import com.google.api.services.sheets.v4.Sheets; -import com.google.api.services.sheets.v4.model.*; - -import java.io.IOException; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SpreadsheetPivotTables { - private static final int SHEET_ID = 1337; - private Sheets service; - - public BatchUpdateSpreadsheetResponse pivotTable(String spreadsheetId, List ranges) throws IOException { - Sheets service = this.service; - int targetSheetId = 123; - - Request request = new Request().setUpdateCells(new UpdateCellsRequest() - .setRows(Collections.singletonList(new RowData().setValues(Collections.singletonList( - new CellData().setPivotTable( - new PivotTable().setSource( - new GridRange() - .setSheetId(SHEET_ID) - .setStartRowIndex(0) - .setEndColumnIndex(0) - .setEndRowIndex(101) - .setEndColumnIndex(8) - ).setRows(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(6) - .setShowTotals(true) - .setSortOrder("ASCENDING") - )).setColumns(Collections.singletonList( - new PivotGroup() - .setSourceColumnOffset(3) - .setSortOrder("ASCENDING") - .setShowTotals(true) - )).setValues(Collections.singletonList( - new PivotValue() - .setSummarizeFunction("COUNTA") - .setSourceColumnOffset(3) - )).setValueLayout("HORIZONTAL")) - )) - )) - .setStart(new GridCoordinate() - .setSheetId(targetSheetId) - .setRowIndex(0) - .setColumnIndex(0) - ) - .setFields("pivotTable") - ); - - BatchUpdateSpreadsheetRequest body = - new BatchUpdateSpreadsheetRequest().setRequests(Collections.singletonList(request)); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - - // [END batchGetValues] - return result; - } - - public BatchUpdateSpreadsheetResponse conditionalFormatting(String spreadsheetId) throws IOException { - List ranges = Collections.singletonList(new GridRange() - .setSheetId(0) - .setStartRowIndex(1) - .setEndRowIndex(11) - .setStartColumnIndex(0) - .setEndColumnIndex(4) - ); - List requests = Arrays.asList( - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue() - .setUserEnteredValue("=GT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setTextFormat( - new TextFormat().setForegroundColor(new Color().setRed(0.8f)) - )) - ) - ) - .setIndex(0) - ), - new Request().setAddConditionalFormatRule(new AddConditionalFormatRuleRequest() - .setRule(new ConditionalFormatRule() - .setRanges(ranges) - .setBooleanRule(new BooleanRule() - .setCondition(new BooleanCondition() - .setType("CUSTOM_FORMULA") - .setValues(Collections.singletonList( - new ConditionValue() - .setUserEnteredValue("=LT($D2,median($D$2:$D$11))") - )) - ) - .setFormat(new CellFormat().setBackgroundColor( - new Color().setRed(1f).setGreen(0.4f).setBlue(0.4f) - )) - ) - ) - .setIndex(0) - ) - ); - - BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest().setRequests(requests); - BatchUpdateSpreadsheetResponse result = service.spreadsheets() - .batchUpdate(spreadsheetId, body) - .execute(); - - return result; - } -} diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java index 655c0784..ad235820 100644 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ b/sheets/snippets/src/main/java/SpreadsheetSnippets.java @@ -17,7 +17,7 @@ public SpreadsheetSnippets(Sheets service) { public String create(String title) throws IOException { Sheets service = this.service; - // [START create] + // [START sheets_create] Spreadsheet spreadsheet = new Spreadsheet() .setProperties(new SpreadsheetProperties() .setTitle(title)); @@ -25,7 +25,7 @@ public String create(String title) throws IOException { .setFields("spreadsheetId") .execute(); System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId()); - // [END create] + // [END sheets_create] return spreadsheet.getSpreadsheetId(); } @@ -33,7 +33,7 @@ public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String t String find, String replacement) throws IOException { Sheets service = this.service; - // [START batchUpdate] + // [START sheets_batch_update] List requests = new ArrayList<>(); // Change the spreadsheet's title. requests.add(new Request() @@ -55,24 +55,24 @@ public BatchUpdateSpreadsheetResponse batchUpdate(String spreadsheetId, String t service.spreadsheets().batchUpdate(spreadsheetId, body).execute(); FindReplaceResponse findReplaceResponse = response.getReplies().get(1).getFindReplace(); System.out.printf("%d replacements made.", findReplaceResponse.getOccurrencesChanged()); - // [END batchUpdate] + // [END sheets_batch_update] return response; } public ValueRange getValues(String spreadsheetId, String range) throws IOException { Sheets service = this.service; - // [START getValues] + // [START sheets_get_values] ValueRange result = service.spreadsheets().values().get(spreadsheetId, range).execute(); int numRows = result.getValues() != null ? result.getValues().size() : 0; System.out.printf("%d rows retrieved.", numRows); - // [END getValues] + // [END sheets_get_values] return result; } public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) throws IOException { Sheets service = this.service; - // [START batchGetValues] + // [START sheets_batch_get_vValues] List ranges = Arrays.asList( //Range names ... ); @@ -82,14 +82,14 @@ public BatchGetValuesResponse batchGetValues(String spreadsheetId, List BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) .setRanges(ranges).execute(); System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - // [END batchGetValues] + // [END sheets_batch_get_vValues] return result; } public UpdateValuesResponse updateValues(String spreadsheetId, String range, String valueInputOption, List> _values) throws IOException { Sheets service = this.service; - // [START updateValues] + // [START sheets_update_values] List> values = Arrays.asList( Arrays.asList( // Cell values ... @@ -106,7 +106,7 @@ public UpdateValuesResponse updateValues(String spreadsheetId, String range, .setValueInputOption(valueInputOption) .execute(); System.out.printf("%d cells updated.", result.getUpdatedCells()); - // [END updateValues] + // [END sheets_update_values] return result; } @@ -115,7 +115,7 @@ public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String List> _values) throws IOException { Sheets service = this.service; - // [START batchUpdateValues] + // [START sheets_batch_update_values] List> values = Arrays.asList( Arrays.asList( // Cell values ... @@ -137,7 +137,7 @@ public BatchUpdateValuesResponse batchUpdateValues(String spreadsheetId, String BatchUpdateValuesResponse result = service.spreadsheets().values().batchUpdate(spreadsheetId, body).execute(); System.out.printf("%d cells updated.", result.getTotalUpdatedCells()); - // [END batchUpdateValues] + // [END sheets_batch_update_values] return result; } @@ -145,7 +145,7 @@ public AppendValuesResponse appendValues(String spreadsheetId, String range, String valueInputOption, List> _values) throws IOException { Sheets service = this.service; - // [START appendValues] + // [START sheets_append_values] List> values = Arrays.asList( Arrays.asList( // Cell values ... @@ -162,7 +162,7 @@ public AppendValuesResponse appendValues(String spreadsheetId, String range, .setValueInputOption(valueInputOption) .execute(); System.out.printf("%d cells appended.", result.getUpdates().getUpdatedCells()); - // [END appendValues] + // [END sheets_append_values] return result; } @@ -183,7 +183,7 @@ public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws I int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties() .getSheetId(); - // [START pivot_tables] + // [START sheets_pivot_tables] PivotTable pivotTable = new PivotTable() .setSource( new GridRange() @@ -231,13 +231,13 @@ public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws I .setRequests(requests); BatchUpdateSpreadsheetResponse result = service.spreadsheets() .batchUpdate(spreadsheetId, updateCellsBody).execute(); - // [END pivot_tables] + // [END sheets_pivot_tables] return result; } public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) throws IOException { - // [START conditionalFormat] + // [START sheets_conditional_format] List ranges = Collections.singletonList(new GridRange() .setSheetId(0) .setStartRowIndex(1) @@ -291,7 +291,7 @@ public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) .batchUpdate(spreadsheetId, body) .execute(); System.out.printf("%d cells updated.", result.getReplies().size()); - // [END conditionalFormat] + // [END sheets_conditional_format] return result; } } From 5bdd5507034351dba3901d21a280a797046aa2c4 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 29 Jun 2018 13:36:18 -0700 Subject: [PATCH 003/297] Update Sheets region tag: sheets_conditional_formatting --- sheets/snippets/src/main/java/SpreadsheetSnippets.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java index ad235820..c9cf8caf 100644 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ b/sheets/snippets/src/main/java/SpreadsheetSnippets.java @@ -237,7 +237,7 @@ public BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId) throws I public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) throws IOException { - // [START sheets_conditional_format] + // [START sheets_conditional_formatting] List ranges = Collections.singletonList(new GridRange() .setSheetId(0) .setStartRowIndex(1) @@ -291,7 +291,7 @@ public BatchUpdateSpreadsheetResponse conditionalFormat(String spreadsheetId) .batchUpdate(spreadsheetId, body) .execute(); System.out.printf("%d cells updated.", result.getReplies().size()); - // [END sheets_conditional_format] + // [END sheets_conditional_formatting] return result; } } From c2f1de06f7851312276081e7ad6233157ef67bf2 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 29 Jun 2018 13:38:22 -0700 Subject: [PATCH 004/297] Update region tag: sheets_batch_get_values --- sheets/snippets/src/main/java/SpreadsheetSnippets.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sheets/snippets/src/main/java/SpreadsheetSnippets.java b/sheets/snippets/src/main/java/SpreadsheetSnippets.java index c9cf8caf..bccb1a1f 100644 --- a/sheets/snippets/src/main/java/SpreadsheetSnippets.java +++ b/sheets/snippets/src/main/java/SpreadsheetSnippets.java @@ -72,7 +72,7 @@ public ValueRange getValues(String spreadsheetId, String range) throws IOExcepti public BatchGetValuesResponse batchGetValues(String spreadsheetId, List _ranges) throws IOException { Sheets service = this.service; - // [START sheets_batch_get_vValues] + // [START sheets_batch_get_values] List ranges = Arrays.asList( //Range names ... ); @@ -82,7 +82,7 @@ public BatchGetValuesResponse batchGetValues(String spreadsheetId, List BatchGetValuesResponse result = service.spreadsheets().values().batchGet(spreadsheetId) .setRanges(ranges).execute(); System.out.printf("%d ranges retrieved.", result.getValueRanges().size()); - // [END sheets_batch_get_vValues] + // [END sheets_batch_get_values] return result; } public UpdateValuesResponse updateValues(String spreadsheetId, String range, From d14d33b1dd67b2d39fdf8cf093bf052e2bd139f4 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Mon, 2 Jul 2018 16:45:28 -0700 Subject: [PATCH 005/297] Remove old Admin SDK Quickstart rules in Travis --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6e869c86..267c45b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,6 @@ jdk: # Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) env: - DIR=adminSDK/directory/quickstart - - DIR=adminSDK/groupsMigration/quickstart - - DIR=adminSDK/groupsSettings/quickstart - - DIR=adminSDK/licensing/quickstart - DIR=adminSDK/reports/quickstart - DIR=adminSDK/reseller/quickstart - DIR=appsScript/quickstart From af844e7e70181f26217684773006aa9fd5d12eae Mon Sep 17 00:00:00 2001 From: Eric Koleda Date: Mon, 16 Jul 2018 14:24:30 -0400 Subject: [PATCH 006/297] Change the file names expected for developer credentials and other changes. --- .gitignore | 4 +++- .../src/main/java/AdminSDKDirectoryQuickstart.java | 10 +++++----- .../src/main/java/AdminSDKReportsQuickstart.java | 10 +++++----- .../src/main/java/AdminSDKResellerQuickstart.java | 10 +++++----- .../src/main/java/AppsScriptQuickstart.java | 10 +++++----- .../quickstart/src/main/java/CalendarQuickstart.java | 10 +++++----- .../src/main/java/ClassroomQuickstart.java | 10 +++++----- drive/activity/quickstart/build.gradle | 2 +- .../src/main/java/DriveActivityQuickstart.java | 11 ++++------- drive/quickstart/src/main/java/DriveQuickstart.java | 10 +++++----- gmail/quickstart/src/main/java/GmailQuickstart.java | 12 ++++++------ .../quickstart/src/main/java/PeopleQuickstart.java | 10 +++++----- .../quickstart/src/main/java/SheetsQuickstart.java | 10 +++++----- .../quickstart/src/main/java/SlidesQuickstart.java | 10 +++++----- tasks/quickstart/src/main/java/TasksQuickstart.java | 10 +++++----- vault/quickstart/src/main/java/Quickstart.java | 9 ++++----- 16 files changed, 73 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 4dfb4934..d15eb021 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ gradlew.bat *.properties client_secret.json +credentials.json +tokens/ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* @@ -38,4 +40,4 @@ hs_err_pid* .settings/ .classpath .project -properties \ No newline at end of file +properties diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index ace9c8be..3e094baa 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -38,30 +38,30 @@ public class AdminSDKDirectoryQuickstart { private static final String APPLICATION_NAME = "Google Admin SDK Directory API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials folder at /secret. */ private static final List SCOPES = Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = AdminSDKDirectoryQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = AdminSDKDirectoryQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index f240f462..f873b370 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -38,30 +38,30 @@ public class AdminSDKReportsQuickstart { private static final String APPLICATION_NAME = "Google Admin SDK Reports API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials folder at /secret. */ private static final List SCOPES = Collections.singletonList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = AdminSDKReportsQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = AdminSDKReportsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index 2f9feabb..de5a4e8a 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -38,30 +38,30 @@ public class AdminSDKResellerQuickstart { private static final String APPLICATION_NAME = "Google Admin SDK Reseller API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials folder at /secret. */ private static final List SCOPES = Collections.singletonList(ResellerScopes.APPS_ORDER); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = AdminSDKResellerQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = AdminSDKResellerQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index eb335490..a8041911 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -40,30 +40,30 @@ public class AppsScriptQuickstart { private static final String APPLICATION_NAME = "Apps Script API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials folder at /secret. */ private static final List SCOPES = Collections.singletonList("https://www.googleapis.com/auth/script.projects"); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = AppsScriptQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = AppsScriptQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index e34b79fc..1f9c1129 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -39,30 +39,30 @@ public class CalendarQuickstart { private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(CalendarScopes.CALENDAR_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = CalendarQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index dd5da8e6..d0848887 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -37,30 +37,30 @@ public class ClassroomQuickstart { private static final String APPLICATION_NAME = "Google Classroom API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = ClassroomQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = ClassroomQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/drive/activity/quickstart/build.gradle b/drive/activity/quickstart/build.gradle index 38665724..df305da2 100644 --- a/drive/activity/quickstart/build.gradle +++ b/drive/activity/quickstart/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'java' apply plugin: 'application' -mainClassName = 'ActivityQuickstart' +mainClassName = 'DriveActivityQuickstart' sourceCompatibility = 1.7 targetCompatibility = 1.7 version = '1.0' diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index 102799a2..019e26f2 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -40,9 +40,8 @@ public class DriveActivityQuickstart { private static final String APPLICATION_NAME = "G Suite Activity API Java Quickstart"; - /** Directory to store user credentials for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File( - System.getProperty("user.home"), ".credentials/appsactivity-java-quickstart"); + /** Directory to store authorization tokens for this application. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); /** Global instance of the {@link FileDataStoreFactory}. */ private static FileDataStoreFactory DATA_STORE_FACTORY; @@ -59,9 +58,7 @@ public class DriveActivityQuickstart { * If modifying these scopes, delete your previously saved credentials * at ~/.credentials/appsactivity-java-quickstart */ - private static final List SCOPES = - Arrays.asList(AppsactivityScopes.ACTIVITY, - AppsactivityScopes.DRIVE_METADATA_READONLY); + private static final List SCOPES = Arrays.asList(AppsactivityScopes.ACTIVITY); static { try { @@ -81,7 +78,7 @@ public class DriveActivityQuickstart { public static Credential authorize() throws IOException { // Load client secrets. InputStream in = - DriveActivityQuickstart.class.getResourceAsStream("/client_secret.json"); + DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 1c25f771..97b43b6e 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -38,30 +38,30 @@ public class DriveQuickstart { private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = DriveQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 56ab0004..1c0411ae 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -38,30 +38,30 @@ public class GmailQuickstart { private static final String APPLICATION_NAME = "Gmail API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = GmailQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); @@ -88,4 +88,4 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep } } } -// [END gmail_quickstart] \ No newline at end of file +// [END gmail_quickstart] diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index 573fd08c..3a2f6165 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -38,30 +38,30 @@ public class PeopleQuickstart { private static final String APPLICATION_NAME = "Google People API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = PeopleQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = PeopleQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index f65919d9..4d0caf55 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -37,30 +37,30 @@ public class SheetsQuickstart { private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = SheetsQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index 211aee81..6485a38b 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -38,30 +38,30 @@ public class SlidesQuickstart { private static final String APPLICATION_NAME = "Google Slides API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = SlidesQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = SlidesQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 82569c06..7df1a5c9 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -38,30 +38,30 @@ public class TasksQuickstart { private static final String APPLICATION_NAME = "Google Tasks API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - private static final String CREDENTIALS_FOLDER = "credentials"; // Directory to store user credentials. + private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved credentials/ folder. */ private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); - private static final String CLIENT_SECRET_DIR = "client_secret.json"; + private static final String CREDENTIALS_FILE_PATH = "credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. - * @throws IOException If there is no client_secret. + * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. - InputStream in = TasksQuickstart.class.getResourceAsStream(CLIENT_SECRET_DIR); + InputStream in = TasksQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER))) + .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); diff --git a/vault/quickstart/src/main/java/Quickstart.java b/vault/quickstart/src/main/java/Quickstart.java index 9e627b07..ec3426e6 100644 --- a/vault/quickstart/src/main/java/Quickstart.java +++ b/vault/quickstart/src/main/java/Quickstart.java @@ -38,9 +38,8 @@ public class Quickstart { private static final String APPLICATION_NAME = "Google Vault API Java Quickstart"; - /** Directory to store user credentials for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File( - System.getProperty("user.home"), ".credentials/vault.googleapis.com-java-quickstart"); + /** Directory to store authorization tokens for this application. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); /** Global instance of the {@link FileDataStoreFactory}. */ private static FileDataStoreFactory DATA_STORE_FACTORY; @@ -78,7 +77,7 @@ public class Quickstart { public static Credential authorize() throws IOException { // Load client secrets. InputStream in = - Quickstart.class.getResourceAsStream("/client_secret.json"); + Quickstart.class.getResourceAsStream("/credentials.json"); GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); @@ -126,6 +125,6 @@ public static void main(String[] args) throws IOException { matter.getMatterId()); } } - } + } } // [END vault_quickstart] From ab0795efa8e5ac2a3da5ed131fc8028c8fbd480a Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Thu, 2 Aug 2018 15:43:14 -0700 Subject: [PATCH 007/297] Update Execute.java --- appsScript/execute/src/main/java/Execute.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appsScript/execute/src/main/java/Execute.java b/appsScript/execute/src/main/java/Execute.java index 67149cba..8f42f898 100644 --- a/appsScript/execute/src/main/java/Execute.java +++ b/appsScript/execute/src/main/java/Execute.java @@ -15,7 +15,7 @@ * limitations under the License. */ public class Execute { - // [START apps_script_execute] + // [START apps_script_api_execute] /** * Create a HttpRequestInitializer from the given one, except set * the HTTP read timeout to be longer than the default (to allow @@ -137,5 +137,5 @@ public static void main(String[] args) throws IOException { e.printStackTrace(System.out); } } - // [END apps_script_execute] + // [END apps_script_api_execute] } From b2a1498c4f89c22ffbd6ea9cd65df402d30774ae Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Fri, 3 Aug 2018 15:24:17 -0700 Subject: [PATCH 008/297] Apps Script quickstart region tag --- appsScript/quickstart/src/main/java/AppsScriptQuickstart.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index eb335490..73ff7e54 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// [START apps_script_quickstart] +// [START apps_script_api_quickstart] import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -96,4 +96,4 @@ public static void main(String... args) throws IOException, GeneralSecurityExcep System.out.printf("https://script.google.com/d/%s/edit\n", updatedContent.getScriptId()); } } -// [END apps_script_quickstart] +// [END apps_script_api_quickstart] From c2414c45712718057b38eec630eb8b9a68910334 Mon Sep 17 00:00:00 2001 From: Eric Koleda Date: Wed, 22 Aug 2018 12:37:50 -0400 Subject: [PATCH 009/297] Load the credentials with an absolute path and fix the comment about deleting saved tokens. --- .../quickstart/src/main/java/AdminSDKDirectoryQuickstart.java | 4 ++-- .../quickstart/src/main/java/AdminSDKReportsQuickstart.java | 4 ++-- .../quickstart/src/main/java/AdminSDKResellerQuickstart.java | 4 ++-- appsScript/quickstart/src/main/java/AppsScriptQuickstart.java | 2 +- calendar/quickstart/src/main/java/CalendarQuickstart.java | 4 ++-- classroom/quickstart/src/main/java/ClassroomQuickstart.java | 4 ++-- drive/quickstart/src/main/java/DriveQuickstart.java | 4 ++-- gmail/quickstart/src/main/java/GmailQuickstart.java | 4 ++-- people/quickstart/src/main/java/PeopleQuickstart.java | 4 ++-- sheets/quickstart/src/main/java/SheetsQuickstart.java | 4 ++-- slides/quickstart/src/main/java/SlidesQuickstart.java | 4 ++-- tasks/quickstart/src/main/java/TasksQuickstart.java | 4 ++-- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index 3e094baa..02e32040 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -42,10 +42,10 @@ public class AdminSDKDirectoryQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials folder at /secret. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index f873b370..2c7562ee 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -42,10 +42,10 @@ public class AdminSDKReportsQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials folder at /secret. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index de5a4e8a..5090793e 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -42,10 +42,10 @@ public class AdminSDKResellerQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials folder at /secret. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(ResellerScopes.APPS_ORDER); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index cb491a07..6e1a92aa 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -47,7 +47,7 @@ public class AppsScriptQuickstart { * If modifying these scopes, delete your previously saved credentials folder at /secret. */ private static final List SCOPES = Collections.singletonList("https://www.googleapis.com/auth/script.projects"); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index 1f9c1129..f427fc3b 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -43,10 +43,10 @@ public class CalendarQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(CalendarScopes.CALENDAR_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index d0848887..98498b0b 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -41,10 +41,10 @@ public class ClassroomQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(ClassroomScopes.CLASSROOM_COURSES_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 97b43b6e..5d43e211 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -42,10 +42,10 @@ public class DriveQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 1c0411ae..49c1968f 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -42,10 +42,10 @@ public class GmailQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_LABELS); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index 3a2f6165..29abb542 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -42,10 +42,10 @@ public class PeopleQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Arrays.asList(PeopleServiceScopes.CONTACTS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index 4d0caf55..077f0891 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -41,10 +41,10 @@ public class SheetsQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index 6485a38b..e23d0228 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -42,10 +42,10 @@ public class SlidesQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(SlidesScopes.PRESENTATIONS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 7df1a5c9..fb452e85 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -42,10 +42,10 @@ public class TasksQuickstart { /** * Global instance of the scopes required by this quickstart. - * If modifying these scopes, delete your previously saved credentials/ folder. + * If modifying these scopes, delete your previously saved tokens/ folder. */ private static final List SCOPES = Collections.singletonList(TasksScopes.TASKS_READONLY); - private static final String CREDENTIALS_FILE_PATH = "credentials.json"; + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. From d11166510b50d5418cd173a6b7f54f87826e8f63 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Thu, 23 Aug 2018 15:25:59 -0700 Subject: [PATCH 010/297] Build each target instead of running each target. More work is needed to enable running each quickstart (specifically adding credentials). --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 267c45b3..97e5805d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,4 +14,4 @@ env: - DIR=sheets/quickstart - DIR=slides/quickstart - DIR=tasks/quickstart -script: cd $DIR && gradle -q run +script: cd $DIR && gradle build # gradle -q run From 1223128ef4676781c10f6cdc548bbedb6eb40f1b Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Thu, 23 Aug 2018 15:32:21 -0700 Subject: [PATCH 011/297] Remove jdk9 test. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 97e5805d..899860b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: java jdk: - oraclejdk8 - - oraclejdk9 + # - oraclejdk9 # Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) env: - DIR=adminSDK/directory/quickstart From e99de0dded6c109090a5c57e496e085ba1471370 Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Thu, 23 Aug 2018 16:01:15 -0700 Subject: [PATCH 012/297] Fix People Quickstart imports #17 --- people/quickstart/src/main/java/PeopleQuickstart.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index 29abb542..b303fd6c 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -26,14 +26,15 @@ import com.google.api.services.people.v1.PeopleService; import com.google.api.services.people.v1.PeopleServiceScopes; import com.google.api.services.people.v1.model.ListConnectionsResponse; +import com.google.api.services.people.v1.model.Name; import com.google.api.services.people.v1.model.Person; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.GeneralSecurityException; -import java.util.Collections; import java.util.Arrays; +import java.util.List; public class PeopleQuickstart { private static final String APPLICATION_NAME = "Google People API Java Quickstart"; From 49dd0e896a650a61b789e2157e6d134245b26491 Mon Sep 17 00:00:00 2001 From: Anu Date: Fri, 24 Aug 2018 22:55:02 -0400 Subject: [PATCH 013/297] Add Slides to the snippets build.gradle so it builds. --- slides/snippets/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slides/snippets/build.gradle b/slides/snippets/build.gradle index 8615d123..300684f4 100644 --- a/slides/snippets/build.gradle +++ b/slides/snippets/build.gradle @@ -9,6 +9,7 @@ dependencies { compile 'com.google.api-client:google-api-client:1.22.0' compile 'com.google.apis:google-api-services-drive:v3-rev45-1.22.0' compile 'com.google.apis:google-api-services-sheets:v4-rev34-1.22.0' + compile 'com.google.apis:google-api-services-slides:v1-rev294-1.23.0' testCompile 'junit:junit:4.12' compile fileTree(dir: 'lib', include: ['*.jar']) @@ -16,4 +17,4 @@ dependencies { test { testLogging.showStandardStreams = true -} \ No newline at end of file +} From 1d8937dff5e67bc1753aacec80a42673142718bf Mon Sep 17 00:00:00 2001 From: Anu Date: Sun, 9 Sep 2018 18:26:51 -0400 Subject: [PATCH 014/297] Make Calendar quickstart target Java 8 Calendar quickstart works as is with Java 8 and will still be compatible with Java 7. --- calendar/quickstart/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/calendar/quickstart/build.gradle b/calendar/quickstart/build.gradle index 180a680c..2e580223 100644 --- a/calendar/quickstart/build.gradle +++ b/calendar/quickstart/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'java' apply plugin: 'application' mainClassName = 'CalendarQuickstart' -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 version = '1.0' repositories { From 5ea1c02a4d2c57f8d8d7471c14d6261fd5a3feba Mon Sep 17 00:00:00 2001 From: Eric Koleda Date: Tue, 16 Oct 2018 15:53:50 -0400 Subject: [PATCH 015/297] Use a fixed port for auth callbacks --- .../quickstart/src/main/java/AdminSDKDirectoryQuickstart.java | 3 ++- .../quickstart/src/main/java/AdminSDKReportsQuickstart.java | 3 ++- .../quickstart/src/main/java/AdminSDKResellerQuickstart.java | 3 ++- appsScript/quickstart/src/main/java/AppsScriptQuickstart.java | 3 ++- calendar/quickstart/src/main/java/CalendarQuickstart.java | 3 ++- .../com/google/api/services/samples/calendar/sync/Utils.java | 3 ++- classroom/quickstart/src/main/java/ClassroomQuickstart.java | 3 ++- drive/quickstart/src/main/java/DriveQuickstart.java | 3 ++- gmail/quickstart/src/main/java/GmailQuickstart.java | 3 ++- people/quickstart/src/main/java/PeopleQuickstart.java | 3 ++- sheets/quickstart/src/main/java/SheetsQuickstart.java | 3 ++- slides/quickstart/src/main/java/SlidesQuickstart.java | 3 ++- tasks/quickstart/src/main/java/TasksQuickstart.java | 3 ++- 13 files changed, 26 insertions(+), 13 deletions(-) diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index 02e32040..5d614567 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index 2c7562ee..a7c83e5d 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index 5090793e..a14d69f0 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index 6e1a92aa..be97726c 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -66,7 +66,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index f427fc3b..c667e5b6 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -65,7 +65,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java index c8863331..d9b4cbc0 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java @@ -90,7 +90,8 @@ public static Credential authorize(List scopes) throws Exception { GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, scopes).setDataStoreFactory(dataStoreFactory).build(); // Authorize. - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } /** Gets the datastore factory used in these samples. */ diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index 98498b0b..0f455c75 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -63,7 +63,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index 5d43e211..b3ce3e3d 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 49c1968f..15ba9231 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index b303fd6c..103ee032 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -65,7 +65,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index 077f0891..5fbb3b06 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -63,7 +63,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } /** diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index e23d0228..c06d2dc8 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index fb452e85..9fadb3f5 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -64,7 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { From 69203d6a66fc23a15c678e02087ca3ee86ff78a7 Mon Sep 17 00:00:00 2001 From: Andrzej Samek <4798496+asamek@users.noreply.github.com> Date: Tue, 6 Nov 2018 15:58:48 +0100 Subject: [PATCH 016/297] spelling fix --- calendar/quickstart/src/main/java/CalendarQuickstart.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/calendar/quickstart/src/main/java/CalendarQuickstart.java b/calendar/quickstart/src/main/java/CalendarQuickstart.java index c667e5b6..66a863ca 100644 --- a/calendar/quickstart/src/main/java/CalendarQuickstart.java +++ b/calendar/quickstart/src/main/java/CalendarQuickstart.java @@ -65,8 +65,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { From b5698ecb41e65bb75260da7747d6f353be7af050 Mon Sep 17 00:00:00 2001 From: Eric Koleda Date: Tue, 6 Nov 2018 15:53:46 -0500 Subject: [PATCH 017/297] Apply fix from #41 to the rest of the quickstarts. --- .../quickstart/src/main/java/AdminSDKDirectoryQuickstart.java | 4 ++-- .../quickstart/src/main/java/AdminSDKReportsQuickstart.java | 4 ++-- .../quickstart/src/main/java/AdminSDKResellerQuickstart.java | 4 ++-- appsScript/quickstart/src/main/java/AppsScriptQuickstart.java | 4 ++-- .../com/google/api/services/samples/calendar/sync/Utils.java | 4 ++-- classroom/quickstart/src/main/java/ClassroomQuickstart.java | 4 ++-- drive/quickstart/src/main/java/DriveQuickstart.java | 4 ++-- gmail/quickstart/src/main/java/GmailQuickstart.java | 4 ++-- people/quickstart/src/main/java/PeopleQuickstart.java | 4 ++-- sheets/quickstart/src/main/java/SheetsQuickstart.java | 4 ++-- slides/quickstart/src/main/java/SlidesQuickstart.java | 4 ++-- tasks/quickstart/src/main/java/TasksQuickstart.java | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java index 5d614567..9348503c 100644 --- a/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java +++ b/adminSDK/directory/quickstart/src/main/java/AdminSDKDirectoryQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java index a7c83e5d..d1ec5d1e 100644 --- a/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java +++ b/adminSDK/reports/quickstart/src/main/java/AdminSDKReportsQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java index a14d69f0..e1070471 100644 --- a/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java +++ b/adminSDK/reseller/quickstart/src/main/java/AdminSDKResellerQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java index be97726c..4f24474a 100644 --- a/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java +++ b/appsScript/quickstart/src/main/java/AppsScriptQuickstart.java @@ -66,8 +66,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java index d9b4cbc0..32e9fb87 100644 --- a/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java +++ b/calendar/sync/src/main/java/com/google/api/services/samples/calendar/sync/Utils.java @@ -90,8 +90,8 @@ public static Credential authorize(List scopes) throws Exception { GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, scopes).setDataStoreFactory(dataStoreFactory).build(); // Authorize. - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } /** Gets the datastore factory used in these samples. */ diff --git a/classroom/quickstart/src/main/java/ClassroomQuickstart.java b/classroom/quickstart/src/main/java/ClassroomQuickstart.java index 0f455c75..dc32692c 100644 --- a/classroom/quickstart/src/main/java/ClassroomQuickstart.java +++ b/classroom/quickstart/src/main/java/ClassroomQuickstart.java @@ -63,8 +63,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/drive/quickstart/src/main/java/DriveQuickstart.java b/drive/quickstart/src/main/java/DriveQuickstart.java index b3ce3e3d..509b4ada 100644 --- a/drive/quickstart/src/main/java/DriveQuickstart.java +++ b/drive/quickstart/src/main/java/DriveQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/gmail/quickstart/src/main/java/GmailQuickstart.java b/gmail/quickstart/src/main/java/GmailQuickstart.java index 15ba9231..27c06bc5 100644 --- a/gmail/quickstart/src/main/java/GmailQuickstart.java +++ b/gmail/quickstart/src/main/java/GmailQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/people/quickstart/src/main/java/PeopleQuickstart.java b/people/quickstart/src/main/java/PeopleQuickstart.java index 103ee032..26e5d93e 100644 --- a/people/quickstart/src/main/java/PeopleQuickstart.java +++ b/people/quickstart/src/main/java/PeopleQuickstart.java @@ -65,8 +65,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/sheets/quickstart/src/main/java/SheetsQuickstart.java b/sheets/quickstart/src/main/java/SheetsQuickstart.java index 5fbb3b06..48bbea47 100644 --- a/sheets/quickstart/src/main/java/SheetsQuickstart.java +++ b/sheets/quickstart/src/main/java/SheetsQuickstart.java @@ -63,8 +63,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } /** diff --git a/slides/quickstart/src/main/java/SlidesQuickstart.java b/slides/quickstart/src/main/java/SlidesQuickstart.java index c06d2dc8..02e7be38 100644 --- a/slides/quickstart/src/main/java/SlidesQuickstart.java +++ b/slides/quickstart/src/main/java/SlidesQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { diff --git a/tasks/quickstart/src/main/java/TasksQuickstart.java b/tasks/quickstart/src/main/java/TasksQuickstart.java index 9fadb3f5..d94b5f66 100644 --- a/tasks/quickstart/src/main/java/TasksQuickstart.java +++ b/tasks/quickstart/src/main/java/TasksQuickstart.java @@ -64,8 +64,8 @@ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); - LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build(); - return new AuthorizationCodeInstalledApp(flow, receier).authorize("user"); + LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); + return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { From ae5c1a31c677551fd873b718c9486045c92ef608 Mon Sep 17 00:00:00 2001 From: Arie Date: Tue, 13 Nov 2018 10:09:55 -0800 Subject: [PATCH 018/297] Add files via upload --- adminSDK/alertcenter/quickstart/build.gradle | 18 +++ .../alertcenter/quickstart/settings.gradle | 18 +++ .../java/AdminSDKAlertCenterQuickstart.java | 106 ++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 adminSDK/alertcenter/quickstart/build.gradle create mode 100644 adminSDK/alertcenter/quickstart/settings.gradle create mode 100644 adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java diff --git a/adminSDK/alertcenter/quickstart/build.gradle b/adminSDK/alertcenter/quickstart/build.gradle new file mode 100644 index 00000000..25d08517 --- /dev/null +++ b/adminSDK/alertcenter/quickstart/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' +apply plugin: 'application' +apply plugin: 'idea' + +mainClassName = 'AdminSDKAlertCenterQuickstart' +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.20.0' + compile 'com.google.auth:google-auth-library-oauth2-http:0.11.0' + compile 'com.google.apis:google-api-services-alertcenter:v1beta1-rev7-1.25.0' +} \ No newline at end of file diff --git a/adminSDK/alertcenter/quickstart/settings.gradle b/adminSDK/alertcenter/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/adminSDK/alertcenter/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' diff --git a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java new file mode 100644 index 00000000..b98c6059 --- /dev/null +++ b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java @@ -0,0 +1,106 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START admin_sdk_alertcenter_quickstart] + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +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.alertcenter.v1beta1.AlertCenter; +import com.google.api.services.alertcenter.v1beta1.model.Alert; +import com.google.api.services.alertcenter.v1beta1.model.AlertFeedback; +import com.google.api.services.alertcenter.v1beta1.model.ListAlertsResponse; +import com.google.auth.Credentials; +import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import java.io.IOException; +import java.io.InputStream; +import java.security.GeneralSecurityException; +import java.util.Collections; +import java.util.List; + +public class AdminSDKAlertCenterQuickstart { + + private static final String APPLICATION_NAME = "Google Admin SDK Alert Center API Java Quickstart"; + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + /** + * Global instance of the scopes required by this quickstart. If modifying these scopes, delete + * your previously saved tokens/ folder. + */ + private static final List SCOPES = Collections + .singletonList("https://www.googleapis.com/auth/apps.alerts"); + private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; + + + /** + * Creates an authorized Credentials object. + * + * @return An authorized Credentials object. + * @throws IOException If the credentials.json file cannot be found. + */ + private static Credentials getCredentials(String delegatedAdmin) throws IOException { + // [START admin_sdk_alertcenter_get_credentials] + InputStream in = AdminSDKAlertCenterQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); + if (in == null) { + throw new IOException("Credential file was not found"); + } + GoogleCredentials credentials = ServiceAccountCredentials + .fromStream(in) + .createDelegated(delegatedAdmin) + .createScoped(SCOPES); + // [END admin_sdk_alertcenter_get_credentials] + return credentials; + } + + public static void main(String... args) throws IOException, GeneralSecurityException { + // [START admin_sdk_alertcenter_create_client] + String delegatedAdmin = "admin@xxx.com"; + NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); + AlertCenter service = new AlertCenter.Builder(transport, JSON_FACTORY, + new HttpCredentialsAdapter(getCredentials(delegatedAdmin))) + .setApplicationName(APPLICATION_NAME) + .build(); + // [END admin_sdk_alertcenter_create_client] + + // [START admin_sdk_alertcenter_list_alerts] + ListAlertsResponse listResponse = service.alerts().list().setPageSize(20).execute(); + while (listResponse.getAlerts() != null) { + for (Alert alert : listResponse.getAlerts()) { + System.out.println(alert); + } + if (listResponse.getNextPageToken() == null || listResponse.getNextPageToken().isEmpty()) { + break; + } + listResponse = service.alerts().list().setPageToken(listResponse.getNextPageToken()) + .setPageSize(20).execute(); + } + // [END admin_sdk_alertcenter_list_alerts] + + + listResponse = service.alerts().list().setPageSize(20).execute(); + if (listResponse == null || listResponse.isEmpty()) { + System.out.println("No alerts"); + } + String alertId = listResponse.getAlerts().get(0).getAlertId(); + // [START admin_sdk_alertcenter_provide_feedback] + AlertFeedback newFeedback = new AlertFeedback(); + newFeedback.setType("VERY_USEFUL"); + AlertFeedback feedback = service.alerts().feedback().create(alertId, newFeedback).execute(); + System.out.println(feedback); + // [END admin_sdk_alertcenter_provide_feedback] + } +} +// [END admin_sdk_alertcenter_quickstart] From 51657c00be1d602c3a113a538e7851cd9f4f8d0a Mon Sep 17 00:00:00 2001 From: Arie Date: Tue, 13 Nov 2018 10:12:54 -0800 Subject: [PATCH 019/297] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 888e3088..453cfcb2 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ A collection of samples that demonstrate how to call G Suite APIs in Java. ### Admin SDK +- [Alert Center Quickstart](https://developers.google.com/admin-sdk/alertcenter/quickstart/java) - [Directory Quickstart](https://developers.google.com/admin-sdk/directory/v1/quickstart/java) - [Reports Quickstart](https://developers.google.com/admin-sdk/reports/v1/quickstart/java) - [Reseller Quickstart](https://developers.google.com/admin-sdk/reseller/v1/quickstart/java) From 921b62c6f820f767d3cfadc4b8ac4a9068297499 Mon Sep 17 00:00:00 2001 From: Arie Date: Tue, 13 Nov 2018 10:13:41 -0800 Subject: [PATCH 020/297] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 899860b0..ca28a01d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ jdk: # - oraclejdk9 # Use a Build Matrix for subdirs (https://lord.io/blog/2014/travis-multiple-subdirs/) env: + - DIR=adminSDK/alertcenter/quickstart - DIR=adminSDK/directory/quickstart - DIR=adminSDK/reports/quickstart - DIR=adminSDK/reseller/quickstart From 48bc7ecef9b5f3ef8d7fea1e6e93702277259129 Mon Sep 17 00:00:00 2001 From: Arie Date: Wed, 14 Nov 2018 14:16:56 -0800 Subject: [PATCH 021/297] Update AdminSDKAlertCenterQuickstart.java --- .../java/AdminSDKAlertCenterQuickstart.java | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java index b98c6059..cfca6b29 100644 --- a/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java +++ b/adminSDK/alertcenter/quickstart/src/main/java/AdminSDKAlertCenterQuickstart.java @@ -43,15 +43,16 @@ public class AdminSDKAlertCenterQuickstart { private static final List SCOPES = Collections .singletonList("https://www.googleapis.com/auth/apps.alerts"); private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; - + private static final String DELEGATED_ADMIN_EMAIL = "admin@xxx.com"; /** * Creates an authorized Credentials object. * + * @param delegatedAdminEmail A delegated admin email to associate with the created credentials. * @return An authorized Credentials object. * @throws IOException If the credentials.json file cannot be found. */ - private static Credentials getCredentials(String delegatedAdmin) throws IOException { + private static Credentials getCredentials(String delegatedAdminEmail) throws IOException { // [START admin_sdk_alertcenter_get_credentials] InputStream in = AdminSDKAlertCenterQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); if (in == null) { @@ -59,7 +60,7 @@ private static Credentials getCredentials(String delegatedAdmin) throws IOExcept } GoogleCredentials credentials = ServiceAccountCredentials .fromStream(in) - .createDelegated(delegatedAdmin) + .createDelegated(delegatedAdminEmail) .createScoped(SCOPES); // [END admin_sdk_alertcenter_get_credentials] return credentials; @@ -67,34 +68,39 @@ private static Credentials getCredentials(String delegatedAdmin) throws IOExcept public static void main(String... args) throws IOException, GeneralSecurityException { // [START admin_sdk_alertcenter_create_client] - String delegatedAdmin = "admin@xxx.com"; + NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); AlertCenter service = new AlertCenter.Builder(transport, JSON_FACTORY, - new HttpCredentialsAdapter(getCredentials(delegatedAdmin))) + new HttpCredentialsAdapter(getCredentials(DELEGATED_ADMIN_EMAIL))) .setApplicationName(APPLICATION_NAME) .build(); // [END admin_sdk_alertcenter_create_client] // [START admin_sdk_alertcenter_list_alerts] - ListAlertsResponse listResponse = service.alerts().list().setPageSize(20).execute(); - while (listResponse.getAlerts() != null) { - for (Alert alert : listResponse.getAlerts()) { - System.out.println(alert); - } - if (listResponse.getNextPageToken() == null || listResponse.getNextPageToken().isEmpty()) { - break; - } - listResponse = service.alerts().list().setPageToken(listResponse.getNextPageToken()) + String pageToken = null; + do { + ListAlertsResponse listResponse = service.alerts().list().setPageToken(pageToken) .setPageSize(20).execute(); - } + if (listResponse.getAlerts() != null) { + for (Alert alert : listResponse.getAlerts()) { + System.out.println(alert); + } + } + pageToken = listResponse.getNextPageToken(); + } while (pageToken != null); // [END admin_sdk_alertcenter_list_alerts] - - listResponse = service.alerts().list().setPageSize(20).execute(); + ListAlertsResponse listResponse = service.alerts().list().setPageSize(20).execute(); if (listResponse == null || listResponse.isEmpty()) { System.out.println("No alerts"); + } else { + String alertId = listResponse.getAlerts().get(0).getAlertId(); + // Uncomment the line below to set alert feedback. + // setAlertFeedback(service, alertId); } - String alertId = listResponse.getAlerts().get(0).getAlertId(); + } + + private static void setAlertFeedback(AlertCenter service, String alertId) throws IOException { // [START admin_sdk_alertcenter_provide_feedback] AlertFeedback newFeedback = new AlertFeedback(); newFeedback.setType("VERY_USEFUL"); From b5dc94f4015e394f4462d4df4264347d62db1cd3 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Sun, 2 Dec 2018 17:35:26 -0700 Subject: [PATCH 022/297] Adding java quickstart for Drive Activity v2 API. --- drive/activity-v2/quickstart/build.gradle | 17 ++ .../main/java/DriveActivityQuickstart.java | 184 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 drive/activity-v2/quickstart/build.gradle create mode 100644 drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java diff --git a/drive/activity-v2/quickstart/build.gradle b/drive/activity-v2/quickstart/build.gradle new file mode 100644 index 00000000..cedfe72f --- /dev/null +++ b/drive/activity-v2/quickstart/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = 'DriveActivityQuickstart' +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +version = '1.0' + +repositories { + mavenCentral() +} + +dependencies { + compile 'com.google.api-client:google-api-client:1.27.0' + compile 'com.google.oauth-client:google-oauth-client-jetty:1.27.0' + compile 'com.google.apis:google-api-services-driveactivity:v2-rev20181113-1.27.0' +} diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java new file mode 100644 index 00000000..334ae860 --- /dev/null +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -0,0 +1,184 @@ +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.services.driveactivity.v2.DriveActivityScopes; +import com.google.api.services.driveactivity.v2.model.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class DriveActivityQuickstart { + /** Application name. */ + private static final String APPLICATION_NAME = "G Suite Activity API Java Quickstart"; + + /** Directory to store authorization tokens for this application. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + + /** Global instance of the {@link FileDataStoreFactory}. */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + + /** Global instance of the HTTP transport. */ + private static HttpTransport HTTP_TRANSPORT; + + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved credentials at + * ~/.credentials/driveactivity-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); + } + } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } + + /** + * Build and return an authorized Drive Activity client service. + * + * @return an authorized DriveActivity client service + * @throws IOException + */ + public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() + throws IOException { + Credential credential = authorize(); + return new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } + + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); + + // Print the recent activity in your Google Drive. + QueryDriveActivityResponse result = + service + .activity() + .query( + new QueryDriveActivityRequest() + .setPageSize(10) + .setConsolidationStrategy(new ConsolidationStrategy().setLegacy(new Legacy()))) + .execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (DriveActivity activity : activities) { + String time = getTimeInfo(activity); + String action = getActionInfo(activity.getPrimaryActionDetail()); + List actors = + activity.getActors().stream() + .map(DriveActivityQuickstart::getActorInfo) + .collect(Collectors.toList()); + List targets = + activity.getTargets().stream() + .map(DriveActivityQuickstart::getTargetInfo) + .collect(Collectors.toList()); + System.out.printf("%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); + } + } + } + + private static String truncated(List array) { + return truncated(array, 2); + } + + private static String truncated(List array, int limit) { + String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); + String more = array.size() > limit ? ", ..." : ""; + return "[" + contents + more + "]"; + } + + private static String getTimeInfo(DriveActivity activity) { + if (activity.getTimestamp() != null) { + return activity.getTimestamp(); + } + if (activity.getTimeRange() != null) { + return activity.getTimeRange().getEndTime(); + } + return "unknown"; + } + + private static String getActionInfo(ActionDetail actionDetail) { + return actionDetail.keySet().iterator().next(); + } + + private static String getUserInfo(User user) { + if (user.getKnownUser() != null) { + KnownUser knownUser = user.getKnownUser(); + Boolean isMe = knownUser.getIsCurrentUser(); + return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); + } + return user.keySet().iterator().next(); + } + + private static String getActorInfo(Actor actor) { + if (actor.getUser() != null) { + return getUserInfo(actor.getUser()); + } + return actor.keySet().iterator().next(); + } + + private static String getTargetInfo(Target target) { + if (target.getDriveItem() != null) { + return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; + } + if (target.getTeamDrive() != null) { + return "teamDrive:\"" + target.getTeamDrive().getTitle() + "\""; + } + if (target.getFileComment() != null) { + DriveItem parent = target.getFileComment().getParent(); + if (parent != null) { + return "fileComment:\"" + parent.getTitle() + "\""; + } + return "fileComment:unknown"; + } + return target.keySet().iterator().next(); + } +} From 9532915ab6518aa210f64cf66f1faa531d52cc37 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Sun, 2 Dec 2018 18:37:47 -0700 Subject: [PATCH 023/297] Adding a missing settings.gradle for Drive Activity v2, copied from v1. --- drive/activity-v2/quickstart/settings.gradle | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 drive/activity-v2/quickstart/settings.gradle diff --git a/drive/activity-v2/quickstart/settings.gradle b/drive/activity-v2/quickstart/settings.gradle new file mode 100644 index 00000000..7bcc727d --- /dev/null +++ b/drive/activity-v2/quickstart/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'quickstart' From a39374dd91e6c2e9b6d31f11ac3e33af67043a86 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Mon, 3 Dec 2018 10:54:48 -0700 Subject: [PATCH 024/297] Updating formatting and API name string for java Drive Activity v2 quickstart. --- .../main/java/DriveActivityQuickstart.java | 295 +++++++++--------- .../main/java/DriveActivityQuickstart.java | 2 +- 2 files changed, 147 insertions(+), 150 deletions(-) diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 334ae860..05a38a8d 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -18,167 +18,164 @@ import java.util.stream.Collectors; public class DriveActivityQuickstart { - /** Application name. */ - private static final String APPLICATION_NAME = "G Suite Activity API Java Quickstart"; - - /** Directory to store authorization tokens for this application. */ - private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); - - /** Global instance of the {@link FileDataStoreFactory}. */ - private static FileDataStoreFactory DATA_STORE_FACTORY; - - /** Global instance of the JSON factory. */ - private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); - - /** Global instance of the HTTP transport. */ - private static HttpTransport HTTP_TRANSPORT; - - /** - * Global instance of the scopes required by this quickstart. - * - *

If modifying these scopes, delete your previously saved credentials at - * ~/.credentials/driveactivity-java-quickstart - */ - private static final List SCOPES = - Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); - - static { - try { - HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); - DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(1); + /** Application name. */ + private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart"; + + /** Directory to store authorization tokens for this application. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); + + /** Global instance of the {@link FileDataStoreFactory}. */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); + + /** Global instance of the HTTP transport. */ + private static HttpTransport HTTP_TRANSPORT; + + /** + * Global instance of the scopes required by this quickstart. + * + *

If modifying these scopes, delete your previously saved credentials at + * ~/.credentials/driveactivity-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY); + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); + } } - } - - /** - * Creates an authorized Credential object. - * - * @return an authorized Credential object. - * @throws IOException - */ - public static Credential authorize() throws IOException { - // Load client secrets. - InputStream in = DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); - GoogleClientSecrets clientSecrets = - GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); - - // Build flow and trigger user authorization request. - GoogleAuthorizationCodeFlow flow = - new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) - .setDataStoreFactory(DATA_STORE_FACTORY) - .setAccessType("offline") - .build(); - Credential credential = - new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); - System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); - return credential; - } - - /** - * Build and return an authorized Drive Activity client service. - * - * @return an authorized DriveActivity client service - * @throws IOException - */ - public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() - throws IOException { - Credential credential = authorize(); - return new com.google.api.services.driveactivity.v2.DriveActivity.Builder( - HTTP_TRANSPORT, JSON_FACTORY, credential) - .setApplicationName(APPLICATION_NAME) - .build(); - } - - public static void main(String[] args) throws IOException { - // Build a new authorized API client service. - com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); - - // Print the recent activity in your Google Drive. - QueryDriveActivityResponse result = - service - .activity() - .query( - new QueryDriveActivityRequest() - .setPageSize(10) - .setConsolidationStrategy(new ConsolidationStrategy().setLegacy(new Legacy()))) - .execute(); - List activities = result.getActivities(); - if (activities == null || activities.size() == 0) { - System.out.println("No activity."); - } else { - System.out.println("Recent activity:"); - for (DriveActivity activity : activities) { - String time = getTimeInfo(activity); - String action = getActionInfo(activity.getPrimaryActionDetail()); - List actors = - activity.getActors().stream() - .map(DriveActivityQuickstart::getActorInfo) - .collect(Collectors.toList()); - List targets = - activity.getTargets().stream() - .map(DriveActivityQuickstart::getTargetInfo) - .collect(Collectors.toList()); - System.out.printf("%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); - } + + /** + * Creates an authorized Credential object. + * + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = DriveActivityQuickstart.class.getResourceAsStream("/credentials.json"); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = + new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()) + .authorize("user"); + System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; } - } - private static String truncated(List array) { - return truncated(array, 2); - } + /** + * Build and return an authorized Drive Activity client service. + * + * @return an authorized DriveActivity client service + * @throws IOException + */ + public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService() + throws IOException { + Credential credential = authorize(); + return new com.google.api.services.driveactivity.v2.DriveActivity.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } - private static String truncated(List array, int limit) { - String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); - String more = array.size() > limit ? ", ..." : ""; - return "[" + contents + more + "]"; - } + public static void main(String[] args) throws IOException { + // Build a new authorized API client service. + com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); + + // Print the recent activity in your Google Drive. + QueryDriveActivityResponse result = + service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute(); + List activities = result.getActivities(); + if (activities == null || activities.size() == 0) { + System.out.println("No activity."); + } else { + System.out.println("Recent activity:"); + for (DriveActivity activity : activities) { + String time = getTimeInfo(activity); + String action = getActionInfo(activity.getPrimaryActionDetail()); + List actors = + activity.getActors().stream() + .map(DriveActivityQuickstart::getActorInfo) + .collect(Collectors.toList()); + List targets = + activity.getTargets().stream() + .map(DriveActivityQuickstart::getTargetInfo) + .collect(Collectors.toList()); + System.out.printf( + "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets)); + } + } + } - private static String getTimeInfo(DriveActivity activity) { - if (activity.getTimestamp() != null) { - return activity.getTimestamp(); + private static String truncated(List array) { + return truncated(array, 2); } - if (activity.getTimeRange() != null) { - return activity.getTimeRange().getEndTime(); + + private static String truncated(List array, int limit) { + String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); + String more = array.size() > limit ? ", ..." : ""; + return "[" + contents + more + "]"; } - return "unknown"; - } - - private static String getActionInfo(ActionDetail actionDetail) { - return actionDetail.keySet().iterator().next(); - } - - private static String getUserInfo(User user) { - if (user.getKnownUser() != null) { - KnownUser knownUser = user.getKnownUser(); - Boolean isMe = knownUser.getIsCurrentUser(); - return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); + + private static String getTimeInfo(DriveActivity activity) { + if (activity.getTimestamp() != null) { + return activity.getTimestamp(); + } + if (activity.getTimeRange() != null) { + return activity.getTimeRange().getEndTime(); + } + return "unknown"; } - return user.keySet().iterator().next(); - } - private static String getActorInfo(Actor actor) { - if (actor.getUser() != null) { - return getUserInfo(actor.getUser()); + private static String getActionInfo(ActionDetail actionDetail) { + return actionDetail.keySet().iterator().next(); } - return actor.keySet().iterator().next(); - } - private static String getTargetInfo(Target target) { - if (target.getDriveItem() != null) { - return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; + private static String getUserInfo(User user) { + if (user.getKnownUser() != null) { + KnownUser knownUser = user.getKnownUser(); + Boolean isMe = knownUser.getIsCurrentUser(); + return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); + } + return user.keySet().iterator().next(); } - if (target.getTeamDrive() != null) { - return "teamDrive:\"" + target.getTeamDrive().getTitle() + "\""; + + private static String getActorInfo(Actor actor) { + if (actor.getUser() != null) { + return getUserInfo(actor.getUser()); + } + return actor.keySet().iterator().next(); } - if (target.getFileComment() != null) { - DriveItem parent = target.getFileComment().getParent(); - if (parent != null) { - return "fileComment:\"" + parent.getTitle() + "\""; - } - return "fileComment:unknown"; + + private static String getTargetInfo(Target target) { + if (target.getDriveItem() != null) { + return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; + } + if (target.getTeamDrive() != null) { + return "teamDrive:\"" + target.getTeamDrive().getTitle() + "\""; + } + if (target.getFileComment() != null) { + DriveItem parent = target.getFileComment().getParent(); + if (parent != null) { + return "fileComment:\"" + parent.getTitle() + "\""; + } + return "fileComment:unknown"; + } + return target.keySet().iterator().next(); } - return target.keySet().iterator().next(); - } } diff --git a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java index 019e26f2..8d445ef8 100644 --- a/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity/quickstart/src/main/java/DriveActivityQuickstart.java @@ -38,7 +38,7 @@ public class DriveActivityQuickstart { /** Application name. */ private static final String APPLICATION_NAME = - "G Suite Activity API Java Quickstart"; + "Drive Activity API Java Quickstart"; /** Directory to store authorization tokens for this application. */ private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens"); From 3c696c84b64e1d1fe9af5969fabac9c49b8cc9e4 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Mon, 3 Dec 2018 12:56:01 -0700 Subject: [PATCH 025/297] Adding copyright notice and region tags for drive_activity_v2_quickstart. --- .../src/main/java/DriveActivityQuickstart.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index 05a38a8d..eaeb9680 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -1,3 +1,18 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// [START drive_activity_v2_quickstart] import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; @@ -179,3 +194,4 @@ private static String getTargetInfo(Target target) { return target.keySet().iterator().next(); } } +// [END drive_activity_v2_quickstart] From 8ed642ebcca964ca92914ece127ab97db6be5b85 Mon Sep 17 00:00:00 2001 From: Jeremy Meredith Date: Wed, 16 Jan 2019 11:18:14 -0700 Subject: [PATCH 026/297] Adding comments and a new helper method to Drive Activity v2 API quickstart. --- .../main/java/DriveActivityQuickstart.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java index eaeb9680..1bdae385 100644 --- a/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java +++ b/drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC +// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -28,7 +28,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.AbstractMap; import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -137,16 +139,25 @@ public static void main(String[] args) throws IOException { } } + /** Returns a string representation of the first elements in a list. */ private static String truncated(List array) { - return truncated(array, 2); + return truncatedTo(array, 2); } - private static String truncated(List array, int limit) { + /** Returns a string representation of the first elements in a list. */ + private static String truncatedTo(List array, int limit) { String contents = array.stream().limit(limit).collect(Collectors.joining(", ")); String more = array.size() > limit ? ", ..." : ""; return "[" + contents + more + "]"; } + /** Returns the name of a set property in an object, or else "unknown". */ + private static String getOneOf(AbstractMap obj) { + Iterator iterator = obj.keySet().iterator(); + return iterator.hasNext() ? iterator.next() : "unknown"; + } + + /** Returns a time associated with an activity. */ private static String getTimeInfo(DriveActivity activity) { if (activity.getTimestamp() != null) { return activity.getTimestamp(); @@ -157,26 +168,30 @@ private static String getTimeInfo(DriveActivity activity) { return "unknown"; } + /** Returns the type of action. */ private static String getActionInfo(ActionDetail actionDetail) { - return actionDetail.keySet().iterator().next(); + return getOneOf(actionDetail); } + /** Returns user information, or the type of user if not a known user. */ private static String getUserInfo(User user) { if (user.getKnownUser() != null) { KnownUser knownUser = user.getKnownUser(); Boolean isMe = knownUser.getIsCurrentUser(); return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName(); } - return user.keySet().iterator().next(); + return getOneOf(user); } + /** Returns actor information, or the type of actor if not a user. */ private static String getActorInfo(Actor actor) { if (actor.getUser() != null) { return getUserInfo(actor.getUser()); } - return actor.keySet().iterator().next(); + return getOneOf(actor); } + /** Returns the type of a target and an associated title. */ private static String getTargetInfo(Target target) { if (target.getDriveItem() != null) { return "driveItem:\"" + target.getDriveItem().getTitle() + "\""; @@ -191,7 +206,7 @@ private static String getTargetInfo(Target target) { } return "fileComment:unknown"; } - return target.keySet().iterator().next(); + return getOneOf(target); } } // [END drive_activity_v2_quickstart] From 02ee977ef712f5e5bc136be23de0f5a5cf7d73dc Mon Sep 17 00:00:00 2001 From: Matt Lau Date: Fri, 1 Feb 2019 11:42:33 -0800 Subject: [PATCH 027/297] Add samples for hold migration. --- vault/vault-hold-migration-api/apis.ipr | 365 ++++++++++++++++++ vault/vault-hold-migration-api/apis.iws | 318 +++++++++++++++ vault/vault-hold-migration-api/build.gradle | 22 ++ .../vault-hold-migration-api/settings.gradle | 19 + .../vault/chatmigration/DirectoryService.java | 59 +++ .../vault/chatmigration/DuplicateHold.java | 125 ++++++ .../vault/chatmigration/HoldsReport.java | 160 ++++++++ .../vault/chatmigration/MigrationHelper.java | 196 ++++++++++ .../vault/chatmigration/QuickStart.java | 127 ++++++ .../chatmigration/RetryableTemplate.java | 49 +++ 10 files changed, 1440 insertions(+) create mode 100644 vault/vault-hold-migration-api/apis.ipr create mode 100644 vault/vault-hold-migration-api/apis.iws create mode 100644 vault/vault-hold-migration-api/build.gradle create mode 100644 vault/vault-hold-migration-api/settings.gradle create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DirectoryService.java create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/DuplicateHold.java create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/HoldsReport.java create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/MigrationHelper.java create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/QuickStart.java create mode 100644 vault/vault-hold-migration-api/src/main/java/com/google/vault/chatmigration/RetryableTemplate.java diff --git a/vault/vault-hold-migration-api/apis.ipr b/vault/vault-hold-migration-api/apis.ipr new file mode 100644 index 00000000..d9d8eb33 --- /dev/null +++ b/vault/vault-hold-migration-api/apis.ipr @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.6 + + + + + + + + + + + + + \ No newline at end of file diff --git a/vault/vault-hold-migration-api/apis.iws b/vault/vault-hold-migration-api/apis.iws new file mode 100644 index 00000000..ede0ae6b --- /dev/null +++ b/vault/vault-hold-migration-api/apis.iws @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +