/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.ws.typeprovider.paraminfo;
import gw.lang.reflect.IType;
import gw.xml.XmlElement;
import java.util.List;
import javax.xml.namespace.QName;
public class ArrayWsdlOperationParameterInfo extends WsdlOperationParameterInfo {
private final WsdlOperationParameterInfo _componentParamInfo;
public ArrayWsdlOperationParameterInfo( IType elementType, QName elementQName, WsdlOperationParameterInfo componentParamInfo ) {
super( elementType, elementQName );
_componentParamInfo = componentParamInfo;
}
@Override
public IType getType() {
return _componentParamInfo.getType().getArrayType();
}
@Override
public Object unwrap( XmlElement parameterElement ) {
int idx = 0;
QName componentQName = _componentParamInfo.getParameterElementName();
final List<XmlElement> children = parameterElement.getChildren( componentQName );
Object ret = _componentParamInfo.getType().makeArrayInstance( children.size() );
for ( XmlElement childElement : children ) {
if ( childElement.isNil() ) {
_componentParamInfo.getType().setArrayComponent( ret, idx++, null );
}
else {
_componentParamInfo.getType().setArrayComponent( ret, idx++, _componentParamInfo.unwrap( childElement ) );
}
}
return ret;
}
@Override
public String getName() {
return "request";
}
@Override
public XmlElement wrap( Object array, XmlElement listElement ) {
IType componentElementType = _componentParamInfo.getParameterElementType();
int size = _componentParamInfo.getType().getArrayLength( array );
for ( int i = 0; i < size; i++ ) {
Object child = _componentParamInfo.getType().getArrayComponent( array, i );
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;
}
}