@Override
  public Collection<TatamibotConfiguration> findTatamibotConfigurationsByDomain(String domain) {

    Set<TatamibotConfiguration> configurations = new HashSet<TatamibotConfiguration>();

    ColumnSlice<UUID, String> results =
        HFactory.createSliceQuery(
                keyspaceOperator,
                StringSerializer.get(),
                UUIDSerializer.get(),
                StringSerializer.get())
            .setColumnFamily(ColumnFamilyKeys.DOMAIN_TATAMIBOT_CF)
            .setKey(domain)
            .setRange(null, null, false, Integer.MAX_VALUE)
            .execute()
            .get();

    for (HColumn<UUID, String> column : results.getColumns()) {
      String tatamibotConfigurationId = column.getName().toString();
      TatamibotConfiguration configuration =
          em.find(TatamibotConfiguration.class, tatamibotConfigurationId);
      configurations.add(configuration);
    }
    return configurations;
  }
 @Override
 @CacheEvict(value = "status-cache", key = "#status.statusId")
 public void removeStatus(Status status) {
   status.setRemoved(true);
   if (log.isDebugEnabled()) {
     log.debug("Updating Status : " + status);
   }
   em.persist(status);
 }
 @Override
 @CacheEvict(value = "user-cache", key = "#user.login", beforeInvocation = true)
 public void updateUser(User user) throws ConstraintViolationException, IllegalArgumentException {
   if (log.isDebugEnabled()) {
     log.debug("Updating user : " + user);
   }
   Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
   if (!constraintViolations.isEmpty()) {
     throw new ConstraintViolationException(
         new HashSet<ConstraintViolation<?>>(constraintViolations));
   }
   em.persist(user);
 }
  @Override
  public void insertTatamibotConfiguration(TatamibotConfiguration tatamibotConfiguration) {
    UUID tatamibotConfigurationId = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
    Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
    mutator.insert(
        tatamibotConfiguration.getDomain(),
        ColumnFamilyKeys.DOMAIN_TATAMIBOT_CF,
        HFactory.createColumn(
            tatamibotConfigurationId, "", UUIDSerializer.get(), StringSerializer.get()));

    tatamibotConfiguration.setTatamibotConfigurationId(tatamibotConfigurationId.toString());
    em.persist(tatamibotConfiguration);
  }
 @Override
 @CacheEvict(value = "user-cache", key = "#user.login")
 public void createUser(User user) {
   if (log.isDebugEnabled()) {
     log.debug("Creating user : " + user);
   }
   Set<ConstraintViolation<User>> constraintViolations =
       validator.validate(user, ContraintsUserCreation.class);
   if (!constraintViolations.isEmpty()) {
     throw new ConstraintViolationException(
         new HashSet<ConstraintViolation<?>>(constraintViolations));
   }
   em.persist(user);
 }
 @Override
 @Cacheable("user-cache")
 public User findUserByLogin(String login) {
   User user = null;
   try {
     user = em.find(User.class, login);
   } catch (Exception e) {
     if (log.isDebugEnabled()) {
       log.debug("Exception while looking for user " + login + " : " + e.toString());
     }
     return null;
   }
   if (user != null) {
     user.setStatusCount(counterRepository.getStatusCounter(login));
     user.setFollowersCount(counterRepository.getFollowersCounter(login));
     user.setFriendsCount(counterRepository.getFriendsCounter(login));
   }
   return user;
 }
  @Override
  public Status createStatus(
      String login,
      String username,
      String domain,
      String content,
      String replyTo,
      String replyToUsername,
      List<String> tags)
      throws ConstraintViolationException {

    Status status = new Status();
    String statusId = TimeUUIDUtils.getUniqueTimeUUIDinMillis().toString();
    status.setStatusId(statusId);
    status.setLogin(login);
    status.setUsername(username);
    status.setDomain(domain);
    status.setContent(content);
    status.setStatusDate(Calendar.getInstance().getTime());
    status.setReplyTo(replyTo);
    status.setReplyToUsername(replyToUsername);
    status.setRemoved(false);
    status.setTags(tags);
    if (log.isDebugEnabled()) {
      log.debug("Persisting Status : " + status);
    }
    Set<ConstraintViolation<Status>> constraintViolations = validator.validate(status);
    if (!constraintViolations.isEmpty()) {
      throw new ConstraintViolationException(
          new HashSet<ConstraintViolation<?>>(constraintViolations));
    }
    em.persist(status);

    // Persist tags
    addTags(keyspaceOperator, STATUS_CF, statusId, tags);

    return status;
  }
  @Override
  @Cacheable("status-cache")
  public Status findStatusById(String statusId) {
    if (statusId == null || statusId.equals("")) {
      return null;
    }
    if (log.isDebugEnabled()) {
      log.debug("Finding status : " + statusId);
    }
    Status status = em.find(Status.class, statusId);

    if (status != null) {
      // Find status's tags
      List<String> tags =
          getTags(keyspaceOperator, STATUS_CF, statusId, TAG_COLUMN_MIN_NAME, TAG_COLUMN_MAX_NAME);

      status.setTags(tags);

      status = Boolean.TRUE.equals(status.getRemoved()) ? null : status;
    }

    return status;
  }
 @Override
 public TatamibotConfiguration findTatamibotConfigurationById(String tatamibotConfigurationId) {
   return em.find(TatamibotConfiguration.class, tatamibotConfigurationId);
 }
 @Override
 public void updateTatamibotConfiguration(TatamibotConfiguration tatamibotConfiguration) {
   em.persist(tatamibotConfiguration);
 }