All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.dronesecurity.userapplication.infrastructure.user.serializers.UserDeserializer Maven / Gradle / Ivy

/*
 * Copyright (c) 2021-2022, Mirko Felice & Maxim Derevyanchenko. All rights reserved.
 * Licensed under the MIT license. See LICENSE file in the project root for details.
 */

package io.github.dronesecurity.userapplication.infrastructure.user.serializers;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.github.dronesecurity.userapplication.domain.user.entities.contracts.Role;
import io.github.dronesecurity.userapplication.domain.user.entities.contracts.User;
import io.github.dronesecurity.userapplication.domain.user.entities.impl.CourierImpl;
import io.github.dronesecurity.userapplication.domain.user.entities.impl.MaintainerImpl;
import io.github.dronesecurity.userapplication.domain.user.objects.Username;
import io.github.dronesecurity.userapplication.infrastructure.user.UserConstants;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.util.List;

/**
 * Deserialize Json into {@link User}.
 */
public final class UserDeserializer extends JsonDeserializer {

    /**
     * {@inheritDoc}
     */
    @Contract("_, _ -> new")
    @Override
    public @NotNull User deserialize(final @NotNull JsonParser parser, final @NotNull DeserializationContext ctx)
            throws IOException {
        final ObjectMapper mapper = (ObjectMapper) parser.getCodec();
        final ObjectNode root = mapper.readTree(parser);
        final Role role = Role.valueOf(root.get(UserConstants.ROLE).asText());
        final Username username = Username.parse(root.get(UserConstants.USERNAME).asText());
        switch (role) {
            case COURIER:
                final List drones =
                        mapper.readValue(root.get(UserConstants.DRONES).toString(), new ListTypeReference());
                return new CourierImpl(username, Username.parse(root.get(UserConstants.SUPERVISOR).asText()), drones);
            case MAINTAINER:
                return new MaintainerImpl(username);
            default:
                throw new IllegalStateException("Unexpected value: " + role);
        }
    }

    /**
     * {@link TypeReference} to deserialize into a {@code List}.
     */
    private static class ListTypeReference extends TypeReference> { }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy