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); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,50 @@ | ||||
| // 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.truth.Truth.assertThat; | ||||
| import static com.google.gerrit.server.index.SchemaUtil.schema; | ||||
|  | ||||
| import com.google.gerrit.testutil.GerritBaseTests; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| public class SchemaUtilTest extends GerritBaseTests { | ||||
|   static class TestSchemas { | ||||
|     static final Schema<String> V1 = schema(); | ||||
|     static final Schema<String> V2 = schema(); | ||||
|     static Schema<String> V3 = schema(); // Not final, ignored. | ||||
|     private static final Schema<String> V4 = schema(); | ||||
|  | ||||
|     // Ignored. | ||||
|     static Schema<String> V10 = schema(); | ||||
|     final Schema<String> V11 = schema(); | ||||
|   } | ||||
|  | ||||
|   @Test | ||||
|   public void schemasFromClassBuildsMap() { | ||||
|     Map<Integer, Schema<String>> all = | ||||
|         SchemaUtil.schemasFromClass(TestSchemas.class, String.class); | ||||
|     assertThat(all.keySet()).containsExactly(1, 2, 4); | ||||
|     assertThat(all.get(1)).isEqualTo(TestSchemas.V1); | ||||
|     assertThat(all.get(2)).isEqualTo(TestSchemas.V2); | ||||
|     assertThat(all.get(4)).isEqualTo(TestSchemas.V4); | ||||
|  | ||||
|     exception.expect(IllegalArgumentException.class); | ||||
|     SchemaUtil.schemasFromClass(TestSchemas.class, Object.class); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Dave Borowitz
					Dave Borowitz