package org.hibernate.metamodel.source.annotations.attribute; import org.jboss.jandex.AnnotationInstance; import org.hibernate.AssertionFailure; import org.hibernate.internal.util.StringHelper; import org.hibernate.metamodel.source.annotations.JPADotNames; import org.hibernate.metamodel.source.annotations.JandexHelper; /** * Contains the information about a single {@link javax.persistence.AttributeOverride}. Instances of this class * are creating during annotation processing and then applied onto the persistence attributes. * * @author Hardy Ferentschik * @todo Take care of prefixes of the form 'element', 'key' and 'value'. Add another type enum to handle this. (HF) */ public class AttributeOverride { private static final String PROPERTY_PATH_SEPARATOR = "."; private final ColumnValues columnValues; private final String attributePath; public AttributeOverride(AnnotationInstance attributeOverrideAnnotation) { this( null, attributeOverrideAnnotation ); } public AttributeOverride(String prefix, AnnotationInstance attributeOverrideAnnotation) { if ( attributeOverrideAnnotation == null ) { throw new IllegalArgumentException( "An AnnotationInstance needs to be passed" ); } if ( !JPADotNames.ATTRIBUTE_OVERRIDE.equals( attributeOverrideAnnotation.name() ) ) { throw new AssertionFailure( "A @AttributeOverride annotation needs to be passed to the constructor" ); } columnValues = new ColumnValues( JandexHelper.getValue( attributeOverrideAnnotation, "column", AnnotationInstance.class ) ); attributePath = createAttributePath( prefix, JandexHelper.getValue( attributeOverrideAnnotation, "name", String.class ) ); } public ColumnValues getColumnValues() { return columnValues; } public String getAttributePath() { return attributePath; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append( "AttributeOverride" ); sb.append( "{columnValues=" ).append( columnValues ); sb.append( ", attributePath='" ).append( attributePath ).append( '\'' ); sb.append( '}' ); return sb.toString(); } @Override public boolean equals(Object o) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } AttributeOverride that = (AttributeOverride) o; if ( attributePath != null ? !attributePath.equals( that.attributePath ) : that.attributePath != null ) { return false; } if ( columnValues != null ? !columnValues.equals( that.columnValues ) : that.columnValues != null ) { return false; } return true; } @Override public int hashCode() { int result = columnValues != null ? columnValues.hashCode() : 0; result = 31 * result + ( attributePath != null ? attributePath.hashCode() : 0 ); return result; } private String createAttributePath(String prefix, String name) { String path = ""; if ( StringHelper.isNotEmpty( prefix ) ) { path += prefix; } if ( StringHelper.isNotEmpty( path ) && !path.endsWith( PROPERTY_PATH_SEPARATOR ) ) { path += PROPERTY_PATH_SEPARATOR; } path += name; return path; } }