55 lines
1.5 KiB
Java
55 lines
1.5 KiB
Java
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;
|
|
}
|
|
}
|