diff --git a/.classpath b/.classpath
deleted file mode 100644
index f596458fb..000000000
--- a/.classpath
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index b83d22266..aee5425d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
-/target/
+target
+.springBeans
+.ant-targets-build.xml
+src/ant/.ant-targets-upload-dist.xml
diff --git a/.project b/.project
deleted file mode 100644
index 94203693f..000000000
--- a/.project
+++ /dev/null
@@ -1,40 +0,0 @@
-
- spring-data-commons
- Spring Data Common Interfaces and Implementations
-
-
-
- org.eclipse.wst.common.project.facet.core.builder
-
-
- org.eclipse.wst.validation.validationbuilder
-
-
- org.eclipse.ajdt.core.ajbuilder
-
-
- org.springframework.ide.eclipse.core.springbuilder
-
-
- org.eclipse.ajdt.core.ajbuilder
-
-
- aspectPath
- org.springframework.aspects
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
- org.eclipse.wst.common.project.facet.core.nature
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
- org.eclipse.jem.workbench.JavaEMFNature
- org.eclipse.ajdt.ui.ajnature
- com.springsource.sts.roo.core.nature
- org.springframework.ide.eclipse.core.springnature
-
-
\ No newline at end of file
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index caab2af32..000000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Sep 09 15:12:37 EDT 2010
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.source=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index 9d396ff7d..000000000
--- a/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index be3b0394b..000000000
--- a/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.springBeans b/.springBeans
deleted file mode 100644
index 4dff64763..000000000
--- a/.springBeans
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- 1
-
-
-
-
-
-
-
-
-
-
diff --git a/pom.xml b/pom.xml
index dc0f6f0d7..f94aff4fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,31 +1,17 @@
-
-
+
+
4.0.0
- spring-data-commons
- 1.0.0.M1-SNAPSHOT
- Spring Data Commons
- Spring Data Common Interfaces and Implementations
- http://www.springsource.org
- jar
-
-
- org.springframework.data
- spring-data-parent
- 1.0.0.M1-SNAPSHOT
-
-
-
- Issue Tracker
- http://jira.springframework.org/browse/DATACOMMONS
-
-
- http://git.springsource.org/spring-data/data-commons
-
-
- SpringSource, a division of VMware
- http://www.SpringSource.org
-
- 2010
+ org.springframework.data
+ spring-data-commons-dist
+ Spring Data Commons Distribution
+ 1.0.0.BUILD-SNAPSHOT
+ pom
+
+ spring-data-commons-parent
+ spring-data-commons-core
+ spring-data-commons-aspects
+
@@ -67,49 +53,234 @@
UTF-8
- 1.6.10.BUILD-SNAPSHOT
-
-
-
-
-
- org.springframework
- spring-aop
- ${spring.framework.version}
-
-
- org.springframework
- spring-aspects
- ${spring.framework.version}
-
-
- org.springframework
- spring-tx
- ${spring.framework.version}
-
-
- commons-logging
- commons-logging
- 1.1.1
- provided
-
-
- org.aspectj
- aspectjrt
- ${aspectj.version}
-
-
-
-
+
+ spring-data-commons
+ Spring Data Commons
+ DATA
+ ${project.version}
+ snapshot
+ ${dist.id}-${dist.version}
+ ${dist.finalName}.zip
+ target/${dist.fileName}
+ dist.springframework.org
+
+
+
+
+ staging
+
+
+ spring-site-staging
+ file:///${java.io.tmpdir}/spring-data/data-commons/docs/${project.version}
+
+
+ spring-milestone-staging
+ file:///${java.io.tmpdir}/spring-data/data-commons/milestone
+
+
+ spring-snapshot-staging
+ file:///${java.io.tmpdir}/spring-data/data-commons/snapshot
+
+
+
+
+
+
+ http://www.springsource.com/download/community
+
+ spring-site
+ scp://static.springframework.org/var/www/domains/springframework.org/static/htdocs/spring-data/data-commons/docs/${project.version}
+
+
+ spring-milestone
+ Spring Milestone Repository
+ s3://maven.springframework.org/milestone
+
+
+ spring-snapshot
+ Spring Snapshot Repository
+ s3://maven.springframework.org/snapshot
+
+
+
+
+
+
+ org.springframework.build.aws
+ org.springframework.build.aws.maven
+ 3.0.0.RELEASE
+
+
+
+
+ com.agilejava.docbkx
+ docbkx-maven-plugin
+ 2.0.6
+
+
+
+ generate-html
+ generate-pdf
+
+ package
+
+
+
+
+ org.docbook
+ docbook-xml
+ 4.4
+ runtime
+
+
+
+ index.xml
+ true
+ ${project.basedir}/src/docbkx/resources/xsl/fopdf.xsl
+
+ css/html.css
+
+ false
+ ${project.basedir}/src/docbkx/resources/xsl/html.xsl
+
+
+
+ version
+ ${pom.version}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ maven-javadoc-plugin
+ 2.5
+
+
+ aggregate
+
+ aggregate
+
+ package
+
+ true
+ true
+ Spring Datastore Key-Value
+ 1.5
+ true
+ ${project.basedir}/src/main/javadoc
+ ${project.basedir}/src/main/javadoc/overview.html
+ ${project.basedir}/src/main/javadoc/spring-javadoc.css
+
+ true
+
+ http://static.springframework.org/spring/docs/3.0.x/javadoc-api
+ http://java.sun.com/javase/6/docs/api
+
+
+
+
+
+
+ maven-assembly-plugin
+ 2.2-beta-5
+ false
+
+
+ distribution
+
+ single
+
+ package
+
+
+ ${project.basedir}/src/assembly/distribution.xml
+
+ false
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.4
+
+
+ upload-dist
+ deploy
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+ org.springframework.build
+ org.springframework.build.aws.ant
+ 3.0.5.RELEASE
+
+
+ net.java.dev.jets3t
+ jets3t
+ 0.7.2
+
+
+
+
+
+ ${dist.finalName}
+
- spring-maven-snapshot
-
- true
-
- Springframework Maven SNAPSHOT Repository
- http://maven.springframework.org/snapshot
+ repository.springframework.maven.release
+ Spring Framework Maven Release Repository
+ http://maven.springframework.org/release
-
-
-
+
+ repository.springframework.maven.milestone
+ Spring Framework Maven Milestone Repository
+ http://maven.springframework.org/milestone
+
+
+
+ repository.source.maven.release
+ SpringSource Maven Release Repository
+ http://repository.springsource.com/maven/bundles/release
+
+
+
\ No newline at end of file
diff --git a/spring-data-commons-aspects/pom.xml b/spring-data-commons-aspects/pom.xml
new file mode 100644
index 000000000..6f48ae893
--- /dev/null
+++ b/spring-data-commons-aspects/pom.xml
@@ -0,0 +1,156 @@
+
+ 4.0.0
+
+ org.springframework.data
+ spring-data-commons-parent
+ 1.0.0.BUILD-SNAPSHOT
+ ../spring-data-commons-parent/pom.xml
+
+ spring-data-commons-aspects
+ jar
+ Spring Data Commons Aspects
+
+ 1.6.10.BUILD-SNAPSHOT
+
+
+
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-tx
+
+
+ org.springframework
+ spring-aspects
+ ${org.springframework.version}
+
+
+
+
+ org.springframework.data
+ spring-data-commons-core
+
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ jcl-over-slf4j
+ compile
+
+
+ org.slf4j
+ slf4j-log4j12
+ runtime
+
+
+ log4j
+ log4j
+
+
+ javax.mail
+ mail
+
+
+ javax.jms
+ jms
+
+
+ com.sun.jdmk
+ jmxtools
+
+
+ com.sun.jmx
+ jmxri
+
+
+ runtime
+
+
+
+ javax.annotation
+ jsr250-api
+ true
+
+
+
+ org.mockito
+ mockito-all
+ test
+
+
+
+ junit
+ junit
+
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+
+
+
+ spring-maven-snapshot
+
+ true
+
+ Springframework Maven SNAPSHOT Repository
+ http://maven.springframework.org/snapshot
+
+
+
+
+
+ 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
+
+
+ 1.6
+ 1.6
+
+
+
+ com.springsource.bundlor
+ com.springsource.bundlor.maven
+
+
+
+
diff --git a/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractMixinFields.aj b/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractMixinFields.aj
new file mode 100644
index 000000000..9e6473ea3
--- /dev/null
+++ b/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractMixinFields.aj
@@ -0,0 +1,54 @@
+package org.springframework.persistence.support;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.persistence.RelatedEntity;
+
+/**
+ * Abstract superaspect to advise field read and write
+ * and introduce a mixin interface.
+ *
+ * @param type of introduced interface
+ *
+ * @author Rod Johnson
+ */
+privileged abstract public aspect AbstractMixinFields {
+
+ protected final Log log = LogFactory.getLog(getClass());
+
+ //-------------------------------------------------------------------------
+ // ITDs to add behavior and state to classes
+ //-------------------------------------------------------------------------
+ // Enable Spring DI for all mixed-in objects
+ declare @type: N+: @Configurable;
+
+ //-------------------------------------------------------------------------
+ // Advice for field get/set to delegate to backing Node.
+ //-------------------------------------------------------------------------
+ protected pointcut entityFieldGet(N entity) :
+ get(* N+.*) &&
+ this(entity) &&
+ !(get(@RelatedEntity * *)
+ || get(* N.*)
+ || getsNotToAdvise());
+
+ /**
+ * Never matches. Subclasses can override to exempt certain field reads from advice
+ */
+ protected pointcut getsNotToAdvise();
+
+ protected pointcut entityFieldSet(N entity, Object newVal) :
+ set(* N+.*) &&
+ this(entity) &&
+ args(newVal) &&
+ !(set(@RelatedEntity * *) ||
+ set(* N.*) ||
+ setsNotToAdvise());
+
+ /**
+ * Never matches. Subclasses can override to exempt certain field writes from advice
+ */
+ protected pointcut setsNotToAdvise();
+
+}
diff --git a/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractTypeAnnotatingMixinFields.aj b/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractTypeAnnotatingMixinFields.aj
new file mode 100644
index 000000000..ba63e81e4
--- /dev/null
+++ b/spring-data-commons-aspects/src/main/java/org/springframework/persistence/support/AbstractTypeAnnotatingMixinFields.aj
@@ -0,0 +1,21 @@
+package org.springframework.persistence.support;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * Abstract superaspect for aspects that advice
+ * field access with a mixin for all types annotated with
+ * a given annotation.
+ *
+ * @param annotation on entity
+ * @param type of introduced interface
+ *
+ * @author Rod Johnson
+ */
+privileged abstract public aspect AbstractTypeAnnotatingMixinFields
+ extends AbstractMixinFields {
+
+ // ITD to introduce N state to Annotated objects
+ declare parents : (@ET *) implements N;
+
+}
diff --git a/spring-data-commons-aspects/template.mf b/spring-data-commons-aspects/template.mf
new file mode 100644
index 000000000..2f7b22146
--- /dev/null
+++ b/spring-data-commons-aspects/template.mf
@@ -0,0 +1,20 @@
+Bundle-SymbolicName: org.springframework.data.commons.aspects
+Bundle-Name: Spring Data Commons Aspects
+Bundle-Vendor: SpringSource
+Bundle-ManifestVersion: 2
+Import-Package:
+ sun.reflect;version="0";resolution:=optional
+Import-Template:
+ org.springframework.beans.*;version="[3.0.0, 4.0.0)",
+ org.springframework.core.*;version="[3.0.0, 4.0.0)",
+ org.springframework.dao.*;version="[3.0.0, 4.0.0)",
+ org.springframework.util.*;version="[3.0.0, 4.0.0)",
+ org.springframework.data.core.*;version="[1.0.0, 2.0.0)",
+ org.springframework.datastore.core.*;version="[1.0.0, 2.0.0)",
+ org.springframework.datastore.persistence.*;version="[1.0.0, 2.0.0)",
+ org.aopalliance.*;version="[1.0.0, 2.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="[1.1.1, 2.0.0)",
+ org.aspectj.*;version="[1.6.5, 2.0.0)",
+ org.w3c.dom.*;version="0"
+
+
diff --git a/spring-data-commons-core/pom.xml b/spring-data-commons-core/pom.xml
new file mode 100644
index 000000000..d03a3c6e3
--- /dev/null
+++ b/spring-data-commons-core/pom.xml
@@ -0,0 +1,90 @@
+
+ 4.0.0
+
+ org.springframework.data
+ spring-data-commons-parent
+ 1.0.0.BUILD-SNAPSHOT
+ ../spring-data-commons-parent/pom.xml
+
+ spring-data-commons-core
+ jar
+ Spring Data Commons Core
+
+
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-tx
+
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ jcl-over-slf4j
+ compile
+
+
+ org.slf4j
+ slf4j-log4j12
+ runtime
+
+
+ log4j
+ log4j
+
+
+ javax.mail
+ mail
+
+
+ javax.jms
+ jms
+
+
+ com.sun.jdmk
+ jmxtools
+
+
+ com.sun.jmx
+ jmxri
+
+
+ runtime
+
+
+
+ javax.annotation
+ jsr250-api
+ true
+
+
+
+ org.mockito
+ mockito-all
+ test
+
+
+
+ junit
+ junit
+
+
+
+
+
+
+ com.springsource.bundlor
+ com.springsource.bundlor.maven
+
+
+
+
diff --git a/src/main/java/org/springframework/data/support/ChangeSet.java b/spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSet.java
similarity index 100%
rename from src/main/java/org/springframework/data/support/ChangeSet.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSet.java
diff --git a/src/main/java/org/springframework/data/support/ChangeSetBacked.java b/spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetBacked.java
similarity index 100%
rename from src/main/java/org/springframework/data/support/ChangeSetBacked.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetBacked.java
diff --git a/src/main/java/org/springframework/data/support/ChangeSetPersister.java b/spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetPersister.java
similarity index 100%
rename from src/main/java/org/springframework/data/support/ChangeSetPersister.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetPersister.java
diff --git a/src/main/java/org/springframework/data/support/ChangeSetSynchronizer.java b/spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetSynchronizer.java
similarity index 100%
rename from src/main/java/org/springframework/data/support/ChangeSetSynchronizer.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/support/ChangeSetSynchronizer.java
diff --git a/src/main/java/org/springframework/data/support/HashMapChangeSet.java b/spring-data-commons-core/src/main/java/org/springframework/data/support/HashMapChangeSet.java
similarity index 100%
rename from src/main/java/org/springframework/data/support/HashMapChangeSet.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/support/HashMapChangeSet.java
diff --git a/src/main/java/org/springframework/data/transaction/ChangeSetBackedTransactionSynchronization.java b/spring-data-commons-core/src/main/java/org/springframework/data/transaction/ChangeSetBackedTransactionSynchronization.java
similarity index 100%
rename from src/main/java/org/springframework/data/transaction/ChangeSetBackedTransactionSynchronization.java
rename to spring-data-commons-core/src/main/java/org/springframework/data/transaction/ChangeSetBackedTransactionSynchronization.java
diff --git a/src/main/java/org/springframework/datastore/serialization/SerializationStore.java b/spring-data-commons-core/src/main/java/org/springframework/datastore/serialization/SerializationStore.java
similarity index 100%
rename from src/main/java/org/springframework/datastore/serialization/SerializationStore.java
rename to spring-data-commons-core/src/main/java/org/springframework/datastore/serialization/SerializationStore.java
diff --git a/spring-data-commons-core/src/main/java/org/springframework/persistence/AsynchStoreCompletionListener.java b/spring-data-commons-core/src/main/java/org/springframework/persistence/AsynchStoreCompletionListener.java
new file mode 100644
index 000000000..4f417bb57
--- /dev/null
+++ b/spring-data-commons-core/src/main/java/org/springframework/persistence/AsynchStoreCompletionListener.java
@@ -0,0 +1,32 @@
+package org.springframework.persistence;
+
+import java.lang.reflect.Field;
+
+/**
+ * Listener interface for asynchronous storage operations.
+ * Can be annotated with OnlyOnFailure as an optimization
+ * if the listener is only interested in compensating transactions
+ * in the event of write failure.
+ *
+ * @author Rod Johnson
+ *
+ * @param new value type
+ */
+public interface AsynchStoreCompletionListener {
+
+ /**
+ * Constant indicating no store completion action
+ */
+ class NONE implements AsynchStoreCompletionListener