Arshad Ali
Arshad Ali

Reputation: 3274

How to make this messaging system work as desired

My requirement is quite straightforward, I've admin panel through that admin sends messages to all registered users of the System, User and Message Entity relationship is:

@Entity
    public class Message implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String message;
        @Temporal(TemporalType.TIMESTAMP)
        private Date sentDate;

        @ManyToMany(mappedBy = "messages", cascade = {CascadeType.MERGE})           
        private List<User> users;
        // setter - getters methods are omitted
    } 

And:

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long userId;
    private String userName;
    @Temporal(TemporalType.TIMESTAMP)
    private Date userJoinedAt;
    @ManyToMany(cascade = { CascadeType.PERSIST })
    @JoinTable          
    private List<Message> messages;
    // setter - getters methods are omitted
    } 

At this point I want that when a new user signs-up in the System, he should only see the admin sent messages that are sent after his sign-up time. I've tried:

public void addMessage(Message message) throws Exception {        
  message.setMessageSentDate(new Date());
  messageService.save(message);
  List<Message> messages = messageService.getAll();               
  List<User> registeredUsers = userService.getAll();
  for (User user : registeredUsers) {
      for (Message savedMessage : messages) {
        if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
            user.setMessages(messages);
            userService.save(user);
        }
      }
  }
}

But this method is not working as desired, means it adds all the messages present in Messages Entity, even if those are sent before User Joined Date.

How can I make that possible to get desired job don?

UPDATE

public void addMessage(Message message) throws Exception {        
  message.setMessageSentDate(new Date());
  messageService.save(message);
  List<Message> messages = messageService.getAll();               
  List<User> registeredUsers = userService.getAll();
  for (User user : registeredUsers) {
    // Initializing new variable to store afterJoinedMessages
    List<Message> afterJoinedMessages = new CopyOnWriteArrayList<Message>();
      for (Message savedMessage : messages) {
        if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
            // Here adding those messages to afterJoinedMessages List
            afterJoinedMessags.add(savedMessage);
            // and saving those to user
            user.setMessages(afterJoinedMessags);
            userService.save(user);
        }
      }
  }
}

Would this be a better solution or the one which is given in answer?

Upvotes: 1

Views: 48

Answers (1)

richardtz
richardtz

Reputation: 4993

You are adding the whole messages list whenever any of the messages matches the date condition. Change the call user.setMessages(messages); to a new one you need to create in the User class (addMessage) which simply adds the message to the user messages list. (You can also save the user only once at the end of the loop, not in every iteration).

for (Message savedMessage : messages) {
    if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
        user.addMessage(savedMessage);
    }
}
userService.save(user);

In your User class add something like :

public void addMesage(Message msg) {
    messages.add(msg);
}

UPDATE

I am not aware of all the details, but as the message is being created with the current date, I'd expect it will need to be added to ALL existing users (which should have been registered before now).

So .... I'd leave the method like this : (just save the message and add it to all the users).

public void addMessage(Message message) throws Exception {        
    message.setMessageSentDate(new Date());
    messageService.save(message);
    List<User> registeredUsers = userService.getAll();
    for (User user : registeredUsers) {
        user.addMessage(message);
        userService.save(user);
    }
}

Upvotes: 1

Related Questions