diff --git a/src/main/java/org/springframework/datastore/document/couchdb/CouchDbDocumentSource.java b/src/main/java/org/springframework/datastore/document/couchdb/CouchDocumentSource.java similarity index 68% rename from src/main/java/org/springframework/datastore/document/couchdb/CouchDbDocumentSource.java rename to src/main/java/org/springframework/datastore/document/couchdb/CouchDocumentSource.java index 89adfd2f8..1f4cd070b 100644 --- a/src/main/java/org/springframework/datastore/document/couchdb/CouchDbDocumentSource.java +++ b/src/main/java/org/springframework/datastore/document/couchdb/CouchDocumentSource.java @@ -3,6 +3,6 @@ package org.springframework.datastore.document.couchdb; import org.jcouchdb.document.BaseDocument; import org.springframework.datastore.document.DocumentSource; -public interface CouchDbDocumentSource extends DocumentSource { +public interface CouchDocumentSource extends DocumentSource { } diff --git a/src/main/java/org/springframework/datastore/document/couchdb/CouchDbTemplate.java b/src/main/java/org/springframework/datastore/document/couchdb/CouchTemplate.java similarity index 87% rename from src/main/java/org/springframework/datastore/document/couchdb/CouchDbTemplate.java rename to src/main/java/org/springframework/datastore/document/couchdb/CouchTemplate.java index b80948c5a..2d03c7544 100644 --- a/src/main/java/org/springframework/datastore/document/couchdb/CouchDbTemplate.java +++ b/src/main/java/org/springframework/datastore/document/couchdb/CouchTemplate.java @@ -23,20 +23,20 @@ import org.springframework.datastore.document.AbstractDocumentStoreTemplate; import org.springframework.datastore.document.DocumentSource; import org.springframework.datastore.document.DocumentStoreConnectionFactory; - public class CouchDbTemplate extends AbstractDocumentStoreTemplate { + public class CouchTemplate extends AbstractDocumentStoreTemplate { private DocumentStoreConnectionFactory connectionFactory; - public CouchDbTemplate() { + public CouchTemplate() { super(); } - public CouchDbTemplate(String host, String databaseName) { + public CouchTemplate(String host, String databaseName) { super(); connectionFactory = new CouchDbConnectionFactory(host, databaseName); } - public CouchDbTemplate(CouchDbConnectionFactory mcf) { + public CouchTemplate(CouchDbConnectionFactory mcf) { super(); connectionFactory = mcf; } diff --git a/src/main/java/org/springframework/datastore/document/mongodb/MongoBeanPropertyDocumentMapper.java b/src/main/java/org/springframework/datastore/document/mongodb/MongoBeanPropertyDocumentMapper.java index 31756cca9..6fd382ad9 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/MongoBeanPropertyDocumentMapper.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/MongoBeanPropertyDocumentMapper.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.bson.types.ObjectId; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.NotWritablePropertyException; @@ -75,7 +76,12 @@ public class MongoBeanPropertyDocumentMapper implements DocumentMapper { + + /** Logger available to subclasses */ + protected final Log logger = LogFactory.getLog(getClass()); + + /** The class we are mapping to */ + private Object source; + + /** The class we are mapping to */ + private Class mappedClass; + + /** Map of the fields we provide mapping for */ + private Map mappedFields; + + /** Set of bean properties we provide mapping for */ + private Set mappedProperties; + + + public MongoBeanPropertyDocumentSource(Object source) { + initialize(source); + } + + + public DBObject getDocument() { + BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this.source); + DBObject dbo = new BasicDBObject(); + for (String key : this.mappedFields.keySet()) { + String keyToUse = ("id".equals(key) ? "_id" : key); + PropertyDescriptor pd = this.mappedFields.get(key); + if (pd != null) { + try { + Object value = bw.getPropertyValue(key); + if (value instanceof Enum) { + dbo.put(keyToUse, ((Enum)value).name()); + } + else { + dbo.put(keyToUse, value); + } + } + catch (NotReadablePropertyException ex) { + throw new DataRetrievalFailureException( + "Unable to map property " + pd.getName() + " to key " + key, ex); + } + } + } + return dbo; + } + + + /** + * Initialize the mapping metadata for the given class. + * @param mappedClass the mapped class. + */ + protected void initialize(Object source) { + this.source = source; + this.mappedClass = source.getClass(); + this.mappedFields = new HashMap(); + this.mappedProperties = new HashSet(); + PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass); + for (PropertyDescriptor pd : pds) { + if (pd.getWriteMethod() != null) { + this.mappedFields.put(pd.getName(), pd); + this.mappedProperties.add(pd.getName()); + } + } + } + + /** + * Initialize the given BeanWrapper to be used for row mapping. + * To be called for each row. + *

The default implementation is empty. Can be overridden in subclasses. + * @param bw the BeanWrapper to initialize + */ + protected void initBeanWrapper(BeanWrapper bw) { + } + +} diff --git a/src/main/java/org/springframework/datastore/document/mongodb/MongoConnectionFactory.java b/src/main/java/org/springframework/datastore/document/mongodb/MongoDbConnectionFactory.java similarity index 91% rename from src/main/java/org/springframework/datastore/document/mongodb/MongoConnectionFactory.java rename to src/main/java/org/springframework/datastore/document/mongodb/MongoDbConnectionFactory.java index 96a0fdc37..8c7650603 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/MongoConnectionFactory.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/MongoDbConnectionFactory.java @@ -48,7 +48,7 @@ import com.mongodb.Mongo; * @author Thomas Risberg * @since 1.0 */ -public class MongoConnectionFactory implements DocumentStoreConnectionFactory, InitializingBean { +public class MongoDbConnectionFactory implements DocumentStoreConnectionFactory, InitializingBean { /** * Logger, available to subclasses. @@ -58,16 +58,16 @@ public class MongoConnectionFactory implements DocumentStoreConnectionFactory, InitializingBean { */ protected final Log logger = LogFactory.getLog(getClass()); - private MongoConnectionFactory mcf = new MongoConnectionFactory(); + private MongoDbConnectionFactory mcf = new MongoDbConnectionFactory(); public void setMongo(Mongo mongo) { this.mcf.setMongo(mongo); diff --git a/src/main/java/org/springframework/datastore/document/mongodb/MongoDbDocumentSource.java b/src/main/java/org/springframework/datastore/document/mongodb/MongoDocumentSource.java similarity index 67% rename from src/main/java/org/springframework/datastore/document/mongodb/MongoDbDocumentSource.java rename to src/main/java/org/springframework/datastore/document/mongodb/MongoDocumentSource.java index 8aac07f3d..71d759b7c 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/MongoDbDocumentSource.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/MongoDocumentSource.java @@ -4,6 +4,6 @@ import org.springframework.datastore.document.DocumentSource; import com.mongodb.DBObject; -public interface MongoDbDocumentSource extends DocumentSource { +public interface MongoDocumentSource extends DocumentSource { } diff --git a/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java b/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java index 4c83d1940..2a89b993e 100644 --- a/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java +++ b/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java @@ -45,10 +45,10 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { public MongoTemplate(Mongo mongo, String databaseName) { super(); - connectionFactory = new MongoConnectionFactory(mongo, databaseName); + connectionFactory = new MongoDbConnectionFactory(mongo, databaseName); } - public MongoTemplate(MongoConnectionFactory mcf) { + public MongoTemplate(MongoDbConnectionFactory mcf) { super(); connectionFactory = mcf; } @@ -82,6 +82,11 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { .drop(); } + public void saveObject(String collectionName, Object source) { + MongoBeanPropertyDocumentSource docSrc = new MongoBeanPropertyDocumentSource(source); + save(collectionName, docSrc); + } + public void save(String collectionName, DocumentSource documentSource) { DBObject dbDoc = documentSource.getDocument(); WriteResult wr = null; @@ -95,6 +100,11 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { } } + public List queryForCollection(String collectionName, Class targetClass) { + DocumentMapper mapper = MongoBeanPropertyDocumentMapper.newInstance(targetClass); + return queryForCollection(collectionName, mapper); + } + public List queryForCollection(String collectionName, DocumentMapper mapper) { List results = new ArrayList(); DBCollection collection = getDocumentStoreConnectionFactory()