Skip to content

DATAMONGO-279 - optimistic locking implementation #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 49 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
ec74185
init version implementation
Jul 4, 2012
116eda7
DATAMONGO-477 - Change upper bound of Guava dependency to 14.
rocketraman Jul 6, 2012
69493b6
DATAMONGO-475 - Fixed debug output in map-reduce operations.
odrotbohm Jul 16, 2012
83d0396
DATAMONGO-474 - Fixed criteria mapping for MongoTemplate.group(…).
odrotbohm Jul 16, 2012
5e81400
DATAMONGO-482 - Fixed typo in reference documentation.
odrotbohm Jul 16, 2012
3a3fefb
DATAMONGO-483 - Indexes now use the field name even if index name is …
odrotbohm Jul 16, 2012
0dcec2d
DATAMONGO-480 - Consider WriteResult for insert(…) and save(…) methods.
amolnayak311 Jul 10, 2012
fa7c1ea
DATAMONGO-476 - JavaConfig support for repositories.
odrotbohm Jul 6, 2012
c3b58c2
DATAMONGO-485 - Added test case to show complex id's are working.
odrotbohm Jul 17, 2012
73423c3
DATAMONGO-486 - Polished namespace implementation.
odrotbohm Jul 18, 2012
cdc1efe
DATAMONGO-489 - Ensure read collections get converted to appropriate …
odrotbohm Jul 23, 2012
281f8b3
DATAMONGO-490 - Fixed typos.
odrotbohm Jul 23, 2012
190422f
DATAMONGO-474 - Populating id's after save now inspects field only.
odrotbohm Jul 24, 2012
fc0fd14
DATAMONGO-491 - Upgrade to Spring Data Commons 1.4.0.M1.
odrotbohm Jul 24, 2012
7ae6d82
DATAMONGO-491 - Prepare 1.1.0.M2 release.
odrotbohm Jul 24, 2012
c91fb8c
DATAMONGO-491 - Release 1.1.0.M2.
spring-builds Jul 24, 2012
24e2f3b
DATAMONGO-491 - Prepare next development iteration.
spring-builds Jul 24, 2012
0ebfb90
DATAMONGO-493 - Added test case to show the described scenario is wor…
odrotbohm Jul 24, 2012
fff8998
DATAMONGO-493 - Fixed broken $ne handling in QueryMapper.
odrotbohm Jul 24, 2012
55a16a3
DATAMONGO-495 - Fixed debug output in MongoTemplate.doFind(…).
odrotbohm Jul 26, 2012
5e0bca9
DATAMONGO-494 - QueryMapper now forwards entity metadata into nested …
odrotbohm Jul 27, 2012
dd7222d
DATAMONGO-497 - Fixed reading of empty collections.
odrotbohm Jul 30, 2012
bf436cc
DATAMONGO-496 - AbstractMongoConfiguration now defaults mapping base …
odrotbohm Jul 30, 2012
5860a9d
DATAMONGO-499 - Fixed namespace reference to repository XSD.
odrotbohm Jul 31, 2012
697a96b
DATAMONGO-500 - Index creation is only done for the correct MappingCo…
odrotbohm Jul 31, 2012
4213be4
DATAMONGO-502 - QueryMapper now translates property names into field …
odrotbohm Aug 8, 2012
81d5bc8
DATAMONGO-472 - MongoQueryCreator now correctly translates Not keyword.
odrotbohm Aug 10, 2012
538bccd
DATAMONGO-476 - @EnableMongoRepositories is now inherited into sub-cl…
odrotbohm Aug 13, 2012
3cf7951
DATACMNS-212 - Apply refactorings in Spring Data Commons.
odrotbohm Aug 13, 2012
5e5df90
DATAMONGO-505 - Fixed handling of parameter binding of associations a…
odrotbohm Aug 15, 2012
9257f84
DATAMONGO-508 - Eagerly return DBRef creation if the given value alre…
odrotbohm Aug 15, 2012
b440b4e
DATAMONGO-509 - SimpleMongoRepository.exists(…) now avoids loading un…
odrotbohm Aug 15, 2012
c63dc00
DATAMONGO-510 - Criteria now only uses BasicDBList internally.
odrotbohm Aug 15, 2012
60769ef
DATAMONGO-511 - QueryMapper now maps associations correctly.
odrotbohm Aug 15, 2012
5a9aad9
DATAMONGO-506 - Added test case to show BasicQuery is working for nes…
odrotbohm Aug 15, 2012
ff7e897
DATACMNS-214 - Adapted API change in Spring Data Commons.
odrotbohm Aug 16, 2012
f00962a
DATAMONGO-519 - Make Spring 3.1.2.RELEASE default Spring dependency v…
odrotbohm Aug 20, 2012
cbdedd1
DATAMONGO-517 - Fixed complex keyword handling.
odrotbohm Aug 21, 2012
b412cf4
DATAMONGO-513 - Update to Spring Data Commons 1.4.0.RC1.
odrotbohm Aug 23, 2012
649572a
DATAMONGO-513 - Prepare changelog for 1.1.0.RC1.
odrotbohm Aug 24, 2012
0b91218
DATAMONGO-513 - Release 1.1.0.RC1.
spring-builds Aug 24, 2012
1c3b5c2
DATAMONGO-513 - Prepare next development iteration.
spring-builds Aug 24, 2012
95e44e2
DATAMONGO-526 - Polished README.md.
markpollack Aug 25, 2012
a5d7ce5
DATAMONGO-513 - Update to Spring Data Commons 1.4.0.BUILD-SNAPSHOT.
odrotbohm Aug 30, 2012
9bb3311
DATAMONGO-523 - Added test case to verify type alias detection.
odrotbohm Sep 3, 2012
3e4016c
DATAMONGO-279
noter Sep 4, 2012
58854af
DATAMONGO-521 - Added test case to show that repository AND query works.
odrotbohm Sep 3, 2012
1cf70f6
DATAMONGO-527 - Fixed Criteria.equals(…).
odrotbohm Sep 3, 2012
c5f5f64
DATAMONGO-279 - fix broken repository tests
noter Sep 4, 2012
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
Spring Data - Document
Spring Data MongoDB
======================

