Program: 67632
Project: 67632
Buggy source:
/** 
 * INTERNAL: return if an xsi:type attribute should be added for the given XMLRootObject
 */
public boolean shouldWriteTypeAttribute(Object object,XMLDescriptor descriptor,boolean isXMLRoot){
  boolean writeTypeAttribute=false;
  if (isXMLRoot && (descriptor != null)) {
    XMLRoot xr=(XMLRoot)object;
    QName qName=new QName(xr.getNamespaceURI(),xr.getLocalName());
    XMLDescriptor xdesc=xmlContext.getDescriptor(qName);
    if (xdesc != null) {
      return xdesc.getJavaClass() != descriptor.getJavaClass();
    }
    if (descriptor.hasInheritance()) {
      XMLField classIndicatorField=(XMLField)descriptor.getInheritancePolicy().getClassIndicatorField();
      String classIndicatorUri=null;
      String classIndicatorLocalName=classIndicatorField.getXPathFragment().getLocalName();
      String classIndicatorPrefix=classIndicatorField.getXPathFragment().getPrefix();
      if (classIndicatorPrefix != null) {
        classIndicatorUri=descriptor.getNamespaceResolver().resolveNamespacePrefix(classIndicatorPrefix);
      }
      if ((classIndicatorLocalName != null) && classIndicatorLocalName.equals(XMLConstants.SCHEMA_TYPE_ATTRIBUTE) && (classIndicatorUri != null)&& classIndicatorUri.equals(XMLConstants.SCHEMA_INSTANCE_URL)) {
        return false;
      }
    }
    if (descriptor.getSchemaReference() == null) {
      return false;
    }
    String xmlRootLocalName=xr.getLocalName();
    String xmlRootUri=xr.getNamespaceURI();
    writeTypeAttribute=true;
    for (int i=0; i < descriptor.getTableNames().size(); i++) {
      if (!writeTypeAttribute) {
        break;
      }
      String defaultRootQualifiedName=(String)descriptor.getTableNames().get(i);
      if (defaultRootQualifiedName != null) {
        String defaultRootLocalName=null;
        String defaultRootUri=null;
        int colonIndex=defaultRootQualifiedName.indexOf(':');
        if (colonIndex > 0) {
          String defaultRootPrefix=defaultRootQualifiedName.substring(0,colonIndex);
          defaultRootLocalName=defaultRootQualifiedName.substring(colonIndex + 1);
          if (descriptor.getNamespaceResolver() != null) {
            defaultRootUri=descriptor.getNamespaceResolver().resolveNamespacePrefix(defaultRootPrefix);
          }
        }
 else {
          defaultRootLocalName=defaultRootQualifiedName;
        }
        if (xmlRootLocalName != null) {
          if ((((defaultRootLocalName == null) && (xmlRootLocalName == null)) || (defaultRootLocalName.equals(xmlRootLocalName))) && (((defaultRootUri == null) && (xmlRootUri == null)) || ((xmlRootUri != null) && (defaultRootUri != null) && (defaultRootUri.equals(xmlRootUri))))) {
            writeTypeAttribute=false;
          }
        }
      }
 else {
        if (xmlRootLocalName == null) {
          writeTypeAttribute=false;
        }
      }
    }
  }
  return writeTypeAttribute;
}

Fixed version (ground truth):
/** 
 * INTERNAL: return if an xsi:type attribute should be added for the given XMLRootObject
 */
public boolean shouldWriteTypeAttribute(Object object,XMLDescriptor descriptor,boolean isXMLRoot){
  boolean writeTypeAttribute=false;
  if (isXMLRoot && (descriptor != null)) {
    XMLRoot xr=(XMLRoot)object;
    if (descriptor.hasInheritance()) {
      XMLField classIndicatorField=(XMLField)descriptor.getInheritancePolicy().getClassIndicatorField();
      String classIndicatorUri=null;
      String classIndicatorLocalName=classIndicatorField.getXPathFragment().getLocalName();
      String classIndicatorPrefix=classIndicatorField.getXPathFragment().getPrefix();
      if (classIndicatorPrefix != null) {
        classIndicatorUri=descriptor.getNamespaceResolver().resolveNamespacePrefix(classIndicatorPrefix);
      }
      if ((classIndicatorLocalName != null) && classIndicatorLocalName.equals(XMLConstants.SCHEMA_TYPE_ATTRIBUTE) && (classIndicatorUri != null)&& classIndicatorUri.equals(XMLConstants.SCHEMA_INSTANCE_URL)) {
        return false;
      }
    }
    QName qName=new QName(xr.getNamespaceURI(),xr.getLocalName());
    XMLDescriptor xdesc=xmlContext.getDescriptor(qName);
    if (xdesc != null) {
      return xdesc.getJavaClass() != descriptor.getJavaClass();
    }
    if (descriptor.getSchemaReference() == null) {
      return false;
    }
    String xmlRootLocalName=xr.getLocalName();
    String xmlRootUri=xr.getNamespaceURI();
    writeTypeAttribute=true;
    for (int i=0; i < descriptor.getTableNames().size(); i++) {
      if (!writeTypeAttribute) {
        break;
      }
      String defaultRootQualifiedName=(String)descriptor.getTableNames().get(i);
      if (defaultRootQualifiedName != null) {
        String defaultRootLocalName=null;
        String defaultRootUri=null;
        int colonIndex=defaultRootQualifiedName.indexOf(':');
        if (colonIndex > 0) {
          String defaultRootPrefix=defaultRootQualifiedName.substring(0,colonIndex);
          defaultRootLocalName=defaultRootQualifiedName.substring(colonIndex + 1);
          if (descriptor.getNamespaceResolver() != null) {
            defaultRootUri=descriptor.getNamespaceResolver().resolveNamespacePrefix(defaultRootPrefix);
          }
        }
 else {
          defaultRootLocalName=defaultRootQualifiedName;
        }
        if (xmlRootLocalName != null) {
          if ((((defaultRootLocalName == null) && (xmlRootLocalName == null)) || (defaultRootLocalName.equals(xmlRootLocalName))) && (((defaultRootUri == null) && (xmlRootUri == null)) || ((xmlRootUri != null) && (defaultRootUri != null) && (defaultRootUri.equals(xmlRootUri))))) {
            writeTypeAttribute=false;
          }
        }
      }
 else {
        if (xmlRootLocalName == null) {
          writeTypeAttribute=false;
        }
      }
    }
  }
  return writeTypeAttribute;
}