Extract method from ChangeSchemas to build schema version map
Change-Id: I37779385858795933443f3f369df77acc393b70c
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// Copyright (C) 2016 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.index;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
public class SchemaUtil {
|
||||
public static <V> ImmutableMap<Integer, Schema<V>> schemasFromClass(
|
||||
Class<?> schemasClass, Class<V> valueClass) {
|
||||
Map<Integer, Schema<V>> schemas = Maps.newTreeMap();
|
||||
for (Field f : schemasClass.getDeclaredFields()) {
|
||||
if (Modifier.isStatic(f.getModifiers())
|
||||
&& Modifier.isFinal(f.getModifiers())
|
||||
&& Schema.class.isAssignableFrom(f.getType())) {
|
||||
ParameterizedType t = (ParameterizedType) f.getGenericType();
|
||||
if (t.getActualTypeArguments()[0] == valueClass) {
|
||||
try {
|
||||
f.setAccessible(true);
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<V> schema = (Schema<V>) f.get(null);
|
||||
checkArgument(f.getName().startsWith("V"));
|
||||
schema.setVersion(Integer.parseInt(f.getName().substring(1)));
|
||||
schemas.put(schema.getVersion(), schema);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException(
|
||||
"non-" + schemasClass.getSimpleName() + " schema: " + f);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (schemas.isEmpty()) {
|
||||
throw new ExceptionInInitializerError("no ChangeSchemas found");
|
||||
}
|
||||
return ImmutableMap.copyOf(schemas);
|
||||
}
|
||||
|
||||
public static <V> Schema<V> schema(Collection<FieldDef<V, ?>> fields) {
|
||||
return new Schema<>(ImmutableList.copyOf(fields));
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <V> Schema<V> schema(FieldDef<V, ?>... fields) {
|
||||
return schema(ImmutableList.copyOf(fields));
|
||||
}
|
||||
|
||||
private SchemaUtil() {
|
||||
}
|
||||
}
|
||||
@@ -15,21 +15,14 @@
|
||||
package com.google.gerrit.server.index.change;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.gerrit.server.index.SchemaUtil.schema;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gerrit.server.index.FieldDef;
|
||||
import com.google.gerrit.server.index.Schema;
|
||||
import com.google.gerrit.server.index.SchemaUtil;
|
||||
import com.google.gerrit.server.query.change.ChangeData;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
/** Secondary index schemas for changes. */
|
||||
public class ChangeSchemas {
|
||||
@Deprecated
|
||||
@@ -109,16 +102,8 @@ public class ChangeSchemas {
|
||||
|
||||
static final Schema<ChangeData> V27 = schema(V26.getFields().values());
|
||||
|
||||
private static Schema<ChangeData> schema(Collection<FieldDef<ChangeData, ?>> fields) {
|
||||
return new Schema<>(ImmutableList.copyOf(fields));
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
private static Schema<ChangeData> schema(FieldDef<ChangeData, ?>... fields) {
|
||||
return schema(ImmutableList.copyOf(fields));
|
||||
}
|
||||
|
||||
public static final ImmutableMap<Integer, Schema<ChangeData>> ALL;
|
||||
public static final ImmutableMap<Integer, Schema<ChangeData>> ALL =
|
||||
SchemaUtil.schemasFromClass(ChangeSchemas.class, ChangeData.class);
|
||||
|
||||
public static Schema<ChangeData> get(int version) {
|
||||
Schema<ChangeData> schema = ALL.get(version);
|
||||
@@ -129,33 +114,4 @@ public class ChangeSchemas {
|
||||
public static Schema<ChangeData> getLatest() {
|
||||
return Iterables.getLast(ALL.values());
|
||||
}
|
||||
|
||||
static {
|
||||
Map<Integer, Schema<ChangeData>> all = Maps.newTreeMap();
|
||||
for (Field f : ChangeSchemas.class.getDeclaredFields()) {
|
||||
if (Modifier.isStatic(f.getModifiers())
|
||||
&& Modifier.isFinal(f.getModifiers())
|
||||
&& Schema.class.isAssignableFrom(f.getType())) {
|
||||
ParameterizedType t = (ParameterizedType) f.getGenericType();
|
||||
if (t.getActualTypeArguments()[0] == ChangeData.class) {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<ChangeData> schema = (Schema<ChangeData>) f.get(null);
|
||||
checkArgument(f.getName().startsWith("V"));
|
||||
schema.setVersion(Integer.parseInt(f.getName().substring(1)));
|
||||
all.put(schema.getVersion(), schema);
|
||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
||||
throw new ExceptionInInitializerError(e);
|
||||
}
|
||||
} else {
|
||||
throw new ExceptionInInitializerError(
|
||||
"non-ChangeData schema: " + f);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (all.isEmpty()) {
|
||||
throw new ExceptionInInitializerError("no ChangeSchemas found");
|
||||
}
|
||||
ALL = ImmutableMap.copyOf(all);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user