/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.ws.server.marshal;
import gw.internal.schema.gw.xsd.w3c.xmlschema.types.complex.LocalElement;
import gw.internal.xml.XmlDeserializationContext;
import gw.internal.xml.ws.server.WsiServiceInfo;
import gw.internal.xml.xsd.typeprovider.simplevaluefactory.XmlSimpleValueFactory;
import gw.lang.reflect.IType;
import gw.xml.XmlElement;
import gw.xml.XmlSchemaAccess;
import java.math.BigInteger;
import java.util.Map;
import javax.xml.namespace.QName;
import java.util.Set;
public class SimpleValueMarshalInfo extends MarshalInfo {
private final QName _qname;
private final XmlSimpleValueFactory _valueFactory;
private final String _gwType;
private boolean _isComponent;
public SimpleValueMarshalInfo( IType type, QName qname, XmlSimpleValueFactory valueFactory, String gwType, boolean isComponent ) {
super( type );
_qname = qname;
_valueFactory = valueFactory;
_gwType = gwType;
_isComponent = isComponent;
}
@Override
public Map<String,Set<XmlSchemaAccess>> getAllSchemas() {
return null;
}
@Override
public void addType( LocalElement element, WsiServiceInfo createInfo ) throws Exception {
element.setType$( _qname );
if ( _gwType != null ) {
element.setAttributeValue(GW_TYPE_QNAME, _gwType );
}
if ( ! getType().isPrimitive() ) {
if ( _isComponent ) {
element.setNillable$( true );
}
else {
element.setMinOccurs$( BigInteger.ZERO );
}
}
}
@Override
public Object unmarshal(XmlElement componentElement, UnmarshalContext context) {
final XmlDeserializationContext dc = new XmlDeserializationContext( null );
for ( Map.Entry<String, String> entry : componentElement.getNamespaceContext().entrySet() ) {
dc.addNamespace( entry.getKey(), entry.getValue() );
}
return _valueFactory.deserialize( dc, componentElement.getText(), false ).getGosuValue();
}
@Override
public void marshal(XmlElement parameterElement, IType type, Object obj, MarshalContext context) {
parameterElement.setSimpleValue( _valueFactory.gosuValueToStorageValue( obj ) );
}
}