/* * This file is part of LanternServer, licensed under the MIT License (MIT). * * Copyright (c) LanternPowered <https://www.lanternpowered.org> * Copyright (c) SpongePowered <https://www.spongepowered.org> * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the Software), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.lanternpowered.server.data.key; import com.google.common.reflect.TypeParameter; import com.google.common.reflect.TypeToken; import org.spongepowered.api.data.DataQuery; import org.spongepowered.api.data.key.Key; import org.spongepowered.api.data.key.KeyFactory; import org.spongepowered.api.data.manipulator.mutable.MobSpawnerData; import org.spongepowered.api.data.meta.PatternLayer; import org.spongepowered.api.data.value.BaseValue; import org.spongepowered.api.data.value.immutable.ImmutableBoundedValue; import org.spongepowered.api.data.value.mutable.ListValue; import org.spongepowered.api.data.value.mutable.MapValue; import org.spongepowered.api.data.value.mutable.MutableBoundedValue; import org.spongepowered.api.data.value.mutable.OptionalValue; import org.spongepowered.api.data.value.mutable.PatternListValue; import org.spongepowered.api.data.value.mutable.SetValue; import org.spongepowered.api.data.value.mutable.Value; import org.spongepowered.api.data.value.mutable.WeightedCollectionValue; import org.spongepowered.api.entity.EntitySnapshot; import org.spongepowered.api.util.weighted.WeightedSerializableObject; import org.spongepowered.api.util.weighted.WeightedTable; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; public final class LanternKeyFactory { public static <E> Key<Value<E>> makeValueKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<Value<E>> valueToken = new TypeToken<Value<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return KeyFactory.makeSingleKey(elementToken, valueToken, query, id, name); } public static <E> Key<Value<E>> makeValueKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeValueKey(elementToken, query, id, query.last().toString()); } public static <E> Key<Value<E>> makeValueKey(Class<E> elementType, DataQuery query, String id, String name) { return makeValueKey(elementType, query, id, name); } public static <E> Key<Value<E>> makeValueKey(Class<E> elementType, DataQuery query, String id) { return makeValueKey(TypeToken.of(elementType), query, id, query.last().toString()); } public static <E> Key<MutableBoundedValue<E>> makeMutableBoundedValueKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<MutableBoundedValue<E>> valueToken = new TypeToken<MutableBoundedValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return KeyFactory.makeSingleKey(elementToken, valueToken, query, id, name); } public static <E> Key<MutableBoundedValue<E>> makeMutableBoundedValueKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeMutableBoundedValueKey(elementToken, query, id, query.last().toString()); } public static <E> Key<MutableBoundedValue<E>> makeMutableBoundedValueKey(Class<E> elementType, DataQuery query, String id, String name) { return makeMutableBoundedValueKey(elementType, query, id, name); } public static <E> Key<MutableBoundedValue<E>> makeMutableBoundedValueKey(Class<E> elementType, DataQuery query, String id) { return makeMutableBoundedValueKey(TypeToken.of(elementType), query, id, query.last().toString()); } public static <E> Key<ImmutableBoundedValue<E>> makeImmutableBoundedValueKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<ImmutableBoundedValue<E>> valueToken = new TypeToken<ImmutableBoundedValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return KeyFactory.makeSingleKey(elementToken, valueToken, query, id, name); } public static <E> Key<ImmutableBoundedValue<E>> makeImmutableBoundedValueKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeImmutableBoundedValueKey(elementToken, query, id, query.last().toString()); } public static <E> Key<ImmutableBoundedValue<E>> makeImmutableBoundedValueKey(Class<E> elementType, DataQuery query, String id, String name) { return makeImmutableBoundedValueKey(elementType, query, id, name); } public static <E> Key<ImmutableBoundedValue<E>> makeImmutableBoundedValueKey(Class<E> elementType, DataQuery query, String id) { return makeImmutableBoundedValueKey(TypeToken.of(elementType), query, id, query.last().toString()); } public static <E, V extends BaseValue<E>> Key<V> makeSingleKey(TypeToken<E> elementToken, TypeToken<V> valueToken, DataQuery query, String id, String name) { return KeyFactory.makeSingleKey(elementToken, valueToken, query, id, name); } public static <E, V extends BaseValue<E>> Key<V> makeSingleKey(TypeToken<E> elementToken, TypeToken<V> valueToken, DataQuery query, String id) { return makeSingleKey(elementToken, valueToken, query, id, query.last().toString()); } public static <E, V extends BaseValue<E>> Key<V> makeSingleKey(Class<E> elementType, TypeToken<V> valueToken, DataQuery query, String id, String name) { return makeSingleKey(TypeToken.of(elementType), valueToken, query, id, name); } public static <E, V extends BaseValue<E>> Key<V> makeSingleKey(Class<E> elementType, TypeToken<V> valueToken, DataQuery query, String id) { return makeSingleKey(TypeToken.of(elementType), valueToken, query, id, query.last().toString()); } public static <E> Key<ListValue<E>> makeListKey(TypeToken<? extends List<E>> elementToken, TypeToken<ListValue<E>> valueToken, DataQuery query, String id, String name) { return KeyFactory.makeListKey(elementToken, valueToken, query, id, name); } public static <E> Key<ListValue<E>> makeListKey(TypeToken<? extends List<E>> elementToken, TypeToken<ListValue<E>> valueToken, DataQuery query, String id) { return makeListKey(elementToken, valueToken, query, id, query.last().toString()); } public static <E> Key<ListValue<E>> makeListKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<? extends List<E>> elementToken0 = new TypeToken<List<E>>() {} .where(new TypeParameter<E>() {}, elementToken); final TypeToken<ListValue<E>> valueToken = new TypeToken<ListValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return makeListKey(elementToken0, valueToken, query, id, name); } public static <E> Key<ListValue<E>> makeListKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeListKey(elementToken, query, id, query.last().toString()); } public static <E> Key<ListValue<E>> makeListKey(Class<E> elementType, DataQuery query, String id, String name) { return makeListKey(TypeToken.of(elementType), query, id, name); } public static <E> Key<ListValue<E>> makeListKey(Class<E> elementType, DataQuery query, String id) { return makeListKey(TypeToken.of(elementType), query, id, query.last().toString()); } public static Key<PatternListValue> makePatternListKey(DataQuery query, String id, String name) { final TypeToken<List<PatternLayer>> elementToken = new TypeToken<List<PatternLayer>>() {}; final TypeToken<PatternListValue> valueToken = new TypeToken<PatternListValue>() {}; return makeSingleKey(elementToken, valueToken, query, id, name); } public static Key<PatternListValue> makePatternListKey(DataQuery query, String id) { return makePatternListKey(query, id, query.last().toString()); } public static <E> Key<SetValue<E>> makeSetKey(TypeToken<? extends Set<E>> elementToken, TypeToken<SetValue<E>> valueToken, DataQuery query, String id, String name) { return KeyFactory.makeSetKey(elementToken, valueToken, query, id, name); } public static <E> Key<SetValue<E>> makeSetKey(TypeToken<? extends Set<E>> elementToken, TypeToken<SetValue<E>> valueToken, DataQuery query, String id) { return makeSetKey(elementToken, valueToken, query, id, query.last().toString()); } public static <E> Key<SetValue<E>> makeSetKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<? extends Set<E>> elementToken0 = new TypeToken<Set<E>>() {} .where(new TypeParameter<E>() {}, elementToken); final TypeToken<SetValue<E>> valueToken = new TypeToken<SetValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return makeSetKey(elementToken0, valueToken, query, id, name); } public static <E> Key<SetValue<E>> makeSetKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeSetKey(elementToken, query, id, query.last().toString()); } public static <E> Key<SetValue<E>> makeSetKey(Class<E> elementType, DataQuery query, String id, String name) { return makeSetKey(TypeToken.of(elementType), query, id, name); } public static <E> Key<SetValue<E>> makeSetKey(Class<E> elementType, DataQuery query, String id) { return makeSetKey(TypeToken.of(elementType), query, id, query.last().toString()); } public static <E> Key<OptionalValue<E>> makeOptionalKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<Optional<E>> elementToken0 = new TypeToken<Optional<E>>() {} .where(new TypeParameter<E>() {}, elementToken); final TypeToken<OptionalValue<E>> valueToken = new TypeToken<OptionalValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return KeyFactory.makeOptionalKey(elementToken0, valueToken, query, id, name); } public static <E> Key<OptionalValue<E>> makeOptionalKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeOptionalKey(elementToken, query, id, query.last().toString()); } public static <E> Key<OptionalValue<E>> makeOptionalKey(Class<E> elementType, DataQuery query, String id, String name) { return makeOptionalKey(TypeToken.of(elementType), query, id, name); } public static <E> Key<OptionalValue<E>> makeOptionalKey(Class<E> elementType, DataQuery query, String id) { return makeOptionalKey(TypeToken.of(elementType), query, id); } public static <K, V> Key<MapValue<K, V>> makeMapKey(TypeToken<Map<K, V>> elementToken, TypeToken<MapValue<K, V>> valueToken, DataQuery query, String id, String name) { return KeyFactory.makeMapKey(elementToken, valueToken, query, id, name); } public static <K, V> Key<MapValue<K, V>> makeMapKey(TypeToken<Map<K, V>> elementToken, TypeToken<MapValue<K, V>> valueToken, DataQuery query, String id) { return KeyFactory.makeMapKey(elementToken, valueToken, query, id, query.last().toString()); } public static <K, V> Key<MapValue<K, V>> makeMapKeyWithKeyAndValue(TypeToken<K> keyToken, TypeToken<V> valueToken, DataQuery query, String id, String name) { final TypeToken<Map<K, V>> elementToken = new TypeToken<Map<K, V>>() {} .where(new TypeParameter<K>() {}, keyToken) .where(new TypeParameter<V>() {}, valueToken); final TypeToken<MapValue<K, V>> valueToken0 = new TypeToken<MapValue<K, V>>() {} .where(new TypeParameter<K>() {}, keyToken) .where(new TypeParameter<V>() {}, valueToken); return makeMapKey(elementToken, valueToken0, query, id, name); } public static <K, V> Key<MapValue<K, V>> makeMapKeyWithKeyAndValue(TypeToken<K> keyToken, TypeToken<V> valueToken, DataQuery query, String id) { return makeMapKeyWithKeyAndValue(keyToken, valueToken, query, id, query.last().toString()); } public static <K, V> Key<MapValue<K, V>> makeMapKeyWithKeyAndValue(Class<K> keyType, Class<V> valueType, DataQuery query, String id, String name) { return makeMapKeyWithKeyAndValue(TypeToken.of(keyType), TypeToken.of(valueType), query, id, name); } public static <K, V> Key<MapValue<K, V>> makeMapKeyWithKeyAndValue(Class<K> keyType, Class<V> valueType, DataQuery query, String id) { return makeMapKeyWithKeyAndValue(TypeToken.of(keyType), TypeToken.of(valueType), query, id, query.last().toString()); } public static <E> Key<WeightedCollectionValue<E>> makeWeightedCollectionKey(TypeToken<E> elementToken, DataQuery query, String id, String name) { final TypeToken<WeightedTable<E>> elementToken0 = new TypeToken<WeightedTable<E>>() {} .where(new TypeParameter<E>() {}, elementToken); final TypeToken<WeightedCollectionValue<E>> valueToken = new TypeToken<WeightedCollectionValue<E>>() {} .where(new TypeParameter<E>() {}, elementToken); return makeSingleKey(elementToken0, valueToken, query, id, name); } public static <E> Key<WeightedCollectionValue<E>> makeWeightedCollectionKey(TypeToken<E> elementToken, DataQuery query, String id) { return makeWeightedCollectionKey(elementToken, query, id, query.last().toString()); } public static <E> Key<WeightedCollectionValue<E>> makeWeightedCollectionKey(Class<E> elementType, DataQuery query, String id) { return makeWeightedCollectionKey(TypeToken.of(elementType), query, id); } public static <E> Key<WeightedCollectionValue<E>> makeWeightedCollectionKey(Class<E> elementType, DataQuery query, String id, String name) { return makeWeightedCollectionKey(TypeToken.of(elementType), query, id, name); } public static Key<MobSpawnerData.NextEntityToSpawnValue> makeNextEntityToSpawnKey( DataQuery query, String id, String name) { final TypeToken<WeightedSerializableObject<EntitySnapshot>> elementToken = new TypeToken<WeightedSerializableObject<EntitySnapshot>>() {}; final TypeToken<MobSpawnerData.NextEntityToSpawnValue> valueToken = new TypeToken<MobSpawnerData.NextEntityToSpawnValue>() {}; return makeSingleKey(elementToken, valueToken, query, id, name); } public static Key<MobSpawnerData.NextEntityToSpawnValue> makeNextEntityToSpawnKey( DataQuery query, String id) { return makeNextEntityToSpawnKey(query, id, query.last().toString()); } private LanternKeyFactory() { } }