Search in sources :

Example 6 with Key

use of org.spongepowered.api.data.Key in project SpongeCommon by SpongePowered.

the class SlotData method getter.

// @formatter:on
private static <D> D getter(final Slot holder, final Key<Value<D>> key) {
    final Lens parentLens = ((InventoryBridge) holder.parent()).bridge$getAdapter().inventoryAdapter$getRootLens();
    final Lens childLens = ((InventoryBridge) holder).bridge$getAdapter().inventoryAdapter$getRootLens();
    final Map<Key<?>, Object> dataMap = parentLens.getDataFor(childLens);
    return (D) dataMap.get(key);
}
Also used : Lens(org.spongepowered.common.inventory.lens.Lens) Key(org.spongepowered.api.data.Key)

Example 7 with Key

use of org.spongepowered.api.data.Key in project SpongeCommon by SpongePowered.

the class DataProviderRegistrator method registerDataStoreDelegatingProvider.

public <H extends DataHolder, K, V extends Value<K>> void registerDataStoreDelegatingProvider(final Key<V> key, final Type typeToken) {
    // Create dataprovider for mutable and immutable DataContainerHolders
    if (GenericTypeReflector.isSuperType(DataProviderRegistrator.MUTABLE, typeToken)) {
        this.asMutable(GenericTypeReflector.erase(typeToken)).create(key).get(holder -> {
            final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
            return SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).deserialize(dataContainer).get(key).orElse(null);
        }).set((holder, v) -> {
            final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
            final DataManipulator.Mutable manipulator = DataManipulator.mutableOf();
            manipulator.set(key, v);
            SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).serialize(manipulator, dataContainer);
            ((DataContainerHolder.Mutable) holder).data$setDataContainer(dataContainer);
        });
    } else if (GenericTypeReflector.isSuperType(DataProviderRegistrator.IMMUTABLE, typeToken)) {
        this.asImmutable((Class<? super H>) GenericTypeReflector.erase(typeToken)).create(key).get(holder -> {
            final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
            return SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).deserialize(dataContainer).get(key).orElse(null);
        }).set((holder, v) -> {
            final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
            final DataManipulator.Mutable manipulator = DataManipulator.mutableOf();
            manipulator.set(key, v);
            SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).serialize(manipulator, dataContainer);
            return (H) ((DataContainerHolder.Immutable) holder).data$withDataContainer(dataContainer);
        });
    }
}
Also used : DataContainer(org.spongepowered.api.data.persistence.DataContainer) Arrays(java.util.Arrays) SpongeDataRegistrationBuilder(org.spongepowered.common.data.SpongeDataRegistrationBuilder) BiFunction(java.util.function.BiFunction) DataRegistration(org.spongepowered.api.data.DataRegistration) DataView(org.spongepowered.api.data.persistence.DataView) ImmutableDataProviderBuilder(org.spongepowered.api.data.ImmutableDataProviderBuilder) DataTransactionResult(org.spongepowered.api.data.DataTransactionResult) Function(java.util.function.Function) Supplier(java.util.function.Supplier) Value(org.spongepowered.api.data.value.Value) SpongeDataManager(org.spongepowered.common.data.SpongeDataManager) DataManipulator(org.spongepowered.api.data.DataManipulator) DataStore(org.spongepowered.api.data.persistence.DataStore) BiConsumer(java.util.function.BiConsumer) ResourceKey(org.spongepowered.api.ResourceKey) MutableDataProviderBuilder(org.spongepowered.api.data.MutableDataProviderBuilder) DataContainerHolder(org.spongepowered.common.bridge.data.DataContainerHolder) Nullable(org.checkerframework.checker.nullness.qual.Nullable) SpongeDataStoreBuilder(org.spongepowered.common.data.persistence.datastore.SpongeDataStoreBuilder) DataContentUpdater(org.spongepowered.api.data.persistence.DataContentUpdater) SpongeDataRegistration(org.spongepowered.common.data.SpongeDataRegistration) DefaultedRegistryReference(org.spongepowered.api.registry.DefaultedRegistryReference) TypeTokenUtil(org.spongepowered.common.util.TypeTokenUtil) DataProvider(org.spongepowered.api.data.DataProvider) Sponge(org.spongepowered.api.Sponge) DataHolder(org.spongepowered.api.data.DataHolder) TypeToken(io.leangen.geantyref.TypeToken) Key(org.spongepowered.api.data.Key) Consumer(java.util.function.Consumer) CopyHelper(org.spongepowered.common.util.CopyHelper) Type(java.lang.reflect.Type) Optional(java.util.Optional) OptBool(org.spongepowered.api.util.OptBool) GenericTypeReflector(io.leangen.geantyref.GenericTypeReflector) DataContainer(org.spongepowered.api.data.persistence.DataContainer) DataContainerHolder(org.spongepowered.common.bridge.data.DataContainerHolder) DataManipulator(org.spongepowered.api.data.DataManipulator)

Example 8 with Key

use of org.spongepowered.api.data.Key in project SpongeCommon by SpongePowered.

the class DataProviderRegistrator method spongeDataStore.

