From 8bb631305381cb38caa20514e21df32bd9339b79 Mon Sep 17 00:00:00 2001 From: Nicki Watt Date: Tue, 6 Aug 2013 16:20:59 +0100 Subject: [PATCH 1/4] DATAGRAPH-311: Initial progression towards a Serialization option for query results (and entities). Note: This relies on a change to Spring Data Commons as well ref PR https://github.com/SpringSource/spring-data-commons/pull/35 --- pom.xml | 2 +- .../data/neo4j/annotation/POJOResult.java | 34 ++++ .../fieldaccess/ManagedFieldAccessorSet.java | 16 +- .../ManagedPrefixedDynamicProperties.java | 9 +- .../PrefixedDynamicProperties.java | 6 +- .../data/neo4j/mapping/MappingPolicy.java | 6 +- .../conversion/EntityResultConverter.java | 72 +++++++- .../POJOResultBuildingException.java | 35 ++++ .../support/conversion/QueryResultProxy.java | 55 +----- .../ResultColumnValueExtractor.java | 110 ++++++++++++ .../data/neo4j/model/BestFriend.java | 6 +- .../data/neo4j/model/Friendship.java | 7 +- .../data/neo4j/model/Group.java | 7 +- .../data/neo4j/model/Person.java | 20 ++- .../data/neo4j/model/RootEntity.java | 7 +- .../data/neo4j/repository/MemberDataPOJO.java | 75 +++++++++ .../neo4j/repository/PersonRepository.java | 3 + .../data/neo4j/repository/SerialTesters.java | 105 ++++++++++++ ...SerializableGraphQueryRepositoryTests.java | 156 ++++++++++++++++++ ...zableGraphQueryRepositoryTests-context.xml | 13 ++ 20 files changed, 668 insertions(+), 76 deletions(-) create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/POJOResult.java create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/POJOResultBuildingException.java create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/conversion/ResultColumnValueExtractor.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/MemberDataPOJO.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/SerialTesters.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/SerializableGraphQueryRepositoryTests.java create mode 100644 spring-data-neo4j/src/test/resources/org/springframework/data/neo4j/repository/SerializableGraphQueryRepositoryTests-context.xml diff --git a/pom.xml b/pom.xml index 7cc143398..deac96288 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ multi spring-data-neo4j - 1.6.0.RC1 + 1.6.0.BUILD-SNAPSHOT 1.9 0.11-neo4j-1.9 diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/POJOResult.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/POJOResult.java new file mode 100644 index 000000000..d9fa780a7 --- /dev/null +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/annotation/POJOResult.java @@ -0,0 +1,34 @@ +/** + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.neo4j.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation to mark a POJO as being able to hold the results of a + * SDN based query. + * + * @author Nicki Watt + * @since 06.08.2013 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface POJOResult { + String value() default ""; +} diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedFieldAccessorSet.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedFieldAccessorSet.java index 5326db515..2bc5136d7 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedFieldAccessorSet.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedFieldAccessorSet.java @@ -23,20 +23,28 @@ import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty; import org.springframework.data.neo4j.support.DoReturn; import org.springframework.data.neo4j.support.Neo4jTemplate; +import java.io.Serializable; import java.util.AbstractSet; import java.util.Collection; import java.util.Iterator; import java.util.Set; /** + * This class provides a mechanism for managing and controlling access to + * a Set based field on a SDN managed entity. The associated field typically + * serves as a container for all the references to some other SDN entity(s). + * * @param */ -public class ManagedFieldAccessorSet extends AbstractSet { +public class ManagedFieldAccessorSet extends AbstractSet implements Serializable { + + private static final long serialVersionUID = 1L; + private final Object entity; final Set delegate; - private final Neo4jPersistentProperty property; - private final Neo4jTemplate ctx; - private final FieldAccessor fieldAccessor; + private final transient Neo4jPersistentProperty property; + private final transient Neo4jTemplate ctx; + private final transient FieldAccessor fieldAccessor; private final MappingPolicy mappingPolicy; @SuppressWarnings("unchecked") diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedPrefixedDynamicProperties.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedPrefixedDynamicProperties.java index 75d90e10d..1f4ff30cc 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedPrefixedDynamicProperties.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/ManagedPrefixedDynamicProperties.java @@ -29,10 +29,13 @@ import java.util.Map; * deleted. */ public class ManagedPrefixedDynamicProperties extends PrefixedDynamicProperties { + + private static final long serialVersionUID = 1L; + private final Object entity; - private final Neo4jTemplate template; - private final FieldAccessor fieldAccessor; - private final Neo4jPersistentProperty property; + private transient final Neo4jTemplate template; + private transient final FieldAccessor fieldAccessor; + private transient final Neo4jPersistentProperty property; private boolean isNode; private MappingPolicy mappingPolicy; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java index 19d9638a0..fea4b1edd 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/fieldaccess/PrefixedDynamicProperties.java @@ -15,6 +15,7 @@ */ package org.springframework.data.neo4j.fieldaccess; +import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -27,7 +28,10 @@ import java.util.Set; *

* The methods *PrefixedProperty() allow to access the prefixed property key/values pairs directly. */ -public class PrefixedDynamicProperties implements DynamicProperties { +public class PrefixedDynamicProperties implements DynamicProperties , Serializable { + + private static final long serialVersionUID = 1L; + private final Map map; protected final String prefix; diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/MappingPolicy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/MappingPolicy.java index 3c645f670..622c8b0eb 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/MappingPolicy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/MappingPolicy.java @@ -15,6 +15,7 @@ */ package org.springframework.data.neo4j.mapping; +import java.io.Serializable; import java.util.*; import static java.util.Arrays.asList; @@ -32,7 +33,10 @@ public interface MappingPolicy { boolean shouldLoad(); MappingPolicy combineWith(MappingPolicy mappingPolicy); - public class DefaultMappingPolicy implements MappingPolicy { + public class DefaultMappingPolicy implements MappingPolicy , Serializable { + + private static final long serialVersionUID = 1L; + private Set