(operationDesc.getResultPartName() != null);
boolean isNoReturn = (returnType == void.class);
// In usage=WRAPPED, there will be a single JAXB block inside the body.
// Get this block
JAXBBlockContext blockContext = new JAXBBlockContext(packages, packagesKey);
JAXBBlockFactory factory =
(JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class);
Block block = message.getBodyBlock(blockContext, factory);
Object wrapperObject = block.getBusinessObject(true);
// The child elements are within the object that
// represents the type
if (wrapperObject instanceof JAXBElement) {
wrapperObject = ((JAXBElement)wrapperObject).getValue();
}
// Use the wrapper tool to get the child objects.
JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
// Get the list of names for the output parameters
List<String> names = new ArrayList<String>();
List<ParameterDescription> pdList = new ArrayList<ParameterDescription>();
for (int i = 0; i < pds.length; i++) {
ParameterDescription pd = pds[i];
if (pd.getMode() == Mode.OUT ||
pd.getMode() == Mode.INOUT) {
if (!pd.isHeader()) {
// Header names are not in the wrapped element
names.add(pd.getParameterName());
}
pdList.add(pd);
}
}
if (!operationDesc.isResultHeader()) {
// Normal case (Body Result) The return name is in the wrapped object
if (isChildReturn && !isNoReturn) {
names.add(operationDesc.getResultPartName());
}
}
// Get the child objects
Object[] objects = wrapperTool.unWrap(wrapperObject, names,
marshalDesc.getPropertyDescriptorMap(
wrapperObject.getClass()));
// Now create a list of paramValues so that we can populate the signature
List<PDElement> pvList = new ArrayList<PDElement>();
int bodyIndex = 0;
for (int i = 0; i < pdList.size(); i++) {
ParameterDescription pd = pdList.get(i);
if (!pd.isHeader()) {
// Body elements are obtained from the unwrapped array of objects
Object value = objects[bodyIndex];
// The object in the PDElement must be an element
QName qName = new QName(pd.getTargetNamespace(),
pd.getPartName());
Element element = null;
if (!marshalDesc.getAnnotationDesc(pd.getParameterActualType())
.hasXmlRootElement()) {
element = new Element(value, qName, pd.getParameterActualType());
} else {
element = new Element(value, qName);
}
pvList.add(new PDElement(pd, element, null));
bodyIndex++;
} else {
// Header
// Get the Block from the header
String localName = pd.getParameterName();
JAXBBlockContext blkContext = new JAXBBlockContext(packages, packagesKey);
// Set up "by java type" unmarshalling if necessary
if (blkContext.getConstructionType() != JAXBUtils.CONSTRUCTION_TYPE
.BY_CONTEXT_PATH) {
Class actualType = pd.getParameterActualType();
if (MethodMarshallerUtils.isNotJAXBRootElement(actualType, marshalDesc)) {
blkContext.setProcessType(actualType);
blkContext.setIsxmlList(pd.isListType());
}
}
block = message.getHeaderBlock(pd.getTargetNamespace(), localName, blkContext,
factory);
Object value = block.getBusinessObject(true);
Element element =
new Element(value, new QName(pd.getTargetNamespace(), localName));
pvList.add(new PDElement(pd, element, blkContext.getProcessType()));
}
}
// Populate the response Holders in the signature
MethodMarshallerUtils.updateResponseSignatureArgs(pds, pvList, signatureArgs);