package com.google.gerrit.server.config;

import com.google.gerrit.reviewdb.Project;
import com.google.gerrit.reviewdb.ReviewDb;
import com.google.gerrit.reviewdb.SystemConfig;
import com.google.gwtorm.client.OrmException;
import com.google.gwtorm.client.SchemaFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.ProvisionException;

public class WildProjectNameProvider implements Provider<Project.NameKey> {
  /** Project.Id meaning "any and all projects on this server". */
  public static final Project.Id WILD_PROJECT_ID = new Project.Id(0);

  private final SchemaFactory<ReviewDb> schema;

  @Inject
  WildProjectNameProvider(final SchemaFactory<ReviewDb> schema,
  /*
   * Unused, but we need to force it to load before we do, otherwise we risk
   * reading an empty database without the wild project being in the database.
   * Asking for it should ensures Guice loads it first.
   */
  final SystemConfig config) {
    this.schema = schema;
  }

  public Project.NameKey get() {
    try {
      final ReviewDb db = schema.open();
      try {
        final Project p = db.projects().get(WILD_PROJECT_ID);
        if (p == null) {
          throw new ProvisionException("No project " + WILD_PROJECT_ID);
        }
        return p.getNameKey();
      } finally {
        db.close();
      }
    } catch (OrmException e) {
      throw new ProvisionException("Cannot load " + WILD_PROJECT_ID, e);
    }
  }
}
