@Override public <S> boolean pushItemToList( final MongoIdentifiableEntity entity, final String listPropertyName, S itemToPush, boolean skipIfAlreadyPresent, MongoStoreInvocationContext context) { final Class<? extends MongoEntity> type = entity.getClass(); EntityInfo entityInfo = getEntityInfo(type); // Add item to list directly in this object Property<Object> listProperty = entityInfo.getPropertyByName(listPropertyName); if (listProperty == null) { throw new IllegalArgumentException( "Property " + listPropertyName + " doesn't exist on object " + entity); } List<S> list = (List<S>) listProperty.getValue(entity); if (list == null) { list = new ArrayList<S>(); listProperty.setValue(entity, list); } // Skip if item is already in list if (skipIfAlreadyPresent && list.contains(itemToPush)) { return false; } // Update java object list.add(itemToPush); // Add update of list to pending tasks final List<S> listt = list; context.addUpdateTask( entity, new MongoTask() { @Override public void execute() { // Now DB update of new list with usage of $set BasicDBList dbList = mapperRegistry.convertApplicationObjectToDBObject(listt, BasicDBList.class); BasicDBObject query = new BasicDBObject("_id", entity.getId()); BasicDBObject listObject = new BasicDBObject(listPropertyName, dbList); BasicDBObject setCommand = new BasicDBObject("$set", listObject); getDBCollectionForType(type).update(query, setCommand); } @Override public boolean isFullUpdate() { return false; } }); return true; }
@Override public <S> boolean pullItemFromList( final MongoIdentifiableEntity entity, final String listPropertyName, final S itemToPull, MongoStoreInvocationContext context) { final Class<? extends MongoEntity> type = entity.getClass(); EntityInfo entityInfo = getEntityInfo(type); // Remove item from list directly in this object Property<Object> listProperty = entityInfo.getPropertyByName(listPropertyName); if (listProperty == null) { throw new IllegalArgumentException( "Property " + listPropertyName + " doesn't exist on object " + entity); } List<S> list = (List<S>) listProperty.getValue(entity); // If list is null, we skip both object and DB update if (list == null || !list.contains(itemToPull)) { return false; } else { // Update java object list.remove(itemToPull); // Add update of list to pending tasks context.addUpdateTask( entity, new MongoTask() { @Override public void execute() { // Pull item from DB Object dbItemToPull = mapperRegistry.convertApplicationObjectToDBObject(itemToPull, Object.class); BasicDBObject query = new BasicDBObject("_id", entity.getId()); BasicDBObject pullObject = new BasicDBObject(listPropertyName, dbItemToPull); BasicDBObject pullCommand = new BasicDBObject("$pull", pullObject); getDBCollectionForType(type).update(query, pullCommand); } @Override public boolean isFullUpdate() { return false; } }); return true; } }