30
30
import com .google .common .io .Files ;
31
31
import com .google .gcloud .spi .ServiceRpcFactory ;
32
32
33
+ import org .json .JSONException ;
34
+ import org .json .JSONObject ;
35
+ import org .json .JSONTokener ;
36
+
33
37
import java .io .BufferedReader ;
34
38
import java .io .File ;
39
+ import java .io .FileInputStream ;
35
40
import java .io .FileNotFoundException ;
36
41
import java .io .FileReader ;
37
42
import java .io .IOException ;
@@ -378,7 +383,10 @@ protected String defaultHost() {
378
383
protected String defaultProject () {
379
384
String projectId = System .getProperty (PROJECT_ENV_NAME , System .getenv (PROJECT_ENV_NAME ));
380
385
if (projectId == null ) {
381
- projectId = getAppEngineProjectId ();
386
+ projectId = appEngineProjectId ();
387
+ }
388
+ if (projectId == null ) {
389
+ projectId = serviceAccountProjectId ();
382
390
}
383
391
return projectId != null ? projectId : googleCloudProjectId ();
384
392
}
@@ -461,7 +469,7 @@ private static boolean isWindows() {
461
469
return System .getProperty ("os.name" ).toLowerCase (Locale .ENGLISH ).contains ("windows" );
462
470
}
463
471
464
- protected static String getAppEngineProjectId () {
472
+ protected static String appEngineProjectId () {
465
473
try {
466
474
Class <?> factoryClass =
467
475
Class .forName ("com.google.appengine.api.appidentity.AppIdentityServiceFactory" );
@@ -479,6 +487,20 @@ protected static String getAppEngineProjectId() {
479
487
}
480
488
}
481
489
490
+ protected static String serviceAccountProjectId () {
491
+ String project = null ;
492
+ String credentialsPath = System .getenv ("GOOGLE_APPLICATION_CREDENTIALS" );
493
+ if (credentialsPath != null ) {
494
+ try (InputStream credentialsStream = new FileInputStream (credentialsPath )) {
495
+ JSONObject json = new JSONObject (new JSONTokener (credentialsStream ));
496
+ project = json .getString ("project_id" );
497
+ } catch (IOException | JSONException ex ) {
498
+ // ignore
499
+ }
500
+ }
501
+ return project ;
502
+ }
503
+
482
504
@ SuppressWarnings ("unchecked" )
483
505
public ServiceT service () {
484
506
if (service == null ) {
0 commit comments