Program: 65766
Project: 65766
Buggy source:
/** 
 * Convert the given object to XML and update the given marshal record with that XML Document.
 * @param object the object to marshal
 * @param marshalRecord the marshalRecord to marshal the object to
 * @param descriptor the XMLDescriptor for the object being marshalled
 */
private void marshal(Object object,MarshalRecord marshalRecord,AbstractSession session,XMLDescriptor descriptor,boolean isXMLRoot){
  if (null != schema) {
    marshalRecord=new ValidatingMarshalRecord(marshalRecord,this);
  }
  if (getAttachmentMarshaller() != null) {
    marshalRecord.setXOPPackage(getAttachmentMarshaller().isXOPPackage());
  }
  addDescriptorNamespacesToXMLRecord(descriptor,marshalRecord);
  NamespaceResolver nr=marshalRecord.getNamespaceResolver();
  XMLRoot root=null;
  if (isXMLRoot) {
    root=(XMLRoot)object;
  }
  marshalRecord.beforeContainmentMarshal(object);
  if (!isFragment()) {
    String encoding=getEncoding();
    String version=DEFAULT_XML_VERSION;
    if (!isXMLRoot) {
      marshalRecord.setLeafElementType(descriptor.getDefaultRootElementType());
    }
 else {
      if (root.getEncoding() != null) {
        encoding=root.getEncoding();
      }
      if (root.getXMLVersion() != null) {
        version=root.getXMLVersion();
      }
    }
    marshalRecord.startDocument(encoding,version);
  }
  if (isXMLRoot) {
    if (root.getObject() instanceof Node) {
      marshalRecord.node((Node)root.getObject(),new NamespaceResolver());
      marshalRecord.endDocument();
      return;
    }
  }
  XPathFragment rootFragment=buildRootFragment(object,descriptor,isXMLRoot,marshalRecord);
  String schemaLocation=getSchemaLocation();
  String noNsSchemaLocation=getNoNamespaceSchemaLocation();
  boolean isNil=false;
  if (isXMLRoot) {
    object=root.getObject();
    if (root.getSchemaLocation() != null) {
      schemaLocation=root.getSchemaLocation();
    }
    if (root.getNoNamespaceSchemaLocation() != null) {
      noNsSchemaLocation=root.getNoNamespaceSchemaLocation();
    }
    marshalRecord.setLeafElementType(root.getSchemaType());
    isNil=root.isNil();
  }
  String xsiPrefix=null;
  if ((null != getSchemaLocation()) || (null != getNoNamespaceSchemaLocation()) || (isNil)) {
    xsiPrefix=nr.resolveNamespaceURI(XMLConstants.SCHEMA_INSTANCE_URL);
    if (null == xsiPrefix) {
      xsiPrefix=XMLConstants.SCHEMA_INSTANCE_PREFIX;
      nr.put(XMLConstants.SCHEMA_INSTANCE_PREFIX,XMLConstants.SCHEMA_INSTANCE_URL);
    }
  }
  TreeObjectBuilder treeObjectBuilder=null;
  if (descriptor != null) {
    treeObjectBuilder=(TreeObjectBuilder)descriptor.getObjectBuilder();
  }
  if (session == null) {
    session=(AbstractSession)xmlContext.getSession(0);
  }
  marshalRecord.setSession(session);
  if (null != rootFragment) {
    marshalRecord.startPrefixMappings(nr);
    if (!isXMLRoot && descriptor.getNamespaceResolver() == null && rootFragment.hasNamespace()) {
      throw XMLMarshalException.namespaceResolverNotSpecified(rootFragment.getShortName());
    }
    marshalRecord.openStartElement(rootFragment,nr);
    if (null != schemaLocation) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_LOCATION,xsiPrefix + XMLConstants.COLON + XMLConstants.SCHEMA_LOCATION,schemaLocation);
    }
    if (null != noNsSchemaLocation) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.NO_NS_SCHEMA_LOCATION,xsiPrefix + XMLConstants.COLON + XMLConstants.NO_NS_SCHEMA_LOCATION,noNsSchemaLocation);
    }
    if (isNil) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_NIL_ATTRIBUTE,xsiPrefix + XMLConstants.COLON + XMLConstants.SCHEMA_NIL_ATTRIBUTE,"String_Node_Str");
    }
    marshalRecord.namespaceDeclarations(nr);
    if (descriptor != null && !isNil) {
      treeObjectBuilder.addXsiTypeAndClassIndicatorIfRequired(marshalRecord,descriptor,null,descriptor.getDefaultRootElementField(),root,object,isXMLRoot,true);
      treeObjectBuilder.marshalAttributes(marshalRecord,object,session);
    }
    marshalRecord.closeStartElement();
  }
  if (treeObjectBuilder != null && !isNil) {
    treeObjectBuilder.buildRow(marshalRecord,object,session,this,rootFragment,WriteType.UNDEFINED);
  }
 else   if (isXMLRoot) {
    if (object != null && !isNil) {
      if (root.getDeclaredType() != null && root.getObject() != null && root.getDeclaredType() != root.getObject().getClass()) {
        QName type=(QName)XMLConversionManager.getDefaultJavaTypes().get(object.getClass());
        if (type != null) {
          xsiPrefix=nr.resolveNamespaceURI(XMLConstants.SCHEMA_INSTANCE_URL);
          if (null == xsiPrefix) {
            xsiPrefix=XMLConstants.SCHEMA_INSTANCE_PREFIX;
            marshalRecord.attribute(XMLConstants.XMLNS_URL,xsiPrefix,XMLConstants.XMLNS + ':' + xsiPrefix,XMLConstants.SCHEMA_INSTANCE_URL);
          }
          marshalRecord.attribute(XMLConstants.XMLNS_URL,XMLConstants.SCHEMA_PREFIX,XMLConstants.XMLNS + ':' + XMLConstants.SCHEMA_PREFIX,XMLConstants.SCHEMA_URL);
          marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_TYPE_ATTRIBUTE,xsiPrefix + "String_Node_Str" + XMLConstants.SCHEMA_TYPE_ATTRIBUTE,"String_Node_Str" + type.getLocalPart());
        }
      }
      String value=(String)XMLConversionManager.getDefaultXMLManager().convertObject(object,String.class,root.getSchemaType());
      marshalRecord.characters(value);
    }
  }
  if (null != rootFragment) {
    marshalRecord.endElement(rootFragment,nr);
    marshalRecord.endPrefixMappings(nr);
  }
  if (!isFragment()) {
    marshalRecord.endDocument();
  }
  marshalRecord.afterContainmentMarshal(null,object);
}

