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}