// TODO What if return is an swa attachment, then this should start
// at 1 not 0.
int swaIndex = 0;
for (int i = 0; i < params.length; i++) {
ParameterDescription pd = params[i];
if (log.isDebugEnabled()) {
log.debug(" processing Parameter " + pd);
}
if (pd.getMode() == Mode.IN && isInput ||
pd.getMode() == Mode.INOUT ||
pd.getMode() == Mode.OUT && !isInput) {
// Don't consider async handlers, they are are not represented on the wire,
// thus they don't have a PDElement
// TODO
//if (isAsyncHandler(param)) {
// continue;
//}
Block block = null;
JAXBBlockContext context = new JAXBBlockContext(packages);
AttachmentDescription attachmentDesc = pd.getAttachmentDescription();
if (attachmentDesc == null) {
boolean isBase64Binary = byte[].class.equals(javaType[i]);
// In most cases the entire java object is unmarshalled.
// But in some cases, the java object is a series of
// elements.
boolean unmarshalComponents = false;
if (pd.isListType() ||
javaComponentType[i] == null ||
isBase64Binary) {
context.setProcessType(javaType[i]);
context.setIsxmlList(pd.isListType());
} else {
context.setProcessType(javaComponentType[i]);
unmarshalComponents = true;
}
// Unmarshal the object into a JAXB object or JAXBElement
Element element = null;
if (pd.isHeader()) {
if (log.isDebugEnabled()) {
log.debug(" get block from the headers");
}
// Get the Block from the header
// NOTE The parameter name is always used to get the header
// element
String localName = pd.getParameterName();
block = message.getHeaderBlock(pd.getTargetNamespace(),
localName,
context,
factory);
element = new Element(block.getBusinessObject(true),
block.getQName());
} else if (firstIndex[i] >= 0) {
if (log.isDebugEnabled()) {
log.debug(" get block from the " + firstIndex[i] +
" to the " + lastIndex[i]);
}
// You must use this method if there are more than one body block
// This method may cause OM expansion
if (unmarshalComponents) {
Object container = makeContainer(javaType[i],
javaComponentType[i],
(lastIndex[i] - firstIndex[i]) + 1);
for (int blockI=firstIndex[i]; blockI<=lastIndex[i]; blockI++) {
block = message.getBodyBlock(blockI, context, factory);
Object value = block.getBusinessObject(true);
if (value instanceof JAXBElement) {
value = ((JAXBElement) value).getValue();
}
if (log.isDebugEnabled()) {
log.debug(" get Business Object " + JavaUtils.getObjectIdentity(value) + " from block " + blockI);
}
addComponent(container, value, blockI - firstIndex[i]);
}
element = new Element(container,
block.getQName());
} else {
block = message.getBodyBlock(firstIndex[i], context, factory);
element = new Element(block.getBusinessObject(true),
block.getQName());
}
} else {
// Missing parameter
if (log.isDebugEnabled()) {
log.debug(" there is no block for this parameter.");
}
QName qName = new QName(pd.getTargetNamespace(), pd.getPartName());
if (!unmarshalComponents) {
element = new Element(null, qName);
} else {
Object container = makeContainer(javaType[i],
javaComponentType[i], 0);
element = new Element(container, qName);
}
}
PDElement pde =
new PDElement(pd, element, javaComponentType[i] == null ? null
: javaComponentType[i]);
pdeList.add(pde);
} else {
// Attachment Processing
if (attachmentDesc.getAttachmentType() == AttachmentType.SWA) {
String partName = pd.getPartName();
String cid = null;
if (log.isDebugEnabled()) {
log.debug("Getting the attachment dataHandler for partName=" + partName);
}
if (partName != null && partName.length() > 0) {