public void spongeDataStore(final ResourceKey datastoreKey, final int version, final DataContentUpdater[] contentUpdater, final Class dataHolder, final Key<? extends Value<?>>... dataKeys) {
    final SpongeDataStoreBuilder builder = ((SpongeDataStoreBuilder) DataStore.builder()).pluginData(datastoreKey, version);
    builder.updater(contentUpdater);
    builder.holder(dataHolder);
    for (Key dataKey : dataKeys) {
        builder.key(dataKey, dataKey.key().value());
    }
    SpongeDataManager.getDatastoreRegistry().register(builder.build(), Arrays.asList(dataKeys));
}
Also used : SpongeDataStoreBuilder(org.spongepowered.common.data.persistence.datastore.SpongeDataStoreBuilder) ResourceKey(org.spongepowered.api.ResourceKey) Key(org.spongepowered.api.data.Key)

Example 9 with Key

use of org.spongepowered.api.data.Key in project SpongeCommon by SpongePowered.

the class SpongeFluidStackSnapshotBuilder method build.

@Override
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public FluidStackSnapshot build() {
    if (this.fluidType == null) {
        throw new IllegalStateException("FluidType cannot be null!");
    }
    if (this.volume < 0) {
        throw new IllegalStateException("The fluid volume must be at least 0!");
    }
    final SpongeFluidStackSnapshot snapshot = new SpongeFluidStackSnapshot(this);
    if (this.keyValues != null) {
        final FluidStack stack = snapshot.createStack();
        this.keyValues.forEach((k, v) -> stack.offer((Key) k, v));
        return stack.createSnapshot();
    }
    return snapshot;
}
Also used : FluidStack(org.spongepowered.api.fluid.FluidStack) Key(org.spongepowered.api.data.Key) ResourceKey(org.spongepowered.api.ResourceKey)

Example 10 with Key

use of org.spongepowered.api.data.Key in project SpongeCommon by SpongePowered.

the class SpongeDataStoreBuilder method getDeserializer.

