public boolean addXsiTypeAndClassIndicatorIfRequired(
      Descriptor descriptor,
      Descriptor referenceDescriptor,
      Field xmlField,
      boolean isRootElement) {
    ObjectBuilder objectBuilder = (ObjectBuilder) descriptor.getObjectBuilder();
    boolean xsiTypeIndicatorField = objectBuilder.isXsiTypeIndicatorField();

    if (objectBuilder.addClassIndicatorFieldToRow(this)) {
      return true;
    }

    QName leafType = null;
    if (xmlField != null) {
      leafType = xmlField.getLeafElementType();

      XMLSchemaReference xmlRef = descriptor.getSchemaReference();
      if (xmlRef != null) {
        if (leafType == null) {
          if (xmlRef.getType() == XMLSchemaReference.ELEMENT) {
            return false;
          }
          if (referenceDescriptor == null) {
            writeXsiTypeAttribute(descriptor, xmlRef, isRootElement);
            return true;
          }
        } else if (((xmlRef.getType() == XMLSchemaReference.COMPLEX_TYPE)
                || (xmlRef.getType() == XMLSchemaReference.SIMPLE_TYPE))
            && xmlRef.getSchemaContext() != null
            && xmlRef.isGlobalDefinition()) {
          QName ctxQName = xmlRef.getSchemaContextAsQName(descriptor.getNamespaceResolver());
          if (!ctxQName.equals(leafType)) {
            writeXsiTypeAttribute(descriptor, xmlRef, isRootElement);
            return true;
          }
        }
      }
    }

    if (referenceDescriptor != null && referenceDescriptor == descriptor) {
      return false;
    }
    if (descriptor.hasInheritance()
        && !descriptor.getInheritancePolicy().isRootParentDescriptor()) {
      CoreInheritancePolicy inheritancePolicy = descriptor.getInheritancePolicy();
      Field indicatorField = (Field) inheritancePolicy.getClassIndicatorField();
      if (indicatorField != null && xsiTypeIndicatorField) {
        Object classIndicatorValueObject =
            inheritancePolicy.getClassIndicatorMapping().get(descriptor.getJavaClass());
        String classIndicatorUri = null;
        String classIndicatorLocal = null;
        String classIndicatorPrefix = null;
        if (classIndicatorValueObject instanceof QName) {
          QName classIndicatorQName = (QName) classIndicatorValueObject;
          classIndicatorUri = classIndicatorQName.getNamespaceURI();
          classIndicatorLocal = classIndicatorQName.getLocalPart();
          classIndicatorPrefix = classIndicatorQName.getPrefix();
        } else {
          String classIndicatorValue =
              (String) inheritancePolicy.getClassIndicatorMapping().get(descriptor.getJavaClass());
          int nsindex = classIndicatorValue.indexOf(Constants.COLON);
          String prefix = null;
          if (nsindex != -1) {
            classIndicatorLocal = classIndicatorValue.substring(nsindex + 1);
            prefix = classIndicatorValue.substring(0, nsindex);
          } else {
            classIndicatorLocal = classIndicatorValue;
          }
          classIndicatorUri =
              descriptor.getNonNullNamespaceResolver().resolveNamespacePrefix(prefix);
        }
        if (leafType == null
            || isRootElement && marshaller.isApplicationJSON() && !marshaller.isIncludeRoot()
            || !(leafType.getLocalPart().equals(classIndicatorLocal))
            || (classIndicatorUri == null
                && (leafType.getNamespaceURI() != null && leafType.getNamespaceURI().length() > 0))
            || (classIndicatorUri != null
                && !classIndicatorUri.equals(leafType.getNamespaceURI()))) {
          if (inheritancePolicy.hasClassExtractor()) {
            objectBuilder.addClassIndicatorFieldToRow(this);
          } else {
            writeXsiTypeAttribute(
                descriptor,
                classIndicatorUri,
                classIndicatorLocal,
                classIndicatorPrefix,
                isRootElement);
          }
          return true;
        }
        return false;
      }
    }
    return false;
  }