diff --git a/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/CollectionOptions.java b/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/CollectionOptions.java new file mode 100644 index 000000000..a75115df3 --- /dev/null +++ b/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/CollectionOptions.java @@ -0,0 +1,45 @@ +package org.springframework.datastore.document.mongodb; + +public class CollectionOptions { + + private Integer maxDocuments; + + private Integer size; + + private Boolean capped; + + + + public CollectionOptions(Integer size, Integer maxDocuments, Boolean capped) { + super(); + this.maxDocuments = maxDocuments; + this.size = size; + this.capped = capped; + } + + public Integer getMaxDocuments() { + return maxDocuments; + } + + public void setMaxDocuments(Integer maxDocuments) { + this.maxDocuments = maxDocuments; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Boolean getCapped() { + return capped; + } + + public void setCapped(Boolean capped) { + this.capped = capped; + } + + +} diff --git a/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java b/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java index c78a32a22..e65c982f7 100644 --- a/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java +++ b/spring-datastore-mongodb/src/main/java/org/springframework/datastore/document/mongodb/MongoTemplate.java @@ -20,6 +20,7 @@ package org.springframework.datastore.document.mongodb; import java.util.ArrayList; import java.util.List; +import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.DataRetrievalFailureException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.datastore.document.AbstractDocumentStoreTemplate; @@ -27,6 +28,7 @@ import org.springframework.datastore.document.DocumentMapper; import org.springframework.datastore.document.DocumentSource; import org.springframework.datastore.document.mongodb.query.Query; +import com.mongodb.BasicDBObject; import com.mongodb.CommandResult; import com.mongodb.DB; import com.mongodb.DBCollection; @@ -35,10 +37,15 @@ import com.mongodb.MongoException; import com.mongodb.WriteResult; import com.mongodb.util.JSON; -public class MongoTemplate extends AbstractDocumentStoreTemplate { +public class MongoTemplate extends AbstractDocumentStoreTemplate implements InitializingBean { private DB db; + private String defaultCollectionName; + + //TODO expose configuration... + private CollectionOptions defaultCollectionOptions; + // public MongoTemplate() { // super(); // } @@ -47,6 +54,20 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { super(); this.db = db; } + + + + public String getDefaultCollectionName() { + return defaultCollectionName; + } + + //TODO would one ever consider passing in a DBCollection object? + + public void setDefaultCollectionName(String defaultCollection) { + this.defaultCollectionName = defaultCollection; + } + + public void execute(String command) { execute((DBObject)JSON.parse(command)); @@ -65,9 +86,25 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { } } - public void createCollection(String collectionName, DocumentSource documentSource) { + public DBCollection createCollection(String collectionName) { + try { + return getConnection().createCollection(collectionName, null); + } catch (MongoException e) { + throw new InvalidDataAccessApiUsageException("Error creating collection " + collectionName + ": " + e.getMessage(), e); + } + } + + public void createCollection(String collectionName, CollectionOptions collectionOptions) { + try { + getConnection().createCollection(collectionName, convertToDbObject(collectionOptions)); + } catch (MongoException e) { + throw new InvalidDataAccessApiUsageException("Error creating collection " + collectionName + ": " + e.getMessage(), e); + } + } + + public boolean collectionExists(String collectionName) { try { - getConnection().createCollection(collectionName, documentSource.getDocument()); + return getConnection().collectionExists(collectionName); } catch (MongoException e) { throw new InvalidDataAccessApiUsageException("Error creating collection " + collectionName + ": " + e.getMessage(), e); } @@ -77,6 +114,20 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { getConnection().getCollection(collectionName) .drop(); } + + public void saveObject(Object object) { + saveObject(getRequiredDefaultCollectionName(), object); + } + + private String getRequiredDefaultCollectionName() { + String name = getDefaultCollectionName(); + if (name == null) { + throw new IllegalStateException( + "No 'defaultCollection' or 'defaultCollectionName' specified. Check configuration of MongoTemplate."); + } + return name; + } + public void saveObject(String collectionName, Object source) { MongoBeanPropertyDocumentSource docSrc = new MongoBeanPropertyDocumentSource(source); @@ -87,7 +138,7 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { DBObject dbDoc = documentSource.getDocument(); WriteResult wr = null; try { - wr = getConnection().getCollection(collectionName).save(dbDoc); + wr = getConnection().getCollection(collectionName).save(dbDoc); } catch (MongoException e) { throw new DataRetrievalFailureException(wr.getLastError().getErrorMessage(), e); } @@ -148,4 +199,31 @@ public class MongoTemplate extends AbstractDocumentStoreTemplate { return db; } + + protected DBObject convertToDbObject(CollectionOptions collectionOptions) { + DBObject dbo = new BasicDBObject(); + if (collectionOptions != null) { + if (collectionOptions.getCapped() != null) { + dbo.put("capped", collectionOptions.getCapped().booleanValue()); + } + if (collectionOptions.getSize() != null) { + dbo.put("size", collectionOptions.getSize().intValue()); + } + if (collectionOptions.getMaxDocuments() != null ) { + dbo.put("max", collectionOptions.getMaxDocuments().intValue()); + } + } + return dbo; + } + + + + public void afterPropertiesSet() throws Exception { + if (this.getDefaultCollectionName() != null) { + if (! db.collectionExists(getDefaultCollectionName())) { + db.createCollection(getDefaultCollectionName(), null); + } + } + + } }