Mercury-IM/domain/src/main/java/org/mercury_im/messenger/core/store/caps/MercuryEntityCapsStore.java

81 lines
3.0 KiB
Java
Raw Normal View History

2020-06-09 21:52:53 +02:00
package org.mercury_im.messenger.core.store.caps;
2020-01-06 03:41:37 +01:00
import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smack.xml.XmlPullParser;
import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache;
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
2020-06-09 21:52:53 +02:00
import org.mercury_im.messenger.core.SchedulersFacade;
2020-06-06 18:45:20 +02:00
import org.mercury_im.messenger.core.data.repository.EntityCapsRepository;
2020-01-06 03:41:37 +01:00
import org.mercury_im.messenger.entity.caps.EntityCapsRecord;
2020-06-06 18:45:20 +02:00
import org.mercury_im.messenger.core.logging.Tags;
2020-01-06 03:41:37 +01:00
import java.io.StringReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.disposables.CompositeDisposable;
@Singleton
public class MercuryEntityCapsStore implements EntityCapsPersistentCache {
private static final Logger LOGGER = Logger.getLogger(Tags.TAG_DOMAIN);
private final CompositeDisposable disposable = new CompositeDisposable();
private final EntityCapsRepository repository;
2020-06-09 21:52:53 +02:00
private final SchedulersFacade schedulers;
2020-01-06 03:41:37 +01:00
@Inject
2020-06-09 21:52:53 +02:00
public MercuryEntityCapsStore(EntityCapsRepository entityCapsRepository,
SchedulersFacade schedulers) {
2020-01-06 03:41:37 +01:00
this.repository = entityCapsRepository;
2020-06-09 21:52:53 +02:00
this.schedulers = schedulers;
2020-01-06 03:41:37 +01:00
}
@Override
public void addDiscoverInfoByNodePersistent(String nodeVer, DiscoverInfo info) {
LOGGER.log(Level.INFO, "MercuryEntityCapsStore: addDiscoverInfoByNodePersistent: " + nodeVer);
2020-05-16 15:53:54 +02:00
EntityCapsRecord record = new EntityCapsRecord();
2020-01-06 03:41:37 +01:00
record.setNodeVer(nodeVer);
record.setXml(info.toXML().toString());
2020-06-09 21:52:53 +02:00
disposable.add(repository.insertEntityCapsRecord(record)
.subscribeOn(schedulers.getIoScheduler())
.subscribe());
2020-01-06 03:41:37 +01:00
}
@Override
public DiscoverInfo lookup(String nodeVer) {
LOGGER.log(Level.INFO, "MercuryEntityCapsStore: lookup: " + nodeVer);
2020-05-27 22:34:27 +02:00
EntityCapsRecord defaultIfEmpty = new EntityCapsRecord();
EntityCapsRecord record = repository.maybeGetEntityCapsRecord(nodeVer)
.defaultIfEmpty(defaultIfEmpty)
2020-06-09 21:52:53 +02:00
.subscribeOn(schedulers.getIoScheduler())
2020-01-06 03:41:37 +01:00
.blockingGet();
2020-05-27 22:34:27 +02:00
if (record == defaultIfEmpty) {
return null;
}
try {
return parseDiscoverInfo(record);
} catch (Exception e) {
e.printStackTrace();
return null;
}
2020-01-06 03:41:37 +01:00
}
private DiscoverInfo parseDiscoverInfo(EntityCapsRecord record) throws Exception {
XmlPullParser parser = PacketParserUtils.getParserFor(new StringReader(record.getXml()));
return (DiscoverInfo) PacketParserUtils.parseIQ(parser);
}
@Override
public void emptyCache() {
LOGGER.log(Level.INFO, "MercuryEntityCapsStore: emptyCache.");
2020-06-09 21:52:53 +02:00
disposable.add(repository.deleteAllEntityCapsRecords()
.subscribeOn(schedulers.getIoScheduler())
.subscribe());
2020-01-06 03:41:37 +01:00
}
}