001
002/*
003 * Copyright (C) 2010 Archie L. Cobbs. All rights reserved.
004 *
005 * $Id$
006 */
007
008package org.dellroad.jibxbindings.pidf.lo;
009
010import org.jibx.runtime.JiBXParseException;
011
012/**
013 * The {@code <con:confidence>} element as defined in RFC 4119.
014 *
015 * @see <a href="https://datatracker.ietf.org/doc/draft-ietf-geopriv-uncertainty/?include_text=1">Representation of Uncertainty and Confidence in PIDF-LO</a>
016 */
017public class Confidence implements Cloneable {
018
019    public static final String UNKNOWN_VALUE = "unknown";
020
021    private ProbabilityDensityFunction probabilityDensityFunction = ProbabilityDensityFunction.UNKNOWN;
022    private float value = Float.NaN;
023
024    public Confidence() {
025    }
026
027    public Confidence(ProbabilityDensityFunction probabilityDensityFunction, float value) {
028        this.setProbabilityDensityFunction(probabilityDensityFunction);
029        this.setValue(value);
030    }
031
032    public ProbabilityDensityFunction getProbabilityDensityFunction() {
033        return this.probabilityDensityFunction;
034    }
035    public void setProbabilityDensityFunction(ProbabilityDensityFunction probabilityDensityFunction) {
036        this.probabilityDensityFunction = probabilityDensityFunction;
037    }
038
039    public float getValue() {
040        return this.value;
041    }
042    public void setValue(float value) {
043        this.value = value;
044    }
045
046// JiBX
047
048    public static String serializeConfidenceValue(float value) {
049        if (Float.isNaN(value) || Float.isInfinite(value))
050            return UNKNOWN_VALUE;
051        value = Math.min(Math.max(value, 0.0f), 100.0f);
052        return String.format("%.1f", value);
053    }
054
055    public static float deserializeConfidenceValue(String string) throws JiBXParseException {
056        if (string == null || (string = string.trim()).length() == 0 || string.equalsIgnoreCase(UNKNOWN_VALUE))
057            return Float.NaN;
058        float value;
059        try {
060            value = Float.parseFloat(string);
061        } catch (NumberFormatException e) {
062            throw new JiBXParseException("incorrectly formatted value", string, e);
063        }
064        value = Math.min(Math.max(value, 0.0f), 100.0f);
065        return value;
066    }
067
068// Cloneable
069
070    @Override
071    public Confidence clone() {
072        try {
073            return (Confidence)super.clone();
074        } catch (CloneNotSupportedException e) {
075            throw new RuntimeException(e);
076        }
077    }
078
079// ProbabilityDensityFunction
080
081    /**
082     * Indicates probability density function associated with a {@link Confidence} value.
083     */
084    public enum ProbabilityDensityFunction {
085        UNKNOWN("unknown"),
086        NORMAL("normal"),
087        RECTANGULAR("rectangular");
088
089        private final String xmlValue;
090
091        private ProbabilityDensityFunction(String xmlValue) {
092            this.xmlValue = xmlValue;
093        }
094
095        public final String getXMLValue() {
096            return this.xmlValue;
097        }
098    }
099}
100