From 29a9d64834a4945789ecfd04b42bc8a8d134fb0f Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Thu, 31 Mar 2011 14:29:02 +0200 Subject: [PATCH] caching field-reflection in PropertyFieldAccessors --- ...rtingNodePropertyFieldAccessorFactory.java | 8 ++--- .../PropertyFieldAccessorFactory.java | 33 ++++++++++--------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/ConvertingNodePropertyFieldAccessorFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/ConvertingNodePropertyFieldAccessorFactory.java index a9fe581a9..d3387a1d6 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/ConvertingNodePropertyFieldAccessorFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/ConvertingNodePropertyFieldAccessorFactory.java @@ -46,7 +46,7 @@ public class ConvertingNodePropertyFieldAccessorFactory implements FieldAccessor @Override public FieldAccessor> forField(final Field field) { - return new ConvertingNodePropertyFieldAccessor(field, conversionService); + return new ConvertingNodePropertyFieldAccessor(conversionService, DelegatingFieldAccessorFactory.getNeo4jPropertyName(field),field.getType()); } private boolean isSerializableField(final Field field) { @@ -67,8 +67,8 @@ public class ConvertingNodePropertyFieldAccessorFactory implements FieldAccessor public static class ConvertingNodePropertyFieldAccessor extends PropertyFieldAccessorFactory.PropertyFieldAccessor { private final ConversionService conversionService; - public ConvertingNodePropertyFieldAccessor(final Field field, final ConversionService conversionService) { - super(field, conversionService); + public ConvertingNodePropertyFieldAccessor(ConversionService conversionService, String propertyName, Class fieldType) { + super(conversionService,propertyName,fieldType); this.conversionService = conversionService; } @@ -88,7 +88,7 @@ public class ConvertingNodePropertyFieldAccessorFactory implements FieldAccessor } private Object deserializePropertyValue(final Object value) { - return conversionService.convert(value, field.getType()); + return conversionService.convert(value, fieldType); } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PropertyFieldAccessorFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PropertyFieldAccessorFactory.java index 568455f38..ff9e02a6c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PropertyFieldAccessorFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PropertyFieldAccessorFactory.java @@ -43,7 +43,7 @@ public class PropertyFieldAccessorFactory implements FieldAccessorFactory> forField(final Field field) { - return new PropertyFieldAccessor(field,conversionService); + return new PropertyFieldAccessor(conversionService,DelegatingFieldAccessorFactory.getNeo4jPropertyName(field),field.getType()); } private boolean isNeo4jPropertyType(final Class fieldType) { @@ -57,12 +57,14 @@ public class PropertyFieldAccessorFactory implements FieldAccessorFactory> { - protected final Field field; private final ConversionService conversionService; + protected final String propertyName; + protected final Class fieldType; - public PropertyFieldAccessor(final Field field, ConversionService conversionService) { - this.field = field; + public PropertyFieldAccessor(ConversionService conversionService, String propertyName, Class fieldType) { this.conversionService = conversionService; + this.propertyName = propertyName; + this.fieldType = fieldType; } @Override @@ -74,9 +76,9 @@ public class PropertyFieldAccessorFactory implements FieldAccessorFactory graphBacked, final Object newVal) { final PropertyContainer propertyContainer = graphBacked.getPersistentState(); if (newVal==null) { - propertyContainer.removeProperty(getPropertyName()); + propertyContainer.removeProperty(propertyName); } else { - propertyContainer.setProperty(getPropertyName(), newVal); + propertyContainer.setProperty(propertyName, newVal); } return newVal; } @@ -87,17 +89,16 @@ public class PropertyFieldAccessorFactory implements FieldAccessorFactory graphBacked) { - Class type = field.getType(); - Object value = graphBacked.getPersistentState().getProperty(getPropertyName(), getDefaultValue(type)); - if (value == null || type.isInstance(value)) return value; - if (conversionService!=null) { - return conversionService.convert(value,type); + PropertyContainer element = graphBacked.getPersistentState(); + if (element.hasProperty(propertyName)) { + Object value = element.getProperty(propertyName); + if (value == null || fieldType.isInstance(value)) return value; + if (conversionService!=null) { + return conversionService.convert(value, fieldType); + } + return value; } - return value; - } - - private String getPropertyName() { - return DelegatingFieldAccessorFactory.getNeo4jPropertyName(field); + return getDefaultValue(fieldType); } private Object getDefaultValue(final Class type) {