package org.hibernate.validator.internal.metadata.raw;
import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
import java.lang.reflect.Executable;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaDataBuilder;
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
public class ConstrainedParameter extends AbstractConstrainedElement {
private final Executable executable;
private final Type type;
private final int index;
public ConstrainedParameter(ConfigurationSource source,
Executable executable,
Type type,
int index) {
this(
source,
executable,
type,
index,
Collections.<MetaConstraint<?>>emptySet(),
Collections.<MetaConstraint<?>>emptySet(),
CascadingMetaDataBuilder.nonCascading()
);
}
public ConstrainedParameter(ConfigurationSource source,
Executable executable,
Type type,
int index,
Set<MetaConstraint<?>> constraints,
Set<MetaConstraint<?>> typeArgumentConstraints,
CascadingMetaDataBuilder cascadingMetaDataBuilder) {
super(
source,
ConstrainedElementKind.PARAMETER,
constraints,
typeArgumentConstraints,
cascadingMetaDataBuilder
);
this.executable = executable;
this.type = type;
this.index = index;
}
public Type getType() {
return type;
}
public Executable getExecutable() {
return executable;
}
public int getIndex() {
return index;
}
public ConstrainedParameter merge(ConstrainedParameter other) {
ConfigurationSource mergedSource = ConfigurationSource.max( source, other.source );
Set<MetaConstraint<?>> mergedConstraints = newHashSet( constraints );
mergedConstraints.addAll( other.constraints );
Set<MetaConstraint<?>> mergedTypeArgumentConstraints = new HashSet<>( typeArgumentConstraints );
mergedTypeArgumentConstraints.addAll( other.typeArgumentConstraints );
CascadingMetaDataBuilder mergedCascadingMetaData = cascadingMetaDataBuilder.merge( other.cascadingMetaDataBuilder );
return new ConstrainedParameter(
mergedSource,
executable,
type,
index,
mergedConstraints,
mergedTypeArgumentConstraints,
mergedCascadingMetaData
);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for ( MetaConstraint<?> oneConstraint : getConstraints() ) {
sb.append( oneConstraint.getDescriptor().getAnnotation().annotationType().getSimpleName() );
sb.append( ", " );
}
String constraintsAsString = sb.length() > 0 ? sb.substring( 0, sb.length() - 2 ) : sb.toString();
return "ParameterMetaData [executable=" + executable + ", index=" + index + "], constraints=["
+ constraintsAsString + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + index;
result = prime * result + ( ( executable == null ) ? 0 : executable.hashCode() );
return result;
}
@Override
public boolean equals(Object obj) {
if ( this == obj ) {
return true;
}
if ( !super.equals( obj ) ) {
return false;
}
if ( getClass() != obj.getClass() ) {
return false;
}
ConstrainedParameter other = (ConstrainedParameter) obj;
if ( index != other.index ) {
return false;
}
if ( executable == null ) {
if ( other.executable != null ) {
return false;
}
}
else if ( !executable.equals( other.executable ) ) {
return false;
}
return true;
}
}