package jscl;
import org.solovyev.common.msg.Message;
import org.solovyev.common.msg.MessageRegistry;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.NotThreadSafe;
import java.util.ArrayList;
import java.util.List;
@NotThreadSafe
public class FixedCapacityListMessageRegistry implements MessageRegistry {
@Nonnull
private final List<Message> messages;
private final int capacity;
private volatile int size;
public FixedCapacityListMessageRegistry(int capacity) {
this.size = 0;
this.capacity = capacity;
this.messages = new ArrayList<Message>(capacity);
}
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = {"VO_VOLATILE_INCREMENT"}, justification = "NotThreadSafe - outer synchronization")
public void addMessage(@Nonnull Message message) {
if (!this.messages.contains(message)) {
if (this.size <= this.capacity) {
this.messages.add(message);
this.size++;
} else {
this.messages.remove(0);
this.messages.add(message);
}
}
}
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = {"VO_VOLATILE_INCREMENT"}, justification = "NotThreadSafe - outer synchronization")
@Nonnull
public Message getMessage() {
if (hasMessage()) {
this.size--;
return messages.remove(0);
} else {
throw new IllegalStateException("No messages!");
}
}
public boolean hasMessage() {
return size > 0;
}
}