* @param parentPart The parent message part metadata.
* @throws IOException if the writer fails.
*/
protected void append1(Object obj, MessagePart part, CompositeMessagePart parentPart) throws IOException
{
XMLMessagePartMapping derivedMapping = (XMLMessagePartMapping)part.getMapping();
String sNamespace = (derivedMapping.getNamespace() == null) ? null : derivedMapping.getNamespace().getName();
String sNodeName = derivedMapping.getNodeName();
boolean bAppendType = false;
if (obj == null && part.isRequired())
{
throw new IntegrationException("err.integration.minPartCount", new Object[]{part.getFullPath()});
}
if (obj != null && part instanceof CompositeMessagePart)
{
TransferObject tobj = (TransferObject)obj;
String sDerivedMessageName = tobj.getClassName();
if (!StringUtil.isEmpty(sDerivedMessageName))
{
Message derivedMessage = m_context.getMetadata().getMessage(sDerivedMessageName);
Message baseMessage = null;
if (parentPart == null) // root of message (includes root part referencing another message)
{
baseMessage = ((RootXMLMessagePartMapping)part.getRoot().getMapping()).getRootMessage();
}
else if (part instanceof CompositeMessagePartRef)
{
CompositeMessagePart referencedPart = ((CompositeMessagePartRef)part).getRefPart();
baseMessage = ((RootXMLMessagePartMapping)referencedPart.getMapping()).getRootMessage();
}
if (baseMessage != null)
{
Message.validatePolymorphism(baseMessage, derivedMessage, part);
if (baseMessage != derivedMessage)
{
part = derivedMessage.getRoot();
bAppendType = true;
derivedMapping = (XMLMessagePartMapping)part.getMapping();
}
}
}
}
if (((RootXMLMessagePartMapping)part.getRoot().getMapping()).getRootMessage().getDerivation() == Message.DERIVATION_ABSTRACT)
{
throw new IntegrationException("err.integration.abstractMessage",
new Object[]{((RootXMLMessagePartMapping)part.getRoot().getMapping()).getRootMessage().getName(), part.getFullPath()});
}
if (part instanceof CompositeMessagePart)
{
if (obj != null)
{
CompositeMessagePart composite = (CompositeMessagePart)part;
TransferObject tobj = (TransferObject)obj;
RootXMLMessagePartMapping rootMapping = null;
MessagePart headersPart = null;
boolean bEnvelopeStarted = false;
// append the namespace and the schema
if (parentPart == null)
{
rootMapping = (RootXMLMessagePartMapping)derivedMapping;
headersPart = rootMapping.getHeaderPart();
bEnvelopeStarted = appendEnvelopeStart(rootMapping, tobj);
m_writer.setNamespace(sNamespace);
m_writer.openElement(sNodeName);
appendNamespaces(rootMapping, false, !bEnvelopeStarted && bAppendType);
appendSchemaLocation(rootMapping);
}
else
{
m_writer.setNamespace(sNamespace);
m_writer.openElement(sNodeName);
// Top-level elements of the header need to declare the root
// namespaces, because they are not under the root element.
rootMapping = (RootXMLMessagePartMapping)parentPart.getRoot().getMapping();
if (rootMapping.getHeaderPart() == parentPart)
{
appendNamespaces(rootMapping, false, false);
}
else
{
rootMapping = null; // prevent call to cleanupNamespaces
}
}
appendAttributes(tobj, composite);
if (bAppendType)
{
appendType((RootXMLMessagePartMapping)derivedMapping);
}
if (appendContents(tobj, composite, headersPart))
{
m_writer.setNamespace(sNamespace);
m_writer.endElement(sNodeName);
}
if (bEnvelopeStarted)
{
appendEnvelopeEnd(rootMapping);
}
if (rootMapping != null)
{
cleanupNamespaces();
}
}
else if (!derivedMapping.hasRequiredAttributes()) // skip element with null data if it has required attributes
{
// write element with null data: either <elementName/> or <elementName xsi:nil="1"/>
m_writer.setNamespace(sNamespace);
m_writer.openElement(sNodeName);
if (derivedMapping.isNillable())
{
m_writer.setNamespace(XMLNamespace.XSI_NAME);
m_writer.writeAttribute("nil", "1");
}
m_writer.closeEmptyElement();
}
}
else
{
PrimitiveMessagePart primitive = (PrimitiveMessagePart)part;
if (obj == null)
{
if (derivedMapping.isNillable())
{
m_writer.setNamespace(sNamespace);
m_writer.openElement(sNodeName);
m_writer.setNamespace(XMLNamespace.XSI_NAME);
m_writer.writeAttribute("nil", "1");
m_writer.closeEmptyElement();
}
}
else
{
m_writer.setNamespace(sNamespace);
m_writer.openElement(sNodeName);
// Write xsi:type for ANY parts
if (primitive.getType() == Primitive.ANY && derivedMapping.getSubtype() == XMLMessagePartMapping.SUBTYPE_XSI)
{
appendType((String)s_primitiveNameMap.get(Primitive.primitiveOf(obj)));
}
m_writer.closeElement();