HHH-3563, HHH-3561: component handling rework
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15744 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
92a4af082b
commit
50ec688066
|
@ -59,8 +59,8 @@ public class RevisionInfoConfiguration {
|
|||
|
||||
public RevisionInfoConfiguration() {
|
||||
revisionInfoEntityName = "org.hibernate.envers.DefaultRevisionEntity";
|
||||
revisionInfoIdData = new PropertyData("id", "field", null);
|
||||
revisionInfoTimestampData = new PropertyData("timestamp", "field", null);
|
||||
revisionInfoIdData = new PropertyData("id", "id", "field", null);
|
||||
revisionInfoTimestampData = new PropertyData("timestamp", "timestamp", "field", null);
|
||||
revisionInfoTimestampType = "long";
|
||||
|
||||
revisionPropType = "integer";
|
||||
|
@ -109,11 +109,11 @@ public class RevisionInfoConfiguration {
|
|||
XClass revisionNumberClass = property.getType();
|
||||
if (reflectionManager.equals(revisionNumberClass, Integer.class) ||
|
||||
reflectionManager.equals(revisionNumberClass, Integer.TYPE)) {
|
||||
revisionInfoIdData = new PropertyData(property.getName(), accessType, null);
|
||||
revisionInfoIdData = new PropertyData(property.getName(), property.getName(), accessType, null);
|
||||
revisionNumberFound.set();
|
||||
} else if (reflectionManager.equals(revisionNumberClass, Long.class) ||
|
||||
reflectionManager.equals(revisionNumberClass, Long.TYPE)) {
|
||||
revisionInfoIdData = new PropertyData(property.getName(), accessType, null);
|
||||
revisionInfoIdData = new PropertyData(property.getName(), property.getName(), accessType, null);
|
||||
revisionNumberFound.set();
|
||||
|
||||
// The default is integer
|
||||
|
@ -132,7 +132,7 @@ public class RevisionInfoConfiguration {
|
|||
XClass revisionTimestampClass = property.getType();
|
||||
if (reflectionManager.equals(revisionTimestampClass, Long.class) ||
|
||||
reflectionManager.equals(revisionTimestampClass, Long.TYPE)) {
|
||||
revisionInfoTimestampData = new PropertyData(property.getName(), accessType, null);
|
||||
revisionInfoTimestampData = new PropertyData(property.getName(), property.getName(), accessType, null);
|
||||
revisionTimestampFound.set();
|
||||
} else {
|
||||
throw new MappingException("The field annotated with @RevisionTimestamp must be of type " +
|
||||
|
|
|
@ -46,10 +46,7 @@ import org.hibernate.mapping.Join;
|
|||
import org.hibernate.mapping.PersistentClass;
|
||||
import org.hibernate.mapping.Property;
|
||||
import org.hibernate.mapping.Value;
|
||||
import org.hibernate.type.CollectionType;
|
||||
import org.hibernate.type.ManyToOneType;
|
||||
import org.hibernate.type.OneToOneType;
|
||||
import org.hibernate.type.Type;
|
||||
import org.hibernate.type.*;
|
||||
|
||||
/**
|
||||
* @author Adam Warski (adam at warski dot org)
|
||||
|
@ -62,6 +59,7 @@ public final class AuditMetadataGenerator {
|
|||
private final Element revisionInfoRelationMapping;
|
||||
|
||||
private final BasicMetadataGenerator basicMetadataGenerator;
|
||||
private final ComponentMetadataGenerator componentMetadataGenerator;
|
||||
private final IdMetadataGenerator idMetadataGenerator;
|
||||
private final ToOneRelationMetadataGenerator toOneRelationMetadataGenerator;
|
||||
|
||||
|
@ -79,6 +77,7 @@ public final class AuditMetadataGenerator {
|
|||
this.revisionInfoRelationMapping = revisionInfoRelationMapping;
|
||||
|
||||
this.basicMetadataGenerator = new BasicMetadataGenerator();
|
||||
this.componentMetadataGenerator = new ComponentMetadataGenerator(this);
|
||||
this.idMetadataGenerator = new IdMetadataGenerator(this);
|
||||
this.toOneRelationMetadataGenerator = new ToOneRelationMetadataGenerator(this);
|
||||
|
||||
|
@ -109,13 +108,17 @@ public final class AuditMetadataGenerator {
|
|||
// only first pass
|
||||
if (firstPass) {
|
||||
if (basicMetadataGenerator.addBasic(parent, persistentPropertyAuditingData, value, currentMapper,
|
||||
entityName, insertable, false)) {
|
||||
insertable, false)) {
|
||||
// The property was mapped by the basic generator.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (type instanceof ManyToOneType) {
|
||||
if (type instanceof ComponentType) {
|
||||
// both passes
|
||||
componentMetadataGenerator.addComponent(parent, persistentPropertyAuditingData, value, currentMapper,
|
||||
entityName, xmlMappingData, firstPass);
|
||||
} else if (type instanceof ManyToOneType) {
|
||||
// only second pass
|
||||
if (!firstPass) {
|
||||
toOneRelationMetadataGenerator.addToOne(parent, persistentPropertyAuditingData, value, currentMapper,
|
||||
|
|
|
@ -27,149 +27,82 @@ import java.util.Iterator;
|
|||
import java.util.Properties;
|
||||
|
||||
import org.dom4j.Element;
|
||||
import org.hibernate.envers.ModificationStore;
|
||||
import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
|
||||
import org.hibernate.envers.entities.mapper.SimpleMapperBuilder;
|
||||
|
||||
import org.hibernate.mapping.Column;
|
||||
import org.hibernate.mapping.Component;
|
||||
import org.hibernate.mapping.Property;
|
||||
import org.hibernate.mapping.SimpleValue;
|
||||
import org.hibernate.mapping.Value;
|
||||
import org.hibernate.type.ComponentType;
|
||||
import org.hibernate.type.CompositeCustomType;
|
||||
import org.hibernate.type.CustomType;
|
||||
import org.hibernate.type.ImmutableType;
|
||||
import org.hibernate.type.MutableType;
|
||||
import org.hibernate.type.Type;
|
||||
import org.hibernate.util.StringHelper;
|
||||
|
||||
/**
|
||||
* Generates metadata for basic properties: immutable types (including enums) and components
|
||||
* Generates metadata for basic properties: immutable types (including enums).
|
||||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public final class BasicMetadataGenerator {
|
||||
boolean addBasic(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
|
||||
CompositeMapperBuilder mapper, String entityName, boolean insertable, boolean key) {
|
||||
Type type = value.getType();
|
||||
boolean addBasic(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
Type type = value.getType();
|
||||
|
||||
if (type instanceof ComponentType) {
|
||||
addComponent(parent, persistentPropertyAuditingData, value, mapper, entityName, key);
|
||||
return true;
|
||||
} else {
|
||||
return addBasicNoComponent(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
}
|
||||
}
|
||||
if (type instanceof ImmutableType || type instanceof MutableType) {
|
||||
addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else if (type instanceof CustomType || type instanceof CompositeCustomType) {
|
||||
addCustomValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
|
||||
addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean addBasicNoComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
Type type = value.getType();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type instanceof ImmutableType || type instanceof MutableType) {
|
||||
addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else if (type instanceof CustomType || type instanceof CompositeCustomType) {
|
||||
addCustomValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
|
||||
addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@SuppressWarnings({"unchecked"})
|
||||
private void addSimpleValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
if (parent != null) {
|
||||
Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
|
||||
value.getType().getName(), insertable, key);
|
||||
MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
// A null mapper means that we only want to add xml mappings
|
||||
if (mapper != null) {
|
||||
mapper.add(persistentPropertyAuditingData.getPropertyData());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
private void addSimpleValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
if (parent != null) {
|
||||
Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
|
||||
value.getType().getName(), insertable, key);
|
||||
MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
|
||||
}
|
||||
@SuppressWarnings({"unchecked"})
|
||||
private void addCustomValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
if (parent != null) {
|
||||
Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
|
||||
null, insertable, key);
|
||||
|
||||
// A null mapper means that we only want to add xml mappings
|
||||
if (mapper != null) {
|
||||
mapper.add(persistentPropertyAuditingData.getPropertyData());
|
||||
}
|
||||
}
|
||||
//CustomType propertyType = (CustomType) value.getType();
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
private void addCustomValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
|
||||
if (parent != null) {
|
||||
Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
|
||||
null, insertable, key);
|
||||
Element type_mapping = prop_mapping.addElement("type");
|
||||
type_mapping.addAttribute("name", value.getType().getName());
|
||||
|
||||
//CustomType propertyType = (CustomType) value.getType();
|
||||
if (value instanceof SimpleValue) {
|
||||
Properties typeParameters = ((SimpleValue) value).getTypeParameters();
|
||||
if (typeParameters != null) {
|
||||
for (java.util.Map.Entry paramKeyValue : typeParameters.entrySet()) {
|
||||
Element type_param = type_mapping.addElement("param");
|
||||
type_param.addAttribute("name", (String) paramKeyValue.getKey());
|
||||
type_param.setText((String) paramKeyValue.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Element type_mapping = prop_mapping.addElement("type");
|
||||
type_mapping.addAttribute("name", value.getType().getName());
|
||||
MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
|
||||
}
|
||||
|
||||
if (value instanceof SimpleValue) {
|
||||
Properties typeParameters = ((SimpleValue) value).getTypeParameters();
|
||||
if (typeParameters != null) {
|
||||
for (java.util.Map.Entry paramKeyValue : typeParameters.entrySet()) {
|
||||
Element type_param = type_mapping.addElement("param");
|
||||
type_param.addAttribute("name", (String) paramKeyValue.getKey());
|
||||
type_param.setText((String) paramKeyValue.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
|
||||
}
|
||||
|
||||
if (mapper != null) {
|
||||
mapper.add(persistentPropertyAuditingData.getPropertyData());
|
||||
}
|
||||
}
|
||||
|
||||
private void addComponentClassName(Element any_mapping, Component comp) {
|
||||
if (StringHelper.isNotEmpty(comp.getComponentClassName())) {
|
||||
any_mapping.addAttribute("class", comp.getComponentClassName());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
private void addComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, CompositeMapperBuilder mapper, String entityName, boolean key) {
|
||||
Element component_mapping = null;
|
||||
Component prop_component = (Component) value;
|
||||
|
||||
if (parent != null) {
|
||||
/*
|
||||
TODO: investigate relations inside components
|
||||
if (!firstPass) {
|
||||
// The required element already exists.
|
||||
Iterator<Element> iter = parent.elementIterator("component");
|
||||
while (iter.hasNext()) {
|
||||
Element child = iter.next();
|
||||
if (child.attribute("name").getText().equals(name)) {
|
||||
component_mapping = child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (component_mapping == null) {
|
||||
throw new AuditException("Element for component not found during second pass!");
|
||||
}
|
||||
} else {
|
||||
*/
|
||||
|
||||
component_mapping = parent.addElement("component");
|
||||
component_mapping.addAttribute("name", persistentPropertyAuditingData.getName());
|
||||
|
||||
addComponentClassName(component_mapping, prop_component);
|
||||
}
|
||||
|
||||
CompositeMapperBuilder componentMapper = mapper.addComposite(persistentPropertyAuditingData.getPropertyData());
|
||||
|
||||
Iterator<Property> properties = (Iterator<Property>) prop_component.getPropertyIterator();
|
||||
while (properties.hasNext()) {
|
||||
Property property = properties.next();
|
||||
addBasic(component_mapping,
|
||||
new PersistentPropertyAuditingData(property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL),
|
||||
property.getValue(), componentMapper, entityName, property.isInsertable(), key);
|
||||
}
|
||||
}
|
||||
if (mapper != null) {
|
||||
mapper.add(persistentPropertyAuditingData.getPropertyData());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -400,7 +400,7 @@ public final class CollectionMetadataGenerator {
|
|||
queryGeneratorBuilder.getCurrentIndex());
|
||||
} else {
|
||||
// Last but one parameter: collection components are always insertable
|
||||
boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(xmlMapping,
|
||||
boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasic(xmlMapping,
|
||||
new PersistentPropertyAuditingData(prefix, "field", ModificationStore.FULL), value, null,
|
||||
true, true);
|
||||
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package org.hibernate.envers.configuration.metadata;
|
||||
|
||||
import org.dom4j.Element;
|
||||
import org.hibernate.mapping.Value;
|
||||
import org.hibernate.mapping.Component;
|
||||
import org.hibernate.mapping.Property;
|
||||
import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
|
||||
import org.hibernate.envers.ModificationStore;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* Generates metadata for components.
|
||||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public final class ComponentMetadataGenerator {
|
||||
private final AuditMetadataGenerator mainGenerator;
|
||||
|
||||
ComponentMetadataGenerator(AuditMetadataGenerator auditMetadataGenerator) {
|
||||
mainGenerator = auditMetadataGenerator;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
public void addComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
|
||||
Value value, CompositeMapperBuilder mapper, String entityName,
|
||||
EntityXmlMappingData xmlMappingData, boolean firstPass) {
|
||||
Component prop_component = (Component) value;
|
||||
|
||||
CompositeMapperBuilder componentMapper = mapper.addComponent(persistentPropertyAuditingData.getPropertyData());
|
||||
|
||||
// Adding all properties of the component
|
||||
Iterator<Property> properties = (Iterator<Property>) prop_component.getPropertyIterator();
|
||||
while (properties.hasNext()) {
|
||||
Property property = properties.next();
|
||||
// The name of the property in the entity will consist of the name of the component property concatenated
|
||||
// with the name of the property in the bean, to avoid conflicts.
|
||||
PersistentPropertyAuditingData propertyAuditingData = new PersistentComponentPropertyAuditingData(
|
||||
persistentPropertyAuditingData.getName() + "_" + property.getName(),
|
||||
property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL);
|
||||
|
||||
mainGenerator.addValue(parent, property.getValue(), componentMapper,
|
||||
entityName, xmlMappingData, propertyAuditingData, property.isInsertable(), firstPass);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -62,7 +62,7 @@ public final class IdMetadataGenerator {
|
|||
if (!"_identifierMapper".equals(property.getName())) {
|
||||
if (propertyType instanceof ImmutableType) {
|
||||
// Last but one parameter: ids are always insertable
|
||||
mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(parent,
|
||||
mainGenerator.getBasicMetadataGenerator().addBasic(parent,
|
||||
getIdPersistentPropertyAuditingData(property),
|
||||
property.getValue(), mapper, true, key);
|
||||
} else {
|
||||
|
@ -107,12 +107,12 @@ public final class IdMetadataGenerator {
|
|||
mapper = new SingleIdMapper();
|
||||
|
||||
// Last but one parameter: ids are always insertable
|
||||
mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(rel_id_mapping,
|
||||
mainGenerator.getBasicMetadataGenerator().addBasic(rel_id_mapping,
|
||||
getIdPersistentPropertyAuditingData(id_prop),
|
||||
id_prop.getValue(), mapper, true, false);
|
||||
|
||||
// null mapper - the mapping where already added the first time, now we only want to generate the xml
|
||||
mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(orig_id_mapping,
|
||||
mainGenerator.getBasicMetadataGenerator().addBasic(orig_id_mapping,
|
||||
getIdPersistentPropertyAuditingData(id_prop),
|
||||
id_prop.getValue(), null, true, true);
|
||||
}
|
||||
|
@ -126,7 +126,8 @@ public final class IdMetadataGenerator {
|
|||
}
|
||||
|
||||
private PropertyData getIdPropertyData(Property property) {
|
||||
return new PropertyData(property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL);
|
||||
return new PropertyData(property.getName(), property.getName(), property.getPropertyAccessorName(),
|
||||
ModificationStore.FULL);
|
||||
}
|
||||
|
||||
private PersistentPropertyAuditingData getIdPersistentPropertyAuditingData(Property property) {
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
package org.hibernate.envers.configuration.metadata;
|
||||
|
||||
import org.hibernate.envers.ModificationStore;
|
||||
import org.hibernate.envers.entities.PropertyData;
|
||||
|
||||
/**
|
||||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public class PersistentComponentPropertyAuditingData extends PersistentPropertyAuditingData {
|
||||
private final String beanName;
|
||||
|
||||
public PersistentComponentPropertyAuditingData(String name, String beanName, String accessType,
|
||||
ModificationStore store) {
|
||||
super(name, accessType, store);
|
||||
|
||||
this.beanName = beanName;
|
||||
}
|
||||
|
||||
public PropertyData getPropertyData() {
|
||||
return new PropertyData(getName(), beanName, getAccessType(), getStore());
|
||||
}
|
||||
}
|
|
@ -88,6 +88,6 @@ public class PersistentPropertyAuditingData {
|
|||
}
|
||||
|
||||
public PropertyData getPropertyData() {
|
||||
return new PropertyData(name, accessType, store);
|
||||
return new PropertyData(name, name, accessType, store);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,6 +31,10 @@ import org.hibernate.envers.ModificationStore;
|
|||
*/
|
||||
public class PropertyData {
|
||||
private final String name;
|
||||
/**
|
||||
* Name of the property in the bean.
|
||||
*/
|
||||
private final String beanName;
|
||||
private final String accessType;
|
||||
private final ModificationStore store;
|
||||
|
||||
|
@ -41,17 +45,20 @@ public class PropertyData {
|
|||
*/
|
||||
public PropertyData(String newName, PropertyData propertyData) {
|
||||
this.name = newName;
|
||||
this.beanName = propertyData.beanName;
|
||||
this.accessType = propertyData.accessType;
|
||||
this.store = propertyData.store;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name Name of the property.
|
||||
* @param beanName Name of the property in the bean.
|
||||
* @param accessType Accessor type for this property.
|
||||
* @param store How this property should be stored.
|
||||
*/
|
||||
public PropertyData(String name, String accessType, ModificationStore store) {
|
||||
public PropertyData(String name, String beanName, String accessType, ModificationStore store) {
|
||||
this.name = name;
|
||||
this.beanName = beanName;
|
||||
this.accessType = accessType;
|
||||
this.store = store;
|
||||
}
|
||||
|
@ -60,11 +67,39 @@ public class PropertyData {
|
|||
return name;
|
||||
}
|
||||
|
||||
public String getAccessType() {
|
||||
public String getBeanName() {
|
||||
return beanName;
|
||||
}
|
||||
|
||||
public String getAccessType() {
|
||||
return accessType;
|
||||
}
|
||||
|
||||
public ModificationStore getStore() {
|
||||
return store;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
PropertyData that = (PropertyData) o;
|
||||
|
||||
if (accessType != null ? !accessType.equals(that.accessType) : that.accessType != null) return false;
|
||||
if (beanName != null ? !beanName.equals(that.beanName) : that.beanName != null) return false;
|
||||
if (name != null ? !name.equals(that.name) : that.name != null) return false;
|
||||
if (store != that.store) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = name != null ? name.hashCode() : 0;
|
||||
result = 31 * result + (beanName != null ? beanName.hashCode() : 0);
|
||||
result = 31 * result + (accessType != null ? accessType.hashCode() : 0);
|
||||
result = 31 * result + (store != null ? store.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
package org.hibernate.envers.entities.mapper;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -42,21 +41,21 @@ import org.hibernate.util.ReflectHelper;
|
|||
/**
|
||||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public class MapPropertyMapper implements PropertyMapper, CompositeMapperBuilder {
|
||||
public class ComponentPropertyMapper implements PropertyMapper, CompositeMapperBuilder {
|
||||
private PropertyData propertyData;
|
||||
private ExtendedPropertyMapper delegate;
|
||||
|
||||
public MapPropertyMapper(PropertyData propertyData) {
|
||||
public ComponentPropertyMapper(PropertyData propertyData) {
|
||||
this.propertyData = propertyData;
|
||||
this.delegate = new MultiPropertyMapper();
|
||||
}
|
||||
|
||||
public void add(PropertyData propertyData) {
|
||||
public void add(PropertyData propertyData) {
|
||||
delegate.add(propertyData);
|
||||
}
|
||||
|
||||
public CompositeMapperBuilder addComposite(PropertyData propertyData) {
|
||||
return delegate.addComposite(propertyData);
|
||||
public CompositeMapperBuilder addComponent(PropertyData propertyData) {
|
||||
return delegate.addComponent(propertyData);
|
||||
}
|
||||
|
||||
public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
|
||||
|
@ -64,10 +63,7 @@ public class MapPropertyMapper implements PropertyMapper, CompositeMapperBuilder
|
|||
}
|
||||
|
||||
public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
|
||||
Map<String, Object> newData = new HashMap<String, Object>();
|
||||
data.put(propertyData.getName(), newData);
|
||||
|
||||
return delegate.mapToMapFromEntity(newData, newObj, oldObj);
|
||||
return delegate.mapToMapFromEntity(data, newObj, oldObj);
|
||||
}
|
||||
|
||||
public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey, AuditReaderImplementor versionsReader, Number revision) {
|
||||
|
@ -81,7 +77,7 @@ public class MapPropertyMapper implements PropertyMapper, CompositeMapperBuilder
|
|||
try {
|
||||
Object subObj = ReflectHelper.getDefaultConstructor(getter.getReturnType()).newInstance();
|
||||
setter.set(obj, subObj, null);
|
||||
delegate.mapToEntityFromMap(verCfg, subObj, (Map) data.get(propertyData.getName()), primaryKey, versionsReader, revision);
|
||||
delegate.mapToEntityFromMap(verCfg, subObj, data, primaryKey, versionsReader, revision);
|
||||
} catch (Exception e) {
|
||||
throw new AuditException(e);
|
||||
}
|
|
@ -29,6 +29,6 @@ import org.hibernate.envers.entities.PropertyData;
|
|||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public interface CompositeMapperBuilder extends SimpleMapperBuilder {
|
||||
public CompositeMapperBuilder addComposite(PropertyData propertyData);
|
||||
public CompositeMapperBuilder addComponent(PropertyData propertyData);
|
||||
public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper);
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ import org.hibernate.envers.reader.AuditReaderImplementor;
|
|||
import org.hibernate.envers.tools.reflection.ReflectionTools;
|
||||
import org.hibernate.envers.tools.Tools;
|
||||
|
||||
import org.hibernate.MappingException;
|
||||
import org.hibernate.collection.PersistentCollection;
|
||||
import org.hibernate.property.Getter;
|
||||
|
||||
|
@ -56,16 +55,16 @@ public class MultiPropertyMapper implements ExtendedPropertyMapper {
|
|||
propertyDatas.put(propertyData.getName(), propertyData);
|
||||
}
|
||||
|
||||
public CompositeMapperBuilder addComposite(PropertyData propertyData) {
|
||||
public CompositeMapperBuilder addComponent(PropertyData propertyData) {
|
||||
if (properties.get(propertyData) != null) {
|
||||
throw new MappingException("Mapping for " + propertyData.getName() + " already added!");
|
||||
// This is needed for second pass to work properly in the components mapper
|
||||
return (CompositeMapperBuilder) properties.get(propertyData);
|
||||
}
|
||||
|
||||
MapPropertyMapper mapperBuilder = new MapPropertyMapper(propertyData);
|
||||
properties.put(propertyData, mapperBuilder);
|
||||
propertyDatas.put(propertyData.getName(), propertyData);
|
||||
ComponentPropertyMapper componentMapperBuilder = new ComponentPropertyMapper(propertyData);
|
||||
addComposite(propertyData, componentMapperBuilder);
|
||||
|
||||
return mapperBuilder;
|
||||
return componentMapperBuilder;
|
||||
}
|
||||
|
||||
public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
|
||||
|
|
|
@ -70,18 +70,22 @@ public class SubclassPropertyMapper implements ExtendedPropertyMapper {
|
|||
PersistentCollection newColl,
|
||||
Serializable oldColl,
|
||||
Serializable id) {
|
||||
List<PersistentCollectionChangeData> collectionChanges = parentMapper.mapCollectionChanges(
|
||||
List<PersistentCollectionChangeData> parentCollectionChanges = parentMapper.mapCollectionChanges(
|
||||
referencingPropertyName, newColl, oldColl, id);
|
||||
|
||||
if (collectionChanges == null) {
|
||||
return main.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id);
|
||||
List<PersistentCollectionChangeData> mainCollectionChanges = main.mapCollectionChanges(
|
||||
referencingPropertyName, newColl, oldColl, id);
|
||||
|
||||
if (parentCollectionChanges == null) {
|
||||
return mainCollectionChanges;
|
||||
} else {
|
||||
return collectionChanges;
|
||||
parentCollectionChanges.addAll(mainCollectionChanges);
|
||||
return parentCollectionChanges;
|
||||
}
|
||||
}
|
||||
|
||||
public CompositeMapperBuilder addComposite(PropertyData propertyData) {
|
||||
return main.addComposite(propertyData);
|
||||
public CompositeMapperBuilder addComponent(PropertyData propertyData) {
|
||||
return main.addComponent(propertyData);
|
||||
}
|
||||
|
||||
public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
|
||||
|
|
|
@ -88,8 +88,7 @@ public class EmbeddedIdMapper extends AbstractCompositeIdMapper implements Simpl
|
|||
|
||||
for (PropertyData propertyData : ids.keySet()) {
|
||||
String propertyName = propertyData.getName();
|
||||
ret.ids.put(propertyData, new SingleIdMapper(propertyName,
|
||||
new PropertyData(prefix + propertyName, propertyData)));
|
||||
ret.ids.put(propertyData, new SingleIdMapper(new PropertyData(prefix + propertyName, propertyData)));
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -60,8 +60,7 @@ public class MultipleIdMapper extends AbstractCompositeIdMapper implements Simpl
|
|||
|
||||
for (PropertyData propertyData : ids.keySet()) {
|
||||
String propertyName = propertyData.getName();
|
||||
ret.ids.put(propertyData, new SingleIdMapper(propertyName,
|
||||
new PropertyData(prefix + propertyName, propertyData)));
|
||||
ret.ids.put(propertyData, new SingleIdMapper(new PropertyData(prefix + propertyName, propertyData)));
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -38,19 +38,12 @@ import org.hibernate.property.Setter;
|
|||
* @author Adam Warski (adam at warski dot org)
|
||||
*/
|
||||
public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBuilder {
|
||||
private String beanPropertyName;
|
||||
private PropertyData propertyData;
|
||||
|
||||
public SingleIdMapper() {
|
||||
}
|
||||
|
||||
public SingleIdMapper(String beanPropertyName, PropertyData propertyData) {
|
||||
this.beanPropertyName = beanPropertyName;
|
||||
this.propertyData = propertyData;
|
||||
}
|
||||
|
||||
public SingleIdMapper(PropertyData propertyData) {
|
||||
this.beanPropertyName = propertyData.getName();
|
||||
this.propertyData = propertyData;
|
||||
}
|
||||
|
||||
|
@ -60,7 +53,6 @@ public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBu
|
|||
}
|
||||
|
||||
this.propertyData = propertyData;
|
||||
this.beanPropertyName = propertyData.getName();
|
||||
}
|
||||
|
||||
public void mapToEntityFromMap(Object obj, Map data) {
|
||||
|
@ -68,7 +60,7 @@ public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBu
|
|||
return;
|
||||
}
|
||||
|
||||
Setter setter = ReflectionTools.getSetter(obj.getClass(), beanPropertyName, propertyData.getAccessType());
|
||||
Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
|
||||
setter.set(obj, data.get(propertyData.getName()), null);
|
||||
}
|
||||
|
||||
|
@ -85,7 +77,7 @@ public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBu
|
|||
return null;
|
||||
}
|
||||
|
||||
Getter getter = ReflectionTools.getGetter(data.getClass(), beanPropertyName, propertyData.getAccessType());
|
||||
Getter getter = ReflectionTools.getGetter(data.getClass(), propertyData);
|
||||
return getter.get(data);
|
||||
}
|
||||
|
||||
|
@ -99,7 +91,7 @@ public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBu
|
|||
if (obj == null) {
|
||||
data.put(propertyData.getName(), null);
|
||||
} else {
|
||||
Getter getter = ReflectionTools.getGetter(obj.getClass(), beanPropertyName, propertyData.getAccessType());
|
||||
Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyData);
|
||||
data.put(propertyData.getName(), getter.get(obj));
|
||||
}
|
||||
}
|
||||
|
@ -109,14 +101,13 @@ public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBu
|
|||
return;
|
||||
}
|
||||
|
||||
Getter getter = ReflectionTools.getGetter(objFrom.getClass(), beanPropertyName, propertyData.getAccessType());
|
||||
Setter setter = ReflectionTools.getSetter(objTo.getClass(), beanPropertyName, propertyData.getAccessType());
|
||||
Getter getter = ReflectionTools.getGetter(objFrom.getClass(), propertyData);
|
||||
Setter setter = ReflectionTools.getSetter(objTo.getClass(), propertyData);
|
||||
setter.set(objTo, getter.get(objFrom), null);
|
||||
}
|
||||
|
||||
public IdMapper prefixMappedProperties(String prefix) {
|
||||
return new SingleIdMapper(propertyData.getName(),
|
||||
new PropertyData(prefix + propertyData.getName(), propertyData));
|
||||
return new SingleIdMapper(new PropertyData(prefix + propertyData.getName(), propertyData));
|
||||
}
|
||||
|
||||
public List<QueryParameterData> mapToQueryParametersFromId(Object obj) {
|
||||
|
|
|
@ -59,7 +59,7 @@ public class ReflectionTools {
|
|||
}
|
||||
|
||||
public static Getter getGetter(Class cls, PropertyData propertyData) {
|
||||
return getGetter(cls, propertyData.getName(), propertyData.getAccessType());
|
||||
return getGetter(cls, propertyData.getBeanName(), propertyData.getAccessType());
|
||||
}
|
||||
|
||||
public static Getter getGetter(Class cls, String propertyName, String accessorType) {
|
||||
|
@ -75,10 +75,10 @@ public class ReflectionTools {
|
|||
}
|
||||
|
||||
public static Setter getSetter(Class cls, PropertyData propertyData) {
|
||||
return getSetter(cls, propertyData.getName(), propertyData.getAccessType());
|
||||
return getSetter(cls, propertyData.getBeanName(), propertyData.getAccessType());
|
||||
}
|
||||
|
||||
public static Setter getSetter(Class cls, String propertyName, String accessorType) {
|
||||
private static Setter getSetter(Class cls, String propertyName, String accessorType) {
|
||||
Pair<Class, String> key = make(cls, propertyName);
|
||||
Setter value = setterCache.get(key);
|
||||
if (value == null) {
|
||||
|
|
Loading…
Reference in New Issue