public List<GeneralMessage> getUnreadMessages(String userId, String tagId, UserTags tags) {

    Query<UnreaddenMessage> q =
        ds.createQuery(UnreaddenMessage.class).field("userId").equal(userId.toString());
    String order = tags.getOrder();
    if (!tagId.equals(UserTags.ALL_TAGS)) {
      SocioTag tag = tags.getTag(tagId);
      order = tag.getOrder();
      List<String> tagsIds = new ArrayList<String>();
      List<SocioTag> leaves = tag.getLeaves();
      for (SocioTag leaf : leaves) {
        tagsIds.add(leaf.getUniqueId());
      }
      q.field("tagId").hasAnyOf(tagsIds);
    }
    if (order.equals(SocioTag.ASCENDING_ORDER)) {
      q.order("-messageDate");
    } else {
      q.order("messageDate");
    }
    q.limit(tags.getRange());
    List<GeneralMessage> messagesList = new ArrayList<GeneralMessage>();
    Iterable<UnreaddenMessage> messages = q.fetch();
    for (UnreaddenMessage unreaddenMessage : messages) {
      messagesList.add(unreaddenMessage.getMessage());
    }
    tags.setSelectedTag(tagId);
    ds.save(tags);
    return messagesList;
  }
 public <T extends ISocioObject> List<T> getObjects(Class<T> T) {
   Query<T> q = (Query<T>) ds.createQuery(T);
   Iterable<T> objects = q.fetch();
   ArrayList<T> ret = new ArrayList<T>();
   for (T object : objects) {
     ret.add(object);
   }
   return ret;
 }
 @Override
 public <T extends GeneralMessage> List<T> getMessagesAfterDate(
     Class<T> T, Long date, String sourceField, String sourceId) {
   Query<T> q =
       (Query<T>)
           ds.createQuery(T)
               .field("date")
               .greaterThanOrEq(date)
               .field(sourceField)
               .equal(sourceId);
   Iterable<T> messages = q.fetch();
   ArrayList<T> ret = new ArrayList<T>();
   for (T message : messages) {
     ret.add(message);
   }
   return ret;
 }