package org.openmhealth.reference.data.mongodb; import org.mongojack.DBCursor; import org.mongojack.JacksonDBCollection; import org.openmhealth.reference.data.AuthorizationCodeBin; import org.openmhealth.reference.domain.AuthorizationCode; import org.openmhealth.reference.domain.mongodb.MongoAuthorizationCode; import org.openmhealth.reference.exception.OmhException; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.QueryBuilder; /** * <p> * The interface to the database-backed authorization code repository. * </p> * * @author John Jenkins */ public class MongoAuthorizationCodeBin extends AuthorizationCodeBin { /** * Default constructor. */ protected MongoAuthorizationCodeBin() { // Get the collection to add indexes to. DBCollection collection = MongoDao.getInstance().getDb().getCollection(DB_NAME); // Ensure that there is an index on the code. collection .ensureIndex( new BasicDBObject(AuthorizationCode.JSON_KEY_CODE, 1), DB_NAME + "_" + AuthorizationCode.JSON_KEY_CODE + "_unique", true); } /* * (non-Javadoc) * @see org.openmhealth.reference.data.AuthorizationCodeBin#storeCode(org.openmhealth.reference.domain.AuthorizationCode) */ @Override public void storeCode(final AuthorizationCode code) throws OmhException { // Validate the parameter. if(code == null) { throw new OmhException("The code is null."); } // Get the authorization code collection. JacksonDBCollection<AuthorizationCode, Object> collection = JacksonDBCollection .wrap( MongoDao .getInstance() .getDb() .getCollection(DB_NAME), AuthorizationCode.class); // Make sure the token doesn't already exist. if(collection .count( new BasicDBObject( AuthorizationCode.JSON_KEY_CODE, code.getCode())) > 0) { throw new OmhException("The token already exists."); } // Save it. collection.insert(code); } /* * (non-Javadoc) * @see org.openmhealth.reference.data.AuthorizationCodeBin#getCode(java.lang.String) */ @Override public AuthorizationCode getCode(final String code) throws OmhException { // Get the connection to the authorization code bin with the Jackson // wrapper. JacksonDBCollection<MongoAuthorizationCode, Object> collection = JacksonDBCollection .wrap( MongoDao .getInstance() .getDb() .getCollection(DB_NAME), MongoAuthorizationCode.class); // Build the query. QueryBuilder queryBuilder = QueryBuilder.start(); // Add the authorization code to the query. queryBuilder.and(AuthorizationCode.JSON_KEY_CODE).is(code); // Execute query. DBCursor<MongoAuthorizationCode> result = collection.find(queryBuilder.get()); // If multiple authorization codes were returned, that is a violation // of the system. if(result.count() > 1) { throw new OmhException( "Multiple copies of the same authorization code exist: " + code); } // If no codes were returned, then return null. if(result.count() == 0) { return null; } else { return result.next(); } } }