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