Skip to content

Commit

Permalink
HV-732 Checking of group conversion vadility is now done in the aggre…
Browse files Browse the repository at this point in the history
…gated model not the raw model
  • Loading branch information
hferentschik committed Feb 27, 2013
1 parent 950abc8 commit 4830b88
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 65 deletions.
Expand Up @@ -19,11 +19,15 @@
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.validation.ElementKind;
import javax.validation.GroupSequence;

import org.hibernate.validator.internal.metadata.core.MetaConstraint;
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;

import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;

Expand All @@ -34,6 +38,7 @@
* @author Gunnar Morling
*/
public abstract class AbstractConstraintMetaData implements ConstraintMetaData {
private static final Log log = LoggerFactory.make();

private final String name;
private final Type type;
Expand Down Expand Up @@ -100,16 +105,6 @@ public boolean isConstrained() {
return isConstrained;
}

protected Set<ConstraintDescriptorImpl<?>> asDescriptors(Set<MetaConstraint<?>> constraints) {
Set<ConstraintDescriptorImpl<?>> theValue = newHashSet();

for ( MetaConstraint<?> oneConstraint : constraints ) {
theValue.add( oneConstraint.getDescriptor() );
}

return theValue;
}

@Override
public String toString() {
return "AbstractConstraintMetaData [name=" + name
Expand Down Expand Up @@ -148,4 +143,32 @@ else if ( !name.equals( other.name ) ) {
}
return true;
}

protected Set<ConstraintDescriptorImpl<?>> asDescriptors(Set<MetaConstraint<?>> constraints) {
Set<ConstraintDescriptorImpl<?>> theValue = newHashSet();

for ( MetaConstraint<?> oneConstraint : constraints ) {
theValue.add( oneConstraint.getDescriptor() );
}

return theValue;
}

protected void validateGroupConversions(Map<Class<?>, Class<?>> groupConversions) {
//group conversions may only be configured for cascadable elements
if ( !isCascading() && !groupConversions.isEmpty() ) {
throw log.getGroupConversionOnNonCascadingElementException( this.toString() );
}

//group conversions may not be configured using a sequence as source
for ( Class<?> oneGroup : groupConversions.keySet() ) {
if ( isGroupSequence( oneGroup ) ) {
throw log.getGroupConversionForSequenceException( oneGroup );
}
}
}

private boolean isGroupSequence(Class<?> oneGroup) {
return oneGroup.isAnnotationPresent( GroupSequence.class );
}
}
Expand Up @@ -16,8 +16,6 @@
*/
package org.hibernate.validator.internal.metadata.aggregated;

import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;

import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
Expand All @@ -27,13 +25,14 @@
import org.hibernate.validator.internal.metadata.descriptor.GroupConversionDescriptorImpl;
import org.hibernate.validator.internal.metadata.facets.Cascadable;

import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;

