All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.leancloud.session.PendingMessageCache Maven / Gradle / Ivy

There is a newer version: 8.2.28
Show newest version
package cn.leancloud.session;

import cn.leancloud.utils.StringUtil;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class PendingMessageCache {
  public static class Message implements PersistentQueue.HasId {
    public String msg;
    public String id;
    public long timestamp;

    boolean requestReceipt;
    String cid;

    @Override
    public String getId() {
      return id;
    }

    @Override
    public void setId(String id) {
      this.id = id;
    }

    public static Message getMessage(String msg, String id,
                                     boolean requestReceipt, String cid) {
      Message m = new Message();
      m.msg = msg;
      m.setId(id);
      m.requestReceipt = requestReceipt;
      m.cid = cid;
      return m;
    }
  }

  private Map msgMapping;
  private PersistentQueue messages;

  PendingMessageCache(String peerId, Class type) {
    this.messages = new PersistentQueue(peerId, type);
    this.setupMapping();
  }

  private void setupMapping() {
    msgMapping = new ConcurrentHashMap();
    for (E msg : messages) {
      if (!StringUtil.isEmpty(msg.getId())) {
        msgMapping.put(msg.getId(), msg);
      }
    }
  }

  void offer(E msg) {
    if (!StringUtil.isEmpty(msg.getId())) {
      msgMapping.put(msg.getId(), msg);
    }
    messages.offer(msg);
  }

  E poll(String msgId) {
    if (!StringUtil.isEmpty(msgId) && msgMapping.containsKey(msgId)) {
      E returnValue = msgMapping.remove(msgId);
      messages.remove(returnValue);
      return returnValue;
    }
    return this.poll();
  }

  E poll() {
    return messages.poll();
  }

  public void clear() {
    messages.clear();
    msgMapping.clear();
  }

  public boolean isEmpty() {
    return messages.isEmpty();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy