Skip to content

Commit 054aca8

Browse files
committed
HV-2057 Do not use optional.get() for required xml attributes
those should be already validated and must be present in the xml
1 parent dc010d5 commit 054aca8

8 files changed

+22
-13
lines changed

engine/src/main/java/org/hibernate/validator/internal/xml/AbstractStaxBuilder.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.validator.internal.xml;
88

9+
import java.util.Locale;
910
import java.util.Optional;
1011

1112
import javax.xml.namespace.QName;
@@ -31,9 +32,8 @@ public abstract class AbstractStaxBuilder {
3132
* corresponding xml tag can be processed based on a tag name.
3233
*
3334
* @param xmlEvent an event to check
34-
*
3535
* @return {@code true} if corresponding event can be processed by current builder,
36-
* {@code false} otherwise
36+
* {@code false} otherwise
3737
*/
3838
protected boolean accept(XMLEvent xmlEvent) {
3939
return xmlEvent.isStartElement() && xmlEvent.asStartElement().getName().getLocalPart().equals( getAcceptableQName() );
@@ -59,7 +59,6 @@ public boolean process(XMLEventReader xmlEventReader, XMLEvent xmlEvent) {
5959
* return {@code some-value} as a string.
6060
*
6161
* @param xmlEventReader a current {@link XMLEventReader}
62-
*
6362
* @return a value of a current xml tag as a string
6463
*/
6564
protected String readSingleElement(XMLEventReader xmlEventReader) throws XMLStreamException {
@@ -78,11 +77,21 @@ protected String readSingleElement(XMLEventReader xmlEventReader) throws XMLStre
7877
*
7978
* @param startElement an element to get an attribute from
8079
* @param qName a {@link QName} of an attribute to read
81-
*
8280
* @return a value of an attribute if it is present, {@link Optional#empty()} otherwise
8381
*/
8482
protected Optional<String> readAttribute(StartElement startElement, QName qName) {
8583
Attribute attribute = startElement.getAttributeByName( qName );
8684
return Optional.ofNullable( attribute ).map( Attribute::getValue );
8785
}
86+
87+
protected String readRequiredAttribute(StartElement startElement, QName qName) {
88+
Attribute attribute = startElement.getAttributeByName( qName );
89+
if ( attribute == null ) {
90+
// NOTE: we run schema validation before we try reading the xml,
91+
// hence at this point if we want to get a required attribute, it should be there ...
92+
// and if not: then there's a bigger issue >_<
93+
throw new IllegalStateException( String.format( Locale.ROOT, "Required attribute %s not found within %s", qName, startElement ) );
94+
}
95+
return attribute.getValue();
96+
}
8897
}

engine/src/main/java/org/hibernate/validator/internal/xml/config/ValidationConfigStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ protected String getAcceptableQName() {
193193
@Override
194194
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
195195
StartElement startElement = xmlEvent.asStartElement();
196-
String name = readAttribute( startElement, NAME_QNAME ).get();
196+
String name = readRequiredAttribute( startElement, NAME_QNAME );
197197
String value = readSingleElement( xmlEventReader );
198198
if ( LOG.isDebugEnabled() ) {
199199
LOG.debugf(

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/AbstractConstrainedElementStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ abstract class AbstractConstrainedElementStaxBuilder extends AbstractStaxBuilder
6666
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
6767
Optional<QName> mainAttributeValueQname = getMainAttributeValueQname();
6868
if ( mainAttributeValueQname.isPresent() ) {
69-
mainAttributeValue = readAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() ).get();
69+
mainAttributeValue = readRequiredAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() );
7070
}
7171
ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
7272
ConstraintTypeStaxBuilder constraintTypeStaxBuilder = getNewConstraintTypeStaxBuilder();

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/AbstractConstrainedExecutableElementStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ abstract class AbstractConstrainedExecutableElementStaxBuilder extends AbstractS
5757
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
5858
Optional<QName> mainAttributeValueQname = getMainAttributeValueQname();
5959
if ( mainAttributeValueQname.isPresent() ) {
60-
mainAttributeValue = readAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() ).get();
60+
mainAttributeValue = readRequiredAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() );
6161
}
6262
ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
6363
ConstrainedParameterStaxBuilder constrainedParameterStaxBuilder = getNewConstrainedParameterStaxBuilder();

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/BeanStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ protected String getAcceptableQName() {
8383

8484
@Override
8585
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
86-
this.className = readAttribute( xmlEvent.asStartElement(), CLASS_QNAME ).get();
86+
this.className = readRequiredAttribute( xmlEvent.asStartElement(), CLASS_QNAME );
8787
this.ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
8888
ConstrainedFieldStaxBuilder fieldStaxBuilder = getNewConstrainedFieldStaxBuilder();
8989
ConstrainedGetterStaxBuilder getterStaxBuilder = getNewConstrainedGetterStaxBuilder();

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/ConstraintDefinitionStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protected String getAcceptableQName() {
6060

6161
@Override
6262
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
63-
annotation = readAttribute( xmlEvent.asStartElement(), ANNOTATION_QNAME ).get();
63+
annotation = readRequiredAttribute( xmlEvent.asStartElement(), ANNOTATION_QNAME );
6464
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( getAcceptableQName() ) ) ) {
6565
validatedByStaxBuilder.process( xmlEventReader, xmlEvent );
6666
xmlEvent = xmlEventReader.nextEvent();

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/ConstraintTypeStaxBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ protected String getAcceptableQName() {
9797
@Override
9898
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
9999
StartElement startElement = xmlEvent.asStartElement();
100-
constraintAnnotation = readAttribute( startElement, CONSTRAINT_ANNOTATION_QNAME ).get();
100+
constraintAnnotation = readRequiredAttribute( startElement, CONSTRAINT_ANNOTATION_QNAME );
101101
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( CONSTRAINT_QNAME_LOCAL_PART ) ) ) {
102102
XMLEvent currentEvent = xmlEvent;
103103
builders.forEach( builder -> builder.process( xmlEventReader, currentEvent ) );
@@ -177,7 +177,7 @@ protected String getAcceptableQName() {
177177

178178
@Override
179179
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
180-
String name = readAttribute( xmlEvent.asStartElement(), NAME_QNAME ).get();
180+
String name = readRequiredAttribute( xmlEvent.asStartElement(), NAME_QNAME );
181181
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( ELEMENT_QNAME_LOCAL_PART ) ) ) {
182182
xmlEvent = xmlEventReader.nextEvent();
183183
readElement( xmlEventReader, xmlEvent, name );
@@ -244,7 +244,7 @@ protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLS
244244
if ( xmlEvent.isStartElement() ) {
245245
StartElement startElement = xmlEvent.asStartElement();
246246
if ( startElement.getName().getLocalPart().equals( ELEMENT_QNAME_LOCAL_PART ) ) {
247-
String name = readAttribute( xmlEvent.asStartElement(), NAME_QNAME ).get();
247+
String name = readRequiredAttribute( xmlEvent.asStartElement(), NAME_QNAME );
248248

249249
// we put empty collection here in case the corresponding string element in xml is empty
250250
// if there will be a value it will get merged in this#addParameterValue()

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/GroupConversionStaxBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protected String getAcceptableQName() {
6060
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) {
6161
StartElement startElement = xmlEvent.asStartElement();
6262
String from = readAttribute( startElement, FROM_QNAME ).orElse( DEFAULT_GROUP_NAME );
63-
String to = readAttribute( startElement, TO_QNAME ).get();
63+
String to = readRequiredAttribute( startElement, TO_QNAME );
6464
groupConversionRules.merge(
6565
from,
6666
Collections.singletonList( to ),

0 commit comments

Comments
 (0)