org.hibernate.envers.internal.entities.mapper.relation.component.MiddleEmbeddableComponentMapper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-envers Show documentation
Show all versions of hibernate-envers Show documentation
Hibernate's entity version (audit/history) support
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.envers.internal.entities.mapper.relation.component;
import java.lang.reflect.InvocationTargetException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Map;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.internal.entities.EntityInstantiator;
import org.hibernate.envers.internal.entities.PropertyData;
import org.hibernate.envers.internal.entities.mapper.CompositeMapperBuilder;
import org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper;
import org.hibernate.envers.internal.entities.mapper.PropertyMapper;
import org.hibernate.envers.internal.entities.mapper.relation.ToOneIdMapper;
import org.hibernate.envers.internal.tools.query.Parameters;
import org.hibernate.internal.util.ReflectHelper;
/**
* @author Kristoffer Lundberg (kristoffer at cambio dot se)
*/
public class MiddleEmbeddableComponentMapper implements MiddleComponentMapper, CompositeMapperBuilder {
private final MultiPropertyMapper delegate;
private final Class componentClass;
public MiddleEmbeddableComponentMapper(MultiPropertyMapper delegate, Class componentClass) {
this.delegate = delegate;
this.componentClass = componentClass;
}
@Override
public Object mapToObjectFromFullMap(
EntityInstantiator entityInstantiator,
Map data,
Object dataObject,
Number revision) {
try {
final Object componentInstance = getComponentInstance( dataObject );
delegate.mapToEntityFromMap(
entityInstantiator.getEnversService(),
componentInstance,
data,
null,
entityInstantiator.getAuditReaderImplementor(),
revision
);
return componentInstance;
}
catch (AuditException e) {
// just throw the AuditException without wrapping in another AuditException
throw e;
}
catch (Exception e) {
throw new AuditException( e );
}
}
private Object getComponentInstance(Object dataObject) {
if ( dataObject != null ) {
return dataObject;
}
return AccessController.doPrivileged(
new PrivilegedAction