/*
* Copyright IBM Corp. 2014
*
* 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 net.bluemix.todo.store;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.bluemix.todo.model.ToDo;
import org.bson.types.ObjectId;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/**
* An implementation of {@link ToDoStore} backed by Mongo DB.
*/
public class MongoStore implements ToDoStore {
private DBCollection coll;
/**
* Creates a ToDo store backed by Mongo DB.
* @param coll The collection from the Mongo DB to use.
*/
public MongoStore(DBCollection coll) {
this.coll = coll;
}
@Override
public Collection<ToDo> getAll() {
List<ToDo> todos = new ArrayList<ToDo>();
DBCursor cursor = coll.find();
while(cursor.hasNext()) {
todos.add(createToDo(cursor.next()));
}
cursor.close();
return todos;
}
@Override
public ToDo get(String id) {
BasicDBObject query = new BasicDBObject("_id", id);
DBCursor cursor = coll.find(query);
if(cursor.hasNext()) {
ToDo td = createToDo(cursor.next());
cursor.close();
return td;
} else {
return null;
}
}
@Override
public ToDo persist(ToDo td) {
DBObject dbObj = convertToDbObject(td);
coll.insert(dbObj);
return createToDo(dbObj);
}
@Override
public ToDo update(String id, ToDo td) {
DBObject query = new BasicDBObject("_id", new ObjectId(id));
DBObject update = convertToDbObject(td);
coll.update(query, update);
DBCursor cursor = coll.find(query);
ToDo newTd = createToDo(cursor.next());
cursor.close();
return newTd;
}
@Override
public void delete(String id) {
DBObject query = new BasicDBObject("_id", new ObjectId(id));
coll.remove(query);
}
private ToDo createToDo(DBObject dbObj) {
ToDo td = new ToDo();
td.setTitle((String)dbObj.get("title"));
td.setCompleted((Boolean)dbObj.get("completed"));
td.setId(((ObjectId)dbObj.get("_id")).toString());
td.setOrder((Integer)dbObj.get("order"));
return td;
}
private DBObject convertToDbObject(ToDo td) {
DBObject dbObj = new BasicDBObject("title", td.getTitle()).
append("completed", td.isCompleted()).append("order", td.getOrder());
if(td.getId() != null) {
dbObj.put("_id", new ObjectId(td.getId()));
}
return dbObj;
}
@Override
public int count() throws ToDoStoreException {
return getAll().size();
}
}