org.teamapps.universaldb.message.MessageCache Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of universal-db Show documentation
Show all versions of universal-db Show documentation
Ultra fast TeamApps database
/*-
* ========================LICENSE_START=================================
* UniversalDB
* ---
* Copyright (C) 2014 - 2023 TeamApps.org
* ---
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================LICENSE_END==================================
*/
package org.teamapps.universaldb.message;
import org.teamapps.message.protocol.message.Message;
import org.teamapps.message.protocol.message.MessageRecord;
import java.util.*;
public class MessageCache {
public static MessageCache fullCache() {
return new MessageCache<>(true, 0);
}
public static MessageCache lruCache(int size) {
return new MessageCache<>(false, size);
}
private final boolean fullCache;
private final Map messageMap;
private final List messageList;
private MessageCache(boolean fullCache, int maxSize) {
this.fullCache = fullCache;
messageMap = !fullCache ? new LinkedHashMap<>() {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() >= maxSize;
}
} : new HashMap<>();
messageList = fullCache ? new ArrayList<>() : null;
}
public void addMessage(int id, boolean update, MESSAGE message) {
if (fullCache) {
if (update) {
MESSAGE oldMessage = messageMap.get(id);
if (oldMessage != null) {
messageList.remove(oldMessage);
}
}
messageList.add(message);
}
messageMap.put(id, message);
}
public void removeMessage(int id) {
MESSAGE oldMessage = messageMap.remove(id);
if (fullCache && oldMessage != null) {
messageList.remove(oldMessage);
}
}
public MESSAGE getMessage(int id) {
return messageMap.get(id);
}
public List getMessages() {
return new ArrayList<>(messageList);
}
public int getMessageCount() {
return messageList.size();
}
public boolean isFullCache() {
return fullCache;
}
}