/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.xml.ws.server.marshal; import gw.internal.schema.gw.xsd.w3c.xmlschema.Sequence; import gw.internal.schema.gw.xsd.w3c.xmlschema.anonymous.elements.ExplicitGroup_Element; import gw.internal.schema.gw.xsd.w3c.xmlschema.anonymous.elements.LocalElement_ComplexType; import gw.internal.schema.gw.xsd.w3c.xmlschema.types.complex.LocalElement; import gw.internal.xml.config.XmlServices; import gw.internal.xml.ws.server.WsiServiceInfo; import gw.internal.xml.xsd.typeprovider.schemaparser.XmlSchemaParser; 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.XmlElement; import gw.xml.XmlSchemaAccess; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; public class ListMarshalInfo extends MarshalInfo { private final MarshalInfo _componentMarshalInfo; private final IType _componentType; private final boolean _isComponent; public ListMarshalInfo( IType componentType, MarshalInfo componentMarshalInfo, boolean isComponent ) { super( JavaTypes.LIST().getParameterizedType( componentType ) ); _componentMarshalInfo = componentMarshalInfo; _componentType = componentType; _isComponent = isComponent; } @Override public void addType( LocalElement element, WsiServiceInfo createInfo ) throws Exception { if ( _isComponent ) { element.setNillable$( true ); } else { element.setMinOccurs$( BigInteger.ZERO ); } element.setAttributeValue( XmlSchemaParser.VIEWAS_ATTRIBUTE_NAME, XmlSchemaParser.VIEWAS_LIST ); ExplicitGroup_Element entryElement = new ExplicitGroup_Element(); entryElement.setMinOccurs$( BigInteger.ZERO ); entryElement.setMaxOccurs$( "unbounded" ); element.setComplexType$$gw_xsd_w3c_xmlschema_types_complex_LocalElement$( new LocalElement_ComplexType() ); element.ComplexType$$gw_xsd_w3c_xmlschema_types_complex_LocalElement().setSequence$( new Sequence() ); element.ComplexType$$gw_xsd_w3c_xmlschema_types_complex_LocalElement().Sequence().Element().add( entryElement ); element.ComplexType$$gw_xsd_w3c_xmlschema_types_complex_LocalElement().Sequence().Element().get( 0 ).setName$( "Entry" ); _componentMarshalInfo.addType( entryElement.getTypeInstance(), createInfo ); } @Override public Map<String,Set<XmlSchemaAccess>> getAllSchemas() { return _componentMarshalInfo.getAllSchemas(); } public MarshalInfo getComponentMarshalInfo() { return _componentMarshalInfo; } public IType getComponentType() { return _componentType; } @Override public Object unmarshal(XmlElement componentElement, UnmarshalContext context) { ArrayList<Object> list = new ArrayList<Object>(); for ( XmlElement child : componentElement.getChildren() ) { if ( child.isNil() ) { list.add( null ); } else { list.add( XmlServices.unmarshal( _componentType, child, context) ); } } return list; } @Override public void marshal(XmlElement parameterElement, IType type, Object obj, MarshalContext context) { @SuppressWarnings( {"unchecked"} ) List<Object> list = (List<Object>) obj; for ( Object child : list ) { XmlElement childElement = new XmlElement( parameterElement.getNamespace().qualify( "Entry" ) ); parameterElement.addChild( childElement ); if ( child == null ) { childElement.setNil( true ); } else { XmlServices.marshal( childElement, _componentType, child, context); } } } }