mx.edu.cide.justiciacotidiana.v1.mongo.MongoInterface.java Source code

Java tutorial

Introduction

Here is the source code for mx.edu.cide.justiciacotidiana.v1.mongo.MongoInterface.java

Source

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2015 INFOTEC
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * For more information visit https://github.com/haxdai/justiciacotidiana-api.
*/
package mx.edu.cide.justiciacotidiana.v1.mongo;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoException;
import java.net.UnknownHostException;
import java.util.Date;
import mx.edu.cide.justiciacotidiana.v1.utils.Utils;
import org.bson.types.ObjectId;

/**
 *
 * @author Hasdai Pacheco
 * 
 * Clase utilitaria para realizar operaciones en MongoDB.
 * Basada en la clase utilitaria de https://github.com/mxabierto/avisos
 */
public class MongoInterface {
    /**Cadena de conexin a MongoDB*/
    public static final String MONGOURL = "mongodb://localhost:27017/cide";
    /**Campo para registrar la fecha de creacin de los elementos*/
    public static final String FIELD_CREATED = "created";
    /**Campo para registrar la fecha de actualizacin de los elementos*/
    public static final String FIELD_UPDATED = "updated";
    /**Campo para registrar el ID de los elementos (el id de mongo)*/
    public static final String FIELD_ID = "_id";
    /**Instancia de la clase*/
    private static MongoInterface instance = null;
    /**URI para la conexin mediante el cliente*/
    private final MongoClientURI clientURI;
    /**Referencia a la base de datos de MongoDB*/
    private final DB mongoDB;
    /**Cliente para conexin a MongoDB*/
    private final MongoClient client;

    /**
     * Obtiene una instancia de MongoInterface.
     * @return Instancia de MongoInterface.
     */
    public static synchronized MongoInterface getInstance() {
        if (null == instance) {
            try {
                instance = new MongoInterface();
            } catch (UnknownHostException ex) {
                System.out.println("Can't connect to MongoDB " + ex.getLocalizedMessage());
            }
        }
        return instance;
    }

    /**
     * Crea una instancia de MongoInterface.
     * @throws UnknownHostException 
     */
    private MongoInterface() throws UnknownHostException {
        if (null != System.getenv("MONGO_URL")) {
            clientURI = new MongoClientURI(System.getenv("MONGO_URL"));
        } else {
            clientURI = new MongoClientURI(MONGOURL);
        }
        client = new MongoClient(clientURI);
        mongoDB = client.getDB(clientURI.getDatabase());
        if (null != clientURI.getUsername()) {
            mongoDB.authenticate(clientURI.getUsername(), clientURI.getPassword());
        }
    }

    /**
     * Agrega un elemento a una coleccin.
     * @param collectionName Nombre de la coleccin donde se agregar el elemento.
     * @param item Elemento a insertar.
     * @return ID del elemento insertado. null en otro caso.
     */
    public String addItem(String collectionName, BasicDBObject item) {
        DBCollection tCol = mongoDB.getCollection(collectionName);
        item.put(FIELD_CREATED, new Date());

        //Eliminar id y updated, si es que viene en el documento.
        item.remove(FIELD_ID);
        item.remove(FIELD_UPDATED);
        try {
            tCol.insert(item);
        } catch (MongoException ex) {
            return null;
        }
        return item.getString(FIELD_ID);
    }

    /**
     * @param collectionName Nombre de la coleccin donde se actualizar el elemento.
     * @param query Objeto de consulta para recuperar el elemento a actualizar.
     * @param newData Objeto con los nuevos datos.
     * @return true si la insercin fue exitosa. false en otro caso.
     */
    public boolean updateItem(String collectionName, BasicDBObject query, BasicDBObject newData) {
        DBCollection tCol = mongoDB.getCollection(collectionName);
        newData.put(FIELD_CREATED, query.get(FIELD_CREATED));
        newData.put(FIELD_UPDATED, new Date());

        //Eliminar id, si es que viene en el documento.
        newData.remove(FIELD_ID);

        try {
            tCol.update(query, newData);
        } catch (MongoException ex) {
            return false;
        }
        return true;
    }

