/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.xsd.typeprovider.simplevaluefactory;
import gw.internal.xml.XmlDeserializationContext;
import gw.internal.xml.XmlSerializationContext;
import gw.internal.xml.XmlSimpleValueBase;
import gw.lang.reflect.IType;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.JavaTypes;
import gw.lang.reflect.java.JavaTypes;
import gw.xml.XmlSimpleValue;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
public class DoubleSimpleValueFactory extends XmlSimpleValueFactory {
@Override
public IType getGosuValueType() {
return JavaTypes.DOUBLE();
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
return new Value( (Double) gosuValue );
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
return new Value( stringValueToGosuValue( stringValue ) );
}
private static double stringValueToGosuValue( String stringValue ) {
return parseDouble( stringValue );
}
public static double parseDouble( String stringValue ) {
double gosuValue;
if ( stringValue.equals( "INF" ) || stringValue.equals( "+INF" ) ) {
gosuValue = Double.POSITIVE_INFINITY;
}
else if ( stringValue.equals( "-INF" ) ) {
gosuValue = Double.NEGATIVE_INFINITY;
}
else {
gosuValue = Double.parseDouble( stringValue );
if ( gosuValue == Double.POSITIVE_INFINITY || gosuValue == Double.NEGATIVE_INFINITY ) {
throw new NumberFormatException( stringValue );
}
}
return gosuValue;
}
private static String gosuValueToStringValue( double gosuValue ) {
String stringValue;
if ( gosuValue == Double.POSITIVE_INFINITY ) {
stringValue = "INF";
}
else if ( gosuValue == Double.NEGATIVE_INFINITY ) {
stringValue = "-INF";
}
else {
stringValue = String.valueOf( gosuValue );
}
return stringValue;
}
private class Value extends XmlSimpleValueBase {
private final double _gosuValue;
public Value( double gosuValue ) {
_gosuValue = gosuValue;
}
@Override
public IType getGosuValueType() {
return DoubleSimpleValueFactory.this.getGosuValueType();
}
@Override
public Double _getGosuValue() {
return _gosuValue;
}
public String _getStringValue( boolean isEnumCode ) {
return gosuValueToStringValue( _gosuValue );
}
@Override
public String _serialize( XmlSerializationContext context ) {
return gosuValueToStringValue( _gosuValue );
}
@Override
public List<QName> _getQNames() {
return Collections.emptyList();
}
}
}