2019-08-25 17:54:03 +02:00
|
|
|
package org.mercury_im.messenger.core.stores;
|
2019-08-04 22:36:30 +02:00
|
|
|
|
2019-08-20 01:15:30 +02:00
|
|
|
import org.jivesoftware.smack.util.PacketParserUtils;
|
|
|
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
2019-08-04 22:36:30 +02:00
|
|
|
import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache;
|
|
|
|
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
|
2019-08-10 21:50:03 +02:00
|
|
|
import org.mercury_im.messenger.persistence.model.EntityCapsModel;
|
2019-08-04 22:36:30 +02:00
|
|
|
import org.mercury_im.messenger.persistence.repository.EntityCapsRepository;
|
|
|
|
|
2019-08-10 21:50:03 +02:00
|
|
|
import java.io.StringReader;
|
2019-08-04 22:36:30 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
2019-08-20 01:15:30 +02:00
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
2019-08-04 22:36:30 +02:00
|
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
|
2019-09-08 04:47:59 +02:00
|
|
|
import io.reactivex.Observable;
|
2019-08-20 01:15:30 +02:00
|
|
|
import io.reactivex.Single;
|
|
|
|
import io.reactivex.disposables.CompositeDisposable;
|
2019-09-08 04:47:59 +02:00
|
|
|
import io.reactivex.functions.Consumer;
|
2019-08-10 21:50:03 +02:00
|
|
|
import io.reactivex.observers.DisposableSingleObserver;
|
2019-08-04 22:36:30 +02:00
|
|
|
import io.reactivex.schedulers.Schedulers;
|
|
|
|
|
|
|
|
public class EntityCapsStore implements EntityCapsPersistentCache {
|
|
|
|
|
2019-08-20 01:15:30 +02:00
|
|
|
private static final Logger LOGGER = Logger.getLogger(EntityCapsStore.class.getName());
|
|
|
|
|
2019-08-04 22:36:30 +02:00
|
|
|
private final EntityCapsRepository entityCapsRepository;
|
|
|
|
private final Map<String, DiscoverInfo> discoverInfoMap = new HashMap<>();
|
|
|
|
|
2019-08-20 01:15:30 +02:00
|
|
|
private final CompositeDisposable disposable = new CompositeDisposable();
|
2019-09-08 04:47:59 +02:00
|
|
|
private Observable<List<EntityCapsModel>> allEntityCaps;
|
2019-08-10 21:50:03 +02:00
|
|
|
|
2019-08-04 22:36:30 +02:00
|
|
|
@Inject
|
|
|
|
public EntityCapsStore(EntityCapsRepository repository) {
|
|
|
|
this.entityCapsRepository = repository;
|
2019-08-20 01:15:30 +02:00
|
|
|
populateFromDatabase();
|
2019-08-04 22:36:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private void populateFromDatabase() {
|
2019-08-20 01:15:30 +02:00
|
|
|
allEntityCaps = entityCapsRepository.getAllEntityCaps();
|
|
|
|
disposable.add(allEntityCaps.subscribeOn(Schedulers.io())
|
|
|
|
.observeOn(Schedulers.io())
|
2019-09-08 04:47:59 +02:00
|
|
|
.subscribe(entityCapsModels -> {
|
|
|
|
discoverInfoMap.clear();
|
|
|
|
for (EntityCapsModel c : entityCapsModels) {
|
|
|
|
DiscoverInfo info;
|
|
|
|
try {
|
|
|
|
XmlPullParser parser = PacketParserUtils.getParserFor(new StringReader(c.getXml()));
|
|
|
|
info = (DiscoverInfo) PacketParserUtils.parseIQ(parser);
|
|
|
|
discoverInfoMap.put(c.getNodeVer(), info);
|
|
|
|
} catch (Exception e) {
|
|
|
|
LOGGER.log(Level.SEVERE, "Error parsing EntityCaps: ", e);
|
2019-08-10 21:50:03 +02:00
|
|
|
}
|
|
|
|
}
|
2019-09-08 04:47:59 +02:00
|
|
|
}, throwable -> LOGGER.log(Level.SEVERE, "Error accessing database", throwable)));
|
2019-08-04 22:36:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void addDiscoverInfoByNodePersistent(String nodeVer, DiscoverInfo info) {
|
2019-08-10 21:50:03 +02:00
|
|
|
EntityCapsModel model = entityCapsRepository.newEntityCapsModel(nodeVer);
|
2019-08-20 01:15:30 +02:00
|
|
|
CharSequence xml = info.toXML();
|
|
|
|
String string = xml.toString();
|
|
|
|
model.setXml(string);
|
2019-09-08 04:47:59 +02:00
|
|
|
disposable.add(entityCapsRepository.insertOrReplaceEntityCaps(model)
|
2019-08-20 01:15:30 +02:00
|
|
|
.subscribeOn(Schedulers.io())
|
2019-09-08 04:47:59 +02:00
|
|
|
.subscribe());
|
2019-08-04 22:36:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public DiscoverInfo lookup(String nodeVer) {
|
2019-08-20 01:15:30 +02:00
|
|
|
LOGGER.log(Level.INFO, "Looking up caps for " + nodeVer + " in cache...");
|
|
|
|
DiscoverInfo info = discoverInfoMap.get(nodeVer);
|
|
|
|
LOGGER.log(Level.INFO, "Entry found: " + (info != null ? info.toXML().toString() : "null"));
|
|
|
|
return info;
|
2019-08-04 22:36:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void emptyCache() {
|
2019-08-20 01:15:30 +02:00
|
|
|
entityCapsRepository.deleteAllEntityCaps()
|
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
|
.subscribe();
|
2019-08-04 22:36:30 +02:00
|
|
|
}
|
|
|
|
}
|