    /**
     * 
     * @param collectionName Nombre de la coleccin donde se actualizar el elemento.
     * @param id ID del elemento a actualizar.
     * @param newData Objeto con los nuevos datos.
     * @return true si la actualizacin fue exitosa. false en otro caso.
     */
    public boolean updateItem(String collectionName, String id, BasicDBObject newData) {
        DBObject query = findById(collectionName, id);
        return updateItem(collectionName, (BasicDBObject) query, newData);
    }

    /**
     * Elimina un elemento de la coleccin, dado su ID.
     * @param collectionName Nombre de la coleccin donde se eliminar el elemento.
     * @param id ID del elemento a eliminar.
     * @return true si la eliminacin fue exitosa. false en otro caso.
     */
    public boolean deleteItem(String collectionName, String id) {
        BasicDBObject query = new BasicDBObject(FIELD_ID, new ObjectId(id));
        return deleteItem(collectionName, query);
    }

    /**
     * Elimina un elemento de la coleccin.
     * @param collectionName Nombre de la coleccin donde se eliminar el elemento.
     * @param item Elemento a eliminar.
     * @return true si la eliminacin fue exitosa. false en otro caso.
     */
    public boolean deleteItem(String collectionName, BasicDBObject item) {
        DBCollection tCol = mongoDB.getCollection(collectionName);

        try {
            tCol.remove(item);
        } catch (MongoException ex) {
            return false;
        }
        return true;
    }

    /**
     * Realiza una bsqueda de elementos.
     * @param collectionName Nombre de la coleccin en la que se realizar la bsqueda.
     * @param query Objeto con la referencia a buscar.
     * @return DBCursor con los elementos encontrados. null si ocurri un error.
     */
    public DBCursor findItems(String collectionName, BasicDBObject query) {
        DBCollection tCol = mongoDB.getCollection(collectionName);
        DBCursor cursor = null;

        if (null != query) {
            cursor = tCol.find(query);
        } else {
            cursor = tCol.find();
        }

        return cursor;
    }

    /**
     * Recupera un elemento de una coleccin por su ID.
     * @param collectionName Nombre de la coleccin donde existe el elemento.
     * @param id ID del elemento a recuperar.
     * @return BasicDBObject con los datos del elemento encontrado, si existe.
     */
    public BasicDBObject findById(String collectionName, String id) {
        BasicDBObject query = new BasicDBObject(FIELD_ID, new ObjectId(id));
        return (BasicDBObject) findOne(collectionName, query);
    }

    /**
     * Recupera un elemento de la coleccin mediante una referencia.
     * @param collectionName Nombre de la coleccin donde existe el elemento.
     * @param query Objeto para referencia de bsqueda.
     * @return BasicDBObject con los datos del elemento encontrado, si existe.
     */
    public DBObject findOne(String collectionName, BasicDBObject query) {
        DBCollection tCol = mongoDB.getCollection(collectionName);
        DBObject ret = tCol.findOne(query);
        return ret;
    }

    /**
     * Obtiene la lista de los elementos de una coleccin en formato JSON. Si se proporciona una referencia, se hace un filtrado.
     * @param collectionName Nombre de la coleccin de donde se extraern los elementos.
     * @param query Objeto de referencia para la bsqueda.
     * @return Cadena JSON con el resultado.
     */
    public String listItemsAsJSON(String collectionName, BasicDBObject query) {
        DBCursor cursor = findItems(collectionName, query);
        cursor.sort(new BasicDBObject(FIELD_CREATED, -1));
        StringBuilder ret = new StringBuilder();
        long count = 0;

        if (null != cursor && cursor.hasNext()) {
            count = cursor.size();
        }
        ret.append("{\"count\":").append(count);
        if (cursor.hasNext()) {
            ret.append(", \"items\": [");
            try {
                while (cursor.hasNext()) {
                    BasicDBObject t = (BasicDBObject) cursor.next();
                    ret.append(Utils.JSON.toJSON(t));
                    if (cursor.hasNext())
                        ret.append(",");
                }
            } finally {
                cursor.close();
            }
            ret.append("]");
        }
        ret.append("}");
        return ret.toString();
    }

    /**
     * Contiene los nombres de las colecciones usadas en MongoDB.
     */
    public class COLLECTIONS {
        public static final String TESTIMONIOS = "Testimonios";
        public static final String ENCUESTAS = "Encuestas";
        public static final String COMENTARIOS = "Comentarios";
        public static final String PROPUESTAS = "Propuestas";
        public static final String VOTOS = "Votos";
    }
}