Skip to content

Commit

Permalink
HV-1487 Avoid some code duplication
Browse files Browse the repository at this point in the history
  • Loading branch information
gsmet authored and gunnarmorling committed Oct 18, 2017
1 parent 1ceb8a0 commit 93e563b
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 85 deletions.
@@ -0,0 +1,56 @@
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.internal.engine.resolver;

import javax.validation.Path;

abstract class AbstractTraversableHolder {

private final Object traversableObject;
private final Path.Node traversableProperty;
private final int hashCode;

protected AbstractTraversableHolder(Object traversableObject, Path.Node traversableProperty) {
this.traversableObject = traversableObject;
this.traversableProperty = traversableProperty;
this.hashCode = buildHashCode();
}

@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || !( o instanceof AbstractTraversableHolder ) ) {
return false;
}

AbstractTraversableHolder that = (AbstractTraversableHolder) o;

if ( traversableObject != null ? !traversableObject.equals( that.traversableObject ) : that.traversableObject != null ) {
return false;
}
if ( !traversableProperty.equals( that.traversableProperty ) ) {
return false;
}

return true;
}

@Override
public int hashCode() {
return hashCode;
}

public int buildHashCode() {
// HV-1013 Using identity hash code in order to avoid calling hashCode() of objects which may
// be handling null properties not correctly
int result = traversableObject != null ? System.identityHashCode( traversableObject ) : 0;
result = 31 * result + traversableProperty.hashCode();
return result;
}
}
Expand Up @@ -56,50 +56,10 @@ public boolean isCascadable(Object traversableObject, Path.Node traversablePrope
return true;
}

private static final class TraversableHolder {

private final Object traversableObject;
private final Path.Node traversableProperty;
private final int hashCode;
private static class TraversableHolder extends AbstractTraversableHolder {

private TraversableHolder(Object traversableObject, Path.Node traversableProperty) {
this.traversableObject = traversableObject;
this.traversableProperty = traversableProperty;
this.hashCode = buildHashCode();
}

@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || TraversableHolder.class != o.getClass() ) {
return false;
}

TraversableHolder that = (TraversableHolder) o;

if ( traversableObject != null ? !traversableObject.equals( that.traversableObject ) : that.traversableObject != null ) {
return false;
}
if ( !traversableProperty.equals( that.traversableProperty ) ) {
return false;
}

return true;
}

@Override
public int hashCode() {
return hashCode;
}

public int buildHashCode() {
// HV-1013 Using identity hash code in order to avoid calling hashCode() of objects which may
// be handling null properties not correctly
int result = traversableObject != null ? System.identityHashCode( traversableObject ) : 0;
result = 31 * result + traversableProperty.hashCode();
return result;
super( traversableObject, traversableProperty );
}
}
}
Expand Up @@ -21,7 +21,9 @@
* @author Emmanuel Bernard
*/
class CachingTraversableResolverForSingleValidation implements TraversableResolver {

private final TraversableResolver delegate;

private final Map<TraversableHolder, TraversableHolder> traversables = new HashMap<TraversableHolder, TraversableHolder>();

public CachingTraversableResolverForSingleValidation(TraversableResolver delegate) {
Expand Down Expand Up @@ -83,53 +85,12 @@ else if ( cachedLH.isCascadable == null ) {
return cachedLH.isCascadable;
}

private static final class TraversableHolder {
private final Object traversableObject;
private final Path.Node traversableProperty;
private final int hashCode;

private static final class TraversableHolder extends AbstractTraversableHolder {
private Boolean isReachable;
private Boolean isCascadable;


private TraversableHolder(Object traversableObject, Path.Node traversableProperty) {
this.traversableObject = traversableObject;
this.traversableProperty = traversableProperty;
this.hashCode = buildHashCode();
}

@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || getClass() != o.getClass() ) {
return false;
}

TraversableHolder that = (TraversableHolder) o;

if ( traversableObject != null ? !traversableObject.equals( that.traversableObject ) : that.traversableObject != null ) {
return false;
}
if ( !traversableProperty.equals( that.traversableProperty ) ) {
return false;
}

return true;
}

@Override
public int hashCode() {
return hashCode;
}

public int buildHashCode() {
// HV-1013 Using identity hash code in order to avoid calling hashCode() of objects which may
// be handling null properties not correctly
int result = traversableObject != null ? System.identityHashCode( traversableObject ) : 0;
result = 31 * result + traversableProperty.hashCode();
return result;
super( traversableObject, traversableProperty );
}
}
}

0 comments on commit 93e563b

Please sign in to comment.