
com.github.sseserver.qos.MemoryMessageRepository Maven / Gradle / Ivy
package com.github.sseserver.qos;
import java.io.Serializable;
import java.util.*;
import java.util.function.Consumer;
public class MemoryMessageRepository implements MessageRepository {
public int maxThresholdSize = Integer.getInteger("sseserver.MemoryMessageRepository.maxThresholdSize",
1000);
protected final Map messageMap = Collections.synchronizedMap(new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > maxThresholdSize;
}
});
protected final List> deleteListenerList = new LinkedList<>();
private final boolean primary;
public MemoryMessageRepository() {
this.primary = false;
}
public MemoryMessageRepository(boolean primary) {
this.primary = primary;
}
@Override
public String insert(Message message) {
String id = message.getId();
messageMap.put(id, message);
return id;
}
@Override
public List list() {
return new ArrayList<>(messageMap.values());
}
@Override
public List select(Query query) {
if (messageMap.isEmpty()) {
return Collections.emptyList();
}
List list = new ArrayList<>(2);
for (Message message : messageMap.values()) {
if (match(query, message)) {
list.add(message);
}
}
return list;
}
@Override
public Message delete(String id) {
if (id != null) {
Message remove = messageMap.remove(id);
if (remove != null) {
for (Consumer messageConsumer : deleteListenerList) {
messageConsumer.accept(remove);
}
}
return remove;
} else {
return null;
}
}
@Override
public void close() {
messageMap.clear();
}
@Override
public void addDeleteListener(Consumer listener) {
deleteListenerList.add(listener);
}
@Override
public boolean isPrimary() {
return primary;
}
protected boolean match(Query query, Message message) {
if (message.isFilter(Message.FILTER_TENANT_ID)
&& !exist(query.getTenantId(), message.getTenantIdList())) {
return false;
}
if (message.isFilter(Message.FILTER_CHANNEL)
&& !exist(query.getChannel(), message.getChannelList())) {
return false;
}
if (message.isFilter(Message.FILTER_ACCESS_TOKEN)
&& !exist(query.getAccessToken(), message.getAccessTokenList())) {
return false;
}
if (message.isFilter(Message.FILTER_USER_ID)
&& !exist(query.getUserId(), message.getUserIdList())) {
return false;
}
if (message.isFilter(Message.FILTER_LISTENER_NAME)
&& !query.existListener(message.getListenerName())) {
return false;
}
return true;
}
protected boolean exist(Serializable v1, Collection extends Serializable> v2) {
for (Serializable v : v2) {
if (equals(v1, v)) {
return true;
}
}
return false;
}
protected boolean equals(Serializable v1, Serializable v2) {
if (v1 == v2) {
return true;
}
if (v1 == null || v2 == null) {
return false;
}
if (v1.getClass() == v2.getClass()) {
return v1.equals(v2);
} else {
return v1.toString().equals(v2.toString());
}
}
public int getMaxThresholdSize() {
return maxThresholdSize;
}
public void setMaxThresholdSize(int maxThresholdSize) {
this.maxThresholdSize = maxThresholdSize;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy