Search in sources :

Example 6 with DataQuery

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

the class JsonDataFormat method readView.

private static void readView(JsonReader reader, DataView view) throws IOException {
    reader.beginObject();
    while (reader.hasNext()) {
        DataQuery key = of(reader.nextName());
        if (reader.peek() == JsonToken.BEGIN_OBJECT) {
            // Check this early so we don't need to copy the view
            final DataView subView = view.createView(key);
            JsonDataFormat.readView(reader, subView);
            // handle special array types
            subView.getString(DataQuery.of(ARRAYTYPE)).ifPresent(type -> {
                view.remove(key);
                view.set(key, JsonDataFormat.readArray(type, subView));
            });
        } else {
            view.set(key, JsonDataFormat.read(reader));
        }
    }
    reader.endObject();
}
Also used : DataView(org.spongepowered.api.data.persistence.DataView) DataQuery(org.spongepowered.api.data.persistence.DataQuery)

Example 7 with DataQuery

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

the class SpongeDataStoreBuilder method key.

@Override
@SuppressWarnings("rawtypes")
public <T, V extends Value<T>> SpongeDataStoreBuilder key(final Key<V> key, final BiConsumer<DataView, T> serializer, final Function<DataView, Optional<T>> deserializer) {
    if (this.key != null) {
        final DataQuery query = DataQuery.of(this.key.namespace(), this.key.value());
        final SpongeDataSerializer<T> customSerializer = new SpongeDataSerializer<>(serializer, this.version, query);
        final SpongeDataDeserializer<T> customDeserializer = new SpongeDataDeserializer<>(deserializer, this.version, query);
        this.serializers.put(key, (Tuple) Tuple.of(customSerializer, customDeserializer));
    } else {
        this.serializers.put(key, (Tuple) Tuple.of(serializer, deserializer));
    }
    return this;
}
Also used : DataQuery(org.spongepowered.api.data.persistence.DataQuery)

Example 8 with DataQuery

use of org.spongepowered.api.data.persistence.DataQuery 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)

Example 9 with DataQuery

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

the class NBTTranslator method containerToCompound.

private static void containerToCompound(final DataView container, final CompoundTag compound) {
    // We don't need to get deep values since all nested DataViews will be found
    // from the instance of checks.
    checkNotNull(container);
    checkNotNull(compound);
    for (Map.Entry<DataQuery, Object> entry : container.values(false).entrySet()) {
        Object value = entry.getValue();
        String key = entry.getKey().asString('.');
        if (value instanceof DataView) {
            CompoundTag inner = new CompoundTag();
            NBTTranslator.containerToCompound(container.getView(entry.getKey()).get(), inner);
            compound.put(key, inner);
        } else if (value instanceof Boolean) {
            compound.put(key + NBTTranslator.BOOLEAN_IDENTIFIER, ByteTag.valueOf((Boolean) value));
        } else {
            compound.put(key, NBTTranslator.getBaseFromObject(value));
        }
    }
}
Also used : DataView(org.spongepowered.api.data.persistence.DataView) DataQuery(org.spongepowered.api.data.persistence.DataQuery) Map(java.util.Map) CompoundTag(net.minecraft.nbt.CompoundTag)

Example 10 with DataQuery

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

the class MapTest method blankMapDecorationIds.

private DataView blankMapDecorationIds(final DataView dataView) {
    // Blank changes to id since we always change when serializing them to stop conflicts.
    final DataQuery decorations = DataQuery.of("MapData", "Decorations");
    final List<DataView> newData = dataView.getViewList(decorations).get();
    newData.replaceAll(dataView1 -> dataView1.set(DataQuery.of("id"), "fakeid"));
    dataView.set(decorations, newData);
    return dataView;
}
Also used : DataView(org.spongepowered.api.data.persistence.DataView) DataQuery(org.spongepowered.api.data.persistence.DataQuery)

Aggregations

DataQuery (org.spongepowered.api.data.persistence.DataQuery)20 DataView (org.spongepowered.api.data.persistence.DataView)15 ResourceKey (org.spongepowered.api.ResourceKey)6 InvalidDataException (org.spongepowered.api.data.persistence.InvalidDataException)6 CompoundTag (net.minecraft.nbt.CompoundTag)5 DataContainer (org.spongepowered.api.data.persistence.DataContainer)5 ArrayList (java.util.ArrayList)4 HashSet (java.util.HashSet)4 List (java.util.List)3 Map (java.util.Map)3 Optional (java.util.Optional)3 Nullable (org.checkerframework.checker.nullness.qual.Nullable)3 Biome (org.spongepowered.api.world.biome.Biome)3 Vector3i (org.spongepowered.math.vector.Vector3i)3 ImmutableMap (com.google.common.collect.ImmutableMap)2 TypeToken (io.leangen.geantyref.TypeToken)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 IOException (java.io.IOException)2 Collection (java.util.Collection)2 Set (java.util.Set)2