1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.metaschema.databind.io.xml;
7   
8   import gov.nist.secauto.metaschema.core.model.IBoundObject;
9   import gov.nist.secauto.metaschema.core.model.util.XmlEventUtil;
10  import gov.nist.secauto.metaschema.databind.io.AbstractProblemHandler;
11  import gov.nist.secauto.metaschema.databind.model.IBoundDefinitionModelComplex;
12  
13  import org.apache.logging.log4j.LogManager;
14  import org.apache.logging.log4j.Logger;
15  
16  import java.util.HashSet;
17  import java.util.Set;
18  
19  import javax.xml.namespace.QName;
20  import javax.xml.stream.events.Attribute;
21  
22  /**
23   * Handles problems identified in the parsed XML.
24   * <p>
25   * The default problem handler will report unknown attributes, and provide empty
26   * collections for multi-valued model items and default values for flags and
27   * single valued fields.
28   */
29  public class DefaultXmlProblemHandler
30      extends AbstractProblemHandler
31      implements IXmlProblemHandler {
32    private static final Logger LOGGER = LogManager.getLogger(DefaultXmlProblemHandler.class);
33  
34    private static final QName XSI_SCHEMA_LOCATION
35        = new QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation");
36    private static final Set<QName> IGNORED_QNAMES;
37  
38    static {
39      IGNORED_QNAMES = new HashSet<>();
40      IGNORED_QNAMES.add(XSI_SCHEMA_LOCATION);
41    }
42  
43    @Override
44    public boolean handleUnknownAttribute(
45        IBoundDefinitionModelComplex parentDefinition,
46        IBoundObject targetObject,
47        Attribute attribute,
48        IXmlParsingContext parsingContext) {
49      QName qname = attribute.getName();
50      // check if warning is needed
51      if (LOGGER.isWarnEnabled() && !IGNORED_QNAMES.contains(qname)) {
52        LOGGER.atWarn().log("Skipping unrecognized attribute '{}'{}.",
53            qname,
54            XmlEventUtil.generateLocationMessage(attribute.getLocation()));
55      }
56      // always ignore
57      return true;
58    }
59  }