diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 548bb0f..700247a 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import org.mercury_im.messenger.core.ConnectionCenter; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; @@ -35,6 +36,8 @@ public class MercuryImApplication extends Application { initializeNotificationChannels(this); + ConnectionCenter.get(); + Intent serviceIntent = new Intent(getApplicationContext(), XmppConnectionService.class); serviceIntent.setAction(XmppConnectionService.ACTION_START); diff --git a/core/src/main/java/org/mercury_im/messenger/core/ConnectionCenter.java b/core/src/main/java/org/mercury_im/messenger/core/ConnectionCenter.java index c8baf61..f28d4fd 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/ConnectionCenter.java +++ b/core/src/main/java/org/mercury_im/messenger/core/ConnectionCenter.java @@ -3,11 +3,14 @@ package org.mercury_im.messenger.core; import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jivesoftware.smackx.caps.EntityCapsManager; import org.mercury_im.messenger.persistence.model.AccountModel; +import java.sql.SQLOutput; import java.util.HashMap; import java.util.Map; +import javax.inject.Inject; import javax.inject.Singleton; @Singleton @@ -17,8 +20,14 @@ public class ConnectionCenter { private final Map connectionMap = new HashMap<>(); - private ConnectionCenter() { + private ConnectionCenter() { + } + + @Inject + void injectEntityCapsStore(EntityCapsStore store) { + System.out.println("Inject Store"); + EntityCapsManager.setPersistentCache(store); } public static ConnectionCenter get() { diff --git a/core/src/main/java/org/mercury_im/messenger/core/EntityCapsStore.java b/core/src/main/java/org/mercury_im/messenger/core/EntityCapsStore.java index de26221..202df27 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/EntityCapsStore.java +++ b/core/src/main/java/org/mercury_im/messenger/core/EntityCapsStore.java @@ -1,20 +1,24 @@ package org.mercury_im.messenger.core; +import org.jivesoftware.smack.parsing.SmackParsingException; +import org.jivesoftware.smack.xml.SmackXmlParser; +import org.jivesoftware.smack.xml.XmlPullParserException; import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; -import org.mercury_im.messenger.persistence.model.EntityCapsFeatureModel; -import org.mercury_im.messenger.persistence.model.EntityCapsIdentityModel; +import org.jivesoftware.smackx.disco.provider.DiscoverInfoProvider; +import org.mercury_im.messenger.persistence.model.EntityCapsModel; import org.mercury_im.messenger.persistence.repository.EntityCapsRepository; -import java.util.ArrayList; +import java.io.IOException; +import java.io.StringReader; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; -import io.reactivex.functions.Consumer; -import io.reactivex.internal.observers.ConsumerSingleObserver; +import io.reactivex.SingleObserver; +import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.schedulers.Schedulers; public class EntityCapsStore implements EntityCapsPersistentCache { @@ -22,6 +26,8 @@ public class EntityCapsStore implements EntityCapsPersistentCache { private final EntityCapsRepository entityCapsRepository; private final Map discoverInfoMap = new HashMap<>(); + private final DiscoverInfoProvider provider = new DiscoverInfoProvider(); + @Inject public EntityCapsStore(EntityCapsRepository repository) { this.entityCapsRepository = repository; @@ -30,63 +36,40 @@ public class EntityCapsStore implements EntityCapsPersistentCache { private void populateFromDatabase() { discoverInfoMap.clear(); - entityCapsRepository.getAllFeatures() + SingleObserver observer = entityCapsRepository.getAllEntityCaps() .subscribeOn(Schedulers.io()) .observeOn(Schedulers.computation()) - .zipWith(entityCapsRepository.getAllIdentities().) - .subscribe((Consumer>) features -> { - entityCapsRepository.getAllIdentities() - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.computation()) - .subscribe((ConsumerSingleObserver>) identities -> { + .subscribeWith(new DisposableSingleObserver>() { - for (EntityCapsFeatureModel f : features) { - DiscoverInfo di = discoverInfoMap.get(f.getNodeVer()); - if (di == null) { - di = new DiscoverInfo(); - discoverInfoMap.put(f.getNodeVer(), di); - } - di.addFeature(f.getVar()); - } + @Override + public void onSuccess(List entityCapsModels) { + discoverInfoMap.clear(); + for (EntityCapsModel c : entityCapsModels) { + DiscoverInfo info; + try { + info = provider.parse( + SmackXmlParser.newXmlParser(new StringReader(c.getXml()))); + } catch (IOException | XmlPullParserException | SmackParsingException e) { + e.printStackTrace(); + continue; + } + discoverInfoMap.put(c.getNodeVer(), info); + } + } - for (EntityCapsIdentityModel i : identities) { - DiscoverInfo di = discoverInfoMap.get(i.getNodeVer()); - if (di == null) { - di = new DiscoverInfo(); - discoverInfoMap.put(i.getNodeVer(), di); - } - di.addIdentity(new DiscoverInfo.Identity(i.getCategory(), i.getName(), i.getType())); - } - }); + @Override + public void onError(Throwable e) { + + } }); } @Override public void addDiscoverInfoByNodePersistent(String nodeVer, DiscoverInfo info) { discoverInfoMap.put(nodeVer, info); - - List identities = new ArrayList<>(); - for (DiscoverInfo.Identity i : info.getIdentities()) { - EntityCapsIdentityModel identity = entityCapsRepository.newEntityCapsIdentityModel(); - identity.setCategory(i.getCategory()); - identity.setType(i.getType()); - identity.setName(i.getName()); - identity.setLanguage(i.getLanguage()); - identity.setNodeVer(info.getNode()); - identities.add(identity); - } - - entityCapsRepository.insertIdentities(identities); - - List features = new ArrayList<>(); - for (DiscoverInfo.Feature f : info.getFeatures()) { - EntityCapsFeatureModel feature = entityCapsRepository.newEntityCapsFeatureModel(); - feature.setVar(f.getVar()); - feature.setNodeVer(info.getNode()); - features.add(feature); - } - - entityCapsRepository.insertFeatures(features); + EntityCapsModel model = entityCapsRepository.newEntityCapsModel(nodeVer); + model.setXml(info.toXML().toString()); + entityCapsRepository.insertOrReplaceEntityCaps(model); } @Override diff --git a/core/src/main/java/org/mercury_im/messenger/core/MercuryConnection.java b/core/src/main/java/org/mercury_im/messenger/core/MercuryConnection.java index dcb3aaa..415fda7 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/MercuryConnection.java +++ b/core/src/main/java/org/mercury_im/messenger/core/MercuryConnection.java @@ -9,9 +9,11 @@ import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler; import org.jivesoftware.smack.iqrequest.IQRequestHandler; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.roster.Roster; +import org.jivesoftware.smackx.caps.EntityCapsManager; import org.jivesoftware.smackx.carbons.CarbonManager; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; +import org.jivesoftware.smackx.iqversion.VersionManager; import org.jivesoftware.smackx.iqversion.packet.Version; import org.jivesoftware.smackx.sid.StableUniqueStanzaIdManager; @@ -48,14 +50,8 @@ public class MercuryConnection implements ConnectionListener { stanzaIdManager.enable(); this.serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection); + VersionManager.getInstanceFor(connection).setVersion("Mercury", "0.0.1-stealth", "Android"); serviceDiscoveryManager.setIdentity(new DiscoverInfo.Identity("client", "Mercury", "phone")); - - connection.registerIQRequestHandler(new AbstractIqRequestHandler(Version.ELEMENT, Version.NAMESPACE, IQ.Type.get, IQRequestHandler.Mode.async) { - @Override - public IQ handleIQRequest(IQ iqRequest) { - return Version.createResultFor(iqRequest, new Version("Mercury", "stealth", "Android")); - } - }); roster.setRosterLoadedAtLogin(true); } diff --git a/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json b/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json index e7eb0a2..b449af6 100644 --- a/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json +++ b/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "e1e6ce9276bb4e2a97b5e2bfc25272c1", + "identityHash": "606370403d8f862397c7c75b88be193e", "entities": [ { "tableName": "contacts", @@ -440,131 +440,36 @@ ] }, { - "tableName": "caps_identities", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_caps_identity_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `category` TEXT, `type` TEXT, `name` TEXT, `nodeVer` TEXT)", + "tableName": "entity_caps", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_node_ver` TEXT NOT NULL, `xml` TEXT, PRIMARY KEY(`pk_node_ver`))", "fields": [ { - "fieldPath": "id", - "columnName": "pk_caps_identity_id", - "affinity": "INTEGER", + "fieldPath": "nodeVer", + "columnName": "pk_node_ver", + "affinity": "TEXT", "notNull": true }, { - "fieldPath": "category", - "columnName": "category", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "nodeVer", - "columnName": "nodeVer", + "fieldPath": "xml", + "columnName": "xml", "affinity": "TEXT", "notNull": false } ], "primaryKey": { "columnNames": [ - "pk_caps_identity_id" + "pk_node_ver" ], - "autoGenerate": true + "autoGenerate": false }, "indices": [ { - "name": "index_caps_identities_pk_caps_identity_id", + "name": "index_entity_caps_pk_node_ver", "unique": false, "columnNames": [ - "pk_caps_identity_id" + "pk_node_ver" ], - "createSql": "CREATE INDEX `index_caps_identities_pk_caps_identity_id` ON `${TABLE_NAME}` (`pk_caps_identity_id`)" - }, - { - "name": "index_caps_identities_nodeVer", - "unique": false, - "columnNames": [ - "nodeVer" - ], - "createSql": "CREATE INDEX `index_caps_identities_nodeVer` ON `${TABLE_NAME}` (`nodeVer`)" - }, - { - "name": "index_caps_identities_nodeVer_category_type_name", - "unique": true, - "columnNames": [ - "nodeVer", - "category", - "type", - "name" - ], - "createSql": "CREATE UNIQUE INDEX `index_caps_identities_nodeVer_category_type_name` ON `${TABLE_NAME}` (`nodeVer`, `category`, `type`, `name`)" - } - ], - "foreignKeys": [] - }, - { - "tableName": "caps_features", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_caps_feature_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `var` TEXT, `nodeVer` TEXT)", - "fields": [ - { - "fieldPath": "id", - "columnName": "pk_caps_feature_id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "var", - "columnName": "var", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "nodeVer", - "columnName": "nodeVer", - "affinity": "TEXT", - "notNull": false - } - ], - "primaryKey": { - "columnNames": [ - "pk_caps_feature_id" - ], - "autoGenerate": true - }, - "indices": [ - { - "name": "index_caps_features_pk_caps_feature_id", - "unique": false, - "columnNames": [ - "pk_caps_feature_id" - ], - "createSql": "CREATE INDEX `index_caps_features_pk_caps_feature_id` ON `${TABLE_NAME}` (`pk_caps_feature_id`)" - }, - { - "name": "index_caps_features_nodeVer", - "unique": false, - "columnNames": [ - "nodeVer" - ], - "createSql": "CREATE INDEX `index_caps_features_nodeVer` ON `${TABLE_NAME}` (`nodeVer`)" - }, - { - "name": "index_caps_features_nodeVer_var", - "unique": true, - "columnNames": [ - "nodeVer", - "var" - ], - "createSql": "CREATE UNIQUE INDEX `index_caps_features_nodeVer_var` ON `${TABLE_NAME}` (`nodeVer`, `var`)" + "createSql": "CREATE INDEX `index_entity_caps_pk_node_ver` ON `${TABLE_NAME}` (`pk_node_ver`)" } ], "foreignKeys": [] @@ -573,7 +478,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e1e6ce9276bb4e2a97b5e2bfc25272c1')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '606370403d8f862397c7c75b88be193e')" ] } } \ No newline at end of file diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java index 436212e..d220965 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java @@ -2,29 +2,23 @@ package org.mercury_im.messenger.persistence.room; import android.content.Context; -import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; -import androidx.room.migration.Migration; -import androidx.sqlite.db.SupportSQLiteDatabase; -import org.mercury_im.messenger.persistence.model.EntityCapsIdentityModel; import org.mercury_im.messenger.persistence.room.dao.AccountDao; import org.mercury_im.messenger.persistence.room.dao.AvatarDao; import org.mercury_im.messenger.persistence.room.dao.ChatDao; -import org.mercury_im.messenger.persistence.room.dao.ContactDao; import org.mercury_im.messenger.persistence.room.dao.ContactAttributesDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsFeatureDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsIdentityDao; +import org.mercury_im.messenger.persistence.room.dao.ContactDao; +import org.mercury_im.messenger.persistence.room.dao.EntityCapsDao; import org.mercury_im.messenger.persistence.room.dao.EntityDao; import org.mercury_im.messenger.persistence.room.dao.MessageDao; import org.mercury_im.messenger.persistence.room.model.RoomAccountModel; import org.mercury_im.messenger.persistence.room.model.RoomAvatarModel; import org.mercury_im.messenger.persistence.room.model.RoomChatModel; import org.mercury_im.messenger.persistence.room.model.RoomContactAttributes; -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel; -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel; +import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsModel; import org.mercury_im.messenger.persistence.room.model.RoomEntityModel; import org.mercury_im.messenger.persistence.room.model.RoomMessageModel; @@ -36,8 +30,7 @@ import org.mercury_im.messenger.persistence.room.model.RoomMessageModel; RoomMessageModel.class, RoomEntityModel.class, RoomAvatarModel.class, - RoomEntityCapsIdentityModel.class, - RoomEntityCapsFeatureModel.class + RoomEntityCapsModel.class }) public abstract class AppDatabase extends RoomDatabase { @@ -67,7 +60,5 @@ public abstract class AppDatabase extends RoomDatabase { public abstract AvatarDao avatarDao(); - public abstract EntityCapsIdentityDao capsIdentityDao(); - - public abstract EntityCapsFeatureDao capsFeatureDao(); + public abstract EntityCapsDao entityCapsDao(); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomModule.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomModule.java index 320e1b9..2326923 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomModule.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomModule.java @@ -5,10 +5,9 @@ import android.app.Application; import org.mercury_im.messenger.persistence.room.dao.AccountDao; import org.mercury_im.messenger.persistence.room.dao.AvatarDao; import org.mercury_im.messenger.persistence.room.dao.ChatDao; -import org.mercury_im.messenger.persistence.room.dao.ContactDao; import org.mercury_im.messenger.persistence.room.dao.ContactAttributesDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsFeatureDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsIdentityDao; +import org.mercury_im.messenger.persistence.room.dao.ContactDao; +import org.mercury_im.messenger.persistence.room.dao.EntityCapsDao; import org.mercury_im.messenger.persistence.room.dao.EntityDao; import org.mercury_im.messenger.persistence.room.dao.MessageDao; @@ -81,13 +80,7 @@ public class RoomModule { @Singleton @Provides - EntityCapsIdentityDao provideEntityCapsIdentityDao() { - return mAppDatabase.capsIdentityDao(); - } - - @Singleton - @Provides - EntityCapsFeatureDao providerEntityCapsFeatureDao() { - return mAppDatabase.capsFeatureDao(); + EntityCapsDao provideEntityCapsDao() { + return mAppDatabase.entityCapsDao(); } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java index 89f505d..4e64a6c 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java @@ -13,8 +13,7 @@ import org.mercury_im.messenger.persistence.room.dao.AvatarDao; import org.mercury_im.messenger.persistence.room.dao.ChatDao; import org.mercury_im.messenger.persistence.room.dao.ContactAttributesDao; import org.mercury_im.messenger.persistence.room.dao.ContactDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsFeatureDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsIdentityDao; +import org.mercury_im.messenger.persistence.room.dao.EntityCapsDao; import org.mercury_im.messenger.persistence.room.dao.EntityDao; import org.mercury_im.messenger.persistence.room.dao.MessageDao; import org.mercury_im.messenger.persistence.room.repository.IAccountRepository; @@ -78,8 +77,7 @@ public class RoomRepositoryModule { @Singleton @Provides - EntityCapsRepository providerEntityCapsRepository(EntityCapsIdentityDao identityDao, - EntityCapsFeatureDao featureDao) { - return new IEntityCapsRepository(identityDao, featureDao); + EntityCapsRepository providerEntityCapsRepository(EntityCapsDao entityCapsDao) { + return new IEntityCapsRepository(entityCapsDao); } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsDao.java new file mode 100644 index 0000000..b1325b0 --- /dev/null +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsDao.java @@ -0,0 +1,33 @@ +package org.mercury_im.messenger.persistence.room.dao; + +import androidx.annotation.WorkerThread; +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.Query; + +import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsModel; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Single; + +import static androidx.room.OnConflictStrategy.REPLACE; + +@Dao +@WorkerThread +public interface EntityCapsDao { + + @Query("SELECT * FROM entity_caps WHERE pk_node_ver = :nodeVer") + Single getEntityCapsForNodeVer(String nodeVer); + + @Query("SELECT * FROM entity_caps") + Single> getAllEntityCaps(); + + @Insert(onConflict = REPLACE) + Completable insert(RoomEntityCapsModel... models); + + @Delete + Completable delete(RoomEntityCapsModel... models); +} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsFeatureDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsFeatureDao.java deleted file mode 100644 index a97e7ab..0000000 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsFeatureDao.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.mercury_im.messenger.persistence.room.dao; - -import androidx.annotation.WorkerThread; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.Query; - -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Single; - -import static androidx.room.OnConflictStrategy.IGNORE; - -@Dao -@WorkerThread -public interface EntityCapsFeatureDao extends BaseDao { - - @Query("SELECT * FROM caps_features ORDER BY nodeVer") - Single> getAllFeatures(); - - @Insert(onConflict = IGNORE) - Completable insert(List features); -} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsIdentityDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsIdentityDao.java deleted file mode 100644 index a98bba4..0000000 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityCapsIdentityDao.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.mercury_im.messenger.persistence.room.dao; - -import androidx.annotation.WorkerThread; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.Query; - -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Single; - -import static androidx.room.OnConflictStrategy.IGNORE; - -@Dao -@WorkerThread -public interface EntityCapsIdentityDao extends BaseDao { - - @Query("SELECT * FROM caps_identities ORDER BY nodeVer") - Single> getAllIdentities(); - - @Insert(onConflict = IGNORE) - Completable insert(List identities); -} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsFeatureModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsFeatureModel.java deleted file mode 100644 index aa8a8e8..0000000 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsFeatureModel.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.mercury_im.messenger.persistence.room.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Index; -import androidx.room.PrimaryKey; - -import org.mercury_im.messenger.persistence.model.EntityCapsFeatureModel; - -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel.KEY_ID; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel.KEY_NODE_VER; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel.KEY_VAR; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel.TABLE; - -@Entity(tableName = TABLE, - indices = { - @Index(KEY_ID), - @Index(KEY_NODE_VER), - @Index(value = { - KEY_NODE_VER, - KEY_VAR}, - unique = true) - }) -public class RoomEntityCapsFeatureModel implements EntityCapsFeatureModel { - - public static final String TABLE = "caps_features"; - public static final String KEY_ID ="pk_caps_feature_id"; - public static final String KEY_VAR = "var"; - public static final String KEY_NODE_VER = "nodeVer"; - - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = KEY_ID) - private long id; - - @ColumnInfo(name = KEY_VAR) - private String var; - - @ColumnInfo(name = KEY_NODE_VER) - private String nodeVer; - - @Override - public long getId() { - return id; - } - - @Override - public void setId(long id) { - this.id = id; - } - - @Override - public String getVar() { - return var; - } - - @Override - public void setVar(String var) { - this.var = var; - } - - @Override - public String getNodeVer() { - return nodeVer; - } - - @Override - public void setNodeVer(String nodeVer) { - this.nodeVer = nodeVer; - } -} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsIdentityModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsIdentityModel.java deleted file mode 100644 index 6852218..0000000 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsIdentityModel.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.mercury_im.messenger.persistence.room.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Index; -import androidx.room.PrimaryKey; - -import org.mercury_im.messenger.persistence.model.EntityCapsIdentityModel; - -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.KEY_CATEGORY; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.KEY_ID; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.KEY_NAME; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.KEY_NODE_VER; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.KEY_TYPE; -import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel.TABLE; - -@Entity(tableName = TABLE, - indices = { - @Index(KEY_ID), - @Index(KEY_NODE_VER), - @Index(value = { - KEY_NODE_VER, - KEY_CATEGORY, - KEY_TYPE, - KEY_NAME}, - unique = true) - }) -public class RoomEntityCapsIdentityModel implements EntityCapsIdentityModel { - - public static final String TABLE = "caps_identities"; - public static final String KEY_ID = "pk_caps_identity_id"; - public static final String KEY_CATEGORY = "category"; - public static final String KEY_TYPE = "type"; - public static final String KEY_NAME = "name"; - public static final String KEY_NODE_VER = "nodeVer"; - - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = KEY_ID) - private long id; - - @ColumnInfo(name = KEY_CATEGORY) - private String category; - - @ColumnInfo(name = KEY_TYPE) - private String type; - - @ColumnInfo(name = KEY_NAME) - private String name; - - @ColumnInfo(name = KEY_NODE_VER) - private String nodeVer; - - @Override - public long getId() { - return id; - } - - @Override - public void setId(long id) { - this.id = id; - } - - @Override - public String getCategory() { - return category; - } - - @Override - public void setCategory(String category) { - this.category = category; - } - - @Override - public String getType() { - return type; - } - - @Override - public void setType(String type) { - this.type = type; - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(String name) { - this.name = name; - } - - @Override - public String getNodeVer() { - return nodeVer; - } - - @Override - public void setNodeVer(String nodeVer) { - this.nodeVer = nodeVer; - } - -} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsModel.java new file mode 100644 index 0000000..a712960 --- /dev/null +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityCapsModel.java @@ -0,0 +1,51 @@ +package org.mercury_im.messenger.persistence.room.model; + +import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import org.mercury_im.messenger.persistence.model.EntityCapsModel; + +import static org.mercury_im.messenger.persistence.room.model.RoomEntityCapsModel.TABLE; + +@Entity(tableName = TABLE) +public class RoomEntityCapsModel implements EntityCapsModel { + + public static final String TABLE = "entity_caps"; + public static final String KEY_NODE_VER = "pk_node_ver"; + public static final String KEY_XML = "xml"; + + @PrimaryKey + @NonNull + @ColumnInfo(name = KEY_NODE_VER, index = true) + private String nodeVer; + + @ColumnInfo(name = KEY_XML) + private String xml; + + public RoomEntityCapsModel(@NonNull String nodeVer) { + this.nodeVer = nodeVer; + } + + @Override + @NonNull + public String getNodeVer() { + return nodeVer; + } + + @Override + public void setNodeVer(@NonNull String nodeVer) { + this.nodeVer = nodeVer; + } + + @Override + public String getXml() { + return xml; + } + + @Override + public void setXml(String xml) { + this.xml = xml; + } +} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IEntityCapsRepository.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IEntityCapsRepository.java index 6c90d6c..6ce9d86 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IEntityCapsRepository.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IEntityCapsRepository.java @@ -1,10 +1,10 @@ package org.mercury_im.messenger.persistence.room.repository; +import androidx.annotation.NonNull; + import org.mercury_im.messenger.persistence.repository.EntityCapsRepository; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsFeatureDao; -import org.mercury_im.messenger.persistence.room.dao.EntityCapsIdentityDao; -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsFeatureModel; -import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsIdentityModel; +import org.mercury_im.messenger.persistence.room.dao.EntityCapsDao; +import org.mercury_im.messenger.persistence.room.model.RoomEntityCapsModel; import java.util.List; @@ -14,46 +14,37 @@ import io.reactivex.Completable; import io.reactivex.Single; -public class IEntityCapsRepository implements EntityCapsRepository { +public class IEntityCapsRepository implements EntityCapsRepository { - private final EntityCapsIdentityDao identityDao; - private final EntityCapsFeatureDao featureDao; + private final EntityCapsDao dao; @Inject - public IEntityCapsRepository(EntityCapsIdentityDao identityDao, - EntityCapsFeatureDao featureDao) { - this.identityDao = identityDao; - this.featureDao = featureDao; + public IEntityCapsRepository(EntityCapsDao dao) { + this.dao = dao; } @Override - public RoomEntityCapsIdentityModel newEntityCapsIdentityModel() { - return new RoomEntityCapsIdentityModel(); + public RoomEntityCapsModel newEntityCapsModel(@NonNull String nodeVer) { + return new RoomEntityCapsModel(nodeVer); } @Override - public RoomEntityCapsFeatureModel newEntityCapsFeatureModel() { - return new RoomEntityCapsFeatureModel(); + public Single> getAllEntityCaps() { + return dao.getAllEntityCaps(); } @Override - public Single> getAllFeatures() { - return featureDao.getAllFeatures(); + public Single getEntityCapsForNodeVer(String nodeVer) { + return dao.getEntityCapsForNodeVer(nodeVer); } @Override - public Completable insertFeatures(List features) { - return featureDao.insert(features); + public Completable insertOrReplaceEntityCaps(RoomEntityCapsModel... entityCaps) { + return dao.insert(entityCaps); } @Override - public Single> getAllIdentities() { - return identityDao.getAllIdentities(); - } - - @Override - public Completable insertIdentities(List identities) { - return identityDao.insert(identities); + public Completable deleteOrReplaceEntityCaps(RoomEntityCapsModel... entityCaps) { + return dao.delete(entityCaps); } } diff --git a/persistence/build.gradle b/persistence/build.gradle index ae975dc..aab9d1c 100644 --- a/persistence/build.gradle +++ b/persistence/build.gradle @@ -9,7 +9,7 @@ dependencies { } // RxJava2 - implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" + api "io.reactivex.rxjava2:rxjava:$rxJava2Version" // Dagger 2 for dependency injection implementation "com.google.dagger:dagger:$daggerVersion" diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsFeatureModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsFeatureModel.java deleted file mode 100644 index fd4f5be..0000000 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsFeatureModel.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mercury_im.messenger.persistence.model; - -public interface EntityCapsFeatureModel { - - long getId(); - - void setId(long id); - - String getVar(); - - void setVar(String var); - - String getNodeVer(); - - void setNodeVer(String nodeVer); -} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsIdentityModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsIdentityModel.java deleted file mode 100644 index 9580360..0000000 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsIdentityModel.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.mercury_im.messenger.persistence.model; - -public interface EntityCapsIdentityModel { - - long getId(); - - void setId(long id); - - String getCategory(); - - void setCategory(String category); - - String getType(); - - void setType(String type); - - String getName(); - - void setName(String name); - - String getLanguage(); - - void setLanguage(String lang); - - String getNodeVer(); - - void setNodeVer(String nodeVer); -} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsModel.java new file mode 100644 index 0000000..2546bb6 --- /dev/null +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityCapsModel.java @@ -0,0 +1,12 @@ +package org.mercury_im.messenger.persistence.model; + +public interface EntityCapsModel { + + String getNodeVer(); + + void setNodeVer(String nodeVer); + + String getXml(); + + void setXml(String xml); +} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java index 84c48a3..e2da76d 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java @@ -1,26 +1,21 @@ package org.mercury_im.messenger.persistence.repository; -import org.mercury_im.messenger.persistence.model.EntityCapsFeatureModel; -import org.mercury_im.messenger.persistence.model.EntityCapsIdentityModel; +import org.mercury_im.messenger.persistence.model.EntityCapsModel; import java.util.List; import io.reactivex.Completable; import io.reactivex.Single; -public interface EntityCapsRepository< - I extends EntityCapsIdentityModel, - F extends EntityCapsFeatureModel> { +public interface EntityCapsRepository { - I newEntityCapsIdentityModel(); + E newEntityCapsModel(String nodeVer); - F newEntityCapsFeatureModel(); + Single> getAllEntityCaps(); - Single> getAllFeatures(); + Single getEntityCapsForNodeVer(String nodeVer); - Completable insertFeatures(List features); + Completable insertOrReplaceEntityCaps(E... entityCaps); - Single> getAllIdentities(); - - Completable insertIdentities(List identities); + Completable deleteOrReplaceEntityCaps(E... entityCaps); }