The primary goal of the [Spring Data](http://www.springsource.org/spring-data) project is to make it easier to build Spring-powered applications that use new data access technologies such as non-relational databases, map-reduce frameworks, and cloud based data services.
As the name implies, the **Document** modules provides integration with document databases such as [MongoDB](http://www.mongodb.org/) and [CouchDB](http://couchdb.apache.org/).

The Spring Data MongoDB aims to provide a familiar and consistent Spring-based programming model for for new datastores while retaining store-specific features and capabilities. The Spring Data MongoDB project provides integration with the MongoDB document database. Key functional areas of Spring Data MongoDB are a POJO centric model for interacting with a MongoDB DBCollection and easily writing a Repository style data access layer

Getting Help
------------

At this point your best bet is to look at the Look at the [JavaDocs](http://static.springsource.org/spring-data/data-document/docs/1.0.0.BUILD-SNAPSHOT/spring-data-mongodb/apidocs/) for MongoDB integration and corresponding and source code. For more detailed questions, use the [forum](http://forum.springsource.org/forumdisplay.php?f=80). If you are new to Spring as well as to Spring Data, look for information about [Spring projects](http://www.springsource.org/projects).
For a comprehensive treatmet of all the Spring Data MongoDB features, please refer to the The [User Guide](http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/)

The [JavaDocs](http://static.springsource.org/spring-data/data-mongodb/docs/current/api/) have extensive comments in them as well.

The home page of [Spring Data MongoDB](http://www.springsource.org/spring-data/mongodb) contains links to articles and other resources.

The [User Guide](http://static.springsource.org/spring-data/data-document/docs/1.0.0.BUILD-SNAPSHOT/reference/html/) (A work in progress).
For more detailed questions, use the [forum](http://forum.springsource.org/forumdisplay.php?f=80).

If you are new to Spring as well as to Spring Data, look for information about [Spring projects](http://www.springsource.org/projects).


Quick Start
Expand Down Expand Up @@ -137,11 +143,6 @@ This will register an object in the container named PersonRepository. You can u
}


## CouchDB

TBD


Contributing to Spring Data
---------------------------

Expand Down
5 changes: 2 additions & 3 deletions spring-data-mongodb-parent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
<org.slf4j.version>1.6.1</org.slf4j.version>
<org.codehaus.jackson.version>1.6.1</org.codehaus.jackson.version>
<org.springframework.version.30>3.0.7.RELEASE</org.springframework.version.30>
<org.springframework.version.40>4.0.0.RELEASE</org.springframework.version.40>
<org.springframework.version.range>[${org.springframework.version.30}, ${org.springframework.version.40})</org.springframework.version.range>
<data.commons.version>1.3.2.BUILD-SNAPSHOT</data.commons.version>
<org.springframework.version.range>3.1.2.RELEASE</org.springframework.version.range>
<data.commons.version>1.4.0.BUILD-SNAPSHOT</data.commons.version>
<aspectj.version>1.6.11.RELEASE</aspectj.version>
<bundlor.failOnWarnings>true</bundlor.failOnWarnings>
</properties>
Expand Down
2 changes: 1 addition & 1 deletion spring-data-mongodb/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>maven-apt-plugin</artifactId>
<version>1.0.2</version>
<version>1.0.4</version>
<executions>
<execution>
<phase>generate-test-sources</phase>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
import com.mongodb.Mongo;

/**
* Base class for Spring Data Mongo configuration using JavaConfig.
* Base class for Spring Data MongoDB configuration using JavaConfig.
*
* @author Mark Pollack
* @author Oliver Gierke
Expand Down Expand Up @@ -86,22 +86,26 @@ public MongoTemplate mongoTemplate() throws Exception {
@Bean
public SimpleMongoDbFactory mongoDbFactory() throws Exception {

UserCredentials creadentials = getUserCredentials();
UserCredentials credentials = getUserCredentials();

if (creadentials == null) {
if (credentials == null) {
return new SimpleMongoDbFactory(mongo(), getDatabaseName());
} else {
return new SimpleMongoDbFactory(mongo(), getDatabaseName(), creadentials);
return new SimpleMongoDbFactory(mongo(), getDatabaseName(), credentials);
}
}

/**
* Return the base package to scan for mapped {@link Document}s.
* Return the base package to scan for mapped {@link Document}s. Will return the package name of the configuration
* class' (the concrete class, not this one here) by default. So if you have a {@code com.acme.AppConfig} extending
* {@link AbstractMongoConfiguration} the base package will be considered {@code com.acme} unless the method is
* overriden to implement alternate behaviour.
*
* @return
* @return the base package to scan for mapped {@link Document} classes or {@literal null} to not enable scanning for
* entities.
*/
protected String getMappingBasePackage() {
return null;
return getClass().getPackage().getName();
}

/**
Expand All @@ -127,7 +131,7 @@ public MongoMappingContext mongoMappingContext() throws ClassNotFoundException {
MongoMappingContext mappingContext = new MongoMappingContext();
mappingContext.setInitialEntitySet(getInitialEntitySet());
mappingContext.setSimpleTypeHolder(customConversions().getSimpleTypeHolder());
mappingContext.afterPropertiesSet();
mappingContext.initialize();

return mappingContext;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.data.annotation.Persistent;
import org.springframework.data.config.BeanComponentDefinitionBuilder;
import org.springframework.data.mongodb.core.convert.CustomConversions;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator;
Expand Down Expand Up @@ -166,27 +167,35 @@ private String potentiallyCreateMappingContext(Element element, ParserContext pa
BeanDefinition conversionsDefinition) {

String ctxRef = element.getAttribute("mapping-context-ref");
if (!StringUtils.hasText(ctxRef)) {
BeanDefinitionBuilder mappingContextBuilder = BeanDefinitionBuilder
.genericBeanDefinition(MongoMappingContext.class);

Set<String> classesToAdd = getInititalEntityClasses(element, mappingContextBuilder);
if (classesToAdd != null) {
mappingContextBuilder.addPropertyValue("initialEntitySet", classesToAdd);
}
if (StringUtils.hasText(ctxRef)) {
return ctxRef;
}

if (conversionsDefinition != null) {
AbstractBeanDefinition simpleTypesDefinition = new GenericBeanDefinition();
simpleTypesDefinition.setFactoryBeanName("customConversions");
simpleTypesDefinition.setFactoryMethodName("getSimpleTypeHolder");
BeanComponentDefinitionBuilder componentDefinitionBuilder = new BeanComponentDefinitionBuilder(element,
parserContext);

mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
}
BeanDefinitionBuilder mappingContextBuilder = BeanDefinitionBuilder
.genericBeanDefinition(MongoMappingContext.class);

parserContext.getRegistry().registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition());
ctxRef = MAPPING_CONTEXT;
Set<String> classesToAdd = getInititalEntityClasses(element, mappingContextBuilder);
if (classesToAdd != null) {
mappingContextBuilder.addPropertyValue("initialEntitySet", classesToAdd);
}

if (conversionsDefinition != null) {
AbstractBeanDefinition simpleTypesDefinition = new GenericBeanDefinition();
simpleTypesDefinition.setFactoryBeanName("customConversions");
simpleTypesDefinition.setFactoryMethodName("getSimpleTypeHolder");

mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
}

parserContext.getRegistry().registerBeanDefinition(MAPPING_CONTEXT, mappingContextBuilder.getBeanDefinition());
ctxRef = MAPPING_CONTEXT;

parserContext.registerBeanComponent(componentDefinitionBuilder.getComponent(mappingContextBuilder, ctxRef));

return ctxRef;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2011 by the original author(s).
* Copyright 2011-2012 by the original author(s).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -15,19 +15,19 @@
*/
package org.springframework.data.mongodb.config;

import static org.springframework.data.mongodb.config.BeanNames.*;
import static org.springframework.data.mongodb.config.ParsingUtils.*;
import static org.springframework.data.config.ParsingUtils.*;
import static org.springframework.data.mongodb.config.MongoParsingUtils.*;

import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.data.config.BeanComponentDefinitionBuilder;
import org.springframework.data.mongodb.core.MongoFactoryBean;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.util.StringUtils;
Expand All @@ -44,52 +44,68 @@
*/
public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {

/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
*/
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException {
String id = element.getAttribute("id");
if (!StringUtils.hasText(id)) {
id = DB_FACTORY;
}
return id;

String id = super.resolveId(element, definition, parserContext);
return StringUtils.hasText(id) ? id : BeanNames.DB_FACTORY;
}

/*
* (non-Javadoc)
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
*/
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {

Object source = parserContext.extractSource(element);

BeanComponentDefinitionBuilder helper = new BeanComponentDefinitionBuilder(element, parserContext);

String uri = element.getAttribute("uri");
String mongoRef = element.getAttribute("mongo-ref");
String dbname = element.getAttribute("dbname");
BeanDefinition userCredentials = getUserCredentialsBeanDefinition(element, parserContext);

// Common setup
BeanDefinitionBuilder dbFactoryBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleMongoDbFactory.class);
ParsingUtils.setPropertyValue(element, dbFactoryBuilder, "write-concern", "writeConcern");
setPropertyValue(dbFactoryBuilder, element, "write-concern", "writeConcern");

if (StringUtils.hasText(uri)) {
if (StringUtils.hasText(mongoRef) || StringUtils.hasText(dbname) || userCredentials != null) {
parserContext.getReaderContext().error("Configure either Mongo URI or details individually!",
parserContext.extractSource(element));
parserContext.getReaderContext().error("Configure either Mongo URI or details individually!", source);
}

dbFactoryBuilder.addConstructorArgValue(getMongoUri(uri));
return getSourceBeanDefinition(dbFactoryBuilder, parserContext, element);
}

// Defaulting
mongoRef = StringUtils.hasText(mongoRef) ? mongoRef : registerMongoBeanDefinition(element, parserContext);
dbname = StringUtils.hasText(dbname) ? dbname : "db";
if (StringUtils.hasText(mongoRef)) {
dbFactoryBuilder.addConstructorArgReference(mongoRef);
} else {
dbFactoryBuilder.addConstructorArgValue(registerMongoBeanDefinition(element, parserContext));
}

dbFactoryBuilder.addConstructorArgValue(new RuntimeBeanReference(mongoRef));
dbname = StringUtils.hasText(dbname) ? dbname : "db";
dbFactoryBuilder.addConstructorArgValue(dbname);

if (userCredentials != null) {
dbFactoryBuilder.addConstructorArgValue(userCredentials);
}

ParsingUtils.registerWriteConcernPropertyEditor(parserContext.getRegistry());
BeanDefinitionBuilder writeConcernPropertyEditorBuilder = getWriteConcernPropertyEditorBuilder();

BeanComponentDefinition component = helper.getComponent(writeConcernPropertyEditorBuilder);
parserContext.registerBeanComponent(component);

return getSourceBeanDefinition(dbFactoryBuilder, parserContext, element);
return (AbstractBeanDefinition) helper.getComponentIdButFallback(dbFactoryBuilder, BeanNames.DB_FACTORY)
.getBeanDefinition();
}

/**
Expand All @@ -100,14 +116,13 @@ protected AbstractBeanDefinition parseInternal(Element element, ParserContext pa
* @param parserContext must not be {@literal null}.
* @return
*/
private String registerMongoBeanDefinition(Element element, ParserContext parserContext) {
private BeanDefinition registerMongoBeanDefinition(Element element, ParserContext parserContext) {

BeanDefinitionBuilder mongoBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoFactoryBean.class);
ParsingUtils.setPropertyValue(element, mongoBuilder, "host");
ParsingUtils.setPropertyValue(element, mongoBuilder, "port");
setPropertyValue(mongoBuilder, element, "host");
setPropertyValue(mongoBuilder, element, "port");

return BeanDefinitionReaderUtils.registerWithGeneratedName(mongoBuilder.getBeanDefinition(),
parserContext.getRegistry());
return getSourceBeanDefinition(mongoBuilder, parserContext, element);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
package org.springframework.data.mongodb.config;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigParser;
import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigurationExtension;
import org.springframework.data.repository.config.RepositoryBeanDefinitionParser;
import org.springframework.data.repository.config.RepositoryConfigurationExtension;

/**
* {@link org.springframework.beans.factory.xml.NamespaceHandler} for Mongo DB based repositories.
Expand All @@ -32,7 +34,10 @@ public class MongoNamespaceHandler extends NamespaceHandlerSupport {
*/
public void init() {

registerBeanDefinitionParser("repositories", new MongoRepositoryConfigParser());
RepositoryConfigurationExtension extension = new MongoRepositoryConfigurationExtension();
RepositoryBeanDefinitionParser repositoryBeanDefinitionParser = new RepositoryBeanDefinitionParser(extension);

registerBeanDefinitionParser("repositories", repositoryBeanDefinitionParser);
registerBeanDefinitionParser("mapping-converter", new MappingMongoConverterParser());
registerBeanDefinitionParser("mongo", new MongoParser());
registerBeanDefinitionParser("db-factory", new MongoDbFactoryParser());
Expand Down
Loading