Fixed version (ground truth):
/** 
 * Convert the given object to XML and update the given marshal record with that XML Document.
 * @param object the object to marshal
 * @param marshalRecord the marshalRecord to marshal the object to
 * @param descriptor the XMLDescriptor for the object being marshalled
 */
private void marshal(Object object,MarshalRecord marshalRecord,AbstractSession session,XMLDescriptor descriptor,boolean isXMLRoot){
  if (null != schema) {
    marshalRecord=new ValidatingMarshalRecord(marshalRecord,this);
  }
  if (getAttachmentMarshaller() != null) {
    marshalRecord.setXOPPackage(getAttachmentMarshaller().isXOPPackage());
  }
  addDescriptorNamespacesToXMLRecord(descriptor,marshalRecord);
  NamespaceResolver nr=marshalRecord.getNamespaceResolver();
  XMLRoot root=null;
  if (isXMLRoot) {
    root=(XMLRoot)object;
  }
  marshalRecord.beforeContainmentMarshal(object);
  if (!isFragment()) {
    String encoding=getEncoding();
    String version=DEFAULT_XML_VERSION;
    if (!isXMLRoot) {
      marshalRecord.setLeafElementType(descriptor.getDefaultRootElementType());
    }
 else {
      if (root.getEncoding() != null) {
        encoding=root.getEncoding();
      }
      if (root.getXMLVersion() != null) {
        version=root.getXMLVersion();
      }
    }
    marshalRecord.startDocument(encoding,version);
  }
  if (isXMLRoot) {
    if (root.getObject() instanceof Node) {
      marshalRecord.node((Node)root.getObject(),new NamespaceResolver());
      marshalRecord.endDocument();
      return;
    }
  }
  XPathFragment rootFragment=buildRootFragment(object,descriptor,isXMLRoot,marshalRecord);
  String schemaLocation=getSchemaLocation();
  String noNsSchemaLocation=getNoNamespaceSchemaLocation();
  boolean isNil=false;
  if (isXMLRoot) {
    object=root.getObject();
    if (root.getSchemaLocation() != null) {
      schemaLocation=root.getSchemaLocation();
    }
    if (root.getNoNamespaceSchemaLocation() != null) {
      noNsSchemaLocation=root.getNoNamespaceSchemaLocation();
    }
    marshalRecord.setLeafElementType(root.getSchemaType());
    isNil=root.isNil();
  }
  String xsiPrefix=null;
  if ((null != getSchemaLocation()) || (null != getNoNamespaceSchemaLocation()) || (isNil)) {
    xsiPrefix=nr.resolveNamespaceURI(XMLConstants.SCHEMA_INSTANCE_URL);
    if (null == xsiPrefix) {
      xsiPrefix=XMLConstants.SCHEMA_INSTANCE_PREFIX;
      nr.put(XMLConstants.SCHEMA_INSTANCE_PREFIX,XMLConstants.SCHEMA_INSTANCE_URL);
    }
  }
  TreeObjectBuilder treeObjectBuilder=null;
  if (descriptor != null) {
    treeObjectBuilder=(TreeObjectBuilder)descriptor.getObjectBuilder();
  }
  if (session == null) {
    session=(AbstractSession)xmlContext.getSession(0);
  }
  marshalRecord.setSession(session);
  if (null != rootFragment && !(rootFragment.getLocalName().equals(XMLConstants.EMPTY_STRING))) {
    marshalRecord.startPrefixMappings(nr);
    if (!isXMLRoot && descriptor.getNamespaceResolver() == null && rootFragment.hasNamespace()) {
      throw XMLMarshalException.namespaceResolverNotSpecified(rootFragment.getShortName());
    }
    marshalRecord.openStartElement(rootFragment,nr);
    if (null != schemaLocation) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_LOCATION,xsiPrefix + XMLConstants.COLON + XMLConstants.SCHEMA_LOCATION,schemaLocation);
    }
    if (null != noNsSchemaLocation) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.NO_NS_SCHEMA_LOCATION,xsiPrefix + XMLConstants.COLON + XMLConstants.NO_NS_SCHEMA_LOCATION,noNsSchemaLocation);
    }
    if (isNil) {
      marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_NIL_ATTRIBUTE,xsiPrefix + XMLConstants.COLON + XMLConstants.SCHEMA_NIL_ATTRIBUTE,"String_Node_Str");
    }
    marshalRecord.namespaceDeclarations(nr);
    if (descriptor != null && !isNil) {
      treeObjectBuilder.addXsiTypeAndClassIndicatorIfRequired(marshalRecord,descriptor,null,descriptor.getDefaultRootElementField(),root,object,isXMLRoot,true);
      treeObjectBuilder.marshalAttributes(marshalRecord,object,session);
    }
    marshalRecord.closeStartElement();
  }
  if (treeObjectBuilder != null && !isNil) {
    treeObjectBuilder.buildRow(marshalRecord,object,session,this,rootFragment,WriteType.UNDEFINED);
  }
 else   if (isXMLRoot) {
    if (object != null && !isNil) {
      if (root.getDeclaredType() != null && root.getObject() != null && root.getDeclaredType() != root.getObject().getClass()) {
        QName type=(QName)XMLConversionManager.getDefaultJavaTypes().get(object.getClass());
        if (type != null) {
          xsiPrefix=nr.resolveNamespaceURI(XMLConstants.SCHEMA_INSTANCE_URL);
          if (null == xsiPrefix) {
            xsiPrefix=XMLConstants.SCHEMA_INSTANCE_PREFIX;
            marshalRecord.attribute(XMLConstants.XMLNS_URL,xsiPrefix,XMLConstants.XMLNS + ':' + xsiPrefix,XMLConstants.SCHEMA_INSTANCE_URL);
          }
          marshalRecord.attribute(XMLConstants.XMLNS_URL,XMLConstants.SCHEMA_PREFIX,XMLConstants.XMLNS + ':' + XMLConstants.SCHEMA_PREFIX,XMLConstants.SCHEMA_URL);
          marshalRecord.attribute(XMLConstants.SCHEMA_INSTANCE_URL,XMLConstants.SCHEMA_TYPE_ATTRIBUTE,xsiPrefix + "String_Node_Str" + XMLConstants.SCHEMA_TYPE_ATTRIBUTE,"String_Node_Str" + type.getLocalPart());
        }
      }
      String value=(String)XMLConversionManager.getDefaultXMLManager().convertObject(object,String.class,root.getSchemaType());
      marshalRecord.characters(value);
    }
  }
  if (null != rootFragment && !(rootFragment.getLocalName().equals(XMLConstants.EMPTY_STRING))) {
    marshalRecord.endElement(rootFragment,nr);
    marshalRecord.endPrefixMappings(nr);
  }
  if (!isFragment()) {
    marshalRecord.endDocument();
  }
  marshalRecord.afterContainmentMarshal(null,object);
}