001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.metaschema.databind.io.xml;
007
008import gov.nist.secauto.metaschema.core.model.IBoundObject;
009import gov.nist.secauto.metaschema.core.model.util.XmlEventUtil;
010import gov.nist.secauto.metaschema.databind.io.AbstractProblemHandler;
011import gov.nist.secauto.metaschema.databind.model.IBoundDefinitionModelComplex;
012
013import org.apache.logging.log4j.LogManager;
014import org.apache.logging.log4j.Logger;
015
016import java.util.HashSet;
017import java.util.Set;
018
019import javax.xml.namespace.QName;
020import javax.xml.stream.events.Attribute;
021
022/**
023 * Handles problems identified in the parsed XML.
024 * <p>
025 * The default problem handler will report unknown attributes, and provide empty
026 * collections for multi-valued model items and default values for flags and
027 * single valued fields.
028 */
029public class DefaultXmlProblemHandler
030    extends AbstractProblemHandler
031    implements IXmlProblemHandler {
032  private static final Logger LOGGER = LogManager.getLogger(DefaultXmlProblemHandler.class);
033
034  private static final QName XSI_SCHEMA_LOCATION
035      = new QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation");
036  private static final Set<QName> IGNORED_QNAMES;
037
038  static {
039    IGNORED_QNAMES = new HashSet<>();
040    IGNORED_QNAMES.add(XSI_SCHEMA_LOCATION);
041  }
042
043  @Override
044  public boolean handleUnknownAttribute(
045      IBoundDefinitionModelComplex parentDefinition,
046      IBoundObject targetObject,
047      Attribute attribute,
048      IXmlParsingContext parsingContext) {
049    QName qname = attribute.getName();
050    // check if warning is needed
051    if (LOGGER.isWarnEnabled() && !IGNORED_QNAMES.contains(qname)) {
052      LOGGER.atWarn().log("Skipping unrecognized attribute '{}'{}.",
053          qname,
054          XmlEventUtil.generateLocationMessage(attribute.getLocation()));
055    }
056    // always ignore
057    return true;
058  }
059}