All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.effektif.mongo.MongoCollection Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta14
Show newest version
/*
 * Copyright 2014 Effektif GmbH.
 *
 * 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 com.effektif.mongo;

import static com.effektif.mongo.MongoDb._ID;

import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;
import org.bson.types.ObjectId;
import org.slf4j.Logger;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


public class MongoCollection {
  
  public static final Logger log = MongoDb.log;

  public DBCollection dbCollection;
  public boolean isPretty;
  public WriteConcern defaultWriteConcern;
  public Map writeConcerns;

  public MongoCollection(DBCollection dbCollection, boolean isPretty) {
    this.dbCollection = dbCollection;
    this.isPretty = isPretty;
  }

  public WriteResult insert(String description, BasicDBObject o) {
    if (log.isDebugEnabled())  {
      log.debug("--"+description+"-> o="+toString(o));
    }
    WriteResult writeResult = dbCollection.insert(o, getWriteConcern(description));
    if (log.isDebugEnabled())  {
      log.debug("<-"+description+"-- "+writeResult);
    }
    return writeResult;
  }
  
  public WriteResult save(String description, BasicDBObject dbObject) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" "+toString(dbObject));
    }
    WriteResult writeResult = dbCollection.save(dbObject, getWriteConcern(description));
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+writeResult);
    }
    return writeResult;
  }

  public void updateById(String description, ObjectId id, DBObject dbObject) {
    update(description, new BasicDBObject(_ID, id), dbObject, false, false);
  }

  public WriteResult update(String description, DBObject query, DBObject update) {
    return update(description, query, update, false, false);
  }

  public WriteResult update(String description, DBObject query, DBObject update, boolean upsert, boolean multi) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query)+" u="+toString(update));
    }
    WriteResult writeResult = dbCollection.update(query, update, upsert, multi, getWriteConcern(description));
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+writeResult);
    }
    return writeResult;
  }

  public BasicDBObject findAndModify(String description, DBObject query, DBObject update) {
    return findAndModify(description, query, update, null);
  }

  public BasicDBObject findAndModify(String description, DBObject query, DBObject update, DBObject fields) {
    return findAndModify(description, query, update, fields, null, false, true, false);
  }

  public BasicDBObject findAndModify(String description, DBObject query, DBObject update, DBObject fields, DBObject sort, boolean remove, boolean returnNew, boolean upsert) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query)+" u="+toString(update)+" f="+toString(fields));
    }
    BasicDBObject dbObject = (BasicDBObject) dbCollection.findAndModify(query, fields, sort, remove, update, returnNew, upsert);
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+(dbObject!=null ? toString(dbObject) : "null"));
    }
    return dbObject;
  }

  public BasicDBObject findOne(String description, DBObject query) {
    return findOne(description, query, null);
  }

  public BasicDBObject findOne(String description, DBObject query, DBObject fields) {
    return findOne(description, query, fields, null);
  }

  public BasicDBObject findOne(String description, DBObject query, DBObject fields, DBObject orderBy) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query)+(orderBy!=null ? ", orderBy="+orderBy : ""));
    }
    BasicDBObject dbObject = (BasicDBObject) dbCollection.findOne(query, fields, orderBy);
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+toString(dbObject));
    }
    return dbObject;
  }

  public DBCursor find(String description, DBObject query) {
    return find(description, query, null);
  }

  public DBCursor find(String description, DBObject query, DBObject fields) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query)+(fields!=null ? " f="+toString(fields) :""));
    }
    return new LoggingCursor(this, dbCollection.find(query, fields));
  }
  
  public WriteResult remove(String description, DBObject query) {
    return remove(description, query, true);
  }

  public WriteResult remove(String description, DBObject query, boolean checkForEmptyQuery) {
    if (log.isDebugEnabled()) { 
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query));
    }
    if (checkForEmptyQuery && (query==null || ((BasicDBObject)query).isEmpty())) {
      throw new RuntimeException("I assume this is a bug. Protection against deleting the whole collection");
    }
    WriteResult writeResult = dbCollection.remove(query);
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+writeResult);
    }
    return writeResult;
  }

  public long count(String description, DBObject query) {
    if (log.isDebugEnabled()) { 
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(query));
    }
    Long count = dbCollection.count(query);
    if (log.isDebugEnabled()) {
      log.debug("<-"+dbCollection.getName()+"-- "+count);
    }
    return count;
  }
  
  public Iterator aggregate(String description, DBObject... pipeline) {
    return aggregate(description, Arrays.asList(pipeline));
  }
  
  public Iterator aggregate(String description, List pipeline) {
    if (log.isDebugEnabled()) {
      log.debug("--"+dbCollection.getName()+"-> "+description+" q="+toString(pipeline));
    }
    AggregationOutput aggregationOutput = dbCollection.aggregate(pipeline);
    return new LoggingIterator(this, aggregationOutput.results().iterator());
  }

  public String toString(Object o) {
    if (o==null) {
      return "null";
    }
    // removing sensitive info from logging
    if (Map.class.isAssignableFrom(o.getClass())) {
      Map oMap = (Map) o;
      if (containsSensitiveField(oMap)) {
        Map logCopy = new LinkedHashMap<>(oMap);
        for (String sensitiveField: SENSITIVE_FIELDS) {
          if (oMap.get(sensitiveField)!=null) {
            logCopy.put(sensitiveField, "***");
          }
        }
        o = logCopy;
      }
    }
    return isPretty ? PrettyPrinter.toJsonPrettyPrint(o) : o.toString();
  }

  private static final List SENSITIVE_FIELDS = Arrays.asList(new String[]{
    "password","token","accessToken","refreshToken"   
  }); 
  private boolean containsSensitiveField(Map oMap) {
    for (String sensitiveField: SENSITIVE_FIELDS) {
      if (oMap.get(sensitiveField)!=null) {
        return true;
      }
    }
    return false;
  }

  public WriteConcern getWriteConcern(WriteConcern writeConcern) {
    return writeConcern!=null ? writeConcern : dbCollection.getWriteConcern();
  }

  public DBCollection getDbCollection() {
    return dbCollection;
  }
  
  public boolean isPretty() {
    return isPretty;
  }
  
  public WriteConcern getWriteConcern(String description) {
    if (writeConcerns==null) {
      return dbCollection.getWriteConcern();
    }
    WriteConcern writeConcern = writeConcerns.get(description);
    return writeConcern!=null ? writeConcern : dbCollection.getWriteConcern();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy