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

ninja.morphia.NinjaMorphia Maven / Gradle / Ivy

Go to download

This is an easly plugable module for the Ninja web framework to work with morphia and mongodb by providing a convinent service, providing you with all dependencies and some testing utilites.

The newest version!
package ninja.morphia;

import java.net.UnknownHostException;
import java.util.List;

import ninja.utils.NinjaProperties;

import org.bson.types.ObjectId;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.slf4j.Logger;

import com.google.common.base.Preconditions;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.mongodb.MongoClient;

/**
 * Convinent service class for interacting with mongodb over morphia
 * @author skubiak
 *
 */
@Singleton
public class NinjaMorphia {
    private Datastore datastore;
    private static final String MONGODB_HOST = "ninjamorphia.mongodb.host";
    private static final String MONGODB_PORT = "ninjamorphia.mongodb.port";
    private static final String MONGODB_NAME = "ninjamorphia.mongodb.name";
    private static final String MORPHIA_PACKAGE_NAME = "ninjamorphia.models.package";
    private static final String MONGODB_DEFAULT_HOST = "127.0.0.1";
    private static final String MORPHIA_DEFAULT_PACKAGE_NAME = "models";
    private static final String MONGODB_DEFAULT_NAME = "ninjamorphia";
    private static final int MONGODB_DEFAULT_PORT = 27017;
    private final NinjaProperties ninjaProperties;
    private final Logger logger;
    
    @Inject
    private NinjaMorphia(Logger logger, NinjaProperties ninjaProperties) {
        this.ninjaProperties = ninjaProperties;
        this.logger = logger;
        
        MongoClient mongoClient = null;
        try {
            final String mongoDbHost = this.ninjaProperties.getWithDefault(MONGODB_HOST, MONGODB_DEFAULT_HOST);
            final int mongoDbPort = this.ninjaProperties.getIntegerWithDefault(MONGODB_PORT, MONGODB_DEFAULT_PORT);
            
            mongoClient = new MongoClient(mongoDbHost, mongoDbPort);
        } catch (UnknownHostException e) {
            this.logger.error("Failed to connect to MongoDB", e);
        }
        
        if (mongoClient != null) {
            final String mongoDbName = this.ninjaProperties.getWithDefault(MONGODB_NAME, MONGODB_DEFAULT_NAME);
            final String morphiaPackage = this.ninjaProperties.getWithDefault(MORPHIA_PACKAGE_NAME, MORPHIA_DEFAULT_PACKAGE_NAME);
            
            this.datastore = new Morphia().mapPackage(morphiaPackage).createDatastore(mongoClient, mongoDbName);
            this.logger.info("Created morphia datastore for MongoDB: " + mongoDbName);
        } else {
            this.logger.error("Failed to created morphia datastore. No mongoclient available.");
        }
    }
    
    /**
     * Returns the created morphia datastore
     * 
     * @return Morphia Datastore object
     */
    public Datastore getDatastore() {
        return this.datastore;
    }
    
    /**
     * Convinent mehod for overwriting the morphia
     * object with a given MongoClient
     * 
     * @param A created MongoClient object
     */
    public void setMongoClient(MongoClient mongoClient) {
        Preconditions.checkNotNull(mongoClient);
        
        final String mongoDbName = this.ninjaProperties.getWithDefault(MONGODB_NAME, MONGODB_DEFAULT_NAME);
        final String morphiaPackage = this.ninjaProperties.getWithDefault(MORPHIA_PACKAGE_NAME, MORPHIA_DEFAULT_PACKAGE_NAME);
        
        this.datastore = new Morphia().mapPackage(morphiaPackage).createDatastore(mongoClient, mongoDbName);
    }
    
    /**
     * Retrieves a mapped morphia object from mongodb. If the id is not of 
     * type ObjectId, it will we converted to ObjectId
     * 
     * @param id The id of the object
     * @param clazz The mapped morphia class
     * 
     * @return The reqeusted class from mongodb or null if none found
     */
    public  T findById(Object id, Class clazz) {
        Preconditions.checkNotNull(clazz);
        Preconditions.checkNotNull(id);

        String objectId = null;
        if (!(id instanceof ObjectId)) {
            objectId = String.valueOf(id);
        }
        
        return this.datastore.get(clazz, new ObjectId(objectId));  
    }
    
    /**
     * Retrieves all mapped morphia objects from mongodb
     * 
     * @param clazz The mapped morphia class
     * @return A list of mapped morphia objects or an empty list of none found
     */
    public  List findAll(Class clazz) {
        Preconditions.checkNotNull(clazz);
        
        return this.datastore.find(clazz).asList();
    }
    
    /**
     * Counts all objected of a mapped morphia class
     * 
     * @param clazz The mapped morphia class
     * @return The number of objects in mongodb
     */
    public  long countAll(Class clazz) {
        Preconditions.checkNotNull(clazz);
        
        return this.datastore.find(clazz).countAll();
    }
    
    /**
     * Saves a mapped morphia object to mongodb
     * 
     * @param object The object to save
     */
    public void save(Object object) {
        Preconditions.checkNotNull(object);
        
        this.datastore.save(object);
    }
    
    /**
     * Deletes a mapped morphia object in mongodb
     * 
     * @param object The object to delete
     */
    public void delete(Object object) {
        Preconditions.checkNotNull(object);
        
        this.datastore.delete(object);
    }
    
    /**
     * Deletes all mapped morphia objects of a given class
     * 
     * @param clazz The mapped morphia class
     */
    public  void deleteAll(Class clazz) {
        this.datastore.delete(this.datastore.createQuery(clazz));
    }
    
    /**
     * Drops all data in mognodb on the configured database in 
     * ninja framework application.conf
     */
    public void dropDatabase() {
        this.datastore.getDB().dropDatabase();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy