/*
* 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.internal.xml.XmlUtil;
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 java.util.TreeSet;
import javax.xml.namespace.QName;
public class QNameSimpleValueFactory extends XmlSimpleValueFactory {
private final boolean _validating;
public QNameSimpleValueFactory( boolean validating ) {
_validating = validating;
}
@Override
public IType getGosuValueType() {
return JavaTypes.QNAME();
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
return new Value( (QName) gosuValue );
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
// if ( context.getNamespaces() == null ) {
// throw new XmlSimpleValueException( "Attempt to deserialize QName outside of a namespace context" );
// }
String[] parts = XmlUtil.splitQName( stringValue );
String namespaceURI = context.getNamespaces().get( parts[ 0 ] );
return new Value( new QName( namespaceURI, parts[ 1 ], parts[ 0 ] ) );
}
public class Value extends XmlSimpleValueBase {
private final QName _qname;
public Value( QName qname ) {
if ( _validating ) {
XmlUtil.validateQName(qname);
}
_qname = qname;
}
@Override
public IType getGosuValueType() {
return JavaTypes.QNAME();
}
@Override
public Object _getGosuValue() {
return _qname;
}
@Override
public String _getStringValue( boolean isEnumCode ) {
return isEnumCode ? _qname.getLocalPart() : _qname.toString();
}
@Override
public String _serialize( XmlSerializationContext context ) {
TreeSet<String> availablePrefixes = context.getNamespaceUriToPrefixMap().get( _qname.getNamespaceURI() );
return XmlUtil.qnameToString( availablePrefixes.iterator().next(), _qname.getLocalPart() );
}
@Override
public List<QName> _getQNames() {
return Collections.singletonList( _qname );
}
}
}