/* * 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.ws.server.WsiServiceInfo; import gw.internal.xml.xsd.typeprovider.IXmlSchemaTypeData; import gw.internal.xml.xsd.typeprovider.IXmlType; import gw.internal.xml.xsd.typeprovider.XmlSchemaIndex; import gw.internal.xml.xsd.typeprovider.XmlSchemaResourceTypeLoaderBase; import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaObject; import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaType; import gw.lang.reflect.IType; import gw.xml.XmlElement; import gw.xml.XmlSchemaAccess; import gw.xml.XmlTypeInstance; import java.math.BigInteger; import java.util.*; import javax.xml.namespace.QName; public class XmlTypeInstanceMarshalInfo extends MarshalInfo { private boolean _isComponent; public XmlTypeInstanceMarshalInfo( IType type, boolean isComponent ) { super( type ); _isComponent = isComponent; } @Override public Map<String, Set<XmlSchemaAccess>> getAllSchemas() { IXmlType xmlType = (IXmlType) getType(); IXmlSchemaTypeData typedata = (IXmlSchemaTypeData) xmlType.getTypeData(); final XmlSchemaObject xmlSchemaObject = typedata.getSchemaObject(); final XmlSchemaIndex<?> schemaIndex = xmlSchemaObject.getSchemaIndex(); Map<String,Set<XmlSchemaAccess>> rtn = new LinkedHashMap<String, Set<XmlSchemaAccess>>(); for ( Map.Entry<String, LinkedHashSet<String>> entry : schemaIndex.getGosuNamespacesByXmlNamespace().entrySet() ) { Set<String> gosuNamespaces = entry.getValue(); for ( String gosuNamespace : gosuNamespaces ) { XmlSchemaIndex targetSchema = XmlSchemaResourceTypeLoaderBase.findSchemaForNamespace(schemaIndex.getTypeLoader().getModule(), gosuNamespace); Set<XmlSchemaAccess> xmlSchemaAccesses = rtn.get( entry.getKey() ); if ( xmlSchemaAccesses == null ) { xmlSchemaAccesses = new LinkedHashSet<XmlSchemaAccess>(); rtn.put( entry.getKey(), xmlSchemaAccesses ); } xmlSchemaAccesses.add( targetSchema.getXmlSchemaAccess() ); } } return rtn; } @Override public void addType( LocalElement element, WsiServiceInfo createInfo ) throws Exception { if ( _isComponent ) { element.setNillable$( true ); } else { element.setMinOccurs$( BigInteger.ZERO ); } IXmlType xmlType = (IXmlType) getType(); IXmlSchemaTypeData typedata = (IXmlSchemaTypeData) xmlType.getTypeData(); XmlSchemaType schemaType = (XmlSchemaType) typedata.getSchemaObject(); String namespace = schemaType.getSchemaIndex().getTargetNamespaceAsDeclaredInSchema(); QName qname = schemaType.getQName(); XmlMarshaller.findOrImportSchema( schemaType.getSchemaIndex(), createInfo, qname.getNamespaceURI() ); element.setType$( qname ); } @Override public Object unmarshal(XmlElement componentElement, UnmarshalContext context) { return componentElement.getTypeInstance(); } @Override public void marshal(XmlElement parameterElement, IType type, Object obj, MarshalContext context) { parameterElement.setTypeInstance( (XmlTypeInstance) obj ); } }