/**
   * XmlElement override will completely replace the existing values.
   *
   * @param xmlElement
   * @param oldProperty
   * @param typeInfo
   * @param nsInfo
   * @return
   */
  private Property processXmlElement(
      XmlElement xmlElement, Property oldProperty, TypeInfo typeInfo, NamespaceInfo nsInfo) {
    // reset any existing values
    resetProperty(oldProperty, typeInfo);

    if (xmlElement.getXmlMap() != null) {
      processXmlMap(xmlElement.getXmlMap(), oldProperty);
    }

    // handle xml-id
    if (xmlElement.isXmlId()) {
      typeInfo.setIDProperty(oldProperty);
    } else if (oldProperty.isXmlId()) {
      // account for XmlID un-set via XML
      if (typeInfo.getIDProperty() != null
          && typeInfo.getIDProperty().getPropertyName().equals(oldProperty.getPropertyName())) {
        typeInfo.setIDProperty(null);
      }
    }
    oldProperty.setIsXmlId(xmlElement.isXmlId());

    // handle xml-idref
    oldProperty.setIsXmlIdRef(xmlElement.isXmlIdref());

    // set required
    oldProperty.setIsRequired(xmlElement.isRequired());

    // set xml-inline-binary-data
    oldProperty.setisInlineBinaryData(xmlElement.isXmlInlineBinaryData());

    // set nillable
    oldProperty.setNillable(xmlElement.isNillable());

    // set defaultValue
    if (xmlElement.getDefaultValue().equals("\u0000")) {
      oldProperty.setDefaultValue(null);
    } else {
      oldProperty.setDefaultValue(xmlElement.getDefaultValue());
    }

    // set schema name
    QName qName;
    String name = xmlElement.getName();
    if (name.equals("##default")) {
      name = oldProperty.getPropertyName();
    }
    if (xmlElement.getNamespace().equals("##default")) {
      if (nsInfo.isElementFormQualified()) {
        qName = new QName(nsInfo.getNamespace(), name);
      } else {
        qName = new QName(name);
      }
    } else {
      qName = new QName(xmlElement.getNamespace(), name);
    }
    oldProperty.setSchemaName(qName);

    // set type
    if (xmlElement.getType().equals("javax.xml.bind.annotation.XmlElement.DEFAULT")) {
      // if xmlElement has no type, and the property type was set via
      // @XmlElement, reset it to the original value
      if (oldProperty.isXmlElementType()) {
        oldProperty.setType(oldProperty.getOriginalType());
      }
    } else {
      if (xmlElement.getXmlMap() != null) {
        getLogger()
            .logWarning(
                JAXBMetadataLogger.INVALID_TYPE_ON_MAP, new Object[] {xmlElement.getName()});
      } else {
        oldProperty.setType(jModelInput.getJavaModel().getClass(xmlElement.getType()));
      }
    }

    // handle XmlJavaTypeAdapter
    if (xmlElement.getXmlJavaTypeAdapter() != null) {
      oldProperty.setXmlJavaTypeAdapter(xmlElement.getXmlJavaTypeAdapter());
    }

    // handle XmlElementWrapper
    if (xmlElement.getXmlElementWrapper() != null) {
      oldProperty.setXmlElementWrapper(xmlElement.getXmlElementWrapper());
    }

    // for primitives we always set required, a.k.a. minOccurs="1"
    if (!oldProperty.isRequired()) {
      JavaClass ptype = oldProperty.getActualType();
      oldProperty.setIsRequired(
          ptype.isPrimitive() || ptype.isArray() && ptype.getComponentType().isPrimitive());
    }

    // handle xml-list
    if (xmlElement.isSetXmlList()) {
      // Make sure XmlList annotation is on a collection or array
      if (!aProcessor.isCollectionType(oldProperty) && !oldProperty.getType().isArray()) {
        throw JAXBException.invalidList(oldProperty.getPropertyName());
      }
      oldProperty.setIsXmlList(xmlElement.isXmlList());
    }

    // handle xml-mime-type
    if (xmlElement.getXmlMimeType() != null) {
      oldProperty.setMimeType(xmlElement.getXmlMimeType());
    }

    // handle xml-attachment-ref
    if (xmlElement.isXmlAttachmentRef()) {
      oldProperty.setIsSwaAttachmentRef(true);
      oldProperty.setSchemaType(XMLConstants.SWA_REF_QNAME);
    }

    // handle xml-schema-type
    if (xmlElement.getXmlSchemaType() != null) {
      oldProperty.setSchemaType(
          new QName(
              xmlElement.getXmlSchemaType().getNamespace(),
              xmlElement.getXmlSchemaType().getName()));
    }

    return oldProperty;
  }
  /**
   * XmlAttribute override will completely replace the existing values.
   *
   * @param xmlAttribute
   * @param oldProperty
   * @param nsInfo
   * @return
   */
  private Property processXmlAttribute(
      XmlAttribute xmlAttribute, Property oldProperty, TypeInfo typeInfo, NamespaceInfo nsInfo) {
    // reset any existing values
    resetProperty(oldProperty, typeInfo);

    // handle xml-id
    if (xmlAttribute.isXmlId()) {
      typeInfo.setIDProperty(oldProperty);
    } else if (oldProperty.isXmlId()) {
      // account for XmlID un-set via XML
      if (typeInfo.getIDProperty() != null
          && typeInfo.getIDProperty().getPropertyName().equals(oldProperty.getPropertyName())) {
        typeInfo.setIDProperty(null);
      }
    }
    oldProperty.setIsXmlId(xmlAttribute.isXmlId());

    // handle xml-idref
    oldProperty.setIsXmlIdRef(xmlAttribute.isXmlIdref());

    // set isAttribute
    oldProperty.setIsAttribute(true);

    // set required
    oldProperty.setIsRequired(xmlAttribute.isRequired());

    // set xml-inline-binary-data
    oldProperty.setisInlineBinaryData(xmlAttribute.isXmlInlineBinaryData());

    // set schema name
    QName qName;
    String name = xmlAttribute.getName();
    if (name.equals("##default")) {
      name = oldProperty.getPropertyName();
    }
    if (xmlAttribute.getNamespace().equals("##default")) {
      if (nsInfo.isElementFormQualified()) {
        qName = new QName(nsInfo.getNamespace(), name);
      } else {
        qName = new QName(name);
      }
    } else {
      qName = new QName(xmlAttribute.getNamespace(), name);
    }
    oldProperty.setSchemaName(qName);

    // handle XmlJavaTypeAdapter
    if (xmlAttribute.getXmlJavaTypeAdapter() != null) {
      oldProperty.setXmlJavaTypeAdapter(xmlAttribute.getXmlJavaTypeAdapter());
    }

    // handle xml-mime-type
    if (xmlAttribute.getXmlMimeType() != null) {
      oldProperty.setMimeType(xmlAttribute.getXmlMimeType());
    }

    // handle xml-attachment-ref
    if (xmlAttribute.isXmlAttachmentRef()) {
      oldProperty.setIsSwaAttachmentRef(true);
      oldProperty.setSchemaType(XMLConstants.SWA_REF_QNAME);
    }

    // handle xml-schema-type
    if (xmlAttribute.getXmlSchemaType() != null) {
      oldProperty.setSchemaType(
          new QName(
              xmlAttribute.getXmlSchemaType().getNamespace(),
              xmlAttribute.getXmlSchemaType().getName()));
    }

    return oldProperty;
  }