All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gerrit.server.schema.Schema_119 Maven / Gradle / Ivy

// Copyright (C) 2015 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.google.gerrit.server.schema;

import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_GIT;
import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_HTTP;
import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.HTTP;
import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.REPO_DOWNLOAD;
import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.SSH;
import static com.google.gerrit.server.config.ConfigUtil.storeSection;

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.account.VersionedAccountPreferences;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.UserConfigSections;
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;

import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.BatchRefUpdate;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevWalk;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Schema_119 extends SchemaVersion {
  private static final Map LEGACY_DISPLAYNAME_MAP =
      ImmutableMap. of(
          "ANON_GIT", ANON_GIT,
          "ANON_HTTP", ANON_HTTP,
          "HTTP", HTTP,
          "SSH", SSH,
          "REPO_DOWNLOAD", REPO_DOWNLOAD);

  private final GitRepositoryManager mgr;
  private final AllUsersName allUsersName;
  private final PersonIdent serverUser;

  @Inject
  Schema_119(Provider prior,
      GitRepositoryManager mgr,
      AllUsersName allUsersName,
      @GerritPersonIdent PersonIdent serverUser) {
    super(prior);
    this.mgr = mgr;
    this.allUsersName = allUsersName;
    this.serverUser = serverUser;
  }

  @Override
  protected void migrateData(ReviewDb db, UpdateUI ui)
      throws OrmException, SQLException {
    JdbcSchema schema = (JdbcSchema) db;
    Connection connection = schema.getConnection();
    String tableName = "accounts";
    String emailStrategy = "email_strategy";
    Set columns =
        schema.getDialect().listColumns(connection, tableName);
    Map imports = new HashMap<>();
    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
        ResultSet rs = stmt.executeQuery(
          "select "
          + "account_id, "
          + "maximum_page_size, "
          + "show_site_header, "
          + "use_flash_clipboard, "
          + "download_url, "
          + "download_command, "
          + (columns.contains(emailStrategy)
              ? emailStrategy + ", "
              : "copy_self_on_email, ")
          + "date_format, "
          + "time_format, "
          + "relative_date_in_change_table, "
          + "diff_view, "
          + "size_bar_in_change_table, "
          + "legacycid_in_change_table, "
          + "review_category_strategy, "
          + "mute_common_path_prefixes "
          + "from " + tableName)) {
        while (rs.next()) {
          GeneralPreferencesInfo p =
              new GeneralPreferencesInfo();
          Account.Id accountId = new Account.Id(rs.getInt(1));
          p.changesPerPage = (int)rs.getShort(2);
          p.showSiteHeader = toBoolean(rs.getString(3));
          p.useFlashClipboard = toBoolean(rs.getString(4));
          p.downloadScheme = convertToModernNames(rs.getString(5));
          p.downloadCommand = toDownloadCommand(rs.getString(6));
          p.emailStrategy = toEmailStrategy(rs.getString(7),
              columns.contains(emailStrategy));
          p.dateFormat = toDateFormat(rs.getString(8));
          p.timeFormat = toTimeFormat(rs.getString(9));
          p.relativeDateInChangeTable = toBoolean(rs.getString(10));
          p.diffView = toDiffView(rs.getString(11));
          p.sizeBarInChangeTable = toBoolean(rs.getString(12));
          p.legacycidInChangeTable = toBoolean(rs.getString(13));
          p.reviewCategoryStrategy =
              toReviewCategoryStrategy(rs.getString(14));
          p.muteCommonPathPrefixes = toBoolean(rs.getString(15));
          imports.put(accountId, p);
        }
    }

    if (imports.isEmpty()) {
      return;
    }

    try (Repository git = mgr.openRepository(allUsersName);
        RevWalk rw = new RevWalk(git)) {
      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
      for (Map.Entry e
          : imports.entrySet()) {
        try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED,
            allUsersName, git, bru)) {
          md.getCommitBuilder().setAuthor(serverUser);
          md.getCommitBuilder().setCommitter(serverUser);
          VersionedAccountPreferences p =
              VersionedAccountPreferences.forUser(e.getKey());
          p.load(md);
          storeSection(p.getConfig(), UserConfigSections.GENERAL, null,
              e.getValue(), GeneralPreferencesInfo.defaults());
          p.commit(md);
        }
      }

      bru.execute(rw, NullProgressMonitor.INSTANCE);
    } catch (ConfigInvalidException | IOException ex) {
      throw new OrmException(ex);
    }
  }

  private String convertToModernNames(String s) {
    return !Strings.isNullOrEmpty(s) && LEGACY_DISPLAYNAME_MAP.containsKey(s)
        ? LEGACY_DISPLAYNAME_MAP.get(s)
        : s;
  }

  private static DownloadCommand toDownloadCommand(String v) {
    if (v == null) {
      return DownloadCommand.CHECKOUT;
    }
    return DownloadCommand.valueOf(v);
  }

  private static DateFormat toDateFormat(String v) {
    if (v == null) {
      return DateFormat.STD;
    }
    return DateFormat.valueOf(v);
  }

  private static TimeFormat toTimeFormat(String v) {
    if (v == null) {
      return TimeFormat.HHMM_12;
    }
    return TimeFormat.valueOf(v);
  }

  private static DiffView toDiffView(String v) {
    if (v == null) {
      return DiffView.SIDE_BY_SIDE;
    }
    return DiffView.valueOf(v);
  }

  private static EmailStrategy toEmailStrategy(String v,
      boolean emailStrategyColumnExists) throws OrmException {
    if (v == null) {
      return EmailStrategy.ENABLED;
    }
    if (emailStrategyColumnExists) {
      return EmailStrategy.valueOf(v);
    }
    if (v.equals("N")) {
      // EMAIL_STRATEGY='ENABLED' WHERE (COPY_SELF_ON_EMAIL='N')
      return EmailStrategy.ENABLED;
    } else if (v.equals("Y")) {
      // EMAIL_STRATEGY='CC_ON_OWN_COMMENTS' WHERE (COPY_SELF_ON_EMAIL='Y')
      return EmailStrategy.CC_ON_OWN_COMMENTS;
    } else {
      throw new OrmException(
          "invalid value in accounts.copy_self_on_email: " + v);
    }
  }

  private static ReviewCategoryStrategy toReviewCategoryStrategy(String v) {
    if (v == null) {
      return ReviewCategoryStrategy.NONE;
    }
    return ReviewCategoryStrategy.valueOf(v);
  }

  private static boolean toBoolean(String v) {
    Preconditions.checkState(!Strings.isNullOrEmpty(v));
    return v.equals("Y");
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy