/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.ws.typeprovider.paraminfo;
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 java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
public class ListWsdlOperationParameterInfo extends WsdlOperationParameterInfo {
private final WsdlOperationParameterInfo _componentParamInfo;
public ListWsdlOperationParameterInfo( IType elementPropertyGosuType, QName elementQName, WsdlOperationParameterInfo componentParamInfo ) {
super( elementPropertyGosuType, elementQName );
_componentParamInfo = componentParamInfo;
}
@Override
public IType getType() {
return JavaTypes.LIST().getParameterizedType( _componentParamInfo.getType() );
}
@Override
public Object unwrap( XmlElement parameterElement ) {
List<Object> ret = new ArrayList<Object>();
QName componentQName = _componentParamInfo.getParameterElementName();
for ( XmlElement childElement : parameterElement.getChildren( componentQName ) ) {
if ( childElement.isNil() ) {
ret.add( null );
}
else {
ret.add( _componentParamInfo.unwrap( childElement ) );
}
}
return ret;
}
@Override
public String getName() {
return "request";
}
@Override
public XmlElement wrap( Object obj, XmlElement listElement ) {
IType componentElementType = _componentParamInfo.getParameterElementType();
@SuppressWarnings( {"unchecked"} )
List<Object> list = (List<Object>) obj;
for ( Object child : list ) {
XmlElement childElement = (XmlElement) componentElementType.getTypeInfo().getConstructor().getConstructor().newInstance();
if ( child == null ) {
childElement.setNil( true );
}
else {
childElement = _componentParamInfo.wrap( child, childElement );
}
listElement.addChild( childElement );
}
return listElement;
}
}