package com.sissi.config.impl;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;
import com.sissi.config.MongoCollection;
import com.sissi.config.MongoConfig;
/**
*
* @author kim 2013-11-15
*/
public class MongoProxyConfig implements MongoConfig {
/**
* 重置数据集合(All)
*/
private final static DBObject queryClear = BasicDBObjectBuilder.start().get();
private final static Log log = LogFactory.getLog(MongoProxyConfig.class);
private final Map<String, Object> configs = new HashMap<String, Object>();
private final MongoWrapCollection wrap;
private final DBCollection collection;
public MongoProxyConfig(Mongo client, String db, String collection) {
super();
this.wrap = new MongoWrapCollection();
this.collection = client.getDB(db).getCollection(collection);
this.configs.put(MongoConfig.D_NAME, this.collection.getDB());
this.configs.put(MongoConfig.C_NAME, this.collection);
}
@Override
public Object get(String key) {
return this.configs.get(key);
}
/*
* remove({})
*
* @see com.sissi.config.MongoConfig#reset()
*/
public MongoProxyConfig reset() {
this.collection().remove(queryClear);
return this;
}
public MongoWrapCollection collection() {
return this.wrap;
}
private class MongoWrapCollection implements MongoCollection {
private void log(String op, DBObject... entity) {
log.debug(op + ": " + entity != null ? (" / " + Arrays.toString(entity)) : "");
}
public WriteResult remove(DBObject query) {
return this.remove(query, WriteConcern.MAJORITY);
}
public WriteResult remove(DBObject query, WriteConcern concern) {
this.log("remove", query);
return MongoProxyConfig.this.collection.remove(query, concern);
}
@Override
public WriteResult save(DBObject entity) {
return this.save(entity, WriteConcern.MAJORITY);
}
public WriteResult save(DBObject entity, WriteConcern concern) {
this.log("save", entity);
return MongoProxyConfig.this.collection.save(entity, concern);
}
@Override
public WriteResult update(DBObject query, DBObject entity) {
return this.update(query, entity, false, false, WriteConcern.MAJORITY);
}
@Override
public WriteResult update(DBObject query, DBObject entity, boolean upsert, boolean batch) {
return this.update(query, entity, upsert, batch, WriteConcern.MAJORITY);
}
public WriteResult update(DBObject query, DBObject entity, boolean upsert, boolean batch, WriteConcern concern) {
this.log("update", query, entity);
return MongoProxyConfig.this.collection.update(query, entity, upsert, batch, concern);
}
@Override
public DBCursor find(DBObject query) {
this.log("find", query);
return MongoProxyConfig.this.collection.find(query);
}
@Override
public DBCursor find(DBObject query, DBObject filter) {
this.log("find", query);
return MongoProxyConfig.this.collection.find(query, filter);
}
@Override
public DBObject findOne(DBObject query) {
this.log("findOne", query);
return MongoProxyConfig.this.collection.findOne(query);
}
@Override
public DBObject findOne(DBObject query, DBObject filter) {
this.log("findOne", query);
return MongoProxyConfig.this.collection.findOne(query, filter);
}
public DBObject findAndModify(DBObject query, DBObject entity) {
this.log("findAndModify", query, entity);
return MongoProxyConfig.this.collection.findAndModify(query, entity);
}
public AggregationOutput aggregate(final DBObject... ops) {
this.log("aggregate", ops);
return MongoProxyConfig.this.collection.aggregate(Arrays.asList(ops));
}
}
}