/*
* 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.JavaTypes;
import gw.xml.XmlSimpleValue;
import java.math.BigInteger;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
public class UnsignedLongSimpleValueFactory extends XmlSimpleValueFactory {
private static final BigInteger LONG_MAX_VALUE = new BigInteger( String.valueOf( Long.MAX_VALUE ) ).multiply( new BigInteger( "2" ) ).add( BigInteger.ONE );
@Override
public IType getGosuValueType() {
return JavaTypes.BIG_INTEGER();
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
return new Value( (BigInteger) gosuValue );
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
return new Value( new BigInteger( stringValue ) );
}
private void checkRange( BigInteger gosuValue ) {
if ( gosuValue.compareTo( BigInteger.ZERO ) < 0 || gosuValue.compareTo( LONG_MAX_VALUE ) > 0 ) {
throw new NumberFormatException( "Unsigned long value " + gosuValue + " is out of range" );
}
}
private class Value extends XmlSimpleValueBase {
private final BigInteger _gosuValue;
public Value( BigInteger gosuValue ) {
checkRange( gosuValue );
_gosuValue = gosuValue;
}
@Override
public IType getGosuValueType() {
return UnsignedLongSimpleValueFactory.this.getGosuValueType();
}
@Override
public BigInteger _getGosuValue() {
return _gosuValue;
}
public String _getStringValue( boolean isEnumCode ) {
return String.valueOf( _gosuValue );
}
@Override
public String _serialize( XmlSerializationContext context ) {
return String.valueOf( _gosuValue );
}
@Override
public List<QName> _getQNames() {
return Collections.emptyList();
}
}
}