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

com.github.jknack.mwa.morphia.MorphiaModule Maven / Gradle / Ivy

package com.github.jknack.mwa.morphia;

import static com.github.jknack.mwa.ApplicationConstants.APP_NAMESPACE;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.apache.commons.lang3.Validate.notNull;

import java.util.Set;

import javax.validation.ValidatorFactory;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;

import com.github.jknack.mwa.mongo.MongoModule;
import com.github.jmkgreen.morphia.AbstractEntityInterceptor;
import com.github.jmkgreen.morphia.Datastore;
import com.github.jmkgreen.morphia.Morphia;
import com.github.jmkgreen.morphia.mapping.Mapper;
import com.github.jmkgreen.morphia.mapping.validation.ConstraintViolationException;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoURI;

/**
 * 

* Add support for {@link Morphia} on a Mongo database. Clients must provide a * instance of {@link MorphiaConfigurer} to be able to detect Morphia persistent * classes. *

*

* Also, it configure a Morphia {@link Datastore} ready to use. *

* * @author edgar.espina * @see MongoModule * @see MorphiaConfigurer */ @Configuration @Import(MongoModule.class) public class MorphiaModule { /** * A JSR-303 entity interceptor. * * @author edgar.espina */ private static final class Jsr303Interceptor extends AbstractEntityInterceptor { /** * The validator factory. Required. */ private ValidatorFactory validatorFactory; /** * Creates a new {@link Jsr303Interceptor}. * * @param validatorFactory The validator factory. Required. */ public Jsr303Interceptor(final ValidatorFactory validatorFactory) { this.validatorFactory = checkNotNull(validatorFactory, "The validator factory is required."); } @SuppressWarnings("unchecked") @Override public void prePersist(final Object ent, final DBObject dbObj, final Mapper mapr) { @SuppressWarnings("rawtypes") final Set validate = validatorFactory.getValidator().validate(ent); if (!validate.isEmpty()) { throw new ConstraintViolationException(validate); } } } /** * The logging system. */ private static final Logger logger = LoggerFactory .getLogger(MorphiaModule.class); /** * The local validator factory's bean. */ @Autowired(required = false) private ValidatorFactory validationFactory; /** * Publish a {@link Morphia} POJOs mapper for Mongo datatabases. * * @param env The application's environment. Required. * @return A {@link Morphia} POJOs mapper for Mongo datatabases. */ @Bean public Morphia morphia(final Environment env) { notNull(env, "The env is required."); String[] namespace = env.getProperty(APP_NAMESPACE, String[].class); Morphia morphia = new Morphia(); for (String ns : namespace) { logger.debug("Adding pacakge: {}", ns); morphia.mapPackage(ns); } if (validationFactory != null) { morphia.getMapper().addInterceptor( new Jsr303Interceptor(validationFactory)); } return morphia; } /** * Publish a Morphia {@link Datastore} for executing CRUD operations over * POJOs. * * @param morphia The morphia mapper. Required. * @param mongo The mongo database connection. Required. * @param uri The mongo database uri. Required. * @return A Morphia {@link Datastore} for executing CRUD operations over * POJOs. */ @Bean public Datastore morphiaDatastore(final Morphia morphia, final Mongo mongo, final MongoURI uri) { Validate.notNull(morphia, "The morphia mapper is required."); Validate.notNull(mongo, "The mongo database connection is required."); Validate.notNull(uri, "The mongo database connection uri is required."); return morphia.createDatastore(mongo, uri.getDatabase()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy