HHH-6113 mock global configurations to annotation
This commit is contained in:
parent
52b2930b47
commit
b30024ee9d
|
@ -0,0 +1,19 @@
|
||||||
|
package org.hibernate.metamodel.source.annotations.xml;
|
||||||
|
|
||||||
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public interface MockedNames {
|
||||||
|
public static final DotName DEFAULT_ACCESS = DotName.createSimple( "default.access" );
|
||||||
|
public static final DotName DEFAULT_DELIMITED_IDENTIFIERS = DotName.createSimple( "default.delimited.identifiers" );
|
||||||
|
public static final DotName DEFAULT_ENTITY_LISTENERS = DotName.createSimple( "default.entity.listeners" );
|
||||||
|
public static final DotName DEFAULT_POST_LOAD = DotName.createSimple( "default.entity.listener.post.load" );
|
||||||
|
public static final DotName DEFAULT_POST_PERSIST = DotName.createSimple( "default.entity.listener.post.persist" );
|
||||||
|
public static final DotName DEFAULT_POST_REMOVE = DotName.createSimple( "default.entity.listener.post.remove" );
|
||||||
|
public static final DotName DEFAULT_POST_UPDATE = DotName.createSimple( "default.entity.listener.post.update" );
|
||||||
|
public static final DotName DEFAULT_PRE_PERSIST = DotName.createSimple( "default.entity.listener.pre.persist" );
|
||||||
|
public static final DotName DEFAULT_PRE_REMOVE = DotName.createSimple( "default.entity.listener.pre.remove" );
|
||||||
|
public static final DotName DEFAULT_PRE_UPDATE = DotName.createSimple( "default.entity.listener.pre.update" );
|
||||||
|
}
|
|
@ -24,29 +24,14 @@
|
||||||
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.jboss.jandex.AnnotationInstance;
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.AnnotationTarget;
|
import org.jboss.jandex.AnnotationTarget;
|
||||||
import org.jboss.jandex.AnnotationValue;
|
import org.jboss.jandex.AnnotationValue;
|
||||||
import org.jboss.jandex.DotName;
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
import org.hibernate.AssertionFailure;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLAccessType;
|
import org.hibernate.metamodel.source.annotation.xml.XMLAccessType;
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLAssociationOverride;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLAttributeOverride;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLCollectionTable;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLColumn;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLEnumType;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLJoinColumn;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLJoinTable;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLLob;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLOrderColumn;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLPrimaryKeyJoinColumn;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLTemporalType;
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLUniqueConstraint;
|
import org.hibernate.metamodel.source.annotation.xml.XMLUniqueConstraint;
|
||||||
import org.hibernate.metamodel.source.annotations.JPADotNames;
|
import org.hibernate.metamodel.source.annotations.JPADotNames;
|
||||||
|
|
||||||
|
@ -62,45 +47,9 @@ abstract class AbstractMocker implements JPADotNames {
|
||||||
this.indexBuilder = indexBuilder;
|
this.indexBuilder = indexBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract protected EntityMappingsMocker.Default getDefaults();
|
|
||||||
|
|
||||||
/**
|
abstract protected AnnotationInstance push(AnnotationInstance annotationInstance);
|
||||||
* @return DotName as the key for the ClassInfo object this mocker created that being push to.
|
|
||||||
*/
|
|
||||||
abstract protected DotName getTargetName();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Default Annotation Target for #{create} and #{mocker} methods.
|
|
||||||
*/
|
|
||||||
abstract protected AnnotationTarget getTarget();
|
|
||||||
|
|
||||||
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
|
||||||
if ( annotationInstance != null ) {
|
|
||||||
indexBuilder.addAnnotationInstance( getTargetName(), annotationInstance );
|
|
||||||
}
|
|
||||||
return annotationInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create simple AnnotationInstance with empty annotation value.
|
|
||||||
* AnnotationInstance's target is get from #{getTarget}
|
|
||||||
*
|
|
||||||
* @param name annotation name
|
|
||||||
*
|
|
||||||
* @return annotationInstance which name is , target is from #{getTarget}, and has no annotation values.
|
|
||||||
*/
|
|
||||||
protected AnnotationInstance create(DotName name) {
|
|
||||||
return create( name, MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance create(DotName name, AnnotationValue[] annotationValues) {
|
|
||||||
return create( name, getTarget(), annotationValues );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance create(DotName name, List<AnnotationValue> annotationValueList) {
|
|
||||||
return create( name, getTarget(), annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance create(DotName name, AnnotationTarget target) {
|
protected AnnotationInstance create(DotName name, AnnotationTarget target) {
|
||||||
return create( name, target, MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY );
|
return create( name, target, MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY );
|
||||||
|
@ -113,335 +62,24 @@ abstract class AbstractMocker implements JPADotNames {
|
||||||
|
|
||||||
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
|
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
|
||||||
AnnotationInstance annotationInstance = MockHelper.create( name, target, annotationValues );
|
AnnotationInstance annotationInstance = MockHelper.create( name, target, annotationValues );
|
||||||
if ( target != null ) {
|
push( annotationInstance );
|
||||||
push( annotationInstance );
|
|
||||||
}
|
|
||||||
return annotationInstance;
|
return annotationInstance;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
//@Column
|
protected AnnotationInstance parserAccessType(XMLAccessType accessType, AnnotationTarget target) {
|
||||||
protected AnnotationInstance parserColumn(XMLColumn column, AnnotationTarget target) {
|
if ( accessType == null ) {
|
||||||
if ( column == null ) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
return create( ACCESS, target, MockHelper.enumValueArray( "value", ACCESS_TYPE, accessType ) );
|
||||||
MockHelper.stringValue( "name", column.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "columnDefinition", column.getColumnDefinition(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "table", column.getTable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "unique", column.isUnique(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "nullable", column.isNullable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "insertable", column.isInsertable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "updatable", column.isUpdatable(), annotationValueList );
|
|
||||||
MockHelper.integerValue( "length", column.getLength(), annotationValueList );
|
|
||||||
MockHelper.integerValue( "precision", column.getPrecision(), annotationValueList );
|
|
||||||
MockHelper.integerValue( "scale", column.getScale(), annotationValueList );
|
|
||||||
return create( COLUMN, target, annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserTemporalType(XMLTemporalType temporalType, AnnotationTarget target) {
|
|
||||||
if ( temporalType == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return create( TEMPORAL, target, MockHelper.enumValueArray( "value", TEMPORAL_TYPE, temporalType ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserEnumType(XMLEnumType enumerated, AnnotationTarget target) {
|
|
||||||
if ( enumerated == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return create( ENUMERATED, target, MockHelper.enumValueArray( "value", ENUM_TYPE, enumerated ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//@AttributeOverride
|
|
||||||
private AnnotationInstance parserAttributeOverride(XMLAttributeOverride attributeOverride, AnnotationTarget target) {
|
|
||||||
if ( attributeOverride == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", attributeOverride.getName(), annotationValueList );
|
|
||||||
if ( attributeOverride instanceof XMLAttributeOverrideProxy ) {
|
|
||||||
XMLAttributeOverrideProxy proxy = (XMLAttributeOverrideProxy) attributeOverride;
|
|
||||||
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getColumnAnnotationValue() );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
MockHelper.nestedAnnotationValue(
|
|
||||||
"column", parserColumn( attributeOverride.getColumn(), null ), annotationValueList
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return
|
|
||||||
create(
|
|
||||||
ATTRIBUTE_OVERRIDE, target, annotationValueList
|
|
||||||
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserPrimaryKeyJoinColumn(XMLPrimaryKeyJoinColumn primaryKeyJoinColumn, AnnotationTarget target) {
|
|
||||||
if ( primaryKeyJoinColumn == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", primaryKeyJoinColumn.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue(
|
|
||||||
"referencedColumnName", primaryKeyJoinColumn.getReferencedColumnName(), annotationValueList
|
|
||||||
);
|
|
||||||
MockHelper.stringValue(
|
|
||||||
"columnDefinition", primaryKeyJoinColumn.getColumnDefinition(), annotationValueList
|
|
||||||
);
|
|
||||||
return
|
|
||||||
create(
|
|
||||||
PRIMARY_KEY_JOIN_COLUMN, target, annotationValueList
|
|
||||||
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserPrimaryKeyJoinColumnList(List<XMLPrimaryKeyJoinColumn> primaryKeyJoinColumnList, AnnotationTarget target) {
|
|
||||||
if ( MockHelper.isNotEmpty( primaryKeyJoinColumnList ) ) {
|
|
||||||
if ( primaryKeyJoinColumnList.size() == 1 ) {
|
|
||||||
return parserPrimaryKeyJoinColumn( primaryKeyJoinColumnList.get( 0 ), target );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return create(
|
|
||||||
PRIMARY_KEY_JOIN_COLUMNS,
|
|
||||||
target,
|
|
||||||
nestedPrimaryKeyJoinColumnList( "value", primaryKeyJoinColumnList, null )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationValue[] nestedPrimaryKeyJoinColumnList(String name, List<XMLPrimaryKeyJoinColumn> constraints, List<AnnotationValue> annotationValueList) {
|
|
||||||
if ( MockHelper.isNotEmpty( constraints ) ) {
|
|
||||||
AnnotationValue[] values = new AnnotationValue[constraints.size()];
|
|
||||||
for ( int i = 0; i < constraints.size(); i++ ) {
|
|
||||||
AnnotationInstance annotationInstance = parserPrimaryKeyJoinColumn( constraints.get( i ), null );
|
|
||||||
values[i] = MockHelper.nestedAnnotationValue(
|
|
||||||
"", annotationInstance
|
|
||||||
);
|
|
||||||
}
|
|
||||||
MockHelper.addToCollectionIfNotNull(
|
|
||||||
annotationValueList, AnnotationValue.createArrayValue( name, values )
|
|
||||||
);
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
return MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void getAnnotationInstanceByTarget(DotName annName, AnnotationTarget target, Operation operation) {
|
|
||||||
Map<DotName, List<AnnotationInstance>> annotatedMap = indexBuilder.getIndexedAnnotations( getTargetName() );
|
|
||||||
if ( !annotatedMap.containsKey( annName ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
List<AnnotationInstance> annotationInstanceList = annotatedMap.get( annName );
|
|
||||||
if ( MockHelper.isNotEmpty( annotationInstanceList ) ) {
|
|
||||||
for ( AnnotationInstance annotationInstance : annotationInstanceList ) {
|
|
||||||
AnnotationTarget annotationTarget = annotationInstance.target();
|
|
||||||
if ( MockHelper.targetEquals( target, annotationTarget ) ) {
|
|
||||||
if ( operation.process( annotationInstance ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected interface Operation {
|
|
||||||
boolean process(AnnotationInstance annotationInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ContainerOperation implements Operation {
|
|
||||||
private Operation child;
|
|
||||||
|
|
||||||
ContainerOperation(Operation child) {
|
|
||||||
this.child = child;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean process(AnnotationInstance annotationInstance) {
|
|
||||||
AnnotationValue value = annotationInstance.value();
|
|
||||||
AnnotationInstance[] indexedAttributeOverridesValues = value.asNestedArray();
|
|
||||||
for ( AnnotationInstance ai : indexedAttributeOverridesValues ) {
|
|
||||||
child.process( ai );
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AttributeOverrideOperation implements Operation {
|
|
||||||
private Set<String> names;
|
|
||||||
private List<XMLAttributeOverride> attributeOverrides;
|
|
||||||
|
|
||||||
AttributeOverrideOperation(Set<String> names, List<XMLAttributeOverride> attributeOverrides) {
|
|
||||||
this.names = names;
|
|
||||||
this.attributeOverrides = attributeOverrides;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean process(AnnotationInstance annotationInstance) {
|
|
||||||
String name = annotationInstance.value( "name" ).asString();
|
|
||||||
if ( !names.contains( name ) ) {
|
|
||||||
XMLAttributeOverrideProxy attributeOverride = new XMLAttributeOverrideProxy();
|
|
||||||
attributeOverride.setName( name );
|
|
||||||
attributeOverride.setColumnAnnotationValue( annotationInstance.value( "column" ) );
|
|
||||||
attributeOverrides.add( attributeOverride );
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserAttributeOverrides(List<XMLAttributeOverride> attributeOverrides, AnnotationTarget target) {
|
|
||||||
if ( target == null ) {
|
|
||||||
throw new AssertionFailure( "target can not be null" );
|
|
||||||
}
|
|
||||||
if ( attributeOverrides == null || attributeOverrides.isEmpty() ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
Set<String> names = new HashSet<String>();
|
|
||||||
for ( XMLAttributeOverride attributeOverride : attributeOverrides ) {
|
|
||||||
names.add( attributeOverride.getName() );
|
|
||||||
}
|
|
||||||
Operation operation = new AttributeOverrideOperation( names, attributeOverrides );
|
|
||||||
getAnnotationInstanceByTarget(
|
|
||||||
ATTRIBUTE_OVERRIDES, target, new ContainerOperation( operation )
|
|
||||||
);
|
|
||||||
getAnnotationInstanceByTarget(
|
|
||||||
ATTRIBUTE_OVERRIDE, target, operation
|
|
||||||
);
|
|
||||||
if ( attributeOverrides.size() == 1 ) {
|
|
||||||
return parserAttributeOverride( attributeOverrides.get( 0 ), target );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
AnnotationValue[] values = new AnnotationValue[attributeOverrides.size()];
|
|
||||||
for ( int i = 0; i < values.length; i++ ) {
|
|
||||||
values[i] = MockHelper.nestedAnnotationValue(
|
|
||||||
"", parserAttributeOverride( attributeOverrides.get( i ), null )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return create(
|
|
||||||
ATTRIBUTE_OVERRIDES,
|
|
||||||
target,
|
|
||||||
new AnnotationValue[] { AnnotationValue.createArrayValue( "value", values ) }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AssociationOverrideOperation implements Operation {
|
|
||||||
private Set<String> names;
|
|
||||||
private List<XMLAssociationOverride> associationOverrides;
|
|
||||||
|
|
||||||
AssociationOverrideOperation(Set<String> names, List<XMLAssociationOverride> associationOverrides) {
|
|
||||||
this.names = names;
|
|
||||||
this.associationOverrides = associationOverrides;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean process(AnnotationInstance annotationInstance) {
|
|
||||||
String name = annotationInstance.value( "name" ).asString();
|
|
||||||
if ( !names.contains( name ) ) {
|
|
||||||
XMLAssociationOverrideProxy associationOverride = new XMLAssociationOverrideProxy();
|
|
||||||
associationOverride.setName( name );
|
|
||||||
associationOverride.setJoinColumnsAnnotationValue( annotationInstance.value( "joinColumns" ) );
|
|
||||||
associationOverride.setJoinTableAnnotationValue( annotationInstance.value( "joinTable" ) );
|
|
||||||
associationOverrides.add( associationOverride );
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserAssociationOverrides(List<XMLAssociationOverride> associationOverrides, AnnotationTarget target) {
|
|
||||||
if ( target == null ) {
|
|
||||||
throw new AssertionFailure( "target can not be null" );
|
|
||||||
}
|
|
||||||
if ( associationOverrides == null || associationOverrides.isEmpty() ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<String> names = new HashSet<String>();
|
|
||||||
for ( XMLAssociationOverride associationOverride : associationOverrides ) {
|
|
||||||
names.add( associationOverride.getName() );
|
|
||||||
}
|
|
||||||
Operation operation = new AssociationOverrideOperation( names, associationOverrides );
|
|
||||||
getAnnotationInstanceByTarget(
|
|
||||||
ASSOCIATION_OVERRIDES, target, new ContainerOperation( operation )
|
|
||||||
);
|
|
||||||
getAnnotationInstanceByTarget(
|
|
||||||
ASSOCIATION_OVERRIDE, target, operation
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
if ( associationOverrides.size() == 1 ) {
|
|
||||||
return parserAssociationOverride( associationOverrides.get( 0 ), target );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
AnnotationValue[] values = new AnnotationValue[associationOverrides.size()];
|
|
||||||
for ( int i = 0; i < values.length; i++ ) {
|
|
||||||
values[i] = MockHelper.nestedAnnotationValue(
|
|
||||||
"", parserAssociationOverride( associationOverrides.get( i ), null )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return create(
|
|
||||||
ASSOCIATION_OVERRIDES,
|
|
||||||
target,
|
|
||||||
new AnnotationValue[] { AnnotationValue.createArrayValue( "value", values ) }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//@AssociationOverride
|
|
||||||
private AnnotationInstance parserAssociationOverride(XMLAssociationOverride associationOverride, AnnotationTarget target) {
|
|
||||||
if ( associationOverride == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", associationOverride.getName(), annotationValueList );
|
|
||||||
if ( associationOverride instanceof XMLAssociationOverrideProxy ) {
|
|
||||||
XMLAssociationOverrideProxy proxy = (XMLAssociationOverrideProxy) associationOverride;
|
|
||||||
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getJoinColumnsAnnotationValue() );
|
|
||||||
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getJoinTableAnnotationValue() );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nestedJoinColumnList(
|
|
||||||
"joinColumns", associationOverride.getJoinColumn(), annotationValueList
|
|
||||||
);
|
|
||||||
MockHelper.nestedAnnotationValue(
|
|
||||||
"joinTable", parserJoinTable( associationOverride.getJoinTable(), null ), annotationValueList
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return create( ASSOCIATION_OVERRIDE, target, annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
//@JoinTable
|
|
||||||
protected AnnotationInstance parserJoinTable(XMLJoinTable joinTable, AnnotationTarget target) {
|
|
||||||
if ( joinTable == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
MockHelper.updateSchema( new SchemaAware.JoinTableSchemaAware( joinTable ), getDefaults() );
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", joinTable.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "catalog", joinTable.getCatalog(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "schema", joinTable.getSchema(), annotationValueList );
|
|
||||||
nestedJoinColumnList( "joinColumns", joinTable.getJoinColumn(), annotationValueList );
|
|
||||||
nestedJoinColumnList(
|
|
||||||
"inverseJoinColumns", joinTable.getInverseJoinColumn(), annotationValueList
|
|
||||||
);
|
|
||||||
nestedUniqueConstraintList(
|
|
||||||
"uniqueConstraints", joinTable.getUniqueConstraint(), annotationValueList
|
|
||||||
);
|
|
||||||
return create( JOIN_TABLE, target, annotationValueList );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void nestedUniqueConstraintList(String name, List<XMLUniqueConstraint> constraints, List<AnnotationValue> annotationValueList) {
|
protected void nestedUniqueConstraintList(String name, List<XMLUniqueConstraint> constraints, List<AnnotationValue> annotationValueList) {
|
||||||
if ( MockHelper.isNotEmpty( constraints ) ) {
|
if ( MockHelper.isNotEmpty( constraints ) ) {
|
||||||
AnnotationValue[] values = new AnnotationValue[constraints.size()];
|
AnnotationValue[] values = new AnnotationValue[constraints.size()];
|
||||||
for ( int i = 0; i < constraints.size(); i++ ) {
|
for ( int i = 0; i < constraints.size(); i++ ) {
|
||||||
AnnotationInstance annotationInstance = parserUniqueConstraint( constraints.get( i ) );
|
AnnotationInstance annotationInstance = parserUniqueConstraint( constraints.get( i ), null );
|
||||||
values[i] = MockHelper.nestedAnnotationValue(
|
values[i] = MockHelper.nestedAnnotationValue(
|
||||||
"", annotationInstance
|
"", annotationInstance
|
||||||
);
|
);
|
||||||
|
@ -454,7 +92,7 @@ abstract class AbstractMocker implements JPADotNames {
|
||||||
}
|
}
|
||||||
|
|
||||||
//@UniqueConstraint
|
//@UniqueConstraint
|
||||||
protected AnnotationInstance parserUniqueConstraint(XMLUniqueConstraint uniqueConstraint) {
|
protected AnnotationInstance parserUniqueConstraint(XMLUniqueConstraint uniqueConstraint, AnnotationTarget target) {
|
||||||
if ( uniqueConstraint == null ) {
|
if ( uniqueConstraint == null ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -463,105 +101,10 @@ abstract class AbstractMocker implements JPADotNames {
|
||||||
MockHelper.stringArrayValue( "columnNames", uniqueConstraint.getColumnName(), annotationValueList );
|
MockHelper.stringArrayValue( "columnNames", uniqueConstraint.getColumnName(), annotationValueList );
|
||||||
return
|
return
|
||||||
create(
|
create(
|
||||||
UNIQUE_CONSTRAINT,
|
UNIQUE_CONSTRAINT, target,
|
||||||
annotationValueList
|
annotationValueList
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected AnnotationInstance parserAccessType(XMLAccessType accessType, AnnotationTarget target) {
|
|
||||||
if ( accessType == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return create( ACCESS, target, MockHelper.enumValueArray( "value", ACCESS_TYPE, accessType ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserCollectionTable(XMLCollectionTable collectionTable, AnnotationTarget target) {
|
|
||||||
if ( collectionTable == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
MockHelper.updateSchema( new SchemaAware.CollectionTableSchemaAware( collectionTable ), getDefaults() );
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", collectionTable.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "catalog", collectionTable.getCatalog(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "schema", collectionTable.getSchema(), annotationValueList );
|
|
||||||
nestedJoinColumnList( "joinColumns", collectionTable.getJoinColumn(), annotationValueList );
|
|
||||||
nestedUniqueConstraintList( "uniqueConstraints", collectionTable.getUniqueConstraint(), annotationValueList );
|
|
||||||
return create( COLLECTION_TABLE, target, annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
private AnnotationValue[] nestedJoinColumnList(String name, List<XMLJoinColumn> columns, List<AnnotationValue> annotationValueList) {
|
|
||||||
if ( MockHelper.isNotEmpty( columns ) ) {
|
|
||||||
AnnotationValue[] values = new AnnotationValue[columns.size()];
|
|
||||||
for ( int i = 0; i < columns.size(); i++ ) {
|
|
||||||
AnnotationInstance annotationInstance = parserJoinColumn( columns.get( i ), null );
|
|
||||||
values[i] = MockHelper.nestedAnnotationValue(
|
|
||||||
"", annotationInstance
|
|
||||||
);
|
|
||||||
}
|
|
||||||
MockHelper.addToCollectionIfNotNull(
|
|
||||||
annotationValueList, AnnotationValue.createArrayValue( name, values )
|
|
||||||
);
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
return MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserJoinColumnList(List<XMLJoinColumn> joinColumnList, AnnotationTarget target) {
|
|
||||||
if ( MockHelper.isNotEmpty( joinColumnList ) ) {
|
|
||||||
if ( joinColumnList.size() == 1 ) {
|
|
||||||
return parserJoinColumn( joinColumnList.get( 0 ), target );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
AnnotationValue[] values = nestedJoinColumnList( "value", joinColumnList, null );
|
|
||||||
return create(
|
|
||||||
JOIN_COLUMNS,
|
|
||||||
target,
|
|
||||||
values
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserOrderColumn(XMLOrderColumn orderColumn, AnnotationTarget target) {
|
|
||||||
if ( orderColumn == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", orderColumn.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "columnDefinition", orderColumn.getColumnDefinition(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "nullable", orderColumn.isNullable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "insertable", orderColumn.isInsertable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "updatable", orderColumn.isUpdatable(), annotationValueList );
|
|
||||||
return create( ORDER_COLUMN, target, annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
//@JoinColumn
|
|
||||||
protected AnnotationInstance parserJoinColumn(XMLJoinColumn column, AnnotationTarget target) {
|
|
||||||
if ( column == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
|
||||||
MockHelper.stringValue( "name", column.getName(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "columnDefinition", column.getColumnDefinition(), annotationValueList );
|
|
||||||
MockHelper.stringValue( "table", column.getTable(), annotationValueList );
|
|
||||||
MockHelper.stringValue(
|
|
||||||
"referencedColumnName", column.getReferencedColumnName(), annotationValueList
|
|
||||||
);
|
|
||||||
MockHelper.booleanValue( "unique", column.isUnique(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "nullable", column.isNullable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "insertable", column.isInsertable(), annotationValueList );
|
|
||||||
MockHelper.booleanValue( "updatable", column.isUpdatable(), annotationValueList );
|
|
||||||
return create( JOIN_COLUMN, target, annotationValueList );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected AnnotationInstance parserLob(XMLLob lob, AnnotationTarget target) {
|
|
||||||
if ( lob == null ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return create( LOB, target );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,30 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
|
import org.jboss.jandex.AnnotationTarget;
|
||||||
|
import org.jboss.jandex.AnnotationValue;
|
||||||
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
|
import org.hibernate.AssertionFailure;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLAssociationOverride;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLAttributeOverride;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLCollectionTable;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLColumn;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLEnumType;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLJoinColumn;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLJoinTable;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLLob;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLOrderColumn;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLPrimaryKeyJoinColumn;
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLTemporalType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Strong Liu
|
* @author Strong Liu
|
||||||
*/
|
*/
|
||||||
|
@ -36,7 +60,6 @@ abstract class AnnotationMocker extends AbstractMocker {
|
||||||
|
|
||||||
abstract void process();
|
abstract void process();
|
||||||
|
|
||||||
@Override
|
|
||||||
protected EntityMappingsMocker.Default getDefaults() {
|
protected EntityMappingsMocker.Default getDefaults() {
|
||||||
return defaults;
|
return defaults;
|
||||||
}
|
}
|
||||||
|
@ -44,4 +67,452 @@ abstract class AnnotationMocker extends AbstractMocker {
|
||||||
protected boolean isDefaultCascadePersist() {
|
protected boolean isDefaultCascadePersist() {
|
||||||
return defaults.getCascadePersist() != null && defaults.getCascadePersist();
|
return defaults.getCascadePersist() != null && defaults.getCascadePersist();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//@JoinTable
|
||||||
|
protected AnnotationInstance parserJoinTable(XMLJoinTable joinTable, AnnotationTarget target) {
|
||||||
|
if ( joinTable == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MockHelper.updateSchema( new SchemaAware.JoinTableSchemaAware( joinTable ), getDefaults() );
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", joinTable.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "catalog", joinTable.getCatalog(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "schema", joinTable.getSchema(), annotationValueList );
|
||||||
|
nestedJoinColumnList( "joinColumns", joinTable.getJoinColumn(), annotationValueList );
|
||||||
|
nestedJoinColumnList(
|
||||||
|
"inverseJoinColumns", joinTable.getInverseJoinColumn(), annotationValueList
|
||||||
|
);
|
||||||
|
nestedUniqueConstraintList(
|
||||||
|
"uniqueConstraints", joinTable.getUniqueConstraint(), annotationValueList
|
||||||
|
);
|
||||||
|
return create( JOIN_TABLE, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
//@AssociationOverride
|
||||||
|
private AnnotationInstance parserAssociationOverride(XMLAssociationOverride associationOverride, AnnotationTarget target) {
|
||||||
|
if ( associationOverride == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", associationOverride.getName(), annotationValueList );
|
||||||
|
if ( associationOverride instanceof XMLAssociationOverrideProxy ) {
|
||||||
|
XMLAssociationOverrideProxy proxy = (XMLAssociationOverrideProxy) associationOverride;
|
||||||
|
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getJoinColumnsAnnotationValue() );
|
||||||
|
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getJoinTableAnnotationValue() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nestedJoinColumnList(
|
||||||
|
"joinColumns", associationOverride.getJoinColumn(), annotationValueList
|
||||||
|
);
|
||||||
|
MockHelper.nestedAnnotationValue(
|
||||||
|
"joinTable", parserJoinTable( associationOverride.getJoinTable(), null ), annotationValueList
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return create( ASSOCIATION_OVERRIDE, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
private AnnotationValue[] nestedJoinColumnList(String name, List<XMLJoinColumn> columns, List<AnnotationValue> annotationValueList) {
|
||||||
|
if ( MockHelper.isNotEmpty( columns ) ) {
|
||||||
|
AnnotationValue[] values = new AnnotationValue[columns.size()];
|
||||||
|
for ( int i = 0; i < columns.size(); i++ ) {
|
||||||
|
AnnotationInstance annotationInstance = parserJoinColumn( columns.get( i ), null );
|
||||||
|
values[i] = MockHelper.nestedAnnotationValue(
|
||||||
|
"", annotationInstance
|
||||||
|
);
|
||||||
|
}
|
||||||
|
MockHelper.addToCollectionIfNotNull(
|
||||||
|
annotationValueList, AnnotationValue.createArrayValue( name, values )
|
||||||
|
);
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
return MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
//@Column
|
||||||
|
protected AnnotationInstance parserColumn(XMLColumn column, AnnotationTarget target) {
|
||||||
|
if ( column == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", column.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "columnDefinition", column.getColumnDefinition(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "table", column.getTable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "unique", column.isUnique(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "nullable", column.isNullable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "insertable", column.isInsertable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "updatable", column.isUpdatable(), annotationValueList );
|
||||||
|
MockHelper.integerValue( "length", column.getLength(), annotationValueList );
|
||||||
|
MockHelper.integerValue( "precision", column.getPrecision(), annotationValueList );
|
||||||
|
MockHelper.integerValue( "scale", column.getScale(), annotationValueList );
|
||||||
|
return create( COLUMN, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
//@AttributeOverride
|
||||||
|
private AnnotationInstance parserAttributeOverride(XMLAttributeOverride attributeOverride, AnnotationTarget target) {
|
||||||
|
if ( attributeOverride == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", attributeOverride.getName(), annotationValueList );
|
||||||
|
if ( attributeOverride instanceof XMLAttributeOverrideProxy ) {
|
||||||
|
XMLAttributeOverrideProxy proxy = (XMLAttributeOverrideProxy) attributeOverride;
|
||||||
|
MockHelper.addToCollectionIfNotNull( annotationValueList, proxy.getColumnAnnotationValue() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MockHelper.nestedAnnotationValue(
|
||||||
|
"column", parserColumn( attributeOverride.getColumn(), null ), annotationValueList
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return
|
||||||
|
create(
|
||||||
|
ATTRIBUTE_OVERRIDE, target, annotationValueList
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected AnnotationInstance parserOrderColumn(XMLOrderColumn orderColumn, AnnotationTarget target) {
|
||||||
|
if ( orderColumn == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", orderColumn.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "columnDefinition", orderColumn.getColumnDefinition(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "nullable", orderColumn.isNullable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "insertable", orderColumn.isInsertable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "updatable", orderColumn.isUpdatable(), annotationValueList );
|
||||||
|
return create( ORDER_COLUMN, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
//@JoinColumn
|
||||||
|
protected AnnotationInstance parserJoinColumn(XMLJoinColumn column, AnnotationTarget target) {
|
||||||
|
if ( column == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", column.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "columnDefinition", column.getColumnDefinition(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "table", column.getTable(), annotationValueList );
|
||||||
|
MockHelper.stringValue(
|
||||||
|
"referencedColumnName", column.getReferencedColumnName(), annotationValueList
|
||||||
|
);
|
||||||
|
MockHelper.booleanValue( "unique", column.isUnique(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "nullable", column.isNullable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "insertable", column.isInsertable(), annotationValueList );
|
||||||
|
MockHelper.booleanValue( "updatable", column.isUpdatable(), annotationValueList );
|
||||||
|
return create( JOIN_COLUMN, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserLob(XMLLob lob, AnnotationTarget target) {
|
||||||
|
if ( lob == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return create( LOB, target );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserTemporalType(XMLTemporalType temporalType, AnnotationTarget target) {
|
||||||
|
if ( temporalType == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return create( TEMPORAL, target, MockHelper.enumValueArray( "value", TEMPORAL_TYPE, temporalType ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserEnumType(XMLEnumType enumerated, AnnotationTarget target) {
|
||||||
|
if ( enumerated == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return create( ENUMERATED, target, MockHelper.enumValueArray( "value", ENUM_TYPE, enumerated ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected AnnotationInstance parserPrimaryKeyJoinColumn(XMLPrimaryKeyJoinColumn primaryKeyJoinColumn, AnnotationTarget target) {
|
||||||
|
if ( primaryKeyJoinColumn == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", primaryKeyJoinColumn.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue(
|
||||||
|
"referencedColumnName", primaryKeyJoinColumn.getReferencedColumnName(), annotationValueList
|
||||||
|
);
|
||||||
|
MockHelper.stringValue(
|
||||||
|
"columnDefinition", primaryKeyJoinColumn.getColumnDefinition(), annotationValueList
|
||||||
|
);
|
||||||
|
return
|
||||||
|
create(
|
||||||
|
PRIMARY_KEY_JOIN_COLUMN, target, annotationValueList
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserPrimaryKeyJoinColumnList(List<XMLPrimaryKeyJoinColumn> primaryKeyJoinColumnList, AnnotationTarget target) {
|
||||||
|
if ( MockHelper.isNotEmpty( primaryKeyJoinColumnList ) ) {
|
||||||
|
if ( primaryKeyJoinColumnList.size() == 1 ) {
|
||||||
|
return parserPrimaryKeyJoinColumn( primaryKeyJoinColumnList.get( 0 ), target );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return create(
|
||||||
|
PRIMARY_KEY_JOIN_COLUMNS,
|
||||||
|
target,
|
||||||
|
nestedPrimaryKeyJoinColumnList( "value", primaryKeyJoinColumnList, null )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationValue[] nestedPrimaryKeyJoinColumnList(String name, List<XMLPrimaryKeyJoinColumn> constraints, List<AnnotationValue> annotationValueList) {
|
||||||
|
if ( MockHelper.isNotEmpty( constraints ) ) {
|
||||||
|
AnnotationValue[] values = new AnnotationValue[constraints.size()];
|
||||||
|
for ( int i = 0; i < constraints.size(); i++ ) {
|
||||||
|
AnnotationInstance annotationInstance = parserPrimaryKeyJoinColumn( constraints.get( i ), null );
|
||||||
|
values[i] = MockHelper.nestedAnnotationValue(
|
||||||
|
"", annotationInstance
|
||||||
|
);
|
||||||
|
}
|
||||||
|
MockHelper.addToCollectionIfNotNull(
|
||||||
|
annotationValueList, AnnotationValue.createArrayValue( name, values )
|
||||||
|
);
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
return MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void getAnnotationInstanceByTarget(DotName annName, AnnotationTarget target, Operation operation) {
|
||||||
|
Map<DotName, List<AnnotationInstance>> annotatedMap = indexBuilder.getIndexedAnnotations( getTargetName() );
|
||||||
|
if ( !annotatedMap.containsKey( annName ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<AnnotationInstance> annotationInstanceList = annotatedMap.get( annName );
|
||||||
|
if ( MockHelper.isNotEmpty( annotationInstanceList ) ) {
|
||||||
|
for ( AnnotationInstance annotationInstance : annotationInstanceList ) {
|
||||||
|
AnnotationTarget annotationTarget = annotationInstance.target();
|
||||||
|
if ( MockHelper.targetEquals( target, annotationTarget ) ) {
|
||||||
|
if ( operation.process( annotationInstance ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected AnnotationInstance parserAttributeOverrides(List<XMLAttributeOverride> attributeOverrides, AnnotationTarget target) {
|
||||||
|
if ( target == null ) {
|
||||||
|
throw new AssertionFailure( "target can not be null" );
|
||||||
|
}
|
||||||
|
if ( attributeOverrides == null || attributeOverrides.isEmpty() ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Set<String> names = new HashSet<String>();
|
||||||
|
for ( XMLAttributeOverride attributeOverride : attributeOverrides ) {
|
||||||
|
names.add( attributeOverride.getName() );
|
||||||
|
}
|
||||||
|
Operation operation = new AttributeOverrideOperation( names, attributeOverrides );
|
||||||
|
getAnnotationInstanceByTarget(
|
||||||
|
ATTRIBUTE_OVERRIDES, target, new ContainerOperation( operation )
|
||||||
|
);
|
||||||
|
getAnnotationInstanceByTarget(
|
||||||
|
ATTRIBUTE_OVERRIDE, target, operation
|
||||||
|
);
|
||||||
|
if ( attributeOverrides.size() == 1 ) {
|
||||||
|
return parserAttributeOverride( attributeOverrides.get( 0 ), target );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AnnotationValue[] values = new AnnotationValue[attributeOverrides.size()];
|
||||||
|
for ( int i = 0; i < values.length; i++ ) {
|
||||||
|
values[i] = MockHelper.nestedAnnotationValue(
|
||||||
|
"", parserAttributeOverride( attributeOverrides.get( i ), null )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return create(
|
||||||
|
ATTRIBUTE_OVERRIDES,
|
||||||
|
target,
|
||||||
|
new AnnotationValue[] { AnnotationValue.createArrayValue( "value", values ) }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserAssociationOverrides(List<XMLAssociationOverride> associationOverrides, AnnotationTarget target) {
|
||||||
|
if ( target == null ) {
|
||||||
|
throw new AssertionFailure( "target can not be null" );
|
||||||
|
}
|
||||||
|
if ( associationOverrides == null || associationOverrides.isEmpty() ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> names = new HashSet<String>();
|
||||||
|
for ( XMLAssociationOverride associationOverride : associationOverrides ) {
|
||||||
|
names.add( associationOverride.getName() );
|
||||||
|
}
|
||||||
|
Operation operation = new AssociationOverrideOperation( names, associationOverrides );
|
||||||
|
getAnnotationInstanceByTarget(
|
||||||
|
ASSOCIATION_OVERRIDES, target, new ContainerOperation( operation )
|
||||||
|
);
|
||||||
|
getAnnotationInstanceByTarget(
|
||||||
|
ASSOCIATION_OVERRIDE, target, operation
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
if ( associationOverrides.size() == 1 ) {
|
||||||
|
return parserAssociationOverride( associationOverrides.get( 0 ), target );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AnnotationValue[] values = new AnnotationValue[associationOverrides.size()];
|
||||||
|
for ( int i = 0; i < values.length; i++ ) {
|
||||||
|
values[i] = MockHelper.nestedAnnotationValue(
|
||||||
|
"", parserAssociationOverride( associationOverrides.get( i ), null )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return create(
|
||||||
|
ASSOCIATION_OVERRIDES,
|
||||||
|
target,
|
||||||
|
new AnnotationValue[] { AnnotationValue.createArrayValue( "value", values ) }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance parserCollectionTable(XMLCollectionTable collectionTable, AnnotationTarget target) {
|
||||||
|
if ( collectionTable == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MockHelper.updateSchema( new SchemaAware.CollectionTableSchemaAware( collectionTable ), getDefaults() );
|
||||||
|
List<AnnotationValue> annotationValueList = new ArrayList<AnnotationValue>();
|
||||||
|
MockHelper.stringValue( "name", collectionTable.getName(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "catalog", collectionTable.getCatalog(), annotationValueList );
|
||||||
|
MockHelper.stringValue( "schema", collectionTable.getSchema(), annotationValueList );
|
||||||
|
nestedJoinColumnList( "joinColumns", collectionTable.getJoinColumn(), annotationValueList );
|
||||||
|
nestedUniqueConstraintList( "uniqueConstraints", collectionTable.getUniqueConstraint(), annotationValueList );
|
||||||
|
return create( COLLECTION_TABLE, target, annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected AnnotationInstance parserJoinColumnList(List<XMLJoinColumn> joinColumnList, AnnotationTarget target) {
|
||||||
|
if ( MockHelper.isNotEmpty( joinColumnList ) ) {
|
||||||
|
if ( joinColumnList.size() == 1 ) {
|
||||||
|
return parserJoinColumn( joinColumnList.get( 0 ), target );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AnnotationValue[] values = nestedJoinColumnList( "value", joinColumnList, null );
|
||||||
|
return create(
|
||||||
|
JOIN_COLUMNS,
|
||||||
|
target,
|
||||||
|
values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected interface Operation {
|
||||||
|
boolean process(AnnotationInstance annotationInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ContainerOperation implements Operation {
|
||||||
|
private Operation child;
|
||||||
|
|
||||||
|
ContainerOperation(Operation child) {
|
||||||
|
this.child = child;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(AnnotationInstance annotationInstance) {
|
||||||
|
AnnotationValue value = annotationInstance.value();
|
||||||
|
AnnotationInstance[] indexedAttributeOverridesValues = value.asNestedArray();
|
||||||
|
for ( AnnotationInstance ai : indexedAttributeOverridesValues ) {
|
||||||
|
child.process( ai );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AttributeOverrideOperation implements Operation {
|
||||||
|
private Set<String> names;
|
||||||
|
private List<XMLAttributeOverride> attributeOverrides;
|
||||||
|
|
||||||
|
AttributeOverrideOperation(Set<String> names, List<XMLAttributeOverride> attributeOverrides) {
|
||||||
|
this.names = names;
|
||||||
|
this.attributeOverrides = attributeOverrides;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(AnnotationInstance annotationInstance) {
|
||||||
|
String name = annotationInstance.value( "name" ).asString();
|
||||||
|
if ( !names.contains( name ) ) {
|
||||||
|
XMLAttributeOverrideProxy attributeOverride = new XMLAttributeOverrideProxy();
|
||||||
|
attributeOverride.setName( name );
|
||||||
|
attributeOverride.setColumnAnnotationValue( annotationInstance.value( "column" ) );
|
||||||
|
attributeOverrides.add( attributeOverride );
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AssociationOverrideOperation implements Operation {
|
||||||
|
private Set<String> names;
|
||||||
|
private List<XMLAssociationOverride> associationOverrides;
|
||||||
|
|
||||||
|
AssociationOverrideOperation(Set<String> names, List<XMLAssociationOverride> associationOverrides) {
|
||||||
|
this.names = names;
|
||||||
|
this.associationOverrides = associationOverrides;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(AnnotationInstance annotationInstance) {
|
||||||
|
String name = annotationInstance.value( "name" ).asString();
|
||||||
|
if ( !names.contains( name ) ) {
|
||||||
|
XMLAssociationOverrideProxy associationOverride = new XMLAssociationOverrideProxy();
|
||||||
|
associationOverride.setName( name );
|
||||||
|
associationOverride.setJoinColumnsAnnotationValue( annotationInstance.value( "joinColumns" ) );
|
||||||
|
associationOverride.setJoinTableAnnotationValue( annotationInstance.value( "joinTable" ) );
|
||||||
|
associationOverrides.add( associationOverride );
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create simple AnnotationInstance with empty annotation value.
|
||||||
|
* AnnotationInstance's target is get from #{getTarget}
|
||||||
|
*
|
||||||
|
* @param name annotation name
|
||||||
|
*
|
||||||
|
* @return annotationInstance which name is , target is from #{getTarget}, and has no annotation values.
|
||||||
|
*/
|
||||||
|
protected AnnotationInstance create(DotName name) {
|
||||||
|
return create( name, MockHelper.EMPTY_ANNOTATION_VALUE_ARRAY );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance create(DotName name, AnnotationValue[] annotationValues) {
|
||||||
|
return create( name, getTarget(), annotationValues );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnotationInstance create(DotName name, List<AnnotationValue> annotationValueList) {
|
||||||
|
return create( name, getTarget(), annotationValueList );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DotName as the key for the ClassInfo object this mocker created that being push to.
|
||||||
|
*/
|
||||||
|
abstract protected DotName getTargetName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Default Annotation Target for #{create} and #{mocker} methods.
|
||||||
|
*/
|
||||||
|
abstract protected AnnotationTarget getTarget();
|
||||||
|
|
||||||
|
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
||||||
|
if ( annotationInstance != null && annotationInstance.target() != null ) {
|
||||||
|
indexBuilder.addAnnotationInstance( getTargetName(), annotationInstance );
|
||||||
|
}
|
||||||
|
return annotationInstance;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,8 @@ public class EntityMappingsMocker {
|
||||||
//todo delimited-identifier
|
//todo delimited-identifier
|
||||||
private Default globalDefaults;
|
private Default globalDefaults;
|
||||||
final private IndexBuilder indexBuilder;
|
final private IndexBuilder indexBuilder;
|
||||||
//todo
|
//todo default entity listeners
|
||||||
|
//todo default access type
|
||||||
private XMLEntityListeners defaultEntityListeners;
|
private XMLEntityListeners defaultEntityListeners;
|
||||||
final private GlobalAnnotations globalAnnotations;
|
final private GlobalAnnotations globalAnnotations;
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ public class EntityMappingsMocker {
|
||||||
public Index mockNewIndex() {
|
public Index mockNewIndex() {
|
||||||
processPersistenceUnitMetadata( entityMappingsList );
|
processPersistenceUnitMetadata( entityMappingsList );
|
||||||
processEntityMappings( entityMappingsList );
|
processEntityMappings( entityMappingsList );
|
||||||
processGlobalConfiguration();
|
processGlobalAnnotations();
|
||||||
return indexBuilder.build( globalDefaults );
|
return indexBuilder.build( globalDefaults );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +102,7 @@ public class EntityMappingsMocker {
|
||||||
globalDefaults.setCascadePersist( pud.getCascadePersist() != null );
|
globalDefaults.setCascadePersist( pud.getCascadePersist() != null );
|
||||||
globalDefaults.setDelimitedIdentifiers( pud.getDelimitedIdentifiers() != null );
|
globalDefaults.setDelimitedIdentifiers( pud.getDelimitedIdentifiers() != null );
|
||||||
defaultEntityListeners = pud.getEntityListeners();
|
defaultEntityListeners = pud.getEntityListeners();
|
||||||
|
new PersistenceMetadataMocker( indexBuilder, pud ).process();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG.duplicateMetadata();
|
LOG.duplicateMetadata();
|
||||||
|
@ -139,12 +141,12 @@ public class EntityMappingsMocker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processGlobalConfiguration() {
|
private void processGlobalAnnotations() {
|
||||||
if ( globalAnnotations.hasGlobalConfiguration() ) {
|
if ( globalAnnotations.hasGlobalConfiguration() ) {
|
||||||
indexBuilder.collectGlobalConfigurationFromIndex( globalAnnotations );
|
indexBuilder.collectGlobalConfigurationFromIndex( globalAnnotations );
|
||||||
new GlobalConfigurationMocker(
|
new GlobalAnnotationMocker(
|
||||||
indexBuilder, globalAnnotations
|
indexBuilder, globalAnnotations
|
||||||
).parser();
|
).process();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.jboss.jandex.AnnotationInstance;
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.AnnotationTarget;
|
|
||||||
import org.jboss.jandex.AnnotationValue;
|
import org.jboss.jandex.AnnotationValue;
|
||||||
import org.jboss.jandex.DotName;
|
|
||||||
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLColumnResult;
|
import org.hibernate.metamodel.source.annotation.xml.XMLColumnResult;
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLEntityResult;
|
import org.hibernate.metamodel.source.annotation.xml.XMLEntityResult;
|
||||||
|
@ -44,35 +42,18 @@ import org.hibernate.metamodel.source.annotation.xml.XMLSqlResultSetMapping;
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLTableGenerator;
|
import org.hibernate.metamodel.source.annotation.xml.XMLTableGenerator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* note: Global Configurations {@link org.hibernate.metamodel.source.annotations.xml.filter.IndexedAnnotationFilter.GLOBAL_ANNOTATIONS}
|
|
||||||
* in the new build Index has no target
|
|
||||||
*
|
|
||||||
* @author Strong Liu
|
* @author Strong Liu
|
||||||
*/
|
*/
|
||||||
class GlobalConfigurationMocker extends AbstractMocker {
|
class GlobalAnnotationMocker extends AbstractMocker {
|
||||||
private GlobalAnnotations globalAnnotations;
|
private GlobalAnnotations globalAnnotations;
|
||||||
|
|
||||||
GlobalConfigurationMocker(IndexBuilder indexBuilder, GlobalAnnotations globalAnnotations) {
|
GlobalAnnotationMocker(IndexBuilder indexBuilder, GlobalAnnotations globalAnnotations) {
|
||||||
super( indexBuilder );
|
super( indexBuilder );
|
||||||
this.globalAnnotations = globalAnnotations;
|
this.globalAnnotations = globalAnnotations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected EntityMappingsMocker.Default getDefaults() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
void process() {
|
||||||
protected DotName getTargetName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AnnotationTarget getTarget() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
void parser() {
|
|
||||||
if ( !globalAnnotations.getTableGeneratorMap().isEmpty() ) {
|
if ( !globalAnnotations.getTableGeneratorMap().isEmpty() ) {
|
||||||
for ( XMLTableGenerator generator : globalAnnotations.getTableGeneratorMap().values() ) {
|
for ( XMLTableGenerator generator : globalAnnotations.getTableGeneratorMap().values() ) {
|
||||||
parserTableGenerator( generator );
|
parserTableGenerator( generator );
|
||||||
|
@ -117,7 +98,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return create(
|
return create(
|
||||||
SQL_RESULT_SET_MAPPINGS,
|
SQL_RESULT_SET_MAPPINGS, null,
|
||||||
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -133,7 +114,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
nestedColumnResultList( "columns", mapping.getColumnResult(), annotationValueList );
|
nestedColumnResultList( "columns", mapping.getColumnResult(), annotationValueList );
|
||||||
return
|
return
|
||||||
create(
|
create(
|
||||||
SQL_RESULT_SET_MAPPING, annotationValueList
|
SQL_RESULT_SET_MAPPING, null, annotationValueList
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -226,7 +207,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return create(
|
return create(
|
||||||
NAMED_NATIVE_QUERIES,
|
NAMED_NATIVE_QUERIES, null,
|
||||||
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -246,7 +227,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
nestedQueryHintList( "hints", namedNativeQuery.getHint(), annotationValueList );
|
nestedQueryHintList( "hints", namedNativeQuery.getHint(), annotationValueList );
|
||||||
return
|
return
|
||||||
create(
|
create(
|
||||||
NAMED_NATIVE_QUERY, annotationValueList
|
NAMED_NATIVE_QUERY, null, annotationValueList
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -262,7 +243,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return create(
|
return create(
|
||||||
NAMED_QUERIES,
|
NAMED_QUERIES, null,
|
||||||
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
new AnnotationValue[] { AnnotationValue.createArrayValue( "values", values ) }
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -276,7 +257,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
MockHelper.stringValue( "query", namedQuery.getQuery(), annotationValueList );
|
MockHelper.stringValue( "query", namedQuery.getQuery(), annotationValueList );
|
||||||
MockHelper.enumValue( "lockMode", LOCK_MODE_TYPE, namedQuery.getLockMode(), annotationValueList );
|
MockHelper.enumValue( "lockMode", LOCK_MODE_TYPE, namedQuery.getLockMode(), annotationValueList );
|
||||||
nestedQueryHintList( "hints", namedQuery.getHint(), annotationValueList );
|
nestedQueryHintList( "hints", namedQuery.getHint(), annotationValueList );
|
||||||
return create( NAMED_QUERY, annotationValueList );
|
return create( NAMED_QUERY, null, annotationValueList );
|
||||||
}
|
}
|
||||||
|
|
||||||
//@QueryHint
|
//@QueryHint
|
||||||
|
@ -315,7 +296,7 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
MockHelper.integerValue( "allocationSize", generator.getAllocationSize(), annotationValueList );
|
MockHelper.integerValue( "allocationSize", generator.getAllocationSize(), annotationValueList );
|
||||||
return
|
return
|
||||||
create(
|
create(
|
||||||
SEQUENCE_GENERATOR, annotationValueList
|
SEQUENCE_GENERATOR, null, annotationValueList
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -335,19 +316,16 @@ class GlobalConfigurationMocker extends AbstractMocker {
|
||||||
nestedUniqueConstraintList( "uniqueConstraints", generator.getUniqueConstraint(), annotationValueList );
|
nestedUniqueConstraintList( "uniqueConstraints", generator.getUniqueConstraint(), annotationValueList );
|
||||||
return
|
return
|
||||||
create(
|
create(
|
||||||
TABLE_GENERATOR, annotationValueList
|
TABLE_GENERATOR, null, annotationValueList
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
||||||
return globalAnnotations.push( annotationInstance.name(), annotationInstance );
|
if ( annotationInstance != null ) {
|
||||||
}
|
return globalAnnotations.push( annotationInstance.name(), annotationInstance );
|
||||||
|
}
|
||||||
@Override
|
return null;
|
||||||
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
|
|
||||||
AnnotationInstance annotationInstance = MockHelper.create( name, target, annotationValues );
|
|
||||||
return push( annotationInstance );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -30,7 +30,6 @@ import org.jboss.jandex.AnnotationInstance;
|
||||||
import org.jboss.jandex.AnnotationTarget;
|
import org.jboss.jandex.AnnotationTarget;
|
||||||
import org.jboss.jandex.AnnotationValue;
|
import org.jboss.jandex.AnnotationValue;
|
||||||
import org.jboss.jandex.ClassInfo;
|
import org.jboss.jandex.ClassInfo;
|
||||||
import org.jboss.jandex.DotName;
|
|
||||||
|
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLEntityListener;
|
import org.hibernate.metamodel.source.annotation.xml.XMLEntityListener;
|
||||||
import org.hibernate.metamodel.source.annotation.xml.XMLEntityListeners;
|
import org.hibernate.metamodel.source.annotation.xml.XMLEntityListeners;
|
||||||
|
@ -67,13 +66,13 @@ class ListenerMocker extends AbstractMocker {
|
||||||
|
|
||||||
}
|
}
|
||||||
MockHelper.classArrayValue( "value", clazzNameList, annotationValueList, indexBuilder.getServiceRegistry() );
|
MockHelper.classArrayValue( "value", clazzNameList, annotationValueList, indexBuilder.getServiceRegistry() );
|
||||||
return create( ENTITY_LISTENERS, annotationValueList );
|
return create( ENTITY_LISTENERS, classInfo, annotationValueList );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parser(XMLEntityListener listener) {
|
private void parser(XMLEntityListener listener) {
|
||||||
String clazz = listener.getClazz();
|
String clazz = listener.getClazz();
|
||||||
ClassInfo tempClassInfo = indexBuilder.createClassInfo( clazz );
|
ClassInfo tempClassInfo = indexBuilder.createClassInfo( clazz );
|
||||||
ListenerMocker builder = new ListenerMocker( indexBuilder, tempClassInfo );
|
ListenerMocker builder = createListenerMocker( indexBuilder, tempClassInfo );
|
||||||
builder.parser( listener.getPostLoad() );
|
builder.parser( listener.getPostLoad() );
|
||||||
builder.parser( listener.getPostPersist() );
|
builder.parser( listener.getPostPersist() );
|
||||||
builder.parser( listener.getPostRemove() );
|
builder.parser( listener.getPostRemove() );
|
||||||
|
@ -83,6 +82,9 @@ class ListenerMocker extends AbstractMocker {
|
||||||
builder.parser( listener.getPreUpdate() );
|
builder.parser( listener.getPreUpdate() );
|
||||||
indexBuilder.finishEntityObject( tempClassInfo.name(), null );
|
indexBuilder.finishEntityObject( tempClassInfo.name(), null );
|
||||||
}
|
}
|
||||||
|
protected ListenerMocker createListenerMocker(IndexBuilder indexBuilder, ClassInfo classInfo){
|
||||||
|
return new ListenerMocker( indexBuilder, classInfo );
|
||||||
|
}
|
||||||
|
|
||||||
//@PrePersist
|
//@PrePersist
|
||||||
AnnotationInstance parser(XMLPrePersist callback) {
|
AnnotationInstance parser(XMLPrePersist callback) {
|
||||||
|
@ -147,17 +149,10 @@ class ListenerMocker extends AbstractMocker {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected EntityMappingsMocker.Default getDefaults() {
|
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
||||||
return null;
|
if ( annotationInstance != null && annotationInstance.target() != null ) {
|
||||||
}
|
indexBuilder.addAnnotationInstance( classInfo.name(), annotationInstance );
|
||||||
|
}
|
||||||
@Override
|
return annotationInstance;
|
||||||
protected DotName getTargetName() {
|
|
||||||
return classInfo.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AnnotationTarget getTarget() {
|
|
||||||
return classInfo;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jboss.jandex.AnnotationInstance;
|
||||||
|
import org.jboss.jandex.AnnotationTarget;
|
||||||
|
import org.jboss.jandex.AnnotationValue;
|
||||||
|
import org.jboss.jandex.ClassInfo;
|
||||||
|
import org.jboss.jandex.DotName;
|
||||||
|
|
||||||
|
import org.hibernate.metamodel.source.annotation.xml.XMLPersistenceUnitDefaults;
|
||||||
|
import org.hibernate.metamodel.source.annotations.xml.MockedNames;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
class PersistenceMetadataMocker extends AbstractMocker {
|
||||||
|
private XMLPersistenceUnitDefaults persistenceUnitDefaults;
|
||||||
|
private GlobalAnnotations globalAnnotations = new GlobalAnnotations();
|
||||||
|
private static Map<DotName, DotName> nameDotNameMap = new HashMap<DotName, DotName>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
nameDotNameMap.put( ACCESS, MockedNames.DEFAULT_ACCESS );
|
||||||
|
nameDotNameMap.put( ENTITY_LISTENERS, MockedNames.DEFAULT_ENTITY_LISTENERS );
|
||||||
|
nameDotNameMap.put( POST_LOAD, MockedNames.DEFAULT_POST_LOAD );
|
||||||
|
nameDotNameMap.put( POST_REMOVE, MockedNames.DEFAULT_POST_REMOVE );
|
||||||
|
nameDotNameMap.put( POST_UPDATE, MockedNames.DEFAULT_POST_UPDATE );
|
||||||
|
nameDotNameMap.put( POST_PERSIST, MockedNames.DEFAULT_POST_PERSIST );
|
||||||
|
nameDotNameMap.put( PRE_REMOVE, MockedNames.DEFAULT_PRE_REMOVE );
|
||||||
|
nameDotNameMap.put( PRE_UPDATE, MockedNames.DEFAULT_PRE_UPDATE );
|
||||||
|
nameDotNameMap.put( PRE_PERSIST, MockedNames.DEFAULT_PRE_PERSIST );
|
||||||
|
nameDotNameMap.put( MockedNames.DEFAULT_DELIMITED_IDENTIFIERS, MockedNames.DEFAULT_DELIMITED_IDENTIFIERS );
|
||||||
|
}
|
||||||
|
|
||||||
|
PersistenceMetadataMocker(IndexBuilder indexBuilder, XMLPersistenceUnitDefaults persistenceUnitDefaults) {
|
||||||
|
super( indexBuilder );
|
||||||
|
this.persistenceUnitDefaults = persistenceUnitDefaults;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
||||||
|
if ( annotationInstance != null ) {
|
||||||
|
return globalAnnotations.push( annotationInstance.name(), annotationInstance );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final void process() {
|
||||||
|
parserAccessType( persistenceUnitDefaults.getAccess(), null );
|
||||||
|
if ( persistenceUnitDefaults.getDelimitedIdentifiers() != null ) {
|
||||||
|
create( MockedNames.DEFAULT_DELIMITED_IDENTIFIERS, null );
|
||||||
|
}
|
||||||
|
if ( persistenceUnitDefaults.getEntityListeners() != null ) {
|
||||||
|
new DefaultListenerMocker( indexBuilder, null ).parser( persistenceUnitDefaults.getEntityListeners() );
|
||||||
|
}
|
||||||
|
indexBuilder.finishGlobalConfigurationMocking( globalAnnotations );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
|
||||||
|
DotName defaultName = nameDotNameMap.get( name );
|
||||||
|
if ( defaultName == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return super.create( defaultName, target, annotationValues );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class DefaultListenerMocker extends ListenerMocker {
|
||||||
|
DefaultListenerMocker(IndexBuilder indexBuilder, ClassInfo classInfo) {
|
||||||
|
super( indexBuilder, classInfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
|
||||||
|
return PersistenceMetadataMocker.this.push( annotationInstance );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
|
||||||
|
return PersistenceMetadataMocker.this.create( name,target,annotationValues );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ListenerMocker createListenerMocker(IndexBuilder indexBuilder, ClassInfo classInfo) {
|
||||||
|
return new DefaultListenerMocker( indexBuilder, classInfo );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.hibernate.metamodel.source.annotations.xml.mocker;
|
||||||
|
|
||||||
|
import org.jboss.jandex.Index;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class PersistenceMetadataMockerTest extends AbstractMockerTest {
|
||||||
|
@Test
|
||||||
|
public void testPersistenceMetadata() {
|
||||||
|
Index index = getMockedIndex( "persistence-metadata.xml" );
|
||||||
|
index.printAnnotations();
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,18 @@
|
||||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
version="2.0">
|
version="2.0">
|
||||||
|
<persistence-unit-metadata>
|
||||||
|
<persistence-unit-defaults>
|
||||||
|
<delimited-identifiers/>
|
||||||
|
<access>FIELD</access>
|
||||||
|
<entity-listeners>
|
||||||
|
<entity-listener class="org.hibernate.metamodel.source.annotations.xml.mocker.ItemListener">
|
||||||
|
<pre-persist method-name="prePersist"/>
|
||||||
|
<post-persist method-name="postPersist"/>
|
||||||
|
</entity-listener>
|
||||||
|
</entity-listeners>
|
||||||
|
</persistence-unit-defaults>
|
||||||
|
</persistence-unit-metadata>
|
||||||
<package>org.hibernate.metamodel.source.annotations.xml.mocker</package>
|
<package>org.hibernate.metamodel.source.annotations.xml.mocker</package>
|
||||||
<entity class="Item">
|
<entity class="Item">
|
||||||
<entity-listeners>
|
<entity-listeners>
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
version="2.0">
|
||||||
|
<persistence-unit-metadata>
|
||||||
|
<persistence-unit-defaults>
|
||||||
|
<delimited-identifiers/>
|
||||||
|
<access>FIELD</access>
|
||||||
|
<entity-listeners>
|
||||||
|
<entity-listener class="org.hibernate.metamodel.source.annotations.xml.mocker.ItemListener">
|
||||||
|
<pre-persist method-name="prePersist"/>
|
||||||
|
<post-persist method-name="postPersist"/>
|
||||||
|
</entity-listener>
|
||||||
|
</entity-listeners>
|
||||||
|
</persistence-unit-defaults>
|
||||||
|
</persistence-unit-metadata>
|
||||||
|
</entity-mappings>
|
Loading…
Reference in New Issue