org.hibernate.metamodel.source.annotations.xml.mocker.PersistenceMetadataMocker Maven / Gradle / Ivy
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.internal.jaxb.mapping.orm.JaxbPersistenceUnitDefaults;
import org.hibernate.metamodel.source.annotations.xml.PseudoJpaDotNames;
/**
* @author Strong Liu
*/
class PersistenceMetadataMocker extends AbstractMocker {
private final JaxbPersistenceUnitDefaults persistenceUnitDefaults;
private final GlobalAnnotations globalAnnotations = new GlobalAnnotations();
/**
* Map JPA Annotations name to Pseudo JPA Annotations name.
*/
private final static Map nameMapper = new HashMap();
static {
nameMapper.put( ACCESS, PseudoJpaDotNames.DEFAULT_ACCESS );
nameMapper.put( ENTITY_LISTENERS, PseudoJpaDotNames.DEFAULT_ENTITY_LISTENERS );
nameMapper.put( POST_LOAD, PseudoJpaDotNames.DEFAULT_POST_LOAD );
nameMapper.put( POST_REMOVE, PseudoJpaDotNames.DEFAULT_POST_REMOVE );
nameMapper.put( POST_UPDATE, PseudoJpaDotNames.DEFAULT_POST_UPDATE );
nameMapper.put( POST_PERSIST, PseudoJpaDotNames.DEFAULT_POST_PERSIST );
nameMapper.put( PRE_REMOVE, PseudoJpaDotNames.DEFAULT_PRE_REMOVE );
nameMapper.put( PRE_UPDATE, PseudoJpaDotNames.DEFAULT_PRE_UPDATE );
nameMapper.put( PRE_PERSIST, PseudoJpaDotNames.DEFAULT_PRE_PERSIST );
nameMapper.put(
PseudoJpaDotNames.DEFAULT_DELIMITED_IDENTIFIERS,
PseudoJpaDotNames.DEFAULT_DELIMITED_IDENTIFIERS
);
}
PersistenceMetadataMocker(IndexBuilder indexBuilder, JaxbPersistenceUnitDefaults persistenceUnitDefaults) {
super( indexBuilder );
this.persistenceUnitDefaults = persistenceUnitDefaults;
}
/**
* Mock global configurations defined in with pseudo JPA annotation name.
* NOTE: These mocked annotations do not have {@link AnnotationTarget target}.
*/
final void process() {
parserAccessType( persistenceUnitDefaults.getAccess(), null );
if ( persistenceUnitDefaults.getDelimitedIdentifiers() != null ) {
create( PseudoJpaDotNames.DEFAULT_DELIMITED_IDENTIFIERS, null );
}
if ( persistenceUnitDefaults.getEntityListeners() != null ) {
new DefaultListenerMocker( indexBuilder, null ).parser( persistenceUnitDefaults.getEntityListeners() );
}
indexBuilder.finishGlobalConfigurationMocking( globalAnnotations );
}
@Override
protected AnnotationInstance push(AnnotationInstance annotationInstance) {
if ( annotationInstance != null ) {
return globalAnnotations.push( annotationInstance.name(), annotationInstance );
}
return null;
}
@Override
protected AnnotationInstance create(DotName name, AnnotationTarget target, AnnotationValue[] annotationValues) {
DotName defaultName = nameMapper.get( name );
if ( defaultName == null ) {
return null;
}
return super.create( defaultName, target, annotationValues );
}
private 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 );
}
}
}