All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.validator.internal.metadata.aggregated.AbstractPropertyCascadable Maven / Gradle / Ivy

There is a newer version: 8.0.1.Final
Show newest version
/*
 * Hibernate Validator, declare and validate application constraints
 *
 * License: Apache License, Version 2.0
 * See the license.txt file in the root directory or .
 */
package org.hibernate.validator.internal.metadata.aggregated;

import java.lang.reflect.Type;

import org.hibernate.validator.internal.engine.path.PathImpl;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.facets.Cascadable;
import org.hibernate.validator.internal.properties.Field;
import org.hibernate.validator.internal.properties.Getter;
import org.hibernate.validator.internal.properties.Property;
import org.hibernate.validator.internal.properties.PropertyAccessor;

/**
 * A {@link Cascadable} backed by a property of a Java bean.
 *
 * @author Gunnar Morling
 * @author Marko Bekhta
 */
public abstract class AbstractPropertyCascadable implements Cascadable {

	private final T property;
	private final PropertyAccessor propertyAccessor;
	private final Type cascadableType;
	private final CascadingMetaData cascadingMetaData;

	AbstractPropertyCascadable(T property, CascadingMetaData cascadingMetaData) {
		this.property = property;
		this.propertyAccessor = property.createAccessor();
		this.cascadableType = property.getType();
		this.cascadingMetaData = cascadingMetaData;
	}

	@Override
	public Type getCascadableType() {
		return cascadableType;
	}

	@Override
	public Object getValue(Object parent) {
		return propertyAccessor.getValueFrom( parent );
	}

	@Override
	public void appendTo(PathImpl path) {
		path.addPropertyNode( property.getPropertyName() );
	}

	@Override
	public CascadingMetaData getCascadingMetaData() {
		return cascadingMetaData;
	}

	public abstract static class AbstractBuilder implements Cascadable.Builder {

		private final ValueExtractorManager valueExtractorManager;
		private final T property;
		private CascadingMetaDataBuilder cascadingMetaDataBuilder;

		protected AbstractBuilder(ValueExtractorManager valueExtractorManager, T property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
			this.valueExtractorManager = valueExtractorManager;
			this.property = property;
			this.cascadingMetaDataBuilder = cascadingMetaDataBuilder;
		}

		@Override
		public void mergeCascadingMetaData(CascadingMetaDataBuilder cascadingMetaData) {
			this.cascadingMetaDataBuilder = this.cascadingMetaDataBuilder.merge( cascadingMetaData );
		}

		@Override
		public Cascadable build() {
			return create( property, cascadingMetaDataBuilder.build( valueExtractorManager, property ) );
		}

		protected abstract Cascadable create(T property, CascadingMetaData build);

		public static Cascadable.Builder builder(ValueExtractorManager valueExtractorManager, Property property,
				CascadingMetaDataBuilder cascadingMetaDataBuilder) {
			if ( property instanceof Field ) {
				return new FieldCascadable.Builder( valueExtractorManager, (Field) property, cascadingMetaDataBuilder );
			}
			else if ( property instanceof Getter ) {
				return new GetterCascadable.Builder( valueExtractorManager, (Getter) property, cascadingMetaDataBuilder );
			}
			throw new IllegalStateException( "It should be either a field or a getter." );
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy