Extract method from ChangeSchemas to build schema version map

Change-Id: I37779385858795933443f3f369df77acc393b70c
This commit is contained in:
Dave Borowitz
2016-03-15 15:44:20 +01:00
parent da0459d20c
commit a4d67d259c
3 changed files with 126 additions and 48 deletions

View File

@@ -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() {
}
}

View File

@@ -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);
}
}