/*
* 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.IEnumType;
import gw.lang.reflect.IEnumValue;
import gw.lang.reflect.IType;
import gw.xml.XmlSimpleValue;
import gw.xml.XmlSimpleValueException;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
public class GosuEnumSimpleValueFactory extends XmlSimpleValueFactory {
private final IEnumType _enumType;
public GosuEnumSimpleValueFactory( IEnumType enumType ) {
_enumType = enumType;
}
@Override
public IType getGosuValueType() {
return _enumType;
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
for ( IEnumValue enumValue : _enumType.getEnumValues() ) {
if ( enumValue.getValue().equals(gosuValue) ) {
return new Value( enumValue );
}
}
throw new IllegalStateException( "Enum value not found for type " + _enumType + ": " + gosuValue );
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
IEnumValue value = _enumType.getEnumValue( stringValue );
if ( value == null ) {
throw new XmlSimpleValueException( "Enum constant not found with name '" + stringValue + "'" );
}
return new Value(value);
}
private class Value extends XmlSimpleValueBase {
private final IEnumValue _value;
public Value( IEnumValue value ) {
_value = value;
}
@Override
public IType getGosuValueType() {
return GosuEnumSimpleValueFactory.this.getGosuValueType();
}
@Override
public Object _getGosuValue() {
return _value.getValue();
}
@Override
public String _getStringValue( boolean isEnumCode ) {
return _value.getCode();
}
@Override
public String _serialize( XmlSerializationContext context ) {
return _value.getCode();
}
@Override
public List<QName> _getQNames() {
return Collections.emptyList();
}
}
}