| // Copyright (C) 2018 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.common.base.Preconditions.checkArgument; | |
| import static com.google.common.collect.ImmutableSortedMap.toImmutableSortedMap; | |
| import static java.util.Comparator.naturalOrder; | |
| import com.google.common.collect.ImmutableSortedMap; | |
| import com.google.common.primitives.Ints; | |
| import com.google.gerrit.common.UsedAt; | |
| import java.lang.reflect.InvocationTargetException; | |
| import java.util.Optional; | |
| import java.util.stream.Stream; | |
| public class NoteDbSchemaVersions { | |
| static final ImmutableSortedMap<Integer, Class<? extends NoteDbSchemaVersion>> ALL = | |
| // List all supported NoteDb schema versions here. | |
| Stream.of( | |
| Schema_180.class, | |
| Schema_181.class, | |
| Schema_182.class, | |
| Schema_183.class, | |
| Schema_184.class, | |
| Schema_185.class) | |
| .collect(toImmutableSortedMap(naturalOrder(), v -> guessVersion(v).get(), v -> v)); | |
| public static final int FIRST = ALL.firstKey(); | |
| public static final int LATEST = ALL.lastKey(); | |
| // TODO(dborowitz): Migrate delete-project plugin to use this implementation. | |
| @UsedAt(UsedAt.Project.PLUGIN_DELETE_PROJECT) | |
| public static Optional<Integer> guessVersion(Class<?> c) { | |
| String prefix = "Schema_"; | |
| if (!c.getSimpleName().startsWith(prefix)) { | |
| return Optional.empty(); | |
| } | |
| return Optional.ofNullable(Ints.tryParse(c.getSimpleName().substring(prefix.length()))); | |
| } | |
| public static NoteDbSchemaVersion get( | |
| ImmutableSortedMap<Integer, Class<? extends NoteDbSchemaVersion>> schemaVersions, int i) { | |
| Class<? extends NoteDbSchemaVersion> clazz = schemaVersions.get(i); | |
| checkArgument(clazz != null, "Schema version not found: %s", i); | |
| try { | |
| return clazz.getDeclaredConstructor().newInstance(); | |
| } catch (InstantiationException | |
| | IllegalAccessException | |
| | NoSuchMethodException | |
| | InvocationTargetException e) { | |
| throw new IllegalStateException("failed to invoke constructor on " + clazz.getName(), e); | |
| } | |
| } | |
| } |