/**
* Provides group conversion functionality to {@link Cascadable}s.
*
* @author Gunnar Morling
*/
public class GroupConversionHelper {

private final Map<Class<?>, Class<?>> groupConversions;

public GroupConversionHelper(Map<Class<?>, Class<?>> groupConversions) {
Expand Down
Expand Up @@ -52,7 +52,12 @@ public class ParameterMetaData extends AbstractConstraintMetaData implements Cas
* @param isCascading should cascading constraints be evaluated. Returns {@code true} is the constrained element
* is marked for cascaded validation ({@code @Valid}), {@code false} otherwise.
*/
private ParameterMetaData(int index, String name, Class<?> type, Set<MetaConstraint<?>> constraints, boolean isCascading, Map<Class<?>, Class<?>> groupConversions) {
private ParameterMetaData(int index,
String name,
Class<?> type,
Set<MetaConstraint<?>> constraints,
boolean isCascading,
Map<Class<?>, Class<?>> groupConversions) {
super(
name,
type,
Expand All @@ -64,6 +69,7 @@ private ParameterMetaData(int index, String name, Class<?> type, Set<MetaConstra

this.groupConversionHelper = new GroupConversionHelper( groupConversions );
this.index = index;
validateGroupConversions( groupConversions );
}

public int getIndex() {
Expand Down
Expand Up @@ -79,8 +79,6 @@ private PropertyMetaData(String propertyName,
cascadingMember != null || !constraints.isEmpty()
);

this.groupConversionHelper = new GroupConversionHelper( groupConversions );

if ( cascadingMember != null ) {
this.cascadingMember = cascadingMember;
this.elementType = cascadingMember instanceof Field ? ElementType.FIELD : ElementType.METHOD;
Expand All @@ -89,6 +87,9 @@ private PropertyMetaData(String propertyName,
this.cascadingMember = null;
this.elementType = ElementType.TYPE;
}

this.groupConversionHelper = new GroupConversionHelper( groupConversions );
validateGroupConversions( groupConversions );
}

@Override
Expand Down
Expand Up @@ -46,7 +46,10 @@ public class ReturnValueMetaData extends AbstractConstraintMetaData
private final List<Cascadable> cascadables;
private final GroupConversionHelper groupConversionHelper;

public ReturnValueMetaData(Type type, Set<MetaConstraint<?>> constraints, boolean isCascading, Map<Class<?>, Class<?>> groupConversions) {
public ReturnValueMetaData(Type type,
Set<MetaConstraint<?>> constraints,
boolean isCascading,
Map<Class<?>, Class<?>> groupConversions) {
super(
RETURN_VALUE_NODE_NAME,
type,
Expand All @@ -58,6 +61,7 @@ public ReturnValueMetaData(Type type, Set<MetaConstraint<?>> constraints, boolea

this.cascadables = Collections.unmodifiableList( isCascading ? Arrays.asList( this ) : Collections.<Cascadable>emptyList() );
this.groupConversionHelper = new GroupConversionHelper( groupConversions );
validateGroupConversions( groupConversions );
}

@Override
Expand Down
Expand Up @@ -20,12 +20,9 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.validation.GroupSequence;

import org.hibernate.validator.internal.metadata.core.MetaConstraint;
import org.hibernate.validator.internal.metadata.location.ConstraintLocation;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;

/**
* Base implementation of with functionality common to all {@link ConstrainedElement} implementations.
Expand All @@ -34,8 +31,6 @@
* @author Hardy Ferentschik
*/
public abstract class AbstractConstrainedElement implements ConstrainedElement {
private static final Log log = LoggerFactory.make();

private final ConstrainedElementKind kind;
private final ConfigurationSource source;
private final ConstraintLocation location;
Expand All @@ -55,26 +50,6 @@ public AbstractConstrainedElement(ConfigurationSource source,
this.constraints = constraints != null ? Collections.unmodifiableSet( constraints ) : Collections.<MetaConstraint<?>>emptySet();
this.groupConversions = Collections.unmodifiableMap( groupConversions );
this.isCascading = isCascading;

validateGroupConversions();
}

private void validateGroupConversions() {
//group conversions may only be configured for cascadable elements
if ( !isCascading && !groupConversions.isEmpty() ) {
throw log.getGroupConversionOnNonCascadingElementException( location );
}

//group conversions may not be configured using a sequence as source
for ( Class<?> oneGroup : groupConversions.keySet() ) {
if ( isGroupSequence( oneGroup ) ) {
throw log.getGroupConversionForSequenceException( oneGroup );
}
}
}

private boolean isGroupSequence(Class<?> oneGroup) {
return oneGroup.isAnnotationPresent( GroupSequence.class );
}

@Override
Expand Down
Expand Up @@ -41,7 +41,6 @@
import org.jboss.logging.Message;
import org.jboss.logging.MessageLogger;

import org.hibernate.validator.internal.metadata.location.ConstraintLocation;
import org.hibernate.validator.internal.metadata.raw.ExecutableElement;

import static org.jboss.logging.Logger.Level.INFO;
Expand Down Expand Up @@ -450,8 +449,8 @@ public interface Log extends BasicLogger {
@Message(id = 124, value = "Found multiple group conversions for source group %s: %s.")
ConstraintDeclarationException getMultipleGroupConversionsForSameSourceException(Class<?> from, Set<Class<?>> tos);

@Message(id = 125, value = "Found group conversions for non-cascading element %s.")
ConstraintDeclarationException getGroupConversionOnNonCascadingElementException(ConstraintLocation location);
@Message(id = 125, value = "Found group conversions for non-cascading element: %s.")
ConstraintDeclarationException getGroupConversionOnNonCascadingElementException(String location);

@Message(id = 126,
value = "No bean manager is available. In order to use InjectingConstraintValidatorFactory, the javax.validation.Validator must either be retrieved via dependency injection or a bean manager must be available via JNDI.")
Expand Down
Expand Up @@ -189,12 +189,6 @@ public void multipleGroupConversionsOnFieldWithSameFromCauseException() {
provider.getBeanConfigurationForHierarchy( User2.class );
}

@Test(expectedExceptions = ConstraintDeclarationException.class,
expectedExceptionsMessageRegExp = "HV000125.*.*User5#address.*")
public void groupConversionOnNonCascadingFieldCausesException() {
provider.getBeanConfigurationForHierarchy( User5.class );
}

@Test
public void noGroupConversionOnMethod() throws Exception {
//when
Expand Down Expand Up @@ -241,12 +235,6 @@ public void multipleGroupConversionsOnMethod() throws Exception {
assertThat( method.getGroupConversions() ).isEqualTo( expected );
}

@Test(expectedExceptions = ConstraintDeclarationException.class,
expectedExceptionsMessageRegExp = "HV000125.*User7#getAddress\\(\\).*")
public void groupConversionOnNonCascadingMethodCausesException() {
provider.getBeanConfigurationForHierarchy( User7.class );
}

@Test
public void noGroupConversionOnParameter() throws Exception {
//when
Expand Down Expand Up @@ -294,17 +282,10 @@ public void multipleGroupConversionsOnParameter() throws Exception {
}

@Test(expectedExceptions = ConstraintDeclarationException.class, expectedExceptionsMessageRegExp = "HV000124.*")
public void multipleGroupConversionsOnParameterdWithSameFromCauseException() {
public void multipleGroupConversionsOnParameterWithSameFromCauseException() {
provider.getBeanConfigurationForHierarchy( User4.class );
}

@Test(expectedExceptions = ConstraintDeclarationException.class,
expectedExceptionsMessageRegExp = "HV000125.*.*User6#setAddress\\(0\\).*")
public void groupConversionOnNonCascadingParameterCausesException() {
provider.getBeanConfigurationForHierarchy( User6.class );
}


@Test
public void singleGroupConversionOnConstructor() throws Exception {
//when
Expand Down

0 comments on commit 4830b88

Please sign in to comment.