package com.philemonworks.critter.dao.mongo;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.philemonworks.critter.dao.RuleDao;
import com.philemonworks.critter.rule.Rule;
public class RuleDaoMongoImpl implements RuleDao {
@Inject
@Named("rules")
DBCollection collection;
private RuleMapper mapper = new RuleMapper();
private List<Rule> cachedRules;
public synchronized List<Rule> getRules() {
// Lazy fetch
if (cachedRules == null) {
cachedRules = this.fetchAllRules();
}
return cachedRules;
}
private void flush() {
cachedRules = null;
}
private List<Rule> fetchAllRules() {
List<Rule> rules = new ArrayList<Rule>();
DBCursor cursor = collection.find();
cursor.batchSize(100);
while (cursor.hasNext()) {
rules.add(mapper.fromDBObject((BasicDBObject) cursor.next()));
}
cursor.close();
return rules;
}
public void addOrReplaceRule(Rule aRule) {
DBObject query = new BasicDBObject();
query.put("id", aRule.id);
collection.findAndModify(
query,
null, // DBObject fields
null, // DBObject sort
false, //boolean remove
mapper.toDBObject(aRule), // DBObject update
false, // boolean returnNew
true); // boolean upsert
this.flush();
}
public Rule getRule(String id) {
for (Rule each : this.getRules()) {
if (each.id.equals(id))
return each;
}
return null;
}
public void deleteRule(String id) {
DBObject query = new BasicDBObject();
query.put("id", id);
collection.remove(query);
this.flush();
}
}