package polly.rx.core.orion.datasource;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import polly.rx.core.orion.OrionChatProvider;
import polly.rx.core.orion.model.DefaultOrionChatEntry;
import polly.rx.core.orion.model.OrionChatEntry;
import polly.rx.entities.DBOrionChatEntry;
import de.skuzzle.polly.sdk.PersistenceManagerV2;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Write;
import de.skuzzle.polly.sdk.exceptions.DatabaseException;
import de.skuzzle.polly.sdk.time.Milliseconds;
import de.skuzzle.polly.sdk.time.Time;
import de.skuzzle.polly.tools.collections.TemporaryValueMap;
public class DBOrionChatProvider implements OrionChatProvider {
private final static long ACTIVITY_TIMEOUT = Milliseconds.fromMinutes(2);
private final Map<String, Date> activityMap;
private final PersistenceManagerV2 persistence;
public DBOrionChatProvider(PersistenceManagerV2 persistence) {
this.persistence = persistence;
this.activityMap = new TemporaryValueMap<>(ACTIVITY_TIMEOUT);
}
@Override
public void addChatEntry(OrionChatEntry oce, boolean noteActivity)
throws DatabaseException {
if (noteActivity) {
this.noteActivity(oce.getSender());
}
final DBOrionChatEntry dboce = new DBOrionChatEntry(oce);
try (final Write w = this.persistence.write()) {
w.single(dboce);
}
}
private Date noteActivity(String sender) {
return this.activityMap.put(sender, Time.currentTime());
}
@Override
public Set<String> getActiveNicknames() {
return this.activityMap.keySet();
}
@Override
public List<DefaultOrionChatEntry> getYoungestEntries(String receiver,
boolean isPoll, int max) {
final List<DBOrionChatEntry> entries = this.persistence.atomic().findList(
DBOrionChatEntry.class, DBOrionChatEntry.YOUNGEST_ENTRIES, max);
final Date prevActivity = this.noteActivity(receiver);
Stream<DefaultOrionChatEntry> s = entries.stream()
.sorted(Comparator.comparing(DBOrionChatEntry::getId))
.map(DefaultOrionChatEntry::new);
if (prevActivity != null && isPoll) {
s = s.filter(e -> e.getDate().compareTo(prevActivity) >=0);
}
return s.collect(Collectors.toList());
}
}