@SuppressWarnings({ "rawtypes", "unchecked" })
public <T> BiFunction<DataView, DataQuery, Optional<T>> getDeserializer(final Type elementType) {
    final Class<?> rawType = GenericTypeReflector.erase(elementType);
    if (DataView.class.isAssignableFrom(rawType)) {
        return (view, dataQuery) -> (Optional<T>) view.getView(dataQuery);
    }
    if (DataSerializable.class.isAssignableFrom(rawType)) {
        return (view, dataQuery) -> (Optional<T>) view.getSerializable(dataQuery, (Class<? extends DataSerializable>) rawType);
    }
    final Optional<RegistryType<Object>> registryTypeForValue = SpongeDataManager.INSTANCE.findRegistryTypeFor(rawType);
    if (registryTypeForValue.isPresent()) {
        return (view, dataQuery) -> (Optional<T>) registryTypeForValue.flatMap(regType -> view.getRegistryValue(dataQuery, regType));
    }
    if (ResourceKey.class.isAssignableFrom(rawType)) {
        return (view, dataQuery) -> (Optional<T>) view.getString(dataQuery).map(ResourceKey::resolve);
    }
    if (Sponge.game().dataManager().translator(rawType).isPresent()) {
        return (view, dataQuery) -> (Optional<T>) view.getObject(dataQuery, rawType);
    }
    if (Set.class.isAssignableFrom(rawType)) {
        final Type listType = ((ParameterizedType) elementType).getActualTypeArguments()[0];
        return (view, dataQuery) -> (Optional<T>) SpongeDataStoreBuilder.deserializeList((Class<?>) listType, view, dataQuery).map(list -> new HashSet(list));
    }
    if (List.class.isAssignableFrom(rawType)) {
        final Type listType = ((ParameterizedType) elementType).getActualTypeArguments()[0];
        return (view, dataQuery) -> (Optional<T>) SpongeDataStoreBuilder.deserializeList((Class<?>) listType, view, dataQuery);
    }
    if (Collection.class.isAssignableFrom(rawType)) {
        throw new UnsupportedOperationException("Collection deserialization is not supported. Provide the deserializer for it.");
    }
    if (Types.isArray(elementType)) {
        final Class arrayType = GenericTypeReflector.erase(GenericTypeReflector.getArrayComponentType(elementType));
        return (view, dataQuery) -> (Optional<T>) SpongeDataStoreBuilder.deserializeList((Class<?>) arrayType, view, dataQuery).map(list -> this.listToArray(arrayType, list));
    }
    if (Map.class.isAssignableFrom(rawType)) {
        final Type[] parameterTypes = ((ParameterizedType) elementType).getActualTypeArguments();
        final Type keyType = parameterTypes[0];
        final Type valueType = parameterTypes[1];
        if (!(keyType instanceof Class)) {
            throw new UnsupportedOperationException("Unsupported map-key type " + keyType);
        }
        final Function<DataQuery, Optional<?>> keyDeserializer;
        final Optional<RegistryType<Object>> registryTypeForKey = SpongeDataManager.INSTANCE.findRegistryTypeFor((Class) keyType);
        if (registryTypeForKey.isPresent()) {
            keyDeserializer = key -> registryTypeForKey.flatMap(regType -> Sponge.game().findRegistry(regType)).flatMap(r -> r.findValue(ResourceKey.resolve(key.toString())));
        } else if (((Class<?>) keyType).isEnum()) {
            keyDeserializer = key -> Optional.ofNullable(Enum.valueOf(((Class<? extends Enum>) keyType), key.toString()));
        } else if (keyType == String.class) {
            keyDeserializer = key -> Optional.of(key.toString());
        } else if (keyType == UUID.class) {
            keyDeserializer = key -> Optional.of(UUID.fromString(key.toString()));
        } else if (keyType == ResourceKey.class) {
            keyDeserializer = key -> Optional.of(ResourceKey.resolve(key.toString()));
        } else {
            throw new UnsupportedOperationException("Unsupported map-key type " + keyType);
        }
        final BiFunction<DataView, DataQuery, Optional<Object>> valueDeserializer = this.getDeserializer(valueType);
        return (view, dataQuery) -> (Optional<T>) view.getView(dataQuery).map(mapView -> {
            final Map<Object, Object> resultMap = new HashMap<>();
            for (final DataQuery key : mapView.keys(false)) {
                final Object mapKey = keyDeserializer.apply(key).orElseThrow(() -> new UnsupportedOperationException("Key not found " + key + " as " + keyType));
                final Optional<?> mapValue = valueDeserializer.apply(mapView, key);
                resultMap.put(mapKey, mapValue.get());
            }
            return resultMap;
        });
    }
    return (view, dataQuery) -> (Optional<T>) view.get(dataQuery);
}
Also used : DataContainer(org.spongepowered.api.data.persistence.DataContainer) Array(java.lang.reflect.Array) BiFunction(java.util.function.BiFunction) HashMap(java.util.HashMap) DataView(org.spongepowered.api.data.persistence.DataView) Function(java.util.function.Function) Value(org.spongepowered.api.data.value.Value) SpongeDataManager(org.spongepowered.common.data.SpongeDataManager) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) DataStore(org.spongepowered.api.data.persistence.DataStore) ImmutableList(com.google.common.collect.ImmutableList) DataQuery(org.spongepowered.api.data.persistence.DataQuery) Map(java.util.Map) BiConsumer(java.util.function.BiConsumer) ResourceKey(org.spongepowered.api.ResourceKey) Nullable(org.checkerframework.checker.nullness.qual.Nullable) DataContentUpdater(org.spongepowered.api.data.persistence.DataContentUpdater) Types(org.spongepowered.configurate.util.Types) IdentityHashMap(java.util.IdentityHashMap) DataSerializable(org.spongepowered.api.data.persistence.DataSerializable) ImmutableMap(com.google.common.collect.ImmutableMap) Collection(java.util.Collection) Sponge(org.spongepowered.api.Sponge) Set(java.util.Set) DataHolder(org.spongepowered.api.data.DataHolder) RegistryType(org.spongepowered.api.registry.RegistryType) Tuple(org.spongepowered.api.util.Tuple) UUID(java.util.UUID) TypeToken(io.leangen.geantyref.TypeToken) DataUtil(org.spongepowered.common.data.DataUtil) Key(org.spongepowered.api.data.Key) List(java.util.List) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) Optional(java.util.Optional) GenericTypeReflector(io.leangen.geantyref.GenericTypeReflector) Collections(java.util.Collections) Optional(java.util.Optional) RegistryType(org.spongepowered.api.registry.RegistryType) DataSerializable(org.spongepowered.api.data.persistence.DataSerializable) ParameterizedType(java.lang.reflect.ParameterizedType) DataView(org.spongepowered.api.data.persistence.DataView) RegistryType(org.spongepowered.api.registry.RegistryType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) DataQuery(org.spongepowered.api.data.persistence.DataQuery) UUID(java.util.UUID) HashMap(java.util.HashMap) Map(java.util.Map) IdentityHashMap(java.util.IdentityHashMap) ImmutableMap(com.google.common.collect.ImmutableMap) HashSet(java.util.HashSet)

Aggregations

Key (org.spongepowered.api.data.Key)13 ResourceKey (org.spongepowered.api.ResourceKey)5 Value (org.spongepowered.api.data.value.Value)5 List (java.util.List)4 Map (java.util.Map)4 GenericTypeReflector (io.leangen.geantyref.GenericTypeReflector)3 TypeToken (io.leangen.geantyref.TypeToken)3 Field (java.lang.reflect.Field)3 Type (java.lang.reflect.Type)3 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 Optional (java.util.Optional)3 BiConsumer (java.util.function.BiConsumer)3 Nullable (org.checkerframework.checker.nullness.qual.Nullable)3 Label (org.objectweb.asm.Label)3 DataView (org.spongepowered.api.data.persistence.DataView)3 ValueContainer (org.spongepowered.api.data.value.ValueContainer)3 Tuple (org.spongepowered.api.util.Tuple)3 ImmutableList (com.google.common.collect.ImmutableList)2 ParameterizedType (java.lang.reflect.ParameterizedType)2