Create SpannerOptions in Module instead of Configuration

Remove unnecessary Configuration class, move functionality to Module.
Update tests to function with aforementioned change, no need for faux
Configuration any more.

Change-Id: I39b52ed74e42eeff0be973279c0a1510848b4354
diff --git a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java
deleted file mode 100644
index 7f34313..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2023 The Android Open Source Project
-//
-// 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.
-
-package com.googlesource.gerrit.plugins.spannerrefdb;
-
-import com.google.auth.oauth2.GoogleCredentials;
-import com.google.cloud.spanner.DatabaseId;
-import com.google.cloud.spanner.SpannerOptions;
-import com.google.common.base.Strings;
-import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.FileInputStream;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-class Configuration {
-  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
-
-  public static final String DATABASE_KEY = "database";
-  public static final String INSTANCE_KEY = "instance";
-  public static final String EMULATOR_KEY = "useEmulator";
-  public static final String CREDENTIALS_KEY = "credentialsPath";
-  public static final String SECTION = "ref-database";
-  public static final String SUBSECTION = "spanner";
-  private final String spannerInstance;
-  private final String spannerDatabase;
-  private SpannerOptions options;
-
-  @Inject
-  Configuration(PluginConfigFactory configFactory, @PluginName String pluginName)
-      throws IOException {
-    Config cfg = configFactory.getGlobalPluginConfig(pluginName);
-    this.spannerInstance = getString(cfg, SECTION, SUBSECTION, INSTANCE_KEY, "spanner-instance");
-    this.spannerDatabase = getString(cfg, SECTION, SUBSECTION, DATABASE_KEY, "global-refdb");
-    boolean useEmulator = cfg.getBoolean(SECTION, SUBSECTION, EMULATOR_KEY, false);
-    if (useEmulator) {
-      this.options = SpannerOptions.newBuilder().build();
-      logger.atInfo().log(
-          "Using local Spanner emulator for global-refdb; Spanner credentials will not be read.");
-    } else {
-      String credentialsPath = getString(cfg, SECTION, SUBSECTION, CREDENTIALS_KEY, null);
-      GoogleCredentials credentials =
-          GoogleCredentials.fromStream(new FileInputStream(credentialsPath));
-      this.options = SpannerOptions.newBuilder().setCredentials(credentials).build();
-    }
-  }
-
-  final DatabaseId getDatabaseId() {
-    return DatabaseId.of(options.getProjectId(), spannerInstance, spannerDatabase);
-  }
-
-  final SpannerOptions getOptions() {
-    return options;
-  }
-
-  void setOptions(SpannerOptions options) {
-    this.options = options;
-  }
-
-  private String getString(
-      Config cfg, String section, String subsection, String name, String defaultValue) {
-    String value = cfg.getString(section, subsection, name);
-    if (!Strings.isNullOrEmpty(value)) {
-      return value;
-    }
-    return defaultValue;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Module.java b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Module.java
index df30ab7..c146a9c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Module.java
@@ -15,19 +15,35 @@
 package com.googlesource.gerrit.plugins.spannerrefdb;
 
 import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
-import com.google.cloud.spanner.DatabaseAdminClient;
+import com.google.auth.oauth2.GoogleCredentials;
 import com.google.cloud.spanner.DatabaseClient;
+import com.google.cloud.spanner.DatabaseId;
+import com.google.cloud.spanner.SpannerOptions;
+import com.google.common.base.Strings;
 import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.Singleton;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import org.eclipse.jgit.lib.Config;
 
 class Module extends LifecycleModule {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
+  public static final String DATABASE_KEY = "database";
+  public static final String INSTANCE_KEY = "instance";
+  public static final String EMULATOR_KEY = "useEmulator";
+  public static final String CREDENTIALS_KEY = "credentialsPath";
+  public static final String SECTION = "ref-database";
+  public static final String SUBSECTION = "spanner";
+
   @Override
   protected void configure() {
     logger.atInfo().log("Configuring Cloud Spanner for global refdb.");
@@ -43,13 +59,49 @@
 
   @Provides
   @Singleton
-  public DatabaseAdminClient createDatabaseAdminClient(Configuration configuration) {
-    return configuration.getOptions().getService().getDatabaseAdminClient();
+  private Config Configuration(PluginConfigFactory configFactory, @PluginName String pluginName) {
+    return configFactory.getGlobalPluginConfig(pluginName);
   }
 
   @Provides
   @Singleton
-  public DatabaseClient createDatabaseClient(Configuration configuration) {
-    return configuration.getOptions().getService().getDatabaseClient(configuration.getDatabaseId());
+  public SpannerOptions createSpannerOptions(Config cfg) throws FileNotFoundException, IOException {
+    SpannerOptions options;
+    boolean useEmulator = cfg.getBoolean(SECTION, SUBSECTION, EMULATOR_KEY, false);
+    if (useEmulator) {
+      options = SpannerOptions.newBuilder().build();
+      logger.atInfo().log(
+          "Using local Spanner emulator for global-refdb; Spanner credentials will not be read.");
+    } else {
+      String credentialsPath = getString(cfg, SECTION, SUBSECTION, CREDENTIALS_KEY, null);
+      GoogleCredentials credentials =
+          GoogleCredentials.fromStream(new FileInputStream(credentialsPath));
+      options = SpannerOptions.newBuilder().setCredentials(credentials).build();
+    }
+    return options;
+  }
+
+  @Provides
+  @Singleton
+  public DatabaseClient createDatabaseClient(Config cfg, SpannerOptions options) {
+    return options.getService().getDatabaseClient(createDatabaseId(cfg, options));
+  }
+
+  @Provides
+  @Singleton
+  public DatabaseId createDatabaseId(Config cfg, SpannerOptions options) {
+    String spannerInstance = getString(cfg, SECTION, SUBSECTION, INSTANCE_KEY, "spanner-instance");
+    String spannerDatabase = getString(cfg, SECTION, SUBSECTION, DATABASE_KEY, "global-refdb");
+
+    return DatabaseId.of(options.getProjectId(), spannerInstance, spannerDatabase);
+  }
+
+  private String getString(
+      Config cfg, String section, String subsection, String name, String defaultValue) {
+    String value = cfg.getString(section, subsection, name);
+    if (!Strings.isNullOrEmpty(value)) {
+      return value;
+    }
+    return defaultValue;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerLifeCycleManager.java b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerLifeCycleManager.java
index 9c80b63..5783857 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerLifeCycleManager.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerLifeCycleManager.java
@@ -17,8 +17,10 @@
 import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.api.gax.longrunning.OperationFuture;
 import com.google.cloud.spanner.DatabaseAdminClient;
+import com.google.cloud.spanner.DatabaseId;
 import com.google.cloud.spanner.ErrorCode;
 import com.google.cloud.spanner.SpannerException;
+import com.google.cloud.spanner.SpannerOptions;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.inject.Inject;
@@ -30,13 +32,13 @@
 class SpannerLifeCycleManager implements LifecycleListener {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
-  private final Configuration configuration;
   private DatabaseAdminClient dbAdminClient;
+  private DatabaseId dbId;
 
   @Inject
-  SpannerLifeCycleManager(Configuration configuration, DatabaseAdminClient dbAdminClient) {
-    this.configuration = configuration;
-    this.dbAdminClient = dbAdminClient;
+  SpannerLifeCycleManager(SpannerOptions options, DatabaseId dbId) {
+    this.dbAdminClient = options.getService().getDatabaseAdminClient();
+    this.dbId = dbId;
   }
 
   @Override
@@ -68,14 +70,12 @@
     try {
       OperationFuture<Void, UpdateDatabaseDdlMetadata> op =
           dbAdminClient.updateDatabaseDdl(
-              configuration.getDatabaseId().getInstanceId().getInstance(),
-              configuration.getDatabaseId().getDatabase(),
+              dbId.getInstanceId().getInstance(),
+              dbId.getDatabase(),
               Arrays.asList(statement),
               null);
       op.get();
-      logger.atInfo().log(
-          "Created table in database [%s] with statement %s",
-          configuration.getDatabaseId(), statement);
+      logger.atInfo().log("Created table in database [%s] with statement %s", dbId, statement);
     } catch (Exception e) {
       Throwable cause = e.getCause();
       if (cause instanceof SpannerException) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/EmulatedSpannerRefDb.java b/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/EmulatedSpannerRefDb.java
index 7ce34ed..c555044 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/EmulatedSpannerRefDb.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/EmulatedSpannerRefDb.java
@@ -14,18 +14,10 @@
 
 package com.googlesource.gerrit.plugins.spannerrefdb;
 
-import static com.googlesource.gerrit.plugins.spannerrefdb.Configuration.DATABASE_KEY;
-import static com.googlesource.gerrit.plugins.spannerrefdb.Configuration.EMULATOR_KEY;
-import static com.googlesource.gerrit.plugins.spannerrefdb.Configuration.INSTANCE_KEY;
-import static com.googlesource.gerrit.plugins.spannerrefdb.Configuration.SECTION;
-import static com.googlesource.gerrit.plugins.spannerrefdb.Configuration.SUBSECTION;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import com.google.cloud.NoCredentials;
 import com.google.cloud.spanner.Database;
-import com.google.cloud.spanner.DatabaseAdminClient;
 import com.google.cloud.spanner.DatabaseClient;
+import com.google.cloud.spanner.DatabaseId;
 import com.google.cloud.spanner.Instance;
 import com.google.cloud.spanner.InstanceAdminClient;
 import com.google.cloud.spanner.InstanceConfigId;
@@ -33,11 +25,8 @@
 import com.google.cloud.spanner.InstanceInfo;
 import com.google.cloud.spanner.Spanner;
 import com.google.cloud.spanner.SpannerOptions;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import java.io.IOException;
 import java.util.Collections;
 import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.lib.Config;
 import org.junit.Ignore;
 import org.testcontainers.containers.SpannerEmulatorContainer;
 import org.testcontainers.utility.DockerImageName;
@@ -47,17 +36,17 @@
   public static final String PROJECT_ID = "test";
   public static final String SPANNER_INSTANCE_ID = "spanner-instance";
   public static final String SPANNER_DATABASE_ID = "global-refdb";
-  private static final String pluginName = "spanner-refdb";
 
   private final SpannerEmulatorContainer container;
 
   private final Spanner spanner;
+  private final SpannerOptions spannerOptions;
   private final InstanceAdminClient instanceAdminClient;
   private final Instance spannerInstance;
   private final Database spannerDatabase;
+  private final DatabaseId dbId;
   private final DatabaseClient databaseClient;
   private final SpannerRefDatabase spannerRefDb;
-  private final Configuration pluginConfig;
 
   public EmulatedSpannerRefDb() throws Exception {
     container =
@@ -69,12 +58,13 @@
             "Spanner emulator container started and is listening on %s",
             container.getEmulatorGrpcEndpoint()));
 
-    spanner = getEmulatorOptions().getService();
+    spannerOptions = getEmulatorOptions();
+    spanner = spannerOptions.getService();
     instanceAdminClient = spanner.getInstanceAdminClient();
     spannerInstance = createSpannerInstance();
+    dbId = DatabaseId.of(spannerOptions.getProjectId(), SPANNER_INSTANCE_ID, SPANNER_DATABASE_ID);
     spannerDatabase =
         spannerInstance.createDatabase(SPANNER_DATABASE_ID, Collections.emptyList()).get();
-    pluginConfig = createEmulatorConfiguration();
     createSchema();
     databaseClient = createDatabaseClient();
     Lock.LockFactory lockFactory =
@@ -88,8 +78,7 @@
   }
 
   private void createSchema() {
-    DatabaseAdminClient dbAdminClient = spanner.getDatabaseAdminClient();
-    SpannerLifeCycleManager lcm = new SpannerLifeCycleManager(pluginConfig, dbAdminClient);
+    SpannerLifeCycleManager lcm = new SpannerLifeCycleManager(spannerOptions, dbId);
     lcm.start();
   }
 
@@ -135,23 +124,6 @@
   }
 
   private DatabaseClient createDatabaseClient() {
-    return createDatabaseClient(pluginConfig);
-  }
-
-  private Configuration createEmulatorConfiguration() throws IOException {
-    Config refDbConfig = new Config();
-    refDbConfig.setString(SECTION, SUBSECTION, INSTANCE_KEY, SPANNER_INSTANCE_ID);
-    refDbConfig.setString(SECTION, SUBSECTION, DATABASE_KEY, SPANNER_DATABASE_ID);
-    refDbConfig.setBoolean(SECTION, SUBSECTION, EMULATOR_KEY, true);
-
-    PluginConfigFactory cfgFactory = mock(PluginConfigFactory.class);
-    when(cfgFactory.getGlobalPluginConfig(pluginName)).thenReturn(refDbConfig);
-    Configuration spannerConfig = new Configuration(cfgFactory, pluginName);
-    spannerConfig.setOptions(getEmulatorOptions());
-    return spannerConfig;
-  }
-
-  private DatabaseClient createDatabaseClient(Configuration configuration) {
-    return configuration.getOptions().getService().getDatabaseClient(configuration.getDatabaseId());
+    return spannerOptions.getService().getDatabaseClient(dbId);
   }
 }