From 6772125d25015d62606f85e38423dcea97eca2d8 Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Thu, 15 Dec 2011 20:52:53 -0500 Subject: [PATCH 01/31] added heroku page, initially a dupe of cross-store. --- src/docbkx/reference/heroku.xml | 181 ++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 src/docbkx/reference/heroku.xml diff --git a/src/docbkx/reference/heroku.xml b/src/docbkx/reference/heroku.xml new file mode 100644 index 000000000..fca99ab0c --- /dev/null +++ b/src/docbkx/reference/heroku.xml @@ -0,0 +1,181 @@ + + + + Heroku: seeding the coud + + + *To scale your apps you just add new dynos, so 'heroku scale web=2' etc... + +When your app fails to deploy on the first push, we dont automatically launch a single web dyno on a subsequent push, we should probably document that better. + +*Dynos have 500MB of physical ram available, plus much more than that in swap (Which you really never want to hit with a jvm). Your Procfile that launches java can use that in any way you like, but we do set a config var called JAVA_OPTS for you with some sensible defaults. + +So if you run 'heroku config' you will see the JAVA_OPTS var. you can use it in your Procfile like so + +#Procfile +web: java $JAVA_OPTS ....set up claspath and main class, etc... + +*For logging whatever you use should end up writing to System.out. if you are using a logging framework you should set up its appender to write to system.out (ConsoleAppender in log4j for instance) + +All stdout output is captured by our logplex log routing mesh so you can tail it by running 'heroku logs -t' or use the loggly addon or your own syslog server to capture log output for later analysis. + +*You have no limitation on the version of spring tomcat jetty netty or any other library or framework you can use. As long as it is in a public maven repo (or even a private maven repo) accessible by your build, maven will pull in the dependency and use it. + +*For ides we have both intellij and eclipse. We are working on a project that will make it much easier for tooling providers to do this type of integration, I will let you know when the details are public! + + + + The Spring Data Neo4j project support cross-store persistence, which allows for parts of the data to be + stored in a traditional JPA data store (RDBMS), and other parts in a graph store. This means that an entity + can be partially stored in e.g. MySQL, and partially stored in Neo4j. + + + This allows existing JPA-based applications to embrace NOSQL data stores for evolving certain parts + of their data model. Possible use cases include adding social networking or geospatial information to + existing applications. + +
+ Partial entities + + Partial graph persistence is achieved by restricting the Spring Data Neo4j aspects to manage only + explicitly annotated parts of the entity. Those fields will be made @Transient by the + aspect so that JPA ignores them. + + + A backing node in the graph store is only created when the entity has been assigned a JPA ID. Only + then will the association between the two stores be established. Until the entity has been persisted, + its state is just kept inside the POJO (in detached state), and then flushed to the backing graph + database on persist(). + + + The association between the two entities is maintained via a FOREIGN_ID field in the node, that + contains the JPA ID. Currently only single-value IDs are supported. The entity class can be resolved + via the TypeRepresentationStrategy that manages the Java type hierarchy within the graph + database. Given the ID and class, you can then retrieve the appropriate JPA entity for a given node. + + + The other direction is handled by indexing the Node with the FOREIGN_ID index which contains a + concatenation of the fully qualified class name of the JPA entity and the ID. The matching node + can then be found using the indexing facilities, and the two entities can be reassociated. + + + Using these mechanisms and the Spring Data Neo4j aspects, a single POJO can contain some fields + handled by JPA and others handles by Spring Data Neo4j. This also includes relationship fields persisted + in the graph database. + +
+
+ Cross-store annotations + + Cross-store persistence only requires the use of one additional annotation: @GraphProperty. + See below for details and an example. + +
+ @NodeEntity(partial = "true") + + When annotating an entity with partial = true, this marks it as a cross-store entity. + Spring Data Neo4j will thus only manage fields explicitly annotated with @GraphProperty. + +
+
+ @GraphProperty + + Fields of primitive or convertible types do not normally have to be annotated in order to be + persisted by Spring Data Neo4j. In cross-store mode, Spring Data Neo4j only + persists fields explicitly annotated with @GraphProperty. JPA will ignore these fields. + +
+
Example + + The following example is taken from the + Spring Data Neo4j examples + myrestaurants-social project: + + + Cross-store node entity + friends; + + @RelatedToVia(type = "recommends") + Iterable recommendations; + + @Temporal(TemporalType.TIMESTAMP) + @DateTimeFormat(style = "S-") + private Date birthDate; + + @ManyToMany(cascade = CascadeType.ALL) + private Set favorites; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + public void knows(UserAccount friend) { + relateTo(friend, "friends"); + } + + public Recommendation rate(Restaurant restaurant, int stars, String comment) { + Recommendation recommendation = relateTo(restaurant, Recommendation.class, "recommends"); + recommendation.rate(stars, comment); + return recommendation; + } + + public Iterable getRecommendations() { + return recommendations; + } +} +]]> + +
+
+
+ Configuring cross-store persistence + + Configuring cross-store persistence is done similarly to the default Spring Data Neo4j configuration. + All you need to do is to specify an entityManagerFactory in the XML namespace + config element, and Spring Data Neo4j will configure itself for cross-store use. + + + Cross-store Spring configuration + + + + + + + + + + + +]]> + + + +
+
From 01c09627d67fb728b6922f7f9b7accbc4073da02 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 20 Dec 2011 13:13:26 +0100 Subject: [PATCH 02/31] updated screencast link for cypher --- src/docbkx/reference/attachdetach.key | Bin 0 -> 259526 bytes src/docbkx/reference/neo4j.xml | 3 ++- .../programming-model/repositories.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 src/docbkx/reference/attachdetach.key diff --git a/src/docbkx/reference/attachdetach.key b/src/docbkx/reference/attachdetach.key new file mode 100644 index 0000000000000000000000000000000000000000..0d3f7d67fee5e88a8b2d43162351d1b869dd3f73 GIT binary patch literal 259526 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�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"Cypher" which draws from many sources. It resembles SQL but with an iconic representation of patterns in the graph (concepts drawn from SPARQL). The Cypher execution engine was written in Scala to leverage the high expressiveness for lazy sequence operations of the language and the - parser combinator library. + parser combinator library. A screencast explaining the possibilities in detail can be found on the + Neo4j video site. Cypher queries always begin with a start set of nodes. Those can be either expressed by their diff --git a/src/docbkx/reference/programming-model/repositories.xml b/src/docbkx/reference/programming-model/repositories.xml index 3c391f11e..d7cb32783 100644 --- a/src/docbkx/reference/programming-model/repositories.xml +++ b/src/docbkx/reference/programming-model/repositories.xml @@ -158,7 +158,7 @@
Cypher examples - There is a screencast available showing many features of the query language. + There is a screencast available showing many features of the query language. The following examples are taken from the cineasts dataset of the tutorial section. From 82c63a6b2482392b64764b601fb3b0014813d6a2 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Bergamin Date: Wed, 21 Dec 2011 15:20:06 +0100 Subject: [PATCH 03/31] Call close() on all (obvious) IndexHits instances to avoid resource leaks --- .../IndexingNodeTypeRepresentationStrategyTest.java | 2 ++ ...xingRelationshipTypeRepresentationStrategyTest.java | 2 ++ .../support/node/CrossStoreNodeEntityState.java | 1 + .../data/neo4j/rest/support/RestIndexTest.java | 10 ++++++++++ 4 files changed, 15 insertions(+) diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingNodeTypeRepresentationStrategyTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingNodeTypeRepresentationStrategyTest.java index 443142e66..a56c9b4c2 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingNodeTypeRepresentationStrategyTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingNodeTypeRepresentationStrategyTest.java @@ -81,6 +81,8 @@ public class IndexingNodeTypeRepresentationStrategyTest extends EntityTestBase { assertEquals(node(subThing), subThingHits.getSingle()); assertEquals(thing.getClass().getName(), node(thing).getProperty(IndexingNodeTypeRepresentationStrategy.TYPE_PROPERTY_NAME)); assertEquals(subThing.getClass().getName(), node(subThing).getProperty(IndexingNodeTypeRepresentationStrategy.TYPE_PROPERTY_NAME)); + thingHits.close(); + subThingHits.close(); } @Test diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategyTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategyTest.java index 0dc535beb..c77055e81 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategyTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategyTest.java @@ -83,6 +83,7 @@ public class IndexingRelationshipTypeRepresentationStrategyTest extends EntityTe Relationship rel = linkHits.getSingle(); assertEquals(rel(link), rel); assertEquals(link.getClass().getName(), rel.getProperty("__type__")); + linkHits.close(); } @Test @@ -104,6 +105,7 @@ public class IndexingRelationshipTypeRepresentationStrategyTest extends EntityTe IndexHits linkHits = typesIndex.get(IndexingNodeTypeRepresentationStrategy.INDEX_KEY, link.getClass().getName()); assertNull(linkHits.getSingle()); + linkHits.close(); } @Test diff --git a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java index 5579ea0dd..6c5e42246 100644 --- a/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java +++ b/spring-data-neo4j-cross-store/src/main/java/org/springframework/data/neo4j/cross_store/support/node/CrossStoreNodeEntityState.java @@ -64,6 +64,7 @@ public class CrossStoreNodeEntityState extends Defaul final String foreignId = createForeignId(id); IndexHits indexHits = getForeignIdIndex().get(FOREIGN_ID, foreignId); Node node = indexHits.hasNext() ? indexHits.next() : null; + indexHits.close(); if (node == null) { node = template.createNode(); persistForeignId(node, id); diff --git a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java index 4fc537be9..7d75c0dc5 100644 --- a/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java +++ b/spring-data-neo4j-rest/src/test/java/org/springframework/data/neo4j/rest/support/RestIndexTest.java @@ -37,6 +37,7 @@ public class RestIndexTest extends RestTestBase { IndexHits hits = nodeIndex().get("name", "test"); Assert.assertEquals("index results", true, hits.hasNext()); Assert.assertEquals(node(), hits.next()); + hits.close(); } @Test @@ -45,6 +46,7 @@ public class RestIndexTest extends RestTestBase { IndexHits hits = nodeIndex().query("name", "tes*"); Assert.assertEquals("index results", true, hits.hasNext()); Assert.assertEquals(node(), hits.next()); + hits.close(); } @Test @@ -53,12 +55,14 @@ public class RestIndexTest extends RestTestBase { IndexHits hits = nodeIndex().query("age", "age:[30 TO 40]"); Assert.assertEquals("index results", true, hits.hasNext()); Assert.assertEquals(node(), hits.next()); + hits.close(); } @Test public void testNotFoundInNodeIndex() { IndexHits hits = nodeIndex().get("foo", "bar"); Assert.assertEquals("no index results", false, hits.hasNext()); + hits.close(); } @Test @@ -68,12 +72,14 @@ public class RestIndexTest extends RestTestBase { IndexHits hits = relationshipIndex().get("name", value); Assert.assertEquals("index results", true, hits.hasNext()); Assert.assertEquals(relationship(), hits.next()); + hits.close(); } @Test public void testNotFoundInRelationshipIndex() { IndexHits hits = relationshipIndex().get("foo", "bar"); Assert.assertEquals("no index results", false, hits.hasNext()); + hits.close(); } @Test @@ -86,6 +92,8 @@ public class RestIndexTest extends RestTestBase { nodeIndex().remove(node(), "time", value); IndexHits hitsAfterRemove = nodeIndex().get("time", value); Assert.assertEquals("not found in index results", false, hitsAfterRemove.hasNext()); + hits.close(); + hitsAfterRemove.close(); } @Test @@ -98,6 +106,8 @@ public class RestIndexTest extends RestTestBase { relationshipIndex().remove(relationship(), "time", value); IndexHits hitsAfterRemove = relationshipIndex().get("time", value); Assert.assertEquals("not found in index results", false, hitsAfterRemove.hasNext()); + hits.close(); + hitsAfterRemove.close(); } private Index nodeIndex() { From 4bab5cc98489c600161d7066350cca0a84092a78 Mon Sep 17 00:00:00 2001 From: Werner Nickl Date: Thu, 22 Dec 2011 17:29:23 +0100 Subject: [PATCH 04/31] added a abstract class for the IndexingTypeRepresentationTypes --- ...actIndexingTypeRepresentationStrategy.java | 115 ++++++++++++++++++ ...ndexingNodeTypeRepresentationStrategy.java | 70 +---------- ...elationshipTypeRepresentationStrategy.java | 80 +----------- 3 files changed, 124 insertions(+), 141 deletions(-) create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java new file mode 100644 index 000000000..904fe0150 --- /dev/null +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/AbstractIndexingTypeRepresentationStrategy.java @@ -0,0 +1,115 @@ +/** + * 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.support.typerepresentation; + +import java.lang.annotation.Annotation; + +import org.neo4j.graphdb.PropertyContainer; +import org.neo4j.graphdb.index.Index; +import org.neo4j.graphdb.index.IndexHits; +import org.neo4j.helpers.collection.ClosableIterable; +import org.springframework.data.neo4j.core.GraphDatabase; +import org.springframework.data.neo4j.core.TypeRepresentationStrategy; +import org.springframework.data.neo4j.support.index.ClosableIndexHits; +import org.springframework.data.neo4j.support.index.IndexProvider; +import org.springframework.data.neo4j.support.index.IndexType; + +public abstract class AbstractIndexingTypeRepresentationStrategy implements + TypeRepresentationStrategy { + + public static final String TYPE_PROPERTY_NAME = "__type__"; + public static final String INDEX_KEY = "className"; + protected String INDEX_NAME; + protected final GraphDatabase graphDb; + protected final EntityTypeCache typeCache; + protected final IndexProvider indexProvider; + private final Class clazz; + private final Class typeEntityClass; + + public AbstractIndexingTypeRepresentationStrategy(GraphDatabase graphDb, IndexProvider indexProvider, + final String indexName, final Class clazz, + final Class typeEntityClass) { + this.graphDb = graphDb; + this.indexProvider = indexProvider; + typeCache = new EntityTypeCache(); + INDEX_NAME = indexName; + this.clazz = clazz; + this.typeEntityClass = typeEntityClass; + } + + @SuppressWarnings("unchecked") + public Index getTypesIndex() { + return (Index) graphDb.createIndex(clazz, INDEX_NAME, IndexType.SIMPLE); + } + + @Override + public void postEntityCreation(S state, Class type) { + addToTypesIndex(state, type); + state.setProperty(TYPE_PROPERTY_NAME, type.getName()); + } + + @Override + public long count(Class entityClass) { + long count = 0; + final IndexHits hits = getTypesIndex().get(INDEX_KEY, entityClass.getName()); + while (hits.hasNext()) { + hits.next(); + count++; + } + return count; + } + + @Override + public void preEntityRemoval(S state) { + getTypesIndex().remove(state); + } + + @Override + public ClosableIterable findAll(Class clazz) { + return findAllRelBacked(clazz); + } + + @Override + public Class getJavaType(S propertyContainer) { + if (propertyContainer == null) + throw new IllegalArgumentException("Relationship or Node is null"); + String className = (String) propertyContainer.getProperty(TYPE_PROPERTY_NAME); + return typeCache.getClassForName(className); + } + + protected void addToTypesIndex(S relationshipOrNode, Class entityClass) { + Class type = entityClass; + while (type.getAnnotation(typeEntityClass) != null) { + String value = entityClass.getName(); + if (indexProvider != null) + value = indexProvider.createIndexValueForType(entityClass); + + getTypesIndex().add(relationshipOrNode, INDEX_KEY, value); + type = type.getSuperclass(); + } + } + + @SuppressWarnings("hiding") + private ClosableIterable findAllRelBacked(Class clazz) { + String value = clazz.getName(); + if (indexProvider != null) + value = indexProvider.createIndexValueForType(clazz); + + final IndexHits allEntitiesOfType = getTypesIndex().get(INDEX_KEY, value); + return new ClosableIndexHits(allEntitiesOfType); + } + +} diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java index 5b52d36a4..207860b38 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingNodeTypeRepresentationStrategy.java @@ -17,89 +17,31 @@ package org.springframework.data.neo4j.support.typerepresentation; import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.index.Index; -import org.neo4j.graphdb.index.IndexHits; -import org.neo4j.helpers.collection.ClosableIterable; import org.springframework.data.neo4j.annotation.NodeEntity; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.core.NodeTypeRepresentationStrategy; -import org.springframework.data.neo4j.support.index.ClosableIndexHits; import org.springframework.data.neo4j.support.index.IndexProvider; -import org.springframework.data.neo4j.support.index.IndexType; -public class IndexingNodeTypeRepresentationStrategy implements NodeTypeRepresentationStrategy { +public class IndexingNodeTypeRepresentationStrategy extends AbstractIndexingTypeRepresentationStrategy implements + NodeTypeRepresentationStrategy { public static final String INDEX_NAME = "__types__"; - public static final String TYPE_PROPERTY_NAME = "__type__"; - public static final String INDEX_KEY = "className"; - private final GraphDatabase graphDb; - private final EntityTypeCache typeCache; - - private final IndexProvider indexProvider; public IndexingNodeTypeRepresentationStrategy(GraphDatabase graphDb, IndexProvider indexProvider) { - this.graphDb = graphDb; - this.indexProvider = indexProvider; - typeCache = new EntityTypeCache(); - } - - private Index getNodeTypesIndex() { - return graphDb.createIndex(Node.class, INDEX_NAME, IndexType.SIMPLE); + super(graphDb, indexProvider, INDEX_NAME, Node.class, NodeEntity.class); } @Override - public void postEntityCreation(Node state, Class type) { - addToNodeTypesIndex(state, type); - state.setProperty(TYPE_PROPERTY_NAME, type.getName()); - } - - private void addToNodeTypesIndex(Node node, Class entityClass) { + protected void addToTypesIndex(Node node, Class entityClass) { Class klass = entityClass; - while (klass.getAnnotation(NodeEntity.class) != null) { String value = klass.getName(); if (indexProvider != null) value = indexProvider.createIndexValueForType(klass); - getNodeTypesIndex().add(node, INDEX_KEY, value); + getTypesIndex().add(node, INDEX_KEY, value); klass = klass.getSuperclass(); } } - @Override - public ClosableIterable findAll(Class clazz) { - return findAllNodeBacked(clazz); - } - - private ClosableIterable findAllNodeBacked(Class clazz) { - String value = clazz.getName(); - if (indexProvider != null) - value = indexProvider.createIndexValueForType(clazz); - - final IndexHits allEntitiesOfType = getNodeTypesIndex().get(INDEX_KEY, value); - return new ClosableIndexHits(allEntitiesOfType); - } - - @Override - public long count(Class entityClass) { - long count = 0; - for (Object o : getNodeTypesIndex().get(INDEX_KEY, entityClass.getName())) { - count += 1; - } - return count; - } - - @SuppressWarnings("unchecked") - @Override - public Class getJavaType(Node node) { - if (node == null) throw new IllegalArgumentException("Node is null"); - String className = (String) node.getProperty(TYPE_PROPERTY_NAME); - return typeCache.getClassForName(className); - } - - @Override - public void preEntityRemoval(Node state) { - getNodeTypesIndex().remove(state); - } - -} +} \ No newline at end of file diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java index 179a99f44..c5e5dd519 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java @@ -17,92 +17,18 @@ package org.springframework.data.neo4j.support.typerepresentation; import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.index.Index; -import org.neo4j.graphdb.index.IndexHits; -import org.neo4j.helpers.collection.ClosableIterable; import org.springframework.data.neo4j.annotation.RelationshipEntity; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.core.RelationshipTypeRepresentationStrategy; -import org.springframework.data.neo4j.support.index.ClosableIndexHits; import org.springframework.data.neo4j.support.index.IndexProvider; -import org.springframework.data.neo4j.support.index.IndexType; -public class IndexingRelationshipTypeRepresentationStrategy implements RelationshipTypeRepresentationStrategy { +public class IndexingRelationshipTypeRepresentationStrategy extends + AbstractIndexingTypeRepresentationStrategy implements RelationshipTypeRepresentationStrategy { public static final String INDEX_NAME = "__rel_types__"; - public static final String TYPE_PROPERTY_NAME = "__type__"; - public static final String INDEX_KEY = "className"; - private final GraphDatabase graphDb; - private final EntityTypeCache typeCache; - - private final IndexProvider indexProvider; public IndexingRelationshipTypeRepresentationStrategy(GraphDatabase graphDb, IndexProvider indexProvider) { - this.graphDb = graphDb; - this.indexProvider = indexProvider; - typeCache = new EntityTypeCache(); - } - - private Index getRelTypesIndex() { - return graphDb.createIndex(Relationship.class,INDEX_NAME, IndexType.SIMPLE); - } - - @Override - public void postEntityCreation(Relationship state, Class type) { - addToTypesIndex(state, type); - state.setProperty(TYPE_PROPERTY_NAME, type.getName()); - } - - private void addToTypesIndex(Relationship node, Class entityClass) { - Class type = entityClass; - while (type.getAnnotation(RelationshipEntity.class) != null) { - String value = entityClass.getName(); - if (indexProvider != null) - value = indexProvider.createIndexValueForType(entityClass); - - getRelTypesIndex().add(node, INDEX_KEY, value); - type = type.getSuperclass(); - } - } - - @Override - public ClosableIterable findAll(Class clazz) { - return findAllRelBacked(clazz); - } - - private ClosableIterable findAllRelBacked(Class clazz) { - String value = clazz.getName(); - if (indexProvider != null) - value = indexProvider.createIndexValueForType(clazz); - - final IndexHits allEntitiesOfType = getRelTypesIndex().get(INDEX_KEY, value); - return new ClosableIndexHits(allEntitiesOfType); - } - - - @Override - public long count(Class entityClass) { - long count = 0; - final IndexHits hits = getRelTypesIndex().get(INDEX_KEY, entityClass.getName()); - while (hits.hasNext()) { - hits.next(); - count++; - } - return count; - } - - @Override - @SuppressWarnings("unchecked") - public Class getJavaType(Relationship relationship) { - if (relationship == null) throw new IllegalArgumentException("Relationship is null"); - String className = (String) relationship.getProperty(TYPE_PROPERTY_NAME); - return typeCache.getClassForName(className); - } - - - @Override - public void preEntityRemoval(Relationship state) { - getRelTypesIndex().remove(state); + super(graphDb, indexProvider, INDEX_NAME, Relationship.class, RelationshipEntity.class); } } From 074bcdb814cff8a3e8453977082c9121a5fde5ea Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 19 Dec 2011 11:49:08 +0100 Subject: [PATCH 05/31] DATAGRAPH-157 Check for non primitive id fields in simple mapping mode --- .../mapping/Neo4jPersistentEntityImpl.java | 7 ++++- .../mapping/Neo4jMappingContextTest.java | 7 +++++ .../springframework/data/neo4j/model/Car.java | 2 +- .../data/neo4j/model/PrimitiveIdEntity.java | 28 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/PrimitiveIdEntity.java diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jPersistentEntityImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jPersistentEntityImpl.java index 55cc6c3d1..c1358d205 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jPersistentEntityImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4jPersistentEntityImpl.java @@ -59,7 +59,12 @@ public class Neo4jPersistentEntityImpl extends BasicPersistentEntity Date: Mon, 19 Dec 2011 12:45:33 +0100 Subject: [PATCH 06/31] =?UTF-8?q?added=20test=20for=20relationship-reposit?= =?UTF-8?q?ory=20findAll=E2=81=84=E2=81=84=E2=81=84=E2=81=84=E2=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/neo4j/support/EntityNeo4jTemplateTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTest.java index 505a2ca95..5ba29066b 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/support/EntityNeo4jTemplateTest.java @@ -22,6 +22,7 @@ import org.mockito.Mockito; import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; +import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.helpers.collection.MapUtil; import org.neo4j.kernel.Traversal; import org.springframework.beans.factory.annotation.Autowired; @@ -45,9 +46,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionTemplate; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; +import java.util.*; import static org.junit.Assert.*; import static org.neo4j.graphdb.Direction.OUTGOING; @@ -306,6 +305,10 @@ public class EntityNeo4jTemplateTest extends EntityTestBase { public void testCreateRelationshipBetweenNodes() throws Exception { final Friendship friendship = neo4jOperations.createRelationshipBetween(testTeam.david, testTeam.emil, Friendship.class, "knows", false); assertEquals(friendship.getId(),(Long)getNodeState(testTeam.david).getSingleRelationship(KNOWS, OUTGOING).getId()); + final List friendships = IteratorUtil.addToCollection(friendshipRepository.findAll(), new ArrayList()); + assertEquals(2,friendships.size()); + assertEquals(testTeam.friendShip,friendships.get(0)); + assertEquals(friendship,friendships.get(1)); } @Test @Transactional public void testCreateDuplicateRelationshipBetweenNodes() throws Exception { From 39d31d5864b3c1015d07cb222e13072fadadc5fc Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Wed, 21 Dec 2011 05:23:41 +0100 Subject: [PATCH 07/31] neo4j version update --- spring-data-neo4j-aspects/pom.xml | 4 +- .../support/query/GremlinQueryEngineTest.java | 2 +- spring-data-neo4j-cross-store/pom.xml | 4 +- ...taGraphNamespaceHandlerCrossStoreTest.java | 2 +- .../Neo4jGraphRecommendationTest-context.xml | 1 - spring-data-neo4j-examples/cineasts/pom.xml | 2 +- spring-data-neo4j-parent/pom.xml | 76 ++++++++++++++++-- spring-data-neo4j-rest/pom.xml | 6 +- .../neo4j/rest/support/LocalTestServer.java | 17 +--- spring-data-neo4j/pom.xml | 4 +- .../repository/NodeGraphRepositoryImpl.java | 5 ++ .../RelationshipOperationsRepository.java | 1 + .../mapping/SourceStateTransmitter.java | 8 +- .../neo4j/support/query/GremlinExecutor.java | 4 +- .../neo4j/transaction/SpringProvider.java | 4 +- .../config/DataGraphNamespaceHandlerTest.java | 2 +- .../data/neo4j/model/Person.java | 6 +- .../neo4j/repository/GraphRepositoryTest.java | 17 ++-- .../neo4j/repository/PersonRepository.java | 2 +- .../support/EntityNeo4jTemplateTest.java | 5 +- .../{ => programming-model}/attachdetach.png | Bin .../programming-model/repositories.xml | 2 +- 22 files changed, 116 insertions(+), 58 deletions(-) rename src/docbkx/reference/{ => programming-model}/attachdetach.png (100%) diff --git a/spring-data-neo4j-aspects/pom.xml b/spring-data-neo4j-aspects/pom.xml index 03a0cbfd3..f98d77fba 100644 --- a/spring-data-neo4j-aspects/pom.xml +++ b/spring-data-neo4j-aspects/pom.xml @@ -124,8 +124,8 @@ - com.tinkerpop - gremlin + com.tinkerpop.gremlin + gremlin-groovy true diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java index c96a94db7..7b4a01a40 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/query/GremlinQueryEngineTest.java @@ -66,7 +66,7 @@ public class GremlinQueryEngineTest extends EntityTestBase { @Test @Transactional public void testQueryList() throws Exception { - final String queryString = "t = new Table(); [g.v(michael),g.v(david)].each{ n -> n.as('person.name').as('person.age').table(t,['person.name','person.age']){ it.age }{ it.name } >> -1}; t;" ; + final String queryString = "t = new Table(); [g.v(michael),g.v(david)].each{ n -> n.as('person.name').as('person.age').table(t,['person.name','person.age']){ it.age }{ it.name }.iterate()}; t;" ; final Collection result = IteratorUtil.asCollection(queryEngine.query(queryString, MapUtil.map("michael", getNodeId(michael), "david", getNodeId(testTeam.david)))); assertEquals(asList(testTeam.simpleRowFor(michael, "person"), testTeam.simpleRowFor(testTeam.david, "person")), result); diff --git a/spring-data-neo4j-cross-store/pom.xml b/spring-data-neo4j-cross-store/pom.xml index d7cfa22c8..78114b980 100644 --- a/spring-data-neo4j-cross-store/pom.xml +++ b/spring-data-neo4j-cross-store/pom.xml @@ -127,8 +127,8 @@ - com.tinkerpop - gremlin + com.tinkerpop.gremlin + gremlin-groovy true diff --git a/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java index deb57abfe..996d273e8 100644 --- a/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java +++ b/spring-data-neo4j-cross-store/src/test/java/org/springframework/data/neo4j/config/DataGraphNamespaceHandlerCrossStoreTest.java @@ -52,7 +52,7 @@ public class DataGraphNamespaceHandlerCrossStoreTest { Neo4jTemplate template = config.template; Assert.assertNotNull("template", template); EmbeddedGraphDatabase graphDatabaseService = (EmbeddedGraphDatabase) template.getGraphDatabaseService(); - Assert.assertEquals("store-dir", "target/config-test", graphDatabaseService.getStoreDir()); + Assert.assertTrue("store-dir", graphDatabaseService.getStoreDir().endsWith("target/config-test")); Assert.assertNotNull("graphDatabaseService", config.graphDatabaseService); Assert.assertNotNull("transactionManager", config.transactionManager); config.graphDatabaseService.shutdown(); diff --git a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 1c99fb129..96beb27fc 100644 --- a/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j-cross-store/src/test/resources/org/springframework/data/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -55,7 +55,6 @@ - diff --git a/spring-data-neo4j-examples/cineasts/pom.xml b/spring-data-neo4j-examples/cineasts/pom.xml index 88011fa96..df85250e6 100644 --- a/spring-data-neo4j-examples/cineasts/pom.xml +++ b/spring-data-neo4j-examples/cineasts/pom.xml @@ -14,7 +14,7 @@ 3.0.6.RELEASE 1.6.1 UTF-8 - 1.5 + 1.6.M02 2.0.0.BUILD-SNAPSHOT 1.6.1 1.6.12 diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index 49f8376fa..6e40ca2d4 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -124,12 +124,13 @@ 1.8.4 1.6.1 3.0.6.RELEASE - 1.2.0.M2 - 1.5 + 1.2.0.RC1 + 1.6.M02 0.7-SNAPSHOT 1.6.12 - 1.0 - 1.3 + 1.1 + 1.4 + 1.4 @@ -334,6 +335,61 @@ + + com.tinkerpop.gremlin + gremlin-groovy + ${gremlin.version} + jar + + + org.neo4j + neo4j + + + org.neo4j + neo4j-ha + + + org.neo4j + neo4j-management + + + + com.tinkerpop.blueprints + blueprints-sail-graph + + + + org.codehaus.groovy.maven + gmaven-plugin + + + + jline + jline + + + + + com.tinkerpop.blueprints + blueprints-neo4j-graph + ${blueprints.version} + + + org.neo4j + neo4j + + + org.neo4j + neo4j-ha + + + org.neo4j + neo4j-management + + + + com.tinkerpop.blueprints blueprints-core @@ -348,8 +404,8 @@ - com.tinkerpop - gremlin + com.tinkerpop.gremlin + gremlin-groovy ${gremlin.version} true @@ -410,7 +466,7 @@ org.neo4j neo4j-cypher-dsl - ${neo4j.version} + 1.5 org.apache.maven.plugins maven-eclipse-plugin 2.8 - 1.5 org.eclipse.jdt.core.javanature @@ -310,47 +307,6 @@ - - diff --git a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml index 15fad138c..5f2ab6a16 100644 --- a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml @@ -11,7 +11,7 @@ UTF-8 - 3.0.6.RELEASE + 3.0.7.RELEASE 1.6.12 1.6.1 UTF-8 diff --git a/spring-data-neo4j-examples/hello-worlds/pom.xml b/spring-data-neo4j-examples/hello-worlds/pom.xml index 2ad094ca4..e354db880 100644 --- a/spring-data-neo4j-examples/hello-worlds/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds/pom.xml @@ -11,7 +11,7 @@ UTF-8 - 3.0.6.RELEASE + 3.0.7.RELEASE 1.6.12 1.6.1 UTF-8 diff --git a/spring-data-neo4j-examples/imdb/pom.xml b/spring-data-neo4j-examples/imdb/pom.xml index 23921ad8b..dafe10f03 100644 --- a/spring-data-neo4j-examples/imdb/pom.xml +++ b/spring-data-neo4j-examples/imdb/pom.xml @@ -7,7 +7,7 @@ 2.0.0-BUILD-SNAPSHOT imdb - 3.0.6.RELEASE + 3.0.7.RELEASE 1.6.12 1.6.1 UTF-8 diff --git a/spring-data-neo4j-examples/myrestaurants-social/pom.xml b/spring-data-neo4j-examples/myrestaurants-social/pom.xml index 76d53f957..652a00d8b 100644 --- a/spring-data-neo4j-examples/myrestaurants-social/pom.xml +++ b/spring-data-neo4j-examples/myrestaurants-social/pom.xml @@ -7,11 +7,11 @@ 2.0.0.BUILD-SNAPSHOT myrestaurants-social - 3.0.6.RELEASE + 3.0.7.RELEASE 2.0.0.BUILD-SNAPSHOT 1.6.12 1.6.1 - 1.5 + 1.6.M02 UTF-8 3.0.6.RELEASE From 1d45cddef3307a39523f1fc110ff2bde9bdea8f3 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 01:13:07 +0100 Subject: [PATCH 11/31] DATAGRAPH-162 handle potential cascaded persistent entity types of a Neo4jPersistentProperty correctly --- .../mapping/Neo4JPersistentPropertyImpl.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4JPersistentPropertyImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4JPersistentPropertyImpl.java index b09413e8a..e588933be 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4JPersistentPropertyImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/mapping/Neo4JPersistentPropertyImpl.java @@ -34,6 +34,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.IdentityHashMap; +import java.util.Iterator; import java.util.Map; /** @@ -260,14 +261,15 @@ class Neo4jPersistentPropertyImpl extends AbstractPersistentProperty type) { + return type.isAnnotationPresent(RelationshipEntity.class); } - private boolean hasNodeEntityType() { - return getType().isAnnotationPresent(NodeEntity.class); + + private boolean isNodeEntity(Class type) { + return type.isAnnotationPresent(NodeEntity.class); } public String getIndexKey() { @@ -300,4 +302,17 @@ class Neo4jPersistentPropertyImpl extends AbstractPersistentProperty> getPersistentEntityType() { + final Iterable> result = super.getPersistentEntityType(); + for (Iterator> it = result.iterator(); it.hasNext(); ) { + final TypeInformation typeInformation = it.next(); + final Class type = typeInformation.getType(); + if (isNodeEntity(type) || isRelationshipEntity(type)) continue; + System.out.println("removing "+getName()+" "+type+" "+typeInformation.getActualType().getType()); + it.remove(); + } + return result; + } } From c32f7c34addb32fafc5253558e3a47b8ec9bd1f3 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 01:19:55 +0100 Subject: [PATCH 12/31] DATAGRAPH-161 Upgrade to Spring 3.0.7.GA Neo4j 1.6.M02 Spring Data Commons 1.2.0.GA --- build/ivy/settings/ivy.xml | 6 ++--- .../hello-worlds-aspects/build.gradle | 6 ++--- .../hello-worlds-aspects/settings/ivy.xml | 8 +++---- .../hello-worlds/build.gradle | 7 ++---- .../hello-worlds/build.xml | 22 ++++--------------- .../hello-worlds/settings/ivy.xml | 6 ++--- src/docbkx/tutorial/neo4j.xml | 2 +- src/docbkx/tutorial/setup.xml | 2 +- 8 files changed, 20 insertions(+), 39 deletions(-) diff --git a/build/ivy/settings/ivy.xml b/build/ivy/settings/ivy.xml index 860761182..3e7f55830 100644 --- a/build/ivy/settings/ivy.xml +++ b/build/ivy/settings/ivy.xml @@ -6,9 +6,9 @@ - - - + + + diff --git a/spring-data-neo4j-examples/hello-worlds-aspects/build.gradle b/spring-data-neo4j-examples/hello-worlds-aspects/build.gradle index c4b693f2d..7ffdbf9b7 100644 --- a/spring-data-neo4j-examples/hello-worlds-aspects/build.gradle +++ b/spring-data-neo4j-examples/hello-worlds-aspects/build.gradle @@ -5,9 +5,9 @@ apply plugin: 'idea' apply plugin: 'eclipse' -springVersion = "3.0.5.RELEASE" -springDataNeo4jVersion = "1.1.0.RELEASE" -aspectjVersion = "1.6.11.RELEASE" +springVersion = "3.0.7.RELEASE" +springDataNeo4jVersion = "2.0.0.RELEASE" +aspectjVersion = "1.6.12" apply from:'https://github.com/SpringSource/spring-data-neo4j/raw/master/build/gradle/springdataneo4j.gradle' diff --git a/spring-data-neo4j-examples/hello-worlds-aspects/settings/ivy.xml b/spring-data-neo4j-examples/hello-worlds-aspects/settings/ivy.xml index 2564c1bf5..d1bd7bcfa 100644 --- a/spring-data-neo4j-examples/hello-worlds-aspects/settings/ivy.xml +++ b/spring-data-neo4j-examples/hello-worlds-aspects/settings/ivy.xml @@ -1,14 +1,14 @@ - + - - - + + + diff --git a/spring-data-neo4j-examples/hello-worlds/build.gradle b/spring-data-neo4j-examples/hello-worlds/build.gradle index c4b693f2d..7b2c1ccd5 100644 --- a/spring-data-neo4j-examples/hello-worlds/build.gradle +++ b/spring-data-neo4j-examples/hello-worlds/build.gradle @@ -5,11 +5,8 @@ apply plugin: 'idea' apply plugin: 'eclipse' -springVersion = "3.0.5.RELEASE" -springDataNeo4jVersion = "1.1.0.RELEASE" -aspectjVersion = "1.6.11.RELEASE" - -apply from:'https://github.com/SpringSource/spring-data-neo4j/raw/master/build/gradle/springdataneo4j.gradle' +springVersion = "3.0.7.RELEASE" +springDataNeo4jVersion = "2.0.0.RELEASE" configurations { runtime diff --git a/spring-data-neo4j-examples/hello-worlds/build.xml b/spring-data-neo4j-examples/hello-worlds/build.xml index 60a0d7f3d..c975fc6cf 100644 --- a/spring-data-neo4j-examples/hello-worlds/build.xml +++ b/spring-data-neo4j-examples/hello-worlds/build.xml @@ -7,8 +7,6 @@ - - @@ -29,14 +27,8 @@ - - - - - - - - + + @@ -44,14 +36,8 @@ - - - - - - - - + + diff --git a/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml b/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml index 2564c1bf5..58f5da722 100644 --- a/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml +++ b/spring-data-neo4j-examples/hello-worlds/settings/ivy.xml @@ -1,14 +1,12 @@ - + - - - + diff --git a/src/docbkx/tutorial/neo4j.xml b/src/docbkx/tutorial/neo4j.xml index d4690abbd..5129504a8 100644 --- a/src/docbkx/tutorial/neo4j.xml +++ b/src/docbkx/tutorial/neo4j.xml @@ -40,7 +40,7 @@ org.neo4j neo4j - 1.5 + 1.6.M02 ]]> diff --git a/src/docbkx/tutorial/setup.xml b/src/docbkx/tutorial/setup.xml index 730265306..87d93cc1b 100644 --- a/src/docbkx/tutorial/setup.xml +++ b/src/docbkx/tutorial/setup.xml @@ -32,7 +32,7 @@ Project pom.xml - 3.0.6.RELEASE + 3.0.7.RELEASE From ced3b4ecc5c18692815366ccf6a9978daaecece6 Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Fri, 23 Dec 2011 10:42:43 -0500 Subject: [PATCH 13/31] ported sdn-todos example into org.neo4j namespace, altered text as appropriate --- spring-data-neo4j-examples/todos/.gitignore | 9 + spring-data-neo4j-examples/todos/Procfile | 1 + spring-data-neo4j-examples/todos/bin/todo | 60 +++ spring-data-neo4j-examples/todos/pom.xml | 362 ++++++++++++++++++ spring-data-neo4j-examples/todos/readme.md | 87 +++++ .../todos/src/main/java/Main.java | 23 ++ .../main/java/org/neo4j/app/todos/Todo.java | 76 ++++ .../org/neo4j/app/todos/TodoController.java | 127 ++++++ .../org/neo4j/app/todos/TodoRepository.java | 7 + .../spring/applicationContext-graph.xml | 26 ++ .../META-INF/spring/applicationContext.xml | 64 ++++ .../todos/src/main/resources/log4j.properties | 17 + .../todos/src/main/webapp/404.html | 47 +++ .../webapp/WEB-INF/classes/alt.properties | 1 + .../WEB-INF/classes/standard.properties | 1 + .../webapp/WEB-INF/spring/webmvc-config.xml | 9 + .../todos/src/main/webapp/WEB-INF/web.xml | 88 +++++ .../images/apple-touch-icon-114x114.png | Bin 0 -> 4349 bytes .../webapp/images/apple-touch-icon-72x72.png | Bin 0 -> 4072 bytes .../main/webapp/images/apple-touch-icon.png | Bin 0 -> 3369 bytes .../todos/src/main/webapp/images/favicon.ico | Bin 0 -> 2614 bytes .../src/main/webapp/images/icon_neo4j.png | Bin 0 -> 8133 bytes .../todos/src/main/webapp/images/icon_sdn.png | Bin 0 -> 6474 bytes .../todos/src/main/webapp/index.jsp | 107 ++++++ .../src/main/webapp/javascripts/sdn-todos.js | 25 ++ .../todos/src/main/webapp/javascripts/tabs.js | 42 ++ .../todos/src/main/webapp/log4j.properties | 17 + .../todos/src/main/webapp/robots.txt | 5 + .../src/main/webapp/stylesheets/base.css | 338 ++++++++++++++++ .../src/main/webapp/stylesheets/layout.css | 58 +++ .../src/main/webapp/stylesheets/skeleton.css | 236 ++++++++++++ 31 files changed, 1833 insertions(+) create mode 100644 spring-data-neo4j-examples/todos/.gitignore create mode 100644 spring-data-neo4j-examples/todos/Procfile create mode 100755 spring-data-neo4j-examples/todos/bin/todo create mode 100644 spring-data-neo4j-examples/todos/pom.xml create mode 100644 spring-data-neo4j-examples/todos/readme.md create mode 100644 spring-data-neo4j-examples/todos/src/main/java/Main.java create mode 100644 spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/Todo.java create mode 100644 spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoController.java create mode 100644 spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoRepository.java create mode 100644 spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml create mode 100644 spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext.xml create mode 100644 spring-data-neo4j-examples/todos/src/main/resources/log4j.properties create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/404.html create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/alt.properties create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/standard.properties create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/spring/webmvc-config.xml create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/web.xml create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-114x114.png create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-72x72.png create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon.png create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/images/favicon.ico create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/images/icon_neo4j.png create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/images/icon_sdn.png create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/index.jsp create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js create mode 100644 spring-data-neo4j-examples/todos/src/main/webapp/log4j.properties create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/robots.txt create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css create mode 100755 spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css diff --git a/spring-data-neo4j-examples/todos/.gitignore b/spring-data-neo4j-examples/todos/.gitignore new file mode 100644 index 000000000..126bde297 --- /dev/null +++ b/spring-data-neo4j-examples/todos/.gitignore @@ -0,0 +1,9 @@ +target/ +.idea +*.iml +.project +.classpath +.settings/ +*.swp +*~ +.DS_Store diff --git a/spring-data-neo4j-examples/todos/Procfile b/spring-data-neo4j-examples/todos/Procfile new file mode 100644 index 000000000..845910083 --- /dev/null +++ b/spring-data-neo4j-examples/todos/Procfile @@ -0,0 +1 @@ +web: sh target/bin/webapp diff --git a/spring-data-neo4j-examples/todos/bin/todo b/spring-data-neo4j-examples/todos/bin/todo new file mode 100755 index 000000000..0d140bc2d --- /dev/null +++ b/spring-data-neo4j-examples/todos/bin/todo @@ -0,0 +1,60 @@ +#!/bin/sh + +while getopts ":r" opt; do + case $opt in + r) + export APP_URL=`heroku info --raw | sed -n 's/^web_url=\(.*\)$/\1/p'` + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + ;; + esac + shift +done + +APP_URL=${APP_URL:="http://localhost:8080/"} +REST_ENDPOINT="${APP_URL}api/todos" +CURL_OPTS="--verbose --fail -H Accept:application/json -H Content-Type:application/json" + +list() { + curl ${CURL_OPTS} ${REST_ENDPOINT} +} + +make() { + TITLE=$1 + curl -d "{ \"title\" :\"${TITLE}\"}" ${CURL_OPTS} ${REST_ENDPOINT} +} + +remove() { + ID=$1 + REST_ENDPOINT="${REST_ENDPOINT}/${ID}" + curl -X DELETE ${CURL_OPTS} ${REST_ENDPOINT} +} + +usage() { + echo "Usage: $0 { list | mk | rm }" +} + +if [ "$1" == "" ]; then + usage + exit 1 +fi + + +case "$1" in + list) + list + ;; + + mk) + if [ "$2" == "" ]; then usage; echo " mk \"text\""; exit 1; fi + make "$2" + ;; + rm) + if [ "$2" == "" ]; then usage; echo " rm {id}"; exit 1; fi + remove "$2" + ;; + *) + usage + ;; +esac diff --git a/spring-data-neo4j-examples/todos/pom.xml b/spring-data-neo4j-examples/todos/pom.xml new file mode 100644 index 000000000..e0603aa67 --- /dev/null +++ b/spring-data-neo4j-examples/todos/pom.xml @@ -0,0 +1,362 @@ + + 4.0.0 + + org.neo4j.app + sdn-todos + 1.0-SNAPSHOT + jar + + sdn-todos + + + UTF-8 + 1.5 + 3.0.6.RELEASE + 2.0.0.RC1 + 1.6.12 + 1.6.1 + + + + + spring-maven-release + Spring Maven Release Repository + http://maven.springframework.org/release + + + neo4j-public-repository + http://m2.neo4j.org/ + Publicly available Maven 2 repository for Neo4j + + + spring-maven-milestone + http://maven.springframework.org/milestone + Spring Framework Maven MILESTONE Repository + + true + + + + spring-maven-snapshot + http://maven.springframework.org/snapshot + Springframework Maven SNAPSHOT Repository + + true + + + + + + spring-maven-release + Spring Maven Release Repository + http://maven.springframework.org/release + + + spring-maven-milestone + Spring Maven Milestone Repository + http://maven.springframework.org/milestone + + + + + + junit + junit + 4.8.2 + test + + + log4j + log4j + 1.2.16 + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + org.aspectj + aspectjrt + ${aspectj.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + javax.servlet + servlet-api + 2.5 + compile + + + net.sf.flexjson + flexjson + 2.1 + + + + org.eclipse.jetty + jetty-webapp + 7.4.4.v20110707 + + + org.mortbay.jetty + jsp-2.1-glassfish + 2.1.v20100127 + + + + + org.springframework + spring-core + ${spring.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-test + ${spring.version} + test + + + commons-logging + commons-logging + + + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-aspects + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework.data + spring-data-neo4j-aspects + ${spring-data-neo4j.version} + + + org.springframework.data + spring-data-neo4j-rest + ${spring-data-neo4j.version} + + + javax.validation + validation-api + 1.0.0.GA + + + org.neo4j + neo4j + ${neo4j.version} + + + org.neo4j + neo4j-udc + + + + + org.springframework + spring-web + ${spring.version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + ${spring.version} + + + + commons-logging + commons-logging + + + + + + + + org.codehaus.mojo + appassembler-maven-plugin + 1.1.1 + + + package + assemble + + target + -Xmx512m + + + Main + webapp + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + UTF-8 + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.2 + + + + org.aspectj + aspectjrt + ${aspectj.version} + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + compile + test-compile + + + + + true + + + org.springframework + spring-aspects + + + org.springframework.data + spring-data-neo4j-aspects + + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.8 + + false + true + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.7 + + true + false + 2.0 + + + org.eclipse.ajdt.core.ajbuilder + + org.springframework.aspects + + + + org.springframework.ide.eclipse.core.springbuilder + + + + org.eclipse.ajdt.ui.ajnature + org.springframework.ide.eclipse.core.springnature + + + + + org.apache.maven.plugins + maven-idea-plugin + 2.2 + + true + true + + + + org.codehaus.mojo + tomcat-maven-plugin + 1.1 + + + org.mortbay.jetty + jetty-maven-plugin + 7.4.2.v20110526 + + + /${project.name} + + + + + + + diff --git a/spring-data-neo4j-examples/todos/readme.md b/spring-data-neo4j-examples/todos/readme.md new file mode 100644 index 000000000..fb4fbbe38 --- /dev/null +++ b/spring-data-neo4j-examples/todos/readme.md @@ -0,0 +1,87 @@ +Spring Data Neo4j Todos +======================= + +A simple todo list using Spring Data Neo4j, configured for easy deployment to Heroku. + +Get Ready +--------- + +To prepare for deploying to Heroku, you must first become a Hero: + +* Create an account on [Heroku](http://heroku.com) +* Install the `heroku` command-line client +* See the [Heroku Quickstart](http://devcenter.heroku.com/articles/quickstart) for details + +Feel ready? OK, then get a copy of this project and checkout the heroku-deploy branch: + +```bash +git clone git://github.com/akollegger/sdn-todos.git +cd sdn-todos +git checkout heroku-deploy +``` + +Local build and run +------------------- + +* Run a local Neo4j server (using default config) + +```bash +export NEO4J_REST_URL=http://localhost:7474/db/data +export NEO4J_LOGIN="" +export NEO4J_PASSWORD="" +``` +* Build, then run locally + +```bash +mvn package +sh target/bin/webapp +``` + +* check that it is working + +```bash +./bin/todo mk "tweet high praises to @neo4j" +./bin/todo list +``` + +Satisfied? Then `ctrl-c` to kill the application. + + +Deploy on Heroku +---------------- + +Create a new provisioning stack on Heroku for the app. + +```bash +heroku create --stack cedar` +heroku addons:add neo4j +git push heroku heroku-deploy:master +``` + +Check to make sure it is running with `heroku ps`, which should show a `web.1` process with an "up" state. + +Finally try it out using the `-r` flag to indicate remote access. + +```bash +./bin/todo -r mk "tweet thanks for the good work @mesirii @akollegger" +./bin/todo -r list +``` + +To see the Neo4j graph you just created through Heroku, use `heroku config` to reveal the NEO4J_URL +which can take you to Neo4j's Webadmin. Have fun! + +For a detailed play-by-play, read [Becoming a Heroku](https://github.com/akollegger/sdn-todos/wiki/Becoming-a-Hero(ku)) + +CLI Tool +-------- + +A simplistic `todo` script in the `bin` directory can directly create, delete and list todos. + + Usage: todo [-r] [ list | mk | rm ] + + todo -r - access the remote (Heroku) todo application + todo list - list current todos + todo mk "a new todo" - to create a todo + todo rm 1 - to remove the todo with id 1 + + diff --git a/spring-data-neo4j-examples/todos/src/main/java/Main.java b/spring-data-neo4j-examples/todos/src/main/java/Main.java new file mode 100644 index 000000000..b34ddc186 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/java/Main.java @@ -0,0 +1,23 @@ +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; +public class Main +{ + public static void main(String[] args) throws Exception + { + String webappDirLocation = "src/main/webapp/"; + String webPort = System.getenv("PORT"); + if(webPort == null || webPort.isEmpty()) { + webPort = "8080"; + } + Server server = new Server(Integer.valueOf(webPort)); + WebAppContext root = new WebAppContext(); + root.setContextPath("/"); + root.setDescriptor(webappDirLocation+"/WEB-INF/web.xml"); + root.setResourceBase(webappDirLocation); + root.setParentLoaderPriority(true); + server.setHandler(root); + server.start(); + server.join(); + } +} + diff --git a/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/Todo.java b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/Todo.java new file mode 100644 index 000000000..acafebb11 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/Todo.java @@ -0,0 +1,76 @@ +package org.neo4j.app.todos; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.neo4j.graphdb.Node; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.data.neo4j.annotation.GraphId; +import org.springframework.data.neo4j.annotation.NodeEntity; + +import flexjson.JSONDeserializer; +import flexjson.JSONSerializer; + +@NodeEntity +@Configurable +public class Todo { + + @SuppressWarnings("unused") + @GraphId + private Long id; + + private String title; + + private Boolean isDone = false; + + public Todo() {;} + + public Todo(Node n) { + setPersistentState(n); + } + + public Long getId() { + return getNodeId(); + } + + public String getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Boolean getIsDone() { + return this.isDone; + } + + public void setIsDone(Boolean done) { + this.isDone = done; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Done: ").append(getIsDone()).append(", "); + sb.append("Title: ").append(getTitle()); + return sb.toString(); + } + + public String toJson() { + return new JSONSerializer().exclude("*.class", "*.persistentState", "*.entityState").serialize(this); + } + + public static String toJsonArray(Iterable collection) { + return new JSONSerializer().exclude("*.class", "*.persistentState", "*.entityState").serialize(collection); + } + + public static Todo fromJsonToTodo(String json) { + return new JSONDeserializer().use(null, Todo.class).deserialize(json); + } + + public static Collection fromJsonArrayToTodoes(String json) { + return new JSONDeserializer>().use(null, ArrayList.class).use("values", Todo.class).deserialize(json); + } + +} diff --git a/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoController.java b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoController.java new file mode 100644 index 000000000..a747f87c7 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoController.java @@ -0,0 +1,127 @@ +package org.neo4j.app.todos; + +import java.io.UnsupportedEncodingException; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.util.UriUtils; +import org.springframework.web.util.WebUtils; + +@RequestMapping("/todos") +@Controller +public class TodoController { + + @Autowired TodoRepository todos; + + /** + * POST /todos { "title": "text of the todo" } + * + * Creates a new todo. + * + * @param json + * @return json containing the id of the newly created todo + */ + @RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json") + public ResponseEntity createFromJson(@RequestBody String json) { + Todo createdTodo = todos.save(Todo.fromJsonToTodo(json)); + HttpHeaders headers= new HttpHeaders(); + headers.add("Content-Type", "application/text"); + return new ResponseEntity("{\"id\":" + createdTodo.getId() + "}", headers, HttpStatus.CREATED); + } + + /** + * GET /todos/{id} + * + * Gets the full json for a todo. + * + * @param id + * @return json representation of the requested todo, or HttpStatus.NOT_FOUND + */ + @RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=application/json") + @ResponseBody + public ResponseEntity showJson(@PathVariable("id") Long id) { + Todo todo = todos.findOne(id); + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/text; charset=utf-8"); + if (todo == null) { + return new ResponseEntity(headers, HttpStatus.NOT_FOUND); + } + return new ResponseEntity(todo.toJson(), headers, HttpStatus.OK); + } + + /** + * Get /todos/ + * + * Gets a json array of all todos. + * + * @return json array representation of all todos + */ + @RequestMapping(headers = "Accept=application/json") + @ResponseBody + public ResponseEntity listJson() { + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/text; charset=utf-8"); + return new ResponseEntity(Todo.toJsonArray(todos.findAll()), headers, HttpStatus.OK); + } + + /** + * PUT /todos/ { "id": id, "title": "text of todo", idDone: true|false } + * + * Updates an existing todo. + * + * @param json full json representation of the todo to update + * @return + */ + @RequestMapping(method = RequestMethod.PUT, headers = "Accept=application/json") + public ResponseEntity updateFromJson(@RequestBody String json) { + HttpHeaders headers= new HttpHeaders(); + headers.add("Content-Type", "application/text"); + if (todos.save(Todo.fromJsonToTodo(json)) == null) { + return new ResponseEntity(headers, HttpStatus.NOT_FOUND); + } + return new ResponseEntity(headers, HttpStatus.OK); + } + + /** + * DELETE /todos/{id} + * + * Deletes an existing todo. + * + * @param id + * @return + */ + @RequestMapping(value = "/{id}", method = RequestMethod.DELETE, headers = "Accept=application/json") + public ResponseEntity deleteFromJson(@PathVariable("id") Long id) { + Todo todo = todos.findOne(id); + HttpHeaders headers= new HttpHeaders(); + headers.add("Content-Type", "application/text"); + if (todo == null) { + return new ResponseEntity(headers, HttpStatus.NOT_FOUND); + } + todos.delete(todo); + return new ResponseEntity(headers, HttpStatus.OK); + } + + String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) { + String enc = httpServletRequest.getCharacterEncoding(); + if (enc == null) { + enc = WebUtils.DEFAULT_CHARACTER_ENCODING; + } + try { + pathSegment = UriUtils.encodePathSegment(pathSegment, enc); + } + catch (UnsupportedEncodingException uee) {} + return pathSegment; + } + +} diff --git a/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoRepository.java b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoRepository.java new file mode 100644 index 000000000..be2bf1228 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/java/org/neo4j/app/todos/TodoRepository.java @@ -0,0 +1,7 @@ +package org.neo4j.app.todos; + +import org.springframework.data.neo4j.repository.GraphRepository; + +public interface TodoRepository extends GraphRepository { + +} diff --git a/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml new file mode 100644 index 000000000..c6c1e230f --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext-graph.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext.xml b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext.xml new file mode 100644 index 000000000..4ad95b926 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/resources/META-INF/spring/applicationContext.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + diff --git a/spring-data-neo4j-examples/todos/src/main/resources/log4j.properties b/spring-data-neo4j-examples/todos/src/main/resources/log4j.properties new file mode 100644 index 000000000..5014b358b --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/resources/log4j.properties @@ -0,0 +1,17 @@ +log4j.rootLogger=error, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + +# Print the date in ISO 8601 format +log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n + +log4j.appender.R=org.apache.log4j.RollingFileAppender +log4j.appender.R.File=application.log + +log4j.appender.R.MaxFileSize=100KB +# Keep one backup file +log4j.appender.R.MaxBackupIndex=1 + +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/404.html b/spring-data-neo4j-examples/todos/src/main/webapp/404.html new file mode 100755 index 000000000..a24448f41 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/404.html @@ -0,0 +1,47 @@ + + + + + + + + + + Your Page Title Here :) + + + + + + + + + + + + + + + + + + + + + + +
+

Sorry. Couldn't Find That Page!

+
+ + + + \ No newline at end of file diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/alt.properties b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/alt.properties new file mode 100644 index 000000000..48df87ff7 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/alt.properties @@ -0,0 +1 @@ +styleSheet=resources/styles/alt.css diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/standard.properties b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/standard.properties new file mode 100644 index 000000000..d8dc0164d --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/classes/standard.properties @@ -0,0 +1 @@ +styleSheet=resources/styles/standard.css diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/spring/webmvc-config.xml b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/spring/webmvc-config.xml new file mode 100644 index 000000000..18d9cf3b1 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/spring/webmvc-config.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/web.xml b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..25ccf72ae --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,88 @@ + + + + + sdn-todos + + Neo4j SDN Todo Application + + + + + defaultHtmlEscape + true + + + + contextConfigLocation + classpath*:META-INF/spring/applicationContext*.xml + + + + CharacterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + + + + HttpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + CharacterEncodingFilter + /* + + + + HttpMethodFilter + /* + + + + + org.springframework.web.context.ContextLoaderListener + + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + /WEB-INF/spring/webmvc-config.xml + + 1 + + + + dispatcher + /api/* + + + + 10 + + + + index.jsp + + + + java.lang.Exception + /uncaughtException + + + + 404 + /resourceNotFound + + diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-114x114.png b/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-114x114.png new file mode 100755 index 0000000000000000000000000000000000000000..1c956e0b86066715e7e5bf28bb318c56da951d29 GIT binary patch literal 4349 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 literal 0 HcmV?d00001 diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-72x72.png b/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon-72x72.png new file mode 100755 index 0000000000000000000000000000000000000000..45469aa1760e1bb99bdfc1f1ea2c2af52095419d GIT binary patch literal 4072 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 NTt~}5vr-)u{yzyfR#5-| literal 0 HcmV?d00001 diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon.png b/spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..a3e9bcbc9501f7aa210cb855b3e83826bffa3bb6 GIT binary patch literal 3369 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 literal 0 HcmV?d00001 diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/images/favicon.ico b/spring-data-neo4j-examples/todos/src/main/webapp/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..12fab2490e096ff379e98c3064100c2288146507 GIT binary patch literal 2614 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 Y0bLq=5JP7ek^lez07*qoM6N<$f~@q|+5i9m literal 0 HcmV?d00001 diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/images/icon_neo4j.png b/spring-data-neo4j-examples/todos/src/main/webapp/images/icon_neo4j.png new file mode 100644 index 0000000000000000000000000000000000000000..d41005e7b5b5d3b5f97d889ffcf3fdf9a696756b GIT binary patch literal 8133 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 literal 0 HcmV?d00001 diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/index.jsp b/spring-data-neo4j-examples/todos/src/main/webapp/index.jsp new file mode 100644 index 000000000..042033731 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/index.jsp @@ -0,0 +1,107 @@ + + + + + + + + + + SDN Todos + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Spring Data Neo4j: Todos

+
heroku-deploy
+
+
+
+ + + +
+ + +
+
Todos (a simply jquery pull from the json endpoint):
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js b/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js new file mode 100755 index 000000000..f693369bb --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js @@ -0,0 +1,25 @@ +$(document).ready(function() { + + $.ajaxSetup ({ + cache: false + }); + + var jsonUrl = "api/todos"; + + $.getJSON( + jsonUrl, + function(json) { + var items = []; + + $.each(json, function(i, todo) { + items.push('
  • ' + todo.title + '
  • '); + }); + + $('
      ', { + 'class': 'disc', + html: items.join('') + }).appendTo('div#todos'); + } + ); + +}); \ No newline at end of file diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js b/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js new file mode 100755 index 000000000..8a74b100d --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js @@ -0,0 +1,42 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + + +$(document).ready(function() { + + /* Tabs Activiation + ================================================== */ + + var tabs = $('ul.tabs'); + + tabs.each(function(i) { + + //Get all tabs + var tab = $(this).find('> li > a'); + tab.click(function(e) { + + //Get Location of tab's content + var contentLocation = $(this).attr('href'); + + //Let go if not a hashed one + if(contentLocation.charAt(0)=="#") { + + e.preventDefault(); + + //Make Tab Active + tab.removeClass('active'); + $(this).addClass('active'); + + //Show Tab Content & add active class + $(contentLocation).show().addClass('active').siblings().hide().removeClass('active'); + + } + }); + }); +}); \ No newline at end of file diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/log4j.properties b/spring-data-neo4j-examples/todos/src/main/webapp/log4j.properties new file mode 100644 index 000000000..5014b358b --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/log4j.properties @@ -0,0 +1,17 @@ +log4j.rootLogger=error, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + +# Print the date in ISO 8601 format +log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n + +log4j.appender.R=org.apache.log4j.RollingFileAppender +log4j.appender.R.File=application.log + +log4j.appender.R.MaxFileSize=100KB +# Keep one backup file +log4j.appender.R.MaxBackupIndex=1 + +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/robots.txt b/spring-data-neo4j-examples/todos/src/main/webapp/robots.txt new file mode 100755 index 000000000..d310d070b --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ +# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 + +User-agent: * + diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css new file mode 100755 index 000000000..4533d8903 --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css @@ -0,0 +1,338 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + + +/* Table of Content +================================================== + #Reset & Basics + #Basic Styles + #Site Styles + #Typography + #Links + #Lists + #Images + #Buttons + #Tabs + #Forms + #Misc */ + + +/* #Reset & Basics (Inspired by E. Meyers) +================================================== */ + html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + body { + line-height: 1; } + ol, ul { + list-style: none; } + blockquote, q { + quotes: none; } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; } + table { + border-collapse: collapse; + border-spacing: 0; } + + +/* #Basic Styles +================================================== */ + body { + background: #fff; + font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ + -webkit-text-size-adjust: 100%; + } + + +/* #Typography +================================================== */ + h1, h2, h3, h4, h5, h6 { + color: #181818; + font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; + font-weight: normal; } + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } + h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;} + h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } + h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } + h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } + h5 { font-size: 17px; line-height: 24px; } + h6 { font-size: 14px; line-height: 21px; } + .subheader { color: #777; } + + p { margin: 0 0 20px 0; } + p img { margin: 0; } + p.lead { font-size: 21px; line-height: 27px; color: #777; } + + em { font-style: italic; } + strong { font-weight: bold; color: #333; } + small { font-size: 80%; } + +/* Blockquotes */ + blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } + blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; } + blockquote cite { display: block; font-size: 12px; color: #555; } + blockquote cite:before { content: "\2014 \0020"; } + blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; } + + hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } + + +/* #Links +================================================== */ + a, a:visited { color: #333; text-decoration: underline; outline: 0; } + a:hover, a:focus { color: #000; } + p a, p a:visited { line-height: inherit; } + + +/* #Lists +================================================== */ + ul, ol { margin-bottom: 20px; } + ul { list-style: none outside; } + ol { list-style: decimal; } + ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } + ul.square { list-style: square outside; } + ul.circle { list-style: circle outside; } + ul.disc { list-style: disc outside; } + ul ul, ul ol, + ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } + ul ul li, ul ol li, + ol ol li, ol ul li { margin-bottom: 6px; } + li { line-height: 18px; margin-bottom: 12px; } + ul.large li { line-height: 21px; } + li p { line-height: 21px; } + +/* #Images +================================================== */ + + img.scale-with-grid { + max-width: 100%; + height: auto; } + + +/* #Buttons +================================================== */ + + a.button, + button, + input[type="submit"], + input[type="reset"], + input[type="button"] { + background: #eee; /* Old browsers */ + background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ + background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ + background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ + background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ + background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ + background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ + border: 1px solid #aaa; + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; + padding: 4px 12px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + color: #444; + display: inline-block; + font-size: 11px; + font-weight: bold; + text-decoration: none; + text-shadow: 0 1px rgba(255, 255, 255, .75); + cursor: pointer; + margin-bottom: 20px; + line-height: 21px; + font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } + + a.button:hover, + button:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + input[type="button"]:hover { + color: #222; + background: #ddd; /* Old browsers */ + background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ + background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ + background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ + background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ + background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ + background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ + border: 1px solid #888; + border-top: 1px solid #aaa; + border-left: 1px solid #aaa; } + + a.button:active, + button:active, + input[type="submit"]:active, + input[type="reset"]:active, + input[type="button"]:active { + border: 1px solid #666; + background: #ccc; /* Old browsers */ + background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ + background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ + background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ + background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ + background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ + background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } + + .button.full-width, + button.full-width, + input[type="submit"].full-width, + input[type="reset"].full-width, + input[type="button"].full-width { + width: 100%; + padding-left: 0 !important; + padding-right: 0 !important; + text-align: center; } + + +/* #Tabs (activate in tabs.js) +================================================== */ + ul.tabs { + display: block; + margin: 0 0 20px 0; + padding: 0; + border-bottom: solid 1px #ddd; } + ul.tabs li { + display: block; + width: auto; + height: 30px; + padding: 0; + float: left; + margin-bottom: 0; } + ul.tabs li a { + display: block; + text-decoration: none; + width: auto; + height: 29px; + padding: 0px 20px; + line-height: 30px; + border: solid 1px #ddd; + border-width: 1px 1px 0 0; + margin: 0; + background: #f5f5f5; + font-size: 13px; } + ul.tabs li a.active { + background: #fff; + height: 30px; + position: relative; + top: -4px; + padding-top: 4px; + border-left-width: 1px; + margin: 0 0 0 -1px; + color: #111; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; } + ul.tabs li:first-child a.active { + margin-left: 0; } + ul.tabs li:first-child a { + border-width: 1px 1px 0 1px; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; } + ul.tabs li:last-child a { + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; } + + ul.tabs-content { margin: 0; display: block; } + ul.tabs-content > li { display:none; } + ul.tabs-content > li.active { display: block; } + + /* Clearfixing tabs for beautiful stacking */ + ul.tabs:before, + ul.tabs:after { + content: '\0020'; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } + ul.tabs:after { + clear: both; } + ul.tabs { + zoom: 1; } + + +/* #Forms +================================================== */ + + form { + margin-bottom: 20px; } + fieldset { + margin-bottom: 20px; } + input[type="text"], + input[type="password"], + input[type="email"], + textarea, + select { + border: 1px solid #ccc; + padding: 6px 4px; + outline: none; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #777; + margin: 0; + width: 210px; + max-width: 100%; + display: block; + margin-bottom: 20px; + background: #fff; } + select { + padding: 0; } + input[type="text"]:focus, + input[type="password"]:focus, + input[type="email"]:focus, + textarea:focus { + border: 1px solid #aaa; + color: #444; + -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); + -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); + box-shadow: 0 0 3px rgba(0,0,0,.2); } + textarea { + min-height: 60px; } + label, + legend { + display: block; + font-weight: bold; + font-size: 13px; } + select { + width: 220px; } + input[type="checkbox"] { + display: inline; } + label span, + legend span { + font-weight: normal; + font-size: 13px; + color: #444; } + +/* #Misc +================================================== */ + .remove-bottom { margin-bottom: 0 !important; } + .half-bottom { margin-bottom: 10px !important; } + .add-bottom { margin-bottom: 20px !important; } + + +/* #SDN styling +================================================== */ + #footer { background: #eee; } \ No newline at end of file diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css new file mode 100755 index 000000000..aff5b477e --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css @@ -0,0 +1,58 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + +/* Table of Content +================================================== + #Site Styles + #Page Styles + #Media Queries + #Font-Face */ + +/* #Site Styles +================================================== */ + +/* #Page Styles +================================================== */ + +/* #Media Queries +================================================== */ + + /* Smaller than standard 960 (devices and browsers) */ + @media only screen and (max-width: 959px) {} + + /* Tablet Portrait size to standard 960 (devices and browsers) */ + @media only screen and (min-width: 768px) and (max-width: 959px) {} + + /* All Mobile Sizes (devices and browser) */ + @media only screen and (max-width: 767px) {} + + /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ + @media only screen and (min-width: 480px) and (max-width: 767px) {} + + /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ + @media only screen and (max-width: 479px) {} + + +/* #Font-Face +================================================== */ +/* This is the proper syntax for an @font-face file + Just create a "fonts" folder at the root, + copy your FontName into code below and remove + comment brackets */ + +/* @font-face { + font-family: 'FontName'; + src: url('../fonts/FontName.eot'); + src: url('../fonts/FontName.eot?iefix') format('eot'), + url('../fonts/FontName.woff') format('woff'), + url('../fonts/FontName.ttf') format('truetype'), + url('../fonts/FontName.svg#webfontZam02nTh') format('svg'); + font-weight: normal; + font-style: normal; } +*/ \ No newline at end of file diff --git a/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css new file mode 100755 index 000000000..d0264a40b --- /dev/null +++ b/spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css @@ -0,0 +1,236 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + + +/* Table of Contents +================================================== + #Base 960 Grid + #Tablet (Portrait) + #Mobile (Portrait) + #Mobile (Landscape) + #Clearing */ + + + +/* #Base 960 Grid +================================================== */ + + .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } + .column, .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } + .row { margin-bottom: 20px; } + + /* Nested Column Classes */ + .column.alpha, .columns.alpha { margin-left: 0; } + .column.omega, .columns.omega { margin-right: 0; } + + /* Base Grid */ + .container .one.column { width: 40px; } + .container .two.columns { width: 100px; } + .container .three.columns { width: 160px; } + .container .four.columns { width: 220px; } + .container .five.columns { width: 280px; } + .container .six.columns { width: 340px; } + .container .seven.columns { width: 400px; } + .container .eight.columns { width: 460px; } + .container .nine.columns { width: 520px; } + .container .ten.columns { width: 580px; } + .container .eleven.columns { width: 640px; } + .container .twelve.columns { width: 700px; } + .container .thirteen.columns { width: 760px; } + .container .fourteen.columns { width: 820px; } + .container .fifteen.columns { width: 880px; } + .container .sixteen.columns { width: 940px; } + + .container .one-third.column { width: 300px; } + .container .two-thirds.column { width: 620px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 60px; } + .container .offset-by-two { padding-left: 120px; } + .container .offset-by-three { padding-left: 180px; } + .container .offset-by-four { padding-left: 240px; } + .container .offset-by-five { padding-left: 300px; } + .container .offset-by-six { padding-left: 360px; } + .container .offset-by-seven { padding-left: 420px; } + .container .offset-by-eight { padding-left: 480px; } + .container .offset-by-nine { padding-left: 540px; } + .container .offset-by-ten { padding-left: 600px; } + .container .offset-by-eleven { padding-left: 660px; } + .container .offset-by-twelve { padding-left: 720px; } + .container .offset-by-thirteen { padding-left: 780px; } + .container .offset-by-fourteen { padding-left: 840px; } + .container .offset-by-fifteen { padding-left: 900px; } + + + +/* #Tablet (Portrait) +================================================== */ + + /* Note: Design for a width of 768px */ + + @media only screen and (min-width: 768px) and (max-width: 959px) { + .container { width: 768px; } + .container .column, + .container .columns { margin-left: 10px; margin-right: 10px; } + .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } + .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } + + .container .one.column { width: 28px; } + .container .two.columns { width: 76px; } + .container .three.columns { width: 124px; } + .container .four.columns { width: 172px; } + .container .five.columns { width: 220px; } + .container .six.columns { width: 268px; } + .container .seven.columns { width: 316px; } + .container .eight.columns { width: 364px; } + .container .nine.columns { width: 412px; } + .container .ten.columns { width: 460px; } + .container .eleven.columns { width: 508px; } + .container .twelve.columns { width: 556px; } + .container .thirteen.columns { width: 604px; } + .container .fourteen.columns { width: 652px; } + .container .fifteen.columns { width: 700px; } + .container .sixteen.columns { width: 748px; } + + .container .one-third.column { width: 236px; } + .container .two-thirds.column { width: 492px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 48px; } + .container .offset-by-two { padding-left: 96px; } + .container .offset-by-three { padding-left: 144px; } + .container .offset-by-four { padding-left: 192px; } + .container .offset-by-five { padding-left: 240px; } + .container .offset-by-six { padding-left: 288px; } + .container .offset-by-seven { padding-left: 336px; } + .container .offset-by-eight { padding-left: 348px; } + .container .offset-by-nine { padding-left: 432px; } + .container .offset-by-ten { padding-left: 480px; } + .container .offset-by-eleven { padding-left: 528px; } + .container .offset-by-twelve { padding-left: 576px; } + .container .offset-by-thirteen { padding-left: 624px; } + .container .offset-by-fourteen { padding-left: 672px; } + .container .offset-by-fifteen { padding-left: 720px; } + } + + +/* #Mobile (Portrait) +================================================== */ + + /* Note: Design for a width of 320px */ + + @media only screen and (max-width: 767px) { + .container { width: 300px; } + .columns, .column { margin: 0; } + + .container .one.column, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 300px; } + + /* Offsets */ + .container .offset-by-one, + .container .offset-by-two, + .container .offset-by-three, + .container .offset-by-four, + .container .offset-by-five, + .container .offset-by-six, + .container .offset-by-seven, + .container .offset-by-eight, + .container .offset-by-nine, + .container .offset-by-ten, + .container .offset-by-eleven, + .container .offset-by-twelve, + .container .offset-by-thirteen, + .container .offset-by-fourteen, + .container .offset-by-fifteen { padding-left: 0; } + + } + + +/* #Mobile (Landscape) +================================================== */ + + /* Note: Design for a width of 480px */ + + @media only screen and (min-width: 480px) and (max-width: 767px) { + .container { width: 420px; } + .columns, .column { margin: 0; } + + .container .one.column, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 420px; } + } + + +/* #Clearing +================================================== */ + + /* Self Clearing Goodness */ + .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } + + /* Use clearfix class on parent to clear nested columns, + or wrap each row of columns in a
      */ + .clearfix:before, + .clearfix:after, + .row:before, + .row:after { + content: '\0020'; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } + .row:after, + .clearfix:after { + clear: both; } + .row, + .clearfix { + zoom: 1; } + + /* You can also use a
      to clear columns */ + .clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; + } + + From 3ea2cddf8583e0425f8f2e2ea7312a9548c65f62 Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Fri, 23 Dec 2011 10:46:56 -0500 Subject: [PATCH 14/31] revised learn more to direct people to the heroku chapter of Good Relationships --- spring-data-neo4j-examples/todos/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-data-neo4j-examples/todos/readme.md b/spring-data-neo4j-examples/todos/readme.md index fb4fbbe38..c4a2fe138 100644 --- a/spring-data-neo4j-examples/todos/readme.md +++ b/spring-data-neo4j-examples/todos/readme.md @@ -70,7 +70,8 @@ Finally try it out using the `-r` flag to indicate remote access. To see the Neo4j graph you just created through Heroku, use `heroku config` to reveal the NEO4J_URL which can take you to Neo4j's Webadmin. Have fun! -For a detailed play-by-play, read [Becoming a Heroku](https://github.com/akollegger/sdn-todos/wiki/Becoming-a-Hero(ku)) +For details about preparing your own Spring Data Neo4j application for deployment to Heroku, +see the Heroku chapter in "Good Relationships: The Spring Data Neo4j Guide Book". CLI Tool -------- From 5c77684adb13f10fe0d420cdccc955bab6b94cb2 Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Fri, 23 Dec 2011 11:45:25 -0500 Subject: [PATCH 15/31] revised instructions for creating a personal copy of the todos app, and provisiong to heroku --- spring-data-neo4j-examples/todos/readme.md | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/spring-data-neo4j-examples/todos/readme.md b/spring-data-neo4j-examples/todos/readme.md index c4a2fe138..ac83f0f1b 100644 --- a/spring-data-neo4j-examples/todos/readme.md +++ b/spring-data-neo4j-examples/todos/readme.md @@ -15,9 +15,9 @@ To prepare for deploying to Heroku, you must first become a Hero: Feel ready? OK, then get a copy of this project and checkout the heroku-deploy branch: ```bash -git clone git://github.com/akollegger/sdn-todos.git -cd sdn-todos -git checkout heroku-deploy +git clone git://github.com/SpringSource/spring-data-neo4j.git +cp -r spring-data-neo4j/spring-data-neo4j-examples/todos . +cd todos ``` Local build and run @@ -37,7 +37,7 @@ mvn package sh target/bin/webapp ``` -* check that it is working +* check that it is working (in another terminal, but same project directory) ```bash ./bin/todo mk "tweet high praises to @neo4j" @@ -50,12 +50,21 @@ Satisfied? Then `ctrl-c` to kill the application. Deploy on Heroku ---------------- -Create a new provisioning stack on Heroku for the app. +Initialize a local git repository: + +```bash +git init . +git add . +git commit -m "the start of my own todo application" +``` + +Create a new provisioning stack on Heroku for the app. Heroku will notice that you've got +a git repository, adding itself as a remote. ```bash heroku create --stack cedar` heroku addons:add neo4j -git push heroku heroku-deploy:master +git push heroku master ``` Check to make sure it is running with `heroku ps`, which should show a `web.1` process with an "up" state. @@ -73,6 +82,9 @@ which can take you to Neo4j's Webadmin. Have fun! For details about preparing your own Spring Data Neo4j application for deployment to Heroku, see the Heroku chapter in "Good Relationships: The Spring Data Neo4j Guide Book". +Don't forget to decommission the Heroku application when you're done with it. +Use `heroku destroy` to free up the instance. + CLI Tool -------- From 70c2a27be48246dd73fcda0d62ec51fb272afa1f Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Fri, 23 Dec 2011 11:56:18 -0500 Subject: [PATCH 16/31] added todos example to profile --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 5210d164b..76319cfd3 100644 --- a/pom.xml +++ b/pom.xml @@ -161,6 +161,7 @@ spring-data-neo4j-examples/cineasts-aspects spring-data-neo4j-examples/cineasts-rest spring-data-neo4j-examples/myrestaurants-social + spring-data-neo4j-examples/todos From d89ef6249abea0db6a90b56761e688215c10a592 Mon Sep 17 00:00:00 2001 From: Andreas Kollegger Date: Fri, 23 Dec 2011 12:56:19 -0500 Subject: [PATCH 17/31] updated heroku chapter with full steps to heroku-ize an SDN app --- src/docbkx/reference/heroku.xml | 367 +++++++++++++++++--------------- 1 file changed, 198 insertions(+), 169 deletions(-) diff --git a/src/docbkx/reference/heroku.xml b/src/docbkx/reference/heroku.xml index fca99ab0c..c395d6719 100644 --- a/src/docbkx/reference/heroku.xml +++ b/src/docbkx/reference/heroku.xml @@ -1,181 +1,210 @@ - Heroku: seeding the coud + Heroku: Seeding the Cloud - - *To scale your apps you just add new dynos, so 'heroku scale web=2' etc... - -When your app fails to deploy on the first push, we dont automatically launch a single web dyno on a subsequent push, we should probably document that better. - -*Dynos have 500MB of physical ram available, plus much more than that in swap (Which you really never want to hit with a jvm). Your Procfile that launches java can use that in any way you like, but we do set a config var called JAVA_OPTS for you with some sensible defaults. - -So if you run 'heroku config' you will see the JAVA_OPTS var. you can use it in your Procfile like so - -#Procfile -web: java $JAVA_OPTS ....set up claspath and main class, etc... - -*For logging whatever you use should end up writing to System.out. if you are using a logging framework you should set up its appender to write to system.out (ConsoleAppender in log4j for instance) - -All stdout output is captured by our logplex log routing mesh so you can tail it by running 'heroku logs -t' or use the loggly addon or your own syslog server to capture log output for later analysis. - -*You have no limitation on the version of spring tomcat jetty netty or any other library or framework you can use. As long as it is in a public maven repo (or even a private maven repo) accessible by your build, maven will pull in the dependency and use it. - -*For ides we have both intellij and eclipse. We are working on a project that will make it much easier for tooling providers to do this type of integration, I will let you know when the details are public! - + Deploying your application into the cloud is a great way to scale from from "wouldn't it be cool if.." to + giving interviews to Forbes, Fast Company, and Jimmy Fallon. Heroku makes it super easy to provision everying + you need, including a Neo4j Add-on. With a few simple adjustments, your Spring Data Neo4j application is + ready to take that first step into the cloud. + + To deploy your Spring Data Neo4j web application to Heroku, you'll need: + + + account on Heroku + git command line + maven-based project + standard Spring MV Servlet application + well, and Spring Data Neo4j + + + + For reference, the following sections detail the steps taken to make the Spring Data Neo4j Todos + example ready for deployment to Heroku. + + +
      + Create a Self-Hosted Web Application - The Spring Data Neo4j project support cross-store persistence, which allows for parts of the data to be - stored in a traditional JPA data store (RDBMS), and other parts in a graph store. This means that an entity - can be partially stored in e.g. MySQL, and partially stored in Neo4j. + Usually, a Spring MVC application is bundled into a war and deployed to an application server + like Tomcat. But Heroku can host any kind of java application. It just needs to know what to + launch. So, we'll transform the war into a self-hosted servlet using an embedded Jetty server, + then add a startup script to launch it. - This allows existing JPA-based applications to embrace NOSQL data stores for evolving certain parts - of their data model. Possible use cases include adding social networking or geospatial information to - existing applications. + First, we'll add the dependencies for Jetty to the pom.xml: + + + + org.eclipse.jetty + jetty-webapp + 7.4.4.v20110707 + + + org.mortbay.jetty + jsp-2.1-glassfish + 2.1.v20100127 + + + + Then we'll change the scope of the servlet-api artifact from provided to compile. + This library is normally provided at runtime by the application container. Since we're self-hosting, + it needs to be included directly. Make sure the servlet-api dependency looks like this: + + + + javax.servlet + servlet-api + 2.5 + compile + + + + We could provide a complicated command-line to Heroku to launch the app. Instead, we'll simplify + the command-line by using the appassembler-maven-plugin to create a launch script. Add the plugin + to your pom's build/plugins section: + + + + org.codehaus.mojo + appassembler-maven-plugin + 1.1.1 + + + package + assemble + + target + -Xmx512m + + + Main + webapp + + + + + + + + + Finally, switch the packaging from war to jar. That's it for the pom. + + + Now that the application is ready to be self-hosted, create a simple Main to + bootstrap Jetty and host the servlet. + + + Create src/main/java/Main.java like this: -
      - Partial entities - - Partial graph persistence is achieved by restricting the Spring Data Neo4j aspects to manage only - explicitly annotated parts of the entity. Those fields will be made @Transient by the - aspect so that JPA ignores them. - - - A backing node in the graph store is only created when the entity has been assigned a JPA ID. Only - then will the association between the two stores be established. Until the entity has been persisted, - its state is just kept inside the POJO (in detached state), and then flushed to the backing graph - database on persist(). - - - The association between the two entities is maintained via a FOREIGN_ID field in the node, that - contains the JPA ID. Currently only single-value IDs are supported. The entity class can be resolved - via the TypeRepresentationStrategy that manages the Java type hierarchy within the graph - database. Given the ID and class, you can then retrieve the appropriate JPA entity for a given node. - - - The other direction is handled by indexing the Node with the FOREIGN_ID index which contains a - concatenation of the fully qualified class name of the JPA entity and the ID. The matching node - can then be found using the indexing facilities, and the two entities can be reassociated. - - - Using these mechanisms and the Spring Data Neo4j aspects, a single POJO can contain some fields - handled by JPA and others handles by Spring Data Neo4j. This also includes relationship fields persisted - in the graph database. - -
      -
      - Cross-store annotations - - Cross-store persistence only requires the use of one additional annotation: @GraphProperty. - See below for details and an example. - -
      - @NodeEntity(partial = "true") - - When annotating an entity with partial = true, this marks it as a cross-store entity. - Spring Data Neo4j will thus only manage fields explicitly annotated with @GraphProperty. - -
      -
      - @GraphProperty - - Fields of primitive or convertible types do not normally have to be annotated in order to be - persisted by Spring Data Neo4j. In cross-store mode, Spring Data Neo4j only - persists fields explicitly annotated with @GraphProperty. JPA will ignore these fields. - -
      -
      Example - - The following example is taken from the - Spring Data Neo4j examples - myrestaurants-social project: - - - Cross-store node entity - friends; - - @RelatedToVia(type = "recommends") - Iterable recommendations; - - @Temporal(TemporalType.TIMESTAMP) - @DateTimeFormat(style = "S-") - private Date birthDate; - - @ManyToMany(cascade = CascadeType.ALL) - private Set favorites; - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - public void knows(UserAccount friend) { - relateTo(friend, "friends"); + + import org.eclipse.jetty.server.Server; + import org.eclipse.jetty.webapp.WebAppContext; + public class Main + { + public static void main(String[] args) throws Exception + { + String webappDirLocation = "src/main/webapp/"; + String webPort = System.getenv("PORT"); + if(webPort == null || webPort.isEmpty()) { + webPort = "8080"; + } + Server server = new Server(Integer.valueOf(webPort)); + WebAppContext root = new WebAppContext(); + root.setContextPath("/"); + root.setDescriptor(webappDirLocation+"/WEB-INF/web.xml"); + root.setResourceBase(webappDirLocation); + root.setParentLoaderPriority(true); + server.setHandler(root); + server.start(); + server.join(); + } } - - public Recommendation rate(Restaurant restaurant, int stars, String comment) { - Recommendation recommendation = relateTo(restaurant, Recommendation.class, "recommends"); - recommendation.rate(stars, comment); - return recommendation; - } - - public Iterable getRecommendations() { - return recommendations; - } -} -]]> - -
      -
      -
      - Configuring cross-store persistence - - Configuring cross-store persistence is done similarly to the default Spring Data Neo4j configuration. - All you need to do is to specify an entityManagerFactory in the XML namespace - config element, and Spring Data Neo4j will configure itself for cross-store use. - - - Cross-store Spring configuration - - - - - - - - - - - -]]> - - - -
      +
      + + Notice the use of environment variable "PORT" for discovering which port to use. Heroku and the + Neo4j Add-on use a number of environment variable to configure the application. Next, we'll + modify the Spring application context to use the Neo4j variables for specifying the connection + to Neo4j itself. + + + In the SDN Todos example, src/main/resources/META-INF/spring/applicationContext-graph.xml + was modified to look like this: + + + + + + + + + + + Before provisioning at Heroku, test the application locally. First make sure you've got + Neo4j server running locally, using default configuration. Then set the following + environment variables: + + + export NEO4J_REST_URL=http://localhost:7474/db/data + export NEO4J_LOGIN="" + export NEO4J_PASSWORD="" + + + Now you can launch the app by running sh target/bin/webapp. If running the SDN Todos + example, you can test it by running ./bin/todos list. That should return an empty + JSON array, since no todos have been created yet. + + + For details about the todos script, see the readmen included with the example. + +
      +
      + Deploy to Heroku + + With a self-hosted application ready, deploying to Heroku needs a few more steps. First, + create a Profile at the top-level of the project, which will contain a single + line identifying the command line which launches the application. + + + The contents of the Profile should contain: + + + web: sh target/bin/webapp + + + Now initialize a local git repository, adding all the project files: + + + git init + git add . + git commit -m "initial commit" + + Finally, provision a Heroku stack, add the Neo4j Add-on and deploy the appication. + + + heroku create --stack cedar + heroku addons:add neo4j + git push heroku master + + + Note that the stack must be "cedar" to support running Java. Check that the process + is running by using heroku ps, which should show a "web.1" process + in the "up" state. Success! + + + For the SDN Todos application, you can try out the remote application using the "-r" + switch with the bin/todo script like this: + + + ./bin/todo -r mk "tweet thanks for the good work @mesirii @akollegger" + ./bin/todo -r list + + + To see the Neo4j graph you just created through Heroku, use heroku config to reveal + the NEO4J_URL environment variable, which will take you to Neo4j's Webadmin. + +
      From 502f79e445eac42952a40916701c97174c0262f2 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 18:43:28 +0100 Subject: [PATCH 18/31] DATAGRAPH-138, DATAGRAPH-142 added tests to verify the functionality --- changelog.txt | 6 +++ .../data/neo4j/aspects/support/IndexTest.java | 1 + .../data/neo4j/model/Group.java | 2 +- .../data/neo4j/model/IGroup.java | 23 ++++++++++ .../data/neo4j/model/Person.java | 18 ++++++++ .../data/neo4j/model/RootEntity.java | 42 +++++++++++++++++++ .../neo4j/repository/GraphRepositoryTest.java | 28 +++++++++++++ 7 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/IGroup.java create mode 100644 spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/RootEntity.java diff --git a/changelog.txt b/changelog.txt index 1306d940b..7a53c6323 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,12 @@ Spring Data Graph Changelog =========================== +Changes in version 2.0.0.RELEASE (2011-12-23) +--------------------------------------------- +* Updated Neo4j to 1.6.M02, SpringFramework to 3.0.7.RELEASE, Spring-Data-Commons to 1.2.0.RELEASE +* updated documentation and examples +* + Changes in version 2.0.0.RC1 (2011-11-11) ----------------------------------------- * Updated Neo4j to 1.5 AspectJ to 1.6.12 diff --git a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTest.java b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTest.java index dbaeb79d6..3612c409d 100644 --- a/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTest.java +++ b/spring-data-neo4j-aspects/src/test/java/org/springframework/data/neo4j/aspects/support/IndexTest.java @@ -65,6 +65,7 @@ public class IndexTest extends EntityTestBase { assertEquals(friendship, friendshipFinder.findByPropertyValue("Friendship.years", 1)); } + @Test @Transactional public void testGetRelationshipFromLookedUpNode() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java index 21df31d93..6931c1234 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Group.java @@ -32,7 +32,7 @@ import java.util.HashSet; import java.util.Set; @NodeEntity -public class Group { +public class Group implements IGroup { public final static String OTHER_NAME_INDEX = "other_name"; public static final String SEARCH_GROUPS_INDEX = "search_groups"; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/IGroup.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/IGroup.java new file mode 100644 index 000000000..62b350c5a --- /dev/null +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/IGroup.java @@ -0,0 +1,23 @@ +/** + * 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.model; + +/** + * @author mh + * @since 23.12.11 + */ +public interface IGroup { +} diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java index 5a3150fd8..83ff520e4 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/Person.java @@ -26,6 +26,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.Size; import java.util.Date; import java.util.Map; +import java.util.Set; @NodeEntity @@ -89,6 +90,23 @@ public class Person { @Query("start person=node({self}) match (person)<-[:persons]-(team)-[:persons]->(member) return member.name?, member.age?") private Iterable> otherTeamMemberData; + @RelatedTo(elementClass = Group.class, type = "interface_test", direction = Direction.OUTGOING) + private Set groups; + + RootEntity root; + + public RootEntity getRoot() { + return root; + } + + public void setRoot(RootEntity root) { + this.root = root; + } + + public Set getGroups() { + return groups; + } + public Person(Node n) { this.graphId = n.getId(); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/RootEntity.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/RootEntity.java new file mode 100644 index 000000000..710914189 --- /dev/null +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/model/RootEntity.java @@ -0,0 +1,42 @@ +/** + * 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.model; + +import org.springframework.data.neo4j.annotation.GraphId; +import org.springframework.data.neo4j.annotation.NodeEntity; + +/** + * @author mh + * @since 23.12.11 + */ +@NodeEntity +public class RootEntity { + @GraphId Long id; + + String rootName; + + public Long getId() { + return id; + } + + public String getRootName() { + return rootName; + } + + public void setRootName(String rootName) { + this.rootName = rootName; + } +} diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java index 4b31dfb8f..9433a9c1f 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java @@ -31,6 +31,7 @@ import org.springframework.data.domain.Sort; import org.springframework.data.neo4j.model.Friendship; import org.springframework.data.neo4j.model.Group; import org.springframework.data.neo4j.model.Person; +import org.springframework.data.neo4j.model.RootEntity; import org.springframework.data.neo4j.support.Neo4jTemplate; import org.springframework.data.neo4j.support.conversion.NoSuchColumnFoundException; import org.springframework.data.neo4j.support.node.Neo4jHelper; @@ -273,4 +274,31 @@ public class GraphRepositoryTest { personRepository.createDuplicateRelationshipBetween(testTeam.michael, testTeam.david, Friendship.class, "knows"); assertEquals(2, IteratorUtil.count(neo4jTemplate.getPersistentState(testTeam.michael).getRelationships(Person.KNOWS))); } + + @Test @Transactional + public void testUseInterfaceInRelationships() { + final Person p = neo4jTemplate.save(new Person()); + final Group group = neo4jTemplate.save(new Group()); + neo4jTemplate.createRelationshipBetween(neo4jTemplate.getPersistentState(p),neo4jTemplate.getPersistentState(group),"interface_test",null); + final Person p2 = neo4jTemplate.fetch(p); + assertEquals(group,IteratorUtil.firstOrNull(p2.getGroups())); + } + + @Test @Transactional + public void testConnectToRootEntity() { + final Node referenceNode = neo4jTemplate.getReferenceNode(); + neo4jTemplate.postEntityCreation(referenceNode,RootEntity.class); + final RootEntity root = neo4jTemplate.findOne(referenceNode.getId(), RootEntity.class); + root.setRootName("RootName"); + neo4jTemplate.save(root); + assertEquals(referenceNode.getId(), (long) root.getId()); + assertEquals("RootName", referenceNode.getProperty("rootName")); + assertEquals("RootName", root.getRootName()); + + final Person person = new Person(); + person.setRoot(root); + neo4jTemplate.save(person); + final Person p2 = neo4jTemplate.findOne(person.getId(), Person.class); + assertEquals(root.getId(),p2.getRoot().getId()); + } } From e46c5acc62c234e9ff67bd2369c94e1ee8b41f41 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 20:13:24 +0100 Subject: [PATCH 19/31] added heroku chapter to the documentation --- src/docbkx/index.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/docbkx/index.xml b/src/docbkx/index.xml index 71ca639d6..c8e61ecda 100644 --- a/src/docbkx/index.xml +++ b/src/docbkx/index.xml @@ -134,6 +134,7 @@ + From c4e0a2a1aa26ac29e9c539243a48b94b2f605118 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 20:43:13 +0100 Subject: [PATCH 20/31] tutorial documentation update --- changelog.txt | 6 +- src/docbkx/reference/heroku.xml | 240 ++++++++++++++++++-------------- 2 files changed, 137 insertions(+), 109 deletions(-) diff --git a/changelog.txt b/changelog.txt index 7a53c6323..680f82610 100644 --- a/changelog.txt +++ b/changelog.txt @@ -4,8 +4,10 @@ Spring Data Graph Changelog Changes in version 2.0.0.RELEASE (2011-12-23) --------------------------------------------- * Updated Neo4j to 1.6.M02, SpringFramework to 3.0.7.RELEASE, Spring-Data-Commons to 1.2.0.RELEASE -* updated documentation and examples -* +* updated documentation and examples, added chapter on how to deploy an SDN backed sample app to Heroku +* allow customization for index names, e.g. for multi-tenancy +* object typed fields are not converted if the actual instance can be stored by Neo4j +* cleanup of maven dependencies on neo4j, logging frameworks, Changes in version 2.0.0.RC1 (2011-11-11) ----------------------------------------- diff --git a/src/docbkx/reference/heroku.xml b/src/docbkx/reference/heroku.xml index c395d6719..28ee8df57 100644 --- a/src/docbkx/reference/heroku.xml +++ b/src/docbkx/reference/heroku.xml @@ -33,61 +33,70 @@ then add a startup script to launch it. - First, we'll add the dependencies for Jetty to the pom.xml: + First, we'll add the dependencies for Jetty to the pom.xml: - - - org.eclipse.jetty - jetty-webapp - 7.4.4.v20110707 - - - org.mortbay.jetty - jsp-2.1-glassfish - 2.1.v20100127 - - + + Jetty dependencies - pom.xml + + org.eclipse.jetty + jetty-webapp + 7.4.4.v20110707 + + + org.mortbay.jetty + jsp-2.1-glassfish + 2.1.v20100127 + + ]]> + Then we'll change the scope of the servlet-api artifact from provided to compile. This library is normally provided at runtime by the application container. Since we're self-hosting, it needs to be included directly. Make sure the servlet-api dependency looks like this: - - - javax.servlet - servlet-api - 2.5 - compile - - + + servlet-api dependencies - pom.xml + + javax.servlet + servlet-api + 2.5 + compile + + ]]> + We could provide a complicated command-line to Heroku to launch the app. Instead, we'll simplify the command-line by using the appassembler-maven-plugin to create a launch script. Add the plugin to your pom's build/plugins section: - - - org.codehaus.mojo - appassembler-maven-plugin - 1.1.1 - - - package - assemble - - target - -Xmx512m - - - Main - webapp - - - - - - - + + REST-Client configuration - pom.xml + +org.codehaus.mojo +appassembler-maven-plugin +1.1.1 + + + package + assemble + + target + -Xmx512m + + + Main + webapp + + + + + + + ]]> + Finally, switch the packaging from war to jar. That's it for the pom. @@ -95,34 +104,31 @@ Now that the application is ready to be self-hosted, create a simple Main to bootstrap Jetty and host the servlet. - - Create src/main/java/Main.java like this: - - - - import org.eclipse.jetty.server.Server; - import org.eclipse.jetty.webapp.WebAppContext; - public class Main - { - public static void main(String[] args) throws Exception - { - String webappDirLocation = "src/main/webapp/"; - String webPort = System.getenv("PORT"); - if(webPort == null || webPort.isEmpty()) { - webPort = "8080"; - } - Server server = new Server(Integer.valueOf(webPort)); - WebAppContext root = new WebAppContext(); - root.setContextPath("/"); - root.setDescriptor(webappDirLocation+"/WEB-INF/web.xml"); - root.setResourceBase(webappDirLocation); - root.setParentLoaderPriority(true); - server.setHandler(root); - server.start(); - server.join(); + + src/main/java/Main.java + +} + ]]> + Notice the use of environment variable "PORT" for discovering which port to use. Heroku and the Neo4j Add-on use a number of environment variable to configure the application. Next, we'll @@ -133,25 +139,32 @@ In the SDN Todos example, src/main/resources/META-INF/spring/applicationContext-graph.xml was modified to look like this: - - - - - - - - + + Spring configuration - applicationContext-graph.xml + + + + + + +]]> + Before provisioning at Heroku, test the application locally. First make sure you've got Neo4j server running locally, using default configuration. Then set the following environment variables: - - export NEO4J_REST_URL=http://localhost:7474/db/data - export NEO4J_LOGIN="" - export NEO4J_PASSWORD="" - + + environment variables + + ]]> + Now you can launch the app by running sh target/bin/webapp. If running the SDN Todos example, you can test it by running ./bin/todos list. That should return an empty @@ -161,7 +174,8 @@ For details about the todos script, see the readmen included with the example. -
      + +
      Deploy to Heroku With a self-hosted application ready, deploying to Heroku needs a few more steps. First, @@ -169,39 +183,51 @@ line identifying the command line which launches the application. - The contents of the Profile should contain: + The contents of the Procfile should contain: - - web: sh target/bin/webapp - + + Procfile + + - Now initialize a local git repository, adding all the project files: + + + deploy to heroku + + - - git init - git add . - git commit -m "initial commit" - - Finally, provision a Heroku stack, add the Neo4j Add-on and deploy the appication. - - - heroku create --stack cedar - heroku addons:add neo4j - git push heroku master - + Note that the stack must be "cedar" to support running Java. Check that the process is running by using heroku ps, which should show a "web.1" process in the "up" state. Success! + - For the SDN Todos application, you can try out the remote application using the "-r" + For the SDN Todos application, you can try out the remote application using the -r switch with the bin/todo script like this: - - ./bin/todo -r mk "tweet thanks for the good work @mesirii @akollegger" - ./bin/todo -r list - + + Session with todo script + + To see the Neo4j graph you just created through Heroku, use heroku config to reveal the NEO4J_URL environment variable, which will take you to Neo4j's Webadmin. From ab0cb0805648d8a2891abd4f87fd16b55f97c973 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 21:37:22 +0100 Subject: [PATCH 21/31] documentation update --- changelog.txt | 6 +++++- spring-data-neo4j-parent/pom.xml | 2 +- src/docbkx/index.xml | 4 ++++ src/docbkx/reference/heroku.xml | 19 +++++++++---------- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/changelog.txt b/changelog.txt index 680f82610..63634e53d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,11 +3,15 @@ Spring Data Graph Changelog Changes in version 2.0.0.RELEASE (2011-12-23) --------------------------------------------- -* Updated Neo4j to 1.6.M02, SpringFramework to 3.0.7.RELEASE, Spring-Data-Commons to 1.2.0.RELEASE +* Updated Neo4j, Cypher-DSL to 1.6.M02, SpringFramework to 3.0.7.RELEASE, Spring-Data-Commons to 1.2.0.RELEASE * updated documentation and examples, added chapter on how to deploy an SDN backed sample app to Heroku * allow customization for index names, e.g. for multi-tenancy * object typed fields are not converted if the actual instance can be stored by Neo4j * cleanup of maven dependencies on neo4j, logging frameworks, +* allow injection of custom ConversionServices +* template.fetch() reloads entities and collections +* support for default field values on load via the @GraphProperty annotation + Changes in version 2.0.0.RC1 (2011-11-11) ----------------------------------------- diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index 6e40ca2d4..a80200b2a 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -466,7 +466,7 @@ org.neo4j neo4j-cypher-dsl - 1.5 + 1.6.M02 ]]> Your project is now set up to work against a remote Neo4j Server. - The remote REST implementation works for both the Neo4jTemplate as well as the GraphEntities. For traversals - and Cypher graph queries it is sensible to forward those to the remote endpoint and execute them there instead of - walking the graph over the wire. RestGraphDatabase already supports that by providing methods that forward + For traversals and Cypher and Gremlin graph queries it is sensible to forward those to the remote endpoint and execute them there + instead of walking the graph over the wire. SpringRestGraphDatabase already supports that by providing methods that forward to the remote instance. (e.g. queryEngineFor(), index() and createTraversalDescription()). - Please use those methods when interacting with a remote server for optimal performance. + Please use those methods when interacting with a remote server for optimal performance. Those methods are also + used by the Neo4jTemplate and the mapping infrastructure automatically. From a6d70998d593c4f3d99c89643c8aa7386fe25e68 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 22:23:06 +0100 Subject: [PATCH 23/31] updated dependency of rest binding to 1.6.M02 --- spring-data-neo4j-rest/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index 925a436ed..23050ca49 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -76,7 +76,7 @@ org.neo4j neo4j-rest-graphdb - 1.6-SNAPSHOT + 1.6.M02 org.neo4j From 4e499d4691486910b89d23fa5be26258e0501957 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Fri, 23 Dec 2011 22:23:14 +0100 Subject: [PATCH 24/31] updated docs --- spring-data-neo4j-examples/todos/pom.xml | 4 ++-- .../typerepresentationstrategy.xml | 14 +++++++++----- src/docbkx/tutorial/neo4j-server.xml | 2 +- src/docbkx/tutorial/spring-data-neo4j-aj.xml | 2 +- src/docbkx/tutorial/spring-data-neo4j.xml | 2 +- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/spring-data-neo4j-examples/todos/pom.xml b/spring-data-neo4j-examples/todos/pom.xml index e0603aa67..f0825503d 100644 --- a/spring-data-neo4j-examples/todos/pom.xml +++ b/spring-data-neo4j-examples/todos/pom.xml @@ -4,7 +4,7 @@ org.neo4j.app sdn-todos - 1.0-SNAPSHOT + 2.0.0.BUILD-SNAPSHOT jar sdn-todos @@ -13,7 +13,7 @@ UTF-8 1.5 3.0.6.RELEASE - 2.0.0.RC1 + ${project.version} 1.6.12 1.6.1 diff --git a/src/docbkx/reference/programming-model/typerepresentationstrategy.xml b/src/docbkx/reference/programming-model/typerepresentationstrategy.xml index e4e388f41..fc1fd7e59 100644 --- a/src/docbkx/reference/programming-model/typerepresentationstrategy.xml +++ b/src/docbkx/reference/programming-model/typerepresentationstrategy.xml @@ -21,11 +21,9 @@ Stores entity types in the integrated index. Each entity node gets indexed with its type and - any supertypes that are also@NodeEntity-annotated. The special index used for this - is called__types__. Additionally, in order to get the type of an entity node, each - node has a property - __type__ - with the fully qualified type of that entity. + all supertypes that are also @NodeEntity-annotated. The special index used for this + is named __types__. Additionally, in order to retrieve the type of an entity node, each + node has a property __type__ with the fully qualified type of that entity. @@ -57,6 +55,12 @@ IndexingRelationshipTypeRepresentationStrategy + + Stores relationship entity types in the integrated index. Each entity relationship gets indexed with its type and + all supertypes that are also @RelationshipEntity-annotated. The special index used for this + is named __rel_types__. Additionally, in order to retrieve the type of an entity relationship, each + relationship has a property __type__ with the fully qualified type of that entity. + diff --git a/src/docbkx/tutorial/neo4j-server.xml b/src/docbkx/tutorial/neo4j-server.xml index 84822be3a..396d78fb9 100644 --- a/src/docbkx/tutorial/neo4j-server.xml +++ b/src/docbkx/tutorial/neo4j-server.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-neo4j-rest - 2.0.0.RC1 + 2.0.0.RELEASE ]]> diff --git a/src/docbkx/tutorial/spring-data-neo4j-aj.xml b/src/docbkx/tutorial/spring-data-neo4j-aj.xml index e78a61d16..d8c5e13b5 100644 --- a/src/docbkx/tutorial/spring-data-neo4j-aj.xml +++ b/src/docbkx/tutorial/spring-data-neo4j-aj.xml @@ -26,7 +26,7 @@ org.springframework.data spring-data-neo4j-aspects - 2.0.0.RC1 + 2.0.0.RELEASE diff --git a/src/docbkx/tutorial/spring-data-neo4j.xml b/src/docbkx/tutorial/spring-data-neo4j.xml index c8774bb0b..c47398037 100644 --- a/src/docbkx/tutorial/spring-data-neo4j.xml +++ b/src/docbkx/tutorial/spring-data-neo4j.xml @@ -21,7 +21,7 @@ org.springframework.data spring-data-neo4j - 2.0.0.RC1 + 2.0.0.RELEASE ]]> From d9953e61f803301052f614a5cd6ef09388a5c217 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Fri, 23 Dec 2011 19:26:35 -0500 Subject: [PATCH 25/31] preparing for the GA 2.0.0.RELEASE --- pom.xml | 6 +++--- spring-data-neo4j-aspects/pom.xml | 2 +- spring-data-neo4j-cross-store/pom.xml | 2 +- spring-data-neo4j-examples/cineasts-aspects/pom.xml | 2 +- spring-data-neo4j-examples/cineasts-rest/pom.xml | 4 ++-- spring-data-neo4j-examples/cineasts/pom.xml | 2 +- spring-data-neo4j-examples/hello-worlds-aspects/pom.xml | 2 +- spring-data-neo4j-examples/hello-worlds/pom.xml | 2 +- spring-data-neo4j-examples/imdb/pom.xml | 2 +- spring-data-neo4j-examples/myrestaurants-social/pom.xml | 4 ++-- spring-data-neo4j-examples/todos/pom.xml | 2 +- spring-data-neo4j-parent/pom.xml | 2 +- spring-data-neo4j-rest/pom.xml | 4 ++-- spring-data-neo4j/pom.xml | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 76319cfd3..867f99084 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ Spring Data Neo4j Distribution - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE pom spring-data-neo4j-parent @@ -244,7 +244,7 @@ - + diff --git a/spring-data-neo4j-aspects/pom.xml b/spring-data-neo4j-aspects/pom.xml index f98d77fba..00a288a2a 100644 --- a/spring-data-neo4j-aspects/pom.xml +++ b/spring-data-neo4j-aspects/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-aspects diff --git a/spring-data-neo4j-cross-store/pom.xml b/spring-data-neo4j-cross-store/pom.xml index 78114b980..5b187bc9c 100644 --- a/spring-data-neo4j-cross-store/pom.xml +++ b/spring-data-neo4j-cross-store/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-cross-store diff --git a/spring-data-neo4j-examples/cineasts-aspects/pom.xml b/spring-data-neo4j-examples/cineasts-aspects/pom.xml index 018b1678b..de1c104d9 100644 --- a/spring-data-neo4j-examples/cineasts-aspects/pom.xml +++ b/spring-data-neo4j-examples/cineasts-aspects/pom.xml @@ -15,7 +15,7 @@ 1.6.1 UTF-8 1.6.M02 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE 1.6.12 1.6.1 diff --git a/spring-data-neo4j-examples/cineasts-rest/pom.xml b/spring-data-neo4j-examples/cineasts-rest/pom.xml index 0f9cfd979..c093de3a5 100644 --- a/spring-data-neo4j-examples/cineasts-rest/pom.xml +++ b/spring-data-neo4j-examples/cineasts-rest/pom.xml @@ -15,7 +15,7 @@ 1.6.1 UTF-8 1.6.M02 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE 1.6.12 1.6.1 @@ -85,7 +85,7 @@ org.springframework.data spring-data-neo4j-rest - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE test-jar test diff --git a/spring-data-neo4j-examples/cineasts/pom.xml b/spring-data-neo4j-examples/cineasts/pom.xml index 6b06b16bd..8e570934b 100644 --- a/spring-data-neo4j-examples/cineasts/pom.xml +++ b/spring-data-neo4j-examples/cineasts/pom.xml @@ -14,7 +14,7 @@ 3.0.7.RELEASE 1.6.1 UTF-8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE 1.6.1 1.6.12 1.6.M02 diff --git a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml index 5f2ab6a16..07dc33626 100644 --- a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml @@ -15,7 +15,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/spring-data-neo4j-examples/hello-worlds/pom.xml b/spring-data-neo4j-examples/hello-worlds/pom.xml index e354db880..038a86994 100644 --- a/spring-data-neo4j-examples/hello-worlds/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds/pom.xml @@ -15,7 +15,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/spring-data-neo4j-examples/imdb/pom.xml b/spring-data-neo4j-examples/imdb/pom.xml index dafe10f03..5719dcce7 100644 --- a/spring-data-neo4j-examples/imdb/pom.xml +++ b/spring-data-neo4j-examples/imdb/pom.xml @@ -11,7 +11,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE diff --git a/spring-data-neo4j-examples/myrestaurants-social/pom.xml b/spring-data-neo4j-examples/myrestaurants-social/pom.xml index 652a00d8b..0410c467d 100644 --- a/spring-data-neo4j-examples/myrestaurants-social/pom.xml +++ b/spring-data-neo4j-examples/myrestaurants-social/pom.xml @@ -4,11 +4,11 @@ com.springone.myrestaurants myrestaurants-social war - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE myrestaurants-social 3.0.7.RELEASE - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE 1.6.12 1.6.1 1.6.M02 diff --git a/spring-data-neo4j-examples/todos/pom.xml b/spring-data-neo4j-examples/todos/pom.xml index f0825503d..700dea477 100644 --- a/spring-data-neo4j-examples/todos/pom.xml +++ b/spring-data-neo4j-examples/todos/pom.xml @@ -4,7 +4,7 @@ org.neo4j.app sdn-todos - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE jar sdn-todos diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index a80200b2a..a6b90ccb2 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-neo4j-parent Spring Data Neo4j Parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE pom diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index 23050ca49..0e1317194 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -4,12 +4,12 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-rest jar - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE Spring Data Neo4j REST Wrapper diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index 80abb1b2e..2ae906514 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.RELEASE ../spring-data-neo4j-parent/pom.xml spring-data-neo4j From 1e7c1825227eaaa3d78449b7d04e48badf57a017 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Fri, 23 Dec 2011 20:25:22 -0500 Subject: [PATCH 26/31] prepared for 2.1.0 snapshot builds --- pom.xml | 2 +- spring-data-neo4j-aspects/pom.xml | 2 +- spring-data-neo4j-cross-store/pom.xml | 2 +- spring-data-neo4j-examples/cineasts-aspects/pom.xml | 2 +- spring-data-neo4j-examples/cineasts-rest/pom.xml | 4 ++-- spring-data-neo4j-examples/cineasts/pom.xml | 2 +- spring-data-neo4j-examples/hello-worlds-aspects/pom.xml | 2 +- spring-data-neo4j-examples/hello-worlds/pom.xml | 2 +- spring-data-neo4j-examples/imdb/pom.xml | 2 +- spring-data-neo4j-examples/myrestaurants-social/pom.xml | 4 ++-- spring-data-neo4j-examples/todos/pom.xml | 2 +- spring-data-neo4j-parent/pom.xml | 2 +- spring-data-neo4j-rest/pom.xml | 4 ++-- spring-data-neo4j/pom.xml | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 867f99084..77a175752 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ Spring Data Neo4j Distribution - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT pom spring-data-neo4j-parent diff --git a/spring-data-neo4j-aspects/pom.xml b/spring-data-neo4j-aspects/pom.xml index 00a288a2a..73032405c 100644 --- a/spring-data-neo4j-aspects/pom.xml +++ b/spring-data-neo4j-aspects/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-aspects diff --git a/spring-data-neo4j-cross-store/pom.xml b/spring-data-neo4j-cross-store/pom.xml index 5b187bc9c..0c57c4567 100644 --- a/spring-data-neo4j-cross-store/pom.xml +++ b/spring-data-neo4j-cross-store/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-cross-store diff --git a/spring-data-neo4j-examples/cineasts-aspects/pom.xml b/spring-data-neo4j-examples/cineasts-aspects/pom.xml index de1c104d9..9454d809c 100644 --- a/spring-data-neo4j-examples/cineasts-aspects/pom.xml +++ b/spring-data-neo4j-examples/cineasts-aspects/pom.xml @@ -15,7 +15,7 @@ 1.6.1 UTF-8 1.6.M02 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT 1.6.12 1.6.1 diff --git a/spring-data-neo4j-examples/cineasts-rest/pom.xml b/spring-data-neo4j-examples/cineasts-rest/pom.xml index c093de3a5..cbd7e947f 100644 --- a/spring-data-neo4j-examples/cineasts-rest/pom.xml +++ b/spring-data-neo4j-examples/cineasts-rest/pom.xml @@ -15,7 +15,7 @@ 1.6.1 UTF-8 1.6.M02 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT 1.6.12 1.6.1 @@ -85,7 +85,7 @@ org.springframework.data spring-data-neo4j-rest - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT test-jar test diff --git a/spring-data-neo4j-examples/cineasts/pom.xml b/spring-data-neo4j-examples/cineasts/pom.xml index 8e570934b..a00afc93f 100644 --- a/spring-data-neo4j-examples/cineasts/pom.xml +++ b/spring-data-neo4j-examples/cineasts/pom.xml @@ -14,7 +14,7 @@ 3.0.7.RELEASE 1.6.1 UTF-8 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT 1.6.1 1.6.12 1.6.M02 diff --git a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml index 07dc33626..3178ebe2e 100644 --- a/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds-aspects/pom.xml @@ -15,7 +15,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-data-neo4j-examples/hello-worlds/pom.xml b/spring-data-neo4j-examples/hello-worlds/pom.xml index 038a86994..c1aa647e7 100644 --- a/spring-data-neo4j-examples/hello-worlds/pom.xml +++ b/spring-data-neo4j-examples/hello-worlds/pom.xml @@ -15,7 +15,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-data-neo4j-examples/imdb/pom.xml b/spring-data-neo4j-examples/imdb/pom.xml index 5719dcce7..921080287 100644 --- a/spring-data-neo4j-examples/imdb/pom.xml +++ b/spring-data-neo4j-examples/imdb/pom.xml @@ -11,7 +11,7 @@ 1.6.12 1.6.1 UTF-8 - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-data-neo4j-examples/myrestaurants-social/pom.xml b/spring-data-neo4j-examples/myrestaurants-social/pom.xml index 0410c467d..024649049 100644 --- a/spring-data-neo4j-examples/myrestaurants-social/pom.xml +++ b/spring-data-neo4j-examples/myrestaurants-social/pom.xml @@ -4,11 +4,11 @@ com.springone.myrestaurants myrestaurants-social war - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT myrestaurants-social 3.0.7.RELEASE - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT 1.6.12 1.6.1 1.6.M02 diff --git a/spring-data-neo4j-examples/todos/pom.xml b/spring-data-neo4j-examples/todos/pom.xml index 700dea477..38a70093a 100644 --- a/spring-data-neo4j-examples/todos/pom.xml +++ b/spring-data-neo4j-examples/todos/pom.xml @@ -4,7 +4,7 @@ org.neo4j.app sdn-todos - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT jar sdn-todos diff --git a/spring-data-neo4j-parent/pom.xml b/spring-data-neo4j-parent/pom.xml index a6b90ccb2..74aba35bd 100644 --- a/spring-data-neo4j-parent/pom.xml +++ b/spring-data-neo4j-parent/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-neo4j-parent Spring Data Neo4j Parent - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT pom diff --git a/spring-data-neo4j-rest/pom.xml b/spring-data-neo4j-rest/pom.xml index 0e1317194..63672a322 100644 --- a/spring-data-neo4j-rest/pom.xml +++ b/spring-data-neo4j-rest/pom.xml @@ -4,12 +4,12 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT ../spring-data-neo4j-parent/pom.xml spring-data-neo4j-rest jar - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT Spring Data Neo4j REST Wrapper diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index 2ae906514..d5639c0ba 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -4,7 +4,7 @@ org.springframework.data spring-data-neo4j-parent - 2.0.0.RELEASE + 2.1.0.BUILD-SNAPSHOT ../spring-data-neo4j-parent/pom.xml spring-data-neo4j From fe4ea7923f28f1371cca6fcf8b0ea8e017c9841f Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sat, 7 Jan 2012 00:09:42 +0100 Subject: [PATCH 27/31] DATAGRAPH-166 fixed multiple sort parameters --- .../neo4j/repository/query/CypherGraphRepositoryQuery.java | 3 +-- .../data/neo4j/repository/GraphRepositoryTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/CypherGraphRepositoryQuery.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/CypherGraphRepositoryQuery.java index f190cd4a3..24e4db40c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/CypherGraphRepositoryQuery.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/CypherGraphRepositoryQuery.java @@ -23,8 +23,6 @@ import org.springframework.data.neo4j.support.query.QueryEngine; import org.springframework.data.repository.query.ParameterAccessor; import org.springframework.data.repository.query.Parameters; -import java.util.Map; - /** * @author mh * @since 31.10.11 @@ -66,6 +64,7 @@ class CypherGraphRepositoryQuery extends GraphRepositoryQuery { private String getSortOrder(Sort sort) { String result = ""; for (Sort.Order order : sort) { + if (!result.isEmpty()) result += ", "; result += order.getProperty() + " " + order.getDirection(); } return result; diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java index 9433a9c1f..bef9cd79f 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java @@ -195,7 +195,7 @@ public class GraphRepositoryTest { @Test @Transactional public void testFindPaged() { - final PageRequest page = new PageRequest(0, 1, Sort.Direction.ASC, "member.name"); + final PageRequest page = new PageRequest(0, 1, Sort.Direction.ASC, "member.name","member.age"); Page teamMemberPage1 = personRepository.findAllTeamMembersPaged(testTeam.sdg, page); assertThat(teamMemberPage1, hasItem(testTeam.david)); } From 9f76648c40ce0596966b601740ac16654a9d2c6b Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sat, 7 Jan 2012 00:49:52 +0100 Subject: [PATCH 28/31] updated SDN logo --- src/docbkx/springdatagraph.png | Bin 53140 -> 18098 bytes src/docbkx/tutorial/domain.png | Bin 40376 -> 40199 bytes src/docbkx/tutorial/domain.xml | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docbkx/springdatagraph.png b/src/docbkx/springdatagraph.png index 1718b3475f007fa11167c7578d6a9da6f07df05f..8527a6cf560c3718edbf60b9c261dd09eed3be53 100644 GIT binary patch literal 18098 zcmYg&Wk6ip&NdFk-QArj?pmCpgWCYbDemrW#VPLY?k>gM-Q9~rKhAx>+jD=+?D?~^ zl4mC?$zFLTOi^AE2_7FF3=9lOTI!237#IZB$8SG4n2&FlNGS*~FmM)gF)>AHF)>m_ zdm9sTD`PM)S8yW`h}G87&fXXu1R5S^po6z}Q4S4_R0ef*clUIUla7JLKp81II$OA? zTYX?qZclC{r1)5#ZG+u#=q=?4tO%;nq%jOF*~L)BCn%@{1^L)CYybd0*z)o|6|}J3 zAdhgPlrm>Z2Y5d-{3m;ua1!v^rx~&{22yAAz&EIVW(aqP;sXRJFW!{#esDt?ktJ4A zXK4%QVLh0`SO1aRvAalgXbMP3Na&%2*L+~m*2qrW+?pZuWc%K0uK#Opf7~2qwpQqi za4Rkp8N3Ktp@EsXdCn*70&?(h*igGH$e!&{T4xxt;A+~I`eMWpqi?JxAku!xl+Tj> zemy>PkdUJ!fhp1~kbMwDFfi{WaGyEEU|_(#V1m6I!1}5bZ4T=8k3SInWGkiV00xGG z{?7;8G;8JqU{WyYFCsu!@N+L%SIouvdl87h;@k&j_e)YGb~Sb4uqmhNZzl%+#2J$So7NpulkoMCEnC@xuUqq*(d_8sEwQcyBq%DwEIU1E}I9q*EnL3G@#Y9 zTAln2VCiQXOit~>Y_Zua$Wf-7VF9F_JPCh=f*A;_)O9hfv-|ywWz3Zpzi{&^1PYk> zI_MOs&eBOIFm*~-s+QAO8-)q~-v#`IZQ;yP!J zzTj*w&yh14z*TySr+)saevU_~Bzw$k=?L#^?Ivs31yRT)NyqQ=S;WVG+Vx+EUN~P8OW>Vf4J~t8sg3`| zVhages1RZ-fUbZxmMe*u-CVfJlf75FO2-3kRWUFiH_u__%6n4z(%EJD=XY66E&K4D z8=RcM1}&vy!~F!YwdT}Z#wMJ?HCy$`4f+4kx|`%fuHpH;Zb`$li`7@53GFd-fBh&T z6&7B??yvQF^D@XB?fUde`Rq81GBs6jb&$#9S#Ld$v9RI#&?;9RYM=Lt)g-9q@s`^C!?e-kJf_Nfcc7c z(Z$PwVorxDjXy;H$A02}9?y3Dk5!}H$_|m=@ai*Cxvy>r%A#JT3JLM1lher7_{wVr@Rx z5ZA2NQZ+?atfq5buM>K66{;#f$LN-D%GZaF=c;CFzph3KNm*+xR`p$!j~A;I!0WXo zJ^z)~C_)NLv;3U(+q&tJPl^hDX!@<{ZC2~-q}gQP=I*{OrnQuyB#~LaLn2m(6r(I- zCv_R$RZ?5bA3P1|e;niy3%o0_#-!lJk(K9Z5uZ339sk?A
      H|CE;iuR~;XxVKBD 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 z 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 literal 40376 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 z From 5d61a6429f07eea9c3f24d240f08eacf714b5710 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sat, 7 Jan 2012 01:22:42 +0100 Subject: [PATCH 29/31] changed acknowledgements --- src/docbkx/index.xml | 8 -------- src/docbkx/introduction/about.xml | 4 ++++ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/docbkx/index.xml b/src/docbkx/index.xml index d69b622ea..516695d6c 100644 --- a/src/docbkx/index.xml +++ b/src/docbkx/index.xml @@ -29,14 +29,6 @@ Michael Hunger - - David - Montag - - - Andreas - Kollegger - diff --git a/src/docbkx/introduction/about.xml b/src/docbkx/introduction/about.xml index 51c25e6bc..6c2c8382b 100644 --- a/src/docbkx/introduction/about.xml +++ b/src/docbkx/introduction/about.xml @@ -59,6 +59,10 @@ advanced AspectJ usage which caused some headaches. He always quickly solved our issues and gave us excellent answers. + + Many thanks to our colleagues David Montag, Andreas Kollegger and Rickard Öberg who not only contributed to + Spring Data Neo4j but also provided content and feedback for this book. + We also appreciate very much the foresight of Rod Johnson and Emil Eifrem to initiate the project, and now also providing great forewords. Their leadership inspired collaboration between the engineering teams at From 62f11ac029c0507f5a6676fb5b71c60929577e8c Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 9 Jan 2012 14:22:09 +0100 Subject: [PATCH 30/31] DATAGRAPH-164 Added methods to determine stored java type to neo4j-template and crud-repository --- .../repository/AbstractGraphRepository.java | 5 ++++ .../data/neo4j/repository/CRUDRepository.java | 2 ++ .../data/neo4j/support/Neo4jTemplate.java | 28 +++++++++---------- .../data/neo4j/template/Neo4jOperations.java | 2 ++ .../neo4j/repository/GraphRepositoryTest.java | 19 +++++++++++++ 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java index ecd609c91..a1f8dbb07 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/AbstractGraphRepository.java @@ -303,6 +303,11 @@ public abstract class AbstractGraphRepository im } } + @Override + public Class getStoredJavaType(Object entity) { + return template.getStoredJavaType(entity); + } + @Override public void delete(T entity) { template.delete(entity); diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java index 14bcd24f7..643c004a4 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/CRUDRepository.java @@ -122,4 +122,6 @@ public interface CRUDRepository extends PagingAndSortingRepository { */ Page findAll(Pageable pageable); + Class getStoredJavaType(Object entity); + } \ No newline at end of file diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java index 10e6f8c29..d9a488c02 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/Neo4jTemplate.java @@ -16,22 +16,9 @@ package org.springframework.data.neo4j.support; -import static org.springframework.data.neo4j.support.ParameterCheck.*; - -import java.util.Map; - -import javax.annotation.PostConstruct; -import javax.validation.Validator; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.neo4j.graphdb.DynamicRelationshipType; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.Path; -import org.neo4j.graphdb.PropertyContainer; -import org.neo4j.graphdb.Relationship; -import org.neo4j.graphdb.Transaction; +import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.helpers.collection.ClosableIterable; @@ -70,6 +57,12 @@ import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; +import javax.annotation.PostConstruct; +import javax.validation.Validator; +import java.util.Map; + +import static org.springframework.data.neo4j.support.ParameterCheck.notNull; + /** * Mediator class for the graph related services like the {@link GraphDatabaseService}, the used * {@link org.springframework.data.neo4j.core.TypeRepresentationStrategy}, entity instantiators for nodes and relationships as well as a spring conversion service. @@ -630,4 +623,11 @@ public class Neo4jTemplate implements Neo4jOperations, EntityPersister { ParameterCheck.notNull(entity,"entity"); return getMappingPolicy(entity.getClass()); } + + @Override + public Class getStoredJavaType(Object entity) { + final PropertyContainer container = entity instanceof PropertyContainer ? (PropertyContainer)entity: getPersistentState(entity); + if (container==null) return null; + return getInfrastructure().getTypeRepresentationStrategies().getJavaType(container); + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java index 113cb2327..5c1f1106e 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/template/Neo4jOperations.java @@ -267,4 +267,6 @@ public interface Neo4jOperations { MappingPolicy getMappingPolicy(Class targetType); ResultConverter getDefaultConverter(); + + Class getStoredJavaType(Object entity); } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java index bef9cd79f..2397fbb42 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/repository/GraphRepositoryTest.java @@ -55,6 +55,7 @@ import java.util.Map; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import static org.junit.internal.matchers.IsCollectionContaining.hasItem; import static org.junit.internal.matchers.IsCollectionContaining.hasItems; import static org.neo4j.helpers.collection.IteratorUtil.addToCollection; @@ -223,6 +224,24 @@ public class GraphRepositoryTest { assertEquals(asList(testTeam.michael, testTeam.emil, testTeam.david), asCollection(teamMembers)); } + @Test + @Transactional + public void testGetStoredJavaType() { + Person p = personRepository.save(new Person()); + assertEquals(Person.class, personRepository.getStoredJavaType(p)); + assertEquals(Person.class, personRepository.getStoredJavaType(neo4jTemplate.getPersistentState(p))); + assertEquals(null, personRepository.getStoredJavaType(new Person())); + } + @Test + @Transactional + public void testTemplateGetStoredJavaType() { + Person p = neo4jTemplate.save(new Person()); + assertEquals(Person.class, neo4jTemplate.getStoredJavaType(p)); + assertEquals(Person.class, neo4jTemplate.getStoredJavaType(neo4jTemplate.getPersistentState(p))); + assertEquals(null, neo4jTemplate.getStoredJavaType(new Person())); + } + + @Test @Transactional public void testFindSortedNull() { Collection teamMembers = IteratorUtil.asCollection(personRepository.findAllTeamMembersSorted(testTeam.sdg, null)); From 6f558c7e68893d8e741aba95ba8aed81c7ea65e9 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 9 Jan 2012 15:27:56 +0100 Subject: [PATCH 31/31] DATAGRAPH-164 Added methods to determine stored java type to neo4j-template and crud-repository --- .../reference/programming-model/template.xml | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/docbkx/reference/programming-model/template.xml b/src/docbkx/reference/programming-model/template.xml index 9bad4579b..12b6dd2e4 100644 --- a/src/docbkx/reference/programming-model/template.xml +++ b/src/docbkx/reference/programming-model/template.xml @@ -7,7 +7,7 @@ The Neo4jTemplate offers the convenient API of Spring templates for the Neo4j graph database. The Spring Data Neo4j Object Graph mapping builds upon the core functionality of the - template to persist objects to the graph and load them in a variety of ways. + template to persist objects to the graph and load them in a variety of ways. The template handles the active mapping mode () transparently. @@ -17,6 +17,24 @@ +
      + Core-Operations + + Neo4jTemplate provides access to some of the methods of the Neo4j-Core-API directly. So accessing + nodes and relationships (getReferenceNode, getNode, getRelationship, getRelationshipBetween), + creating nodes and relationships (createNode, createNodeAs, createRelationshipBetween) + and deleting them (delete, deleteRelationshipBetween) are supported. It also provides access to + the underlying GraphDatabase via getGraphDatabase. + +
      +
      + Entity-Persistence + + Neo4jTemplate allows to save,find(One/All),countdelete + and projectTo entities. It provides the stored type information via getStoredJavaType + and can fetch lazy-loaded entities or load them alltogether. + +
      Result @@ -26,7 +44,7 @@ ResultConverter<FROM,TO> which takes care of custom conversions. By default most query methods can already handle conversions from and to: Paths, Nodes, Relationship and GraphEntities as well as conversions backed by registered ConversionServices. A converted Result<FROM> is an - Iterable<TO>. Results can be limited to a single value using the + Iterable<TO>. Results can be limited to a single value using the result.single() or result.singleOrNull() methods. It also offers support for a pure callback function using a Handler<T>.