Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,8 @@ stage('Sonar analysis') {
-Dsonar.organization=\${SONARCLOUD_ORGANIZATION} \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.projectKey=hibernate_hibernate-validator \
-Dsonar.projectName="Hibernate Validator" \
-Dsonar.projectDescription="Hibernate Validator, declare and validate application constraints" \
${helper.scmSource.pullRequest ? """ \
-Dsonar.pullrequest.branch=${helper.scmSource.branch.name} \
-Dsonar.pullrequest.key=${helper.scmSource.pullRequest.id} \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
*/
public abstract class AnnotationMessageCheck extends AnnotationParametersAbstractCheck {

private static final String WORDS_SEPARATED_WITH_DOTS = "(\\w)+(\\.(\\w)+)*";
private static final String WORDS_SEPARATED_WITH_DOTS = "\\w+(?:\\.\\w+)*+";

// for dots and no {} around, or one of the {} is missing
private static final Pattern MESSAGE_PATTERN = Pattern.compile( WORDS_SEPARATED_WITH_DOTS + "|\\{" + WORDS_SEPARATED_WITH_DOTS + "|" + WORDS_SEPARATED_WITH_DOTS + "\\}" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
public class Group {
public static final Group DEFAULT_GROUP = new Group( Default.class );
private static final String DEFAULT_GROUP_NAME = Default.class.getName();

/**
* The actual group.
Expand Down Expand Up @@ -47,7 +48,12 @@ public boolean equals(Object o) {
}

public boolean isDefaultGroup() {
return getDefiningClass().getName().equals( Default.class.getName() );
return isDefaultGroup( group );
}


public static boolean isDefaultGroup(Class<?> group) {
return DEFAULT_GROUP_NAME.equals( group.getName() );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@

import java.lang.reflect.TypeVariable;

import jakarta.validation.groups.Default;

import org.hibernate.validator.internal.engine.groups.Group;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.hibernate.validator.internal.engine.valueextraction.AnnotatedObject;
import org.hibernate.validator.internal.engine.valueextraction.ArrayElement;
Expand Down Expand Up @@ -150,7 +149,7 @@ public final void setCurrentValidatedValue(V currentValue) {
}

public final boolean validatingDefault() {
return getCurrentGroup() != null && getCurrentGroup().getName().equals( Default.class.getName() );
return getCurrentGroup() != null && Group.isDefaultGroup( getCurrentGroup() );
}

public final ConstraintLocationKind getConstraintLocationKind() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import jakarta.validation.metadata.ConstructorDescriptor;
import jakarta.validation.metadata.PropertyDescriptor;

import org.hibernate.validator.internal.engine.groups.Group;
import org.hibernate.validator.internal.engine.groups.Sequence;
import org.hibernate.validator.internal.engine.groups.ValidationOrder;
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
Expand Down Expand Up @@ -579,7 +580,7 @@ private static List<Class<?>> getValidDefaultGroupSequence(Class<?> beanClass, L
validDefaultGroupSequence.add( Default.class );
groupSequenceContainsDefault = true;
}
else if ( group.getName().equals( Default.class.getName() ) ) {
else if ( Group.isDefaultGroup( group ) ) {
throw LOG.getNoDefaultGroupInGroupSequenceException();
}
else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ public static Type extractConstraintType(Class<? extends ConstraintValidator<?,
}

public static Type extractConstraintValidatorTypeArgumentType(Class<? extends ConstraintValidator<?, ?>> validator, int typeArgumentIndex) {
Contracts.assertNotNull( validator, "validator cannot be null" );
Map<Type, Type> resolvedTypes = new HashMap<>();
Type constraintValidatorType = resolveTypes( resolvedTypes, validator );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.validator.internal.xml;

import java.util.Locale;
import java.util.Optional;

import javax.xml.namespace.QName;
Expand All @@ -31,9 +32,8 @@ public abstract class AbstractStaxBuilder {
* corresponding xml tag can be processed based on a tag name.
*
* @param xmlEvent an event to check
*
* @return {@code true} if corresponding event can be processed by current builder,
* {@code false} otherwise
* {@code false} otherwise
*/
protected boolean accept(XMLEvent xmlEvent) {
return xmlEvent.isStartElement() && xmlEvent.asStartElement().getName().getLocalPart().equals( getAcceptableQName() );
Expand All @@ -59,7 +59,6 @@ public boolean process(XMLEventReader xmlEventReader, XMLEvent xmlEvent) {
* return {@code some-value} as a string.
*
* @param xmlEventReader a current {@link XMLEventReader}
*
* @return a value of a current xml tag as a string
*/
protected String readSingleElement(XMLEventReader xmlEventReader) throws XMLStreamException {
Expand All @@ -78,11 +77,21 @@ protected String readSingleElement(XMLEventReader xmlEventReader) throws XMLStre
*
* @param startElement an element to get an attribute from
* @param qName a {@link QName} of an attribute to read
*
* @return a value of an attribute if it is present, {@link Optional#empty()} otherwise
*/
protected Optional<String> readAttribute(StartElement startElement, QName qName) {
Attribute attribute = startElement.getAttributeByName( qName );
return Optional.ofNullable( attribute ).map( Attribute::getValue );
}

protected String readRequiredAttribute(StartElement startElement, QName qName) {
Attribute attribute = startElement.getAttributeByName( qName );
if ( attribute == null ) {
// NOTE: we run schema validation before we try reading the xml,
// hence at this point if we want to get a required attribute, it should be there ...
// and if not: then there's a bigger issue >_<
throw new IllegalStateException( String.format( Locale.ROOT, "Required attribute %s not found within %s", qName, startElement ) );
}
return attribute.getValue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ protected String getAcceptableQName() {
@Override
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
StartElement startElement = xmlEvent.asStartElement();
String name = readAttribute( startElement, NAME_QNAME ).get();
String name = readRequiredAttribute( startElement, NAME_QNAME );
String value = readSingleElement( xmlEventReader );
if ( LOG.isDebugEnabled() ) {
LOG.debugf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ abstract class AbstractConstrainedElementStaxBuilder extends AbstractStaxBuilder
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
Optional<QName> mainAttributeValueQname = getMainAttributeValueQname();
if ( mainAttributeValueQname.isPresent() ) {
mainAttributeValue = readAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() ).get();
mainAttributeValue = readRequiredAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() );
}
ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
ConstraintTypeStaxBuilder constraintTypeStaxBuilder = getNewConstraintTypeStaxBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ abstract class AbstractConstrainedExecutableElementStaxBuilder extends AbstractS
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
Optional<QName> mainAttributeValueQname = getMainAttributeValueQname();
if ( mainAttributeValueQname.isPresent() ) {
mainAttributeValue = readAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() ).get();
mainAttributeValue = readRequiredAttribute( xmlEvent.asStartElement(), mainAttributeValueQname.get() );
}
ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
ConstrainedParameterStaxBuilder constrainedParameterStaxBuilder = getNewConstrainedParameterStaxBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ protected String getAcceptableQName() {

@Override
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
this.className = readAttribute( xmlEvent.asStartElement(), CLASS_QNAME ).get();
this.className = readRequiredAttribute( xmlEvent.asStartElement(), CLASS_QNAME );
this.ignoreAnnotations = readAttribute( xmlEvent.asStartElement(), IGNORE_ANNOTATIONS_QNAME ).map( Boolean::parseBoolean );
ConstrainedFieldStaxBuilder fieldStaxBuilder = getNewConstrainedFieldStaxBuilder();
ConstrainedGetterStaxBuilder getterStaxBuilder = getNewConstrainedGetterStaxBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ protected String getAcceptableQName() {

@Override
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
annotation = readAttribute( xmlEvent.asStartElement(), ANNOTATION_QNAME ).get();
annotation = readRequiredAttribute( xmlEvent.asStartElement(), ANNOTATION_QNAME );
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( getAcceptableQName() ) ) ) {
validatedByStaxBuilder.process( xmlEventReader, xmlEvent );
xmlEvent = xmlEventReader.nextEvent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ protected String getAcceptableQName() {
@Override
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
StartElement startElement = xmlEvent.asStartElement();
constraintAnnotation = readAttribute( startElement, CONSTRAINT_ANNOTATION_QNAME ).get();
constraintAnnotation = readRequiredAttribute( startElement, CONSTRAINT_ANNOTATION_QNAME );
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( CONSTRAINT_QNAME_LOCAL_PART ) ) ) {
XMLEvent currentEvent = xmlEvent;
builders.forEach( builder -> builder.process( xmlEventReader, currentEvent ) );
Expand Down Expand Up @@ -177,7 +177,7 @@ protected String getAcceptableQName() {

@Override
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLStreamException {
String name = readAttribute( xmlEvent.asStartElement(), NAME_QNAME ).get();
String name = readRequiredAttribute( xmlEvent.asStartElement(), NAME_QNAME );
while ( !( xmlEvent.isEndElement() && xmlEvent.asEndElement().getName().getLocalPart().equals( ELEMENT_QNAME_LOCAL_PART ) ) ) {
xmlEvent = xmlEventReader.nextEvent();
readElement( xmlEventReader, xmlEvent, name );
Expand Down Expand Up @@ -244,7 +244,7 @@ protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) throws XMLS
if ( xmlEvent.isStartElement() ) {
StartElement startElement = xmlEvent.asStartElement();
if ( startElement.getName().getLocalPart().equals( ELEMENT_QNAME_LOCAL_PART ) ) {
String name = readAttribute( xmlEvent.asStartElement(), NAME_QNAME ).get();
String name = readRequiredAttribute( xmlEvent.asStartElement(), NAME_QNAME );

// we put empty collection here in case the corresponding string element in xml is empty
// if there will be a value it will get merged in this#addParameterValue()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ protected String getAcceptableQName() {
protected void add(XMLEventReader xmlEventReader, XMLEvent xmlEvent) {
StartElement startElement = xmlEvent.asStartElement();
String from = readAttribute( startElement, FROM_QNAME ).orElse( DEFAULT_GROUP_NAME );
String to = readAttribute( startElement, TO_QNAME ).get();
String to = readRequiredAttribute( startElement, TO_QNAME );
groupConversionRules.merge(
from,
Collections.singletonList( to ),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ public Class<? extends Annotation> annotationType() {
fail();
}
catch (ValidationException e) {
assertThat( e.getMessage() ).startsWith( "HV000082" ).as( "Wrong exception message" );
assertThat( e.getMessage() ).as( "Wrong exception message" ).startsWith( "HV000082" );
}

try {
GetAnnotationAttribute.action( testAnnotation, "foo", Integer.class );
fail();
}
catch (ValidationException e) {
assertThat( e.getMessage() ).startsWith( "HV000083" ).as( "Wrong exception message" );
assertThat( e.getMessage() ).as( "Wrong exception message" ).startsWith( "HV000083" );
}
}
}