001/*
002 *  Units of Measurement Jackson Library for JSON support
003 *  Copyright (c) 2012-2019, Werner Keil and others
004 *
005 * All rights reserved.
006 *
007 * Redistribution and use in source and binary forms, with or without modification,
008 * are permitted provided that the following conditions are met:
009 *
010 * 1. Redistributions of source code must retain the above copyright notice,
011 *    this list of conditions and the following disclaimer.
012 *
013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
014 *    and the following disclaimer in the documentation and/or other materials provided with the distribution.
015 *
016 * 3. Neither the name of JSR-385, Units of Measurement nor the names of their contributors may be used to endorse or promote products
017 *    derived from this software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package tech.uom.lib.jackson;
031
032import com.fasterxml.jackson.core.JsonParser;
033import com.fasterxml.jackson.core.JsonProcessingException;
034import com.fasterxml.jackson.databind.DeserializationContext;
035import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
036import java.io.IOException;
037import java.util.HashMap;
038import java.util.Map;
039import java.util.stream.Collectors;
040import javax.measure.Dimension;
041import tech.units.indriya.unit.UnitDimension;
042
043/**
044 * @author richter
045 * @author keilw
046 */
047public class DimensionJsonDeserializer extends StdScalarDeserializer<Dimension> {
048
049    /**
050     *
051     */
052    private static final long serialVersionUID = 1L;
053
054    public DimensionJsonDeserializer() {
055        super(Dimension.class);
056    }
057
058    @Override
059    public Dimension deserialize(JsonParser p, DeserializationContext ctxt)
060            throws IOException, JsonProcessingException {
061        @SuppressWarnings("unchecked")
062                Map<String, Integer> baseDimensionsStrings = p.readValueAs(Map.class);
063        Map<Dimension, Integer> baseDimensions = new HashMap<>(baseDimensionsStrings.entrySet().stream()
064                .collect(Collectors.toMap(entry -> parseBaseDimension(entry.getKey()), entry -> entry.getValue())));
065        Dimension retValue = UnitDimension.NONE;
066        for (Dimension baseDimension : baseDimensions.keySet()) {
067            int exp = baseDimensions.get(baseDimension);
068            retValue = retValue.multiply(baseDimension.pow(exp));
069        }
070        return retValue;
071    }
072
073    private static Dimension parseBaseDimension(String symbol) {
074        switch (symbol) {
075            case "[N]":
076                return UnitDimension.AMOUNT_OF_SUBSTANCE;
077            case "[I]":
078                return UnitDimension.ELECTRIC_CURRENT;
079            case "[L]":
080                return UnitDimension.LENGTH;
081            case "[J]":
082                return UnitDimension.LUMINOUS_INTENSITY;
083            case "[M]":
084                return UnitDimension.MASS;
085            case "[\u0398]":
086                return UnitDimension.TEMPERATURE;
087            case "[T]":
088                return UnitDimension.TIME;
089            default:
090                throw new IllegalArgumentException(String.format(
091                        "dimension " + "symbol '%s' not supported, maybe dimensionless or " + "wrong universe?", symbol));
092        }
093    }
094}