Fix duplicates from inserting

This commit is contained in:
Paul Schaub 2019-12-21 16:30:14 +01:00
parent 687288e697
commit 7905693fc7
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
40 changed files with 190 additions and 115 deletions

View file

@ -14,6 +14,8 @@ import androidx.core.app.NotificationManagerCompat;
import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.chat.DirectChat;
import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.chat.ChatActivity;
import java.util.UUID;
public class Notifications { public class Notifications {
public static final String NOTIFICATION_CHANNEL__FOREGROUND_SERVICE = "foreground_service"; public static final String NOTIFICATION_CHANNEL__FOREGROUND_SERVICE = "foreground_service";
@ -62,7 +64,7 @@ public class Notifications {
public static int directChatMessageReceived(Context context, DirectChat chat, String contactName, String body) { public static int directChatMessageReceived(Context context, DirectChat chat, String contactName, String body) {
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
int id = (int) chat.getId(); UUID id = chat.getId();
Intent tapAction = new Intent(context, ChatActivity.class); Intent tapAction = new Intent(context, ChatActivity.class);
tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
@ -78,9 +80,9 @@ public class Notifications {
builder.setContentIntent(pendingIntent); builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true); builder.setAutoCancel(true);
notificationManagerCompat.notify(id, builder.build()); notificationManagerCompat.notify(id.hashCode(), builder.build());
return id; return id.hashCode();
} }
} }

View file

@ -149,7 +149,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito
case R.id.password: case R.id.password:
if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) { if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) {
viewModel.login(); //viewModel.login();
return true; return true;
} }
} }

View file

@ -19,6 +19,8 @@ import org.jxmpp.jid.impl.JidCreate;
import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.MercuryImApplication;
import org.mercury_im.messenger.R; import org.mercury_im.messenger.R;
import java.util.UUID;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
@ -44,7 +46,7 @@ public class ChatActivity extends AppCompatActivity
private EntityBareJid jid; private EntityBareJid jid;
private long accountId; private UUID accountId;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -72,7 +74,7 @@ public class ChatActivity extends AppCompatActivity
jid = JidCreate.entityBareFromOrThrowUnchecked(jidString); jid = JidCreate.entityBareFromOrThrowUnchecked(jidString);
// JID will never change, so just set it once // JID will never change, so just set it once
getSupportActionBar().setSubtitle(jid.asUnescapedString()); getSupportActionBar().setSubtitle(jid.asUnescapedString());
accountId = savedInstanceState.getLong(EXTRA_ACCOUNT); accountId = UUID.fromString(savedInstanceState.getString(EXTRA_ACCOUNT));
chatViewModel = new ViewModelProvider(this).get(ChatViewModel.class); chatViewModel = new ViewModelProvider(this).get(ChatViewModel.class);
chatViewModel.init(accountId, jid); chatViewModel.init(accountId, jid);
@ -144,7 +146,7 @@ public class ChatActivity extends AppCompatActivity
@Override @Override
protected void onSaveInstanceState(@NonNull Bundle outState) { protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString(EXTRA_JID, jid.toString()); outState.putString(EXTRA_JID, jid.toString());
outState.putLong(EXTRA_ACCOUNT, accountId); outState.putString(EXTRA_ACCOUNT, accountId.toString());
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }

View file

@ -14,6 +14,7 @@ import org.mercury_im.messenger.entity.contact.Peer;
import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.entity.message.Message;
import java.util.List; import java.util.List;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
@ -47,7 +48,7 @@ public class ChatViewModel extends ViewModel {
MercuryImApplication.getApplication().getAppComponent().inject(this); MercuryImApplication.getApplication().getAppComponent().inject(this);
} }
public void init(long accountId, EntityBareJid jid) { public void init(UUID accountId, EntityBareJid jid) {
disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString()) disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString())
.subscribe((Consumer<Peer>) this::init)); .subscribe((Consumer<Peer>) this::init));
} }

View file

@ -74,7 +74,7 @@ public class ContactListRecyclerViewAdapter
Intent intent = new Intent(context, ChatActivity.class); Intent intent = new Intent(context, ChatActivity.class);
intent.putExtra(ChatActivity.EXTRA_JID, address); intent.putExtra(ChatActivity.EXTRA_JID, address);
intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId()); intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId().toString());
context.startActivity(intent); context.startActivity(intent);
}); });

View file

@ -50,8 +50,9 @@ public class RepositoryModule {
ReactiveEntityStore<Persistable> data, ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler,
PeerMapping peerMapping) { PeerMapping peerMapping,
return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping); AccountRepository accountRepository) {
return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping, accountRepository);
} }
@Provides @Provides

View file

@ -25,6 +25,7 @@ public class AccountMapping extends AbstractMapping<Account, AccountModel> {
@Override @Override
public AccountModel mapToModel(Account entity, AccountModel model) { public AccountModel mapToModel(Account entity, AccountModel model) {
model.setId(entity.getId());
model.setAddress(entity.getAddress()); model.setAddress(entity.getAddress());
model.setPassword(entity.getPassword()); model.setPassword(entity.getPassword());
model.setHost(entity.getHost()); model.setHost(entity.getHost());

View file

@ -28,6 +28,7 @@ public class DirectChatMapping extends AbstractMapping<DirectChat, DirectChatMod
@Override @Override
public DirectChatModel mapToModel(DirectChat entity, DirectChatModel model) { public DirectChatModel mapToModel(DirectChat entity, DirectChatModel model) {
model.setId(entity.getId());
model.setPeer(peerMapping.toModel(entity.getPeer(), model.getPeer())); model.setPeer(peerMapping.toModel(entity.getPeer(), model.getPeer()));
return model; return model;
} }

View file

@ -27,6 +27,7 @@ public class PeerMapping extends AbstractMapping<Peer, PeerModel> {
@Override @Override
public PeerModel mapToModel(Peer entity, PeerModel model) { public PeerModel mapToModel(Peer entity, PeerModel model) {
model.setId(entity.getId());
model.setAccount(accountMapping.toModel(entity.getAccount(), model.getAccount())); model.setAccount(accountMapping.toModel(entity.getAccount(), model.getAccount()));
model.setAddress(entity.getAddress()); model.setAddress(entity.getAddress());
model.setName(entity.getName()); model.setName(entity.getName());
@ -40,9 +41,9 @@ public class PeerMapping extends AbstractMapping<Peer, PeerModel> {
@Override @Override
public Peer mapToEntity(PeerModel model, Peer entity) { public Peer mapToEntity(PeerModel model, Peer entity) {
entity.setId(model.getId());
entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount())); entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount()));
entity.setAddress(model.getAddress()); entity.setAddress(model.getAddress());
entity.setId(model.getId());
entity.setSubscriptionDirection(model.getSubscriptionDirection()); entity.setSubscriptionDirection(model.getSubscriptionDirection());
entity.setSubscriptionPending(model.isSubscriptionPending()); entity.setSubscriptionPending(model.isSubscriptionPending());

View file

@ -1,19 +1,23 @@
package org.mercury_im.messenger.data.model; package org.mercury_im.messenger.data.model;
import java.util.UUID;
import io.requery.Column; import io.requery.Column;
import io.requery.Convert;
import io.requery.Entity; import io.requery.Entity;
import io.requery.Generated; import io.requery.Generated;
import io.requery.Key; import io.requery.Key;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.Table; import io.requery.Table;
import io.requery.converter.UUIDConverter;
@Table(name = "accounts") @Table(name = "accounts")
@Entity @Entity
public abstract class AbstractAccountModel implements Persistable { public abstract class AbstractAccountModel implements Persistable {
@Key @Key
@Generated @Convert(UUIDConverter.class)
long id; UUID id;
@Column(nullable = false) @Column(nullable = false)
String address; String address;

View file

@ -1,5 +1,9 @@
package org.mercury_im.messenger.data.model; package org.mercury_im.messenger.data.model;
import java.util.UUID;
import io.requery.CascadeAction;
import io.requery.Convert;
import io.requery.Entity; import io.requery.Entity;
import io.requery.ForeignKey; import io.requery.ForeignKey;
import io.requery.Generated; import io.requery.Generated;
@ -7,15 +11,17 @@ import io.requery.Key;
import io.requery.OneToOne; import io.requery.OneToOne;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.Table; import io.requery.Table;
import io.requery.converter.UUIDConverter;
@Entity @Entity
@Table(name = "chats") @Table(name = "chats")
public abstract class AbstractDirectChatModel implements Persistable { public abstract class AbstractDirectChatModel implements Persistable {
@Key @Generated @Key
long id; @Convert(UUIDConverter.class)
UUID id;
@OneToOne @OneToOne(cascade = CascadeAction.NONE)
@ForeignKey(referencedColumn = "id") @ForeignKey(referencedColumn = "id")
PeerModel peer; PeerModel peer;

View file

@ -1,19 +1,24 @@
package org.mercury_im.messenger.data.model; package org.mercury_im.messenger.data.model;
import java.util.UUID;
import io.requery.Column; import io.requery.Column;
import io.requery.Convert;
import io.requery.Entity; import io.requery.Entity;
import io.requery.Generated; import io.requery.Generated;
import io.requery.Key; import io.requery.Key;
import io.requery.ManyToOne; import io.requery.ManyToOne;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.Table; import io.requery.Table;
import io.requery.converter.UUIDConverter;
@Entity @Entity
@Table(name = "groupchats") @Table(name = "groupchats")
public abstract class AbstractGroupChatModel implements Persistable { public abstract class AbstractGroupChatModel implements Persistable {
@Key @Generated @Key
long id; @Convert(UUIDConverter.class)
UUID id;
@Column(nullable = false) @Column(nullable = false)
@ManyToOne @ManyToOne

View file

@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.message.MessageDirection;
import java.util.Date; import java.util.Date;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import io.requery.Column; import io.requery.Column;
import io.requery.Convert; import io.requery.Convert;
@ -14,13 +15,15 @@ import io.requery.Key;
import io.requery.OneToMany; import io.requery.OneToMany;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.Table; import io.requery.Table;
import io.requery.converter.UUIDConverter;
@Entity @Entity
@Table(name = "messages") @Table(name = "messages")
public abstract class AbstractMessageModel implements Persistable { public abstract class AbstractMessageModel implements Persistable {
@Key @Generated @Key
long id; @Convert(UUIDConverter.class)
UUID id;
@Column(nullable = false) @Column(nullable = false)
String sender; String sender;

View file

@ -3,6 +3,9 @@ package org.mercury_im.messenger.data.model;
import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter;
import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import org.mercury_im.messenger.entity.contact.SubscriptionDirection;
import java.util.UUID;
import io.requery.CascadeAction;
import io.requery.Column; import io.requery.Column;
import io.requery.Convert; import io.requery.Convert;
import io.requery.Entity; import io.requery.Entity;
@ -11,16 +14,19 @@ import io.requery.Generated;
import io.requery.Key; import io.requery.Key;
import io.requery.ManyToOne; import io.requery.ManyToOne;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.ReferentialAction;
import io.requery.Table; import io.requery.Table;
import io.requery.converter.UUIDConverter;
@Entity @Entity
@Table(name = "contacts") @Table(name = "contacts")
public abstract class AbstractPeerModel implements Persistable { public abstract class AbstractPeerModel implements Persistable {
@Key @Generated @Key
long id; @Convert(UUIDConverter.class)
UUID id;
@ManyToOne @ManyToOne(cascade = CascadeAction.NONE)
@ForeignKey(referencedColumn = "id") @ForeignKey(referencedColumn = "id")
AccountModel account; AccountModel account;

View file

@ -10,6 +10,7 @@ import org.mercury_im.messenger.util.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -52,7 +53,7 @@ public class XmppAccountRepository
} }
@Override @Override
public Observable<Optional<Account>> observeAccount(long accountId) { public Observable<Optional<Account>> observeAccount(UUID accountId) {
return dao.get(accountId).observableResult() return dao.get(accountId).observableResult()
.map(ResultDelegate::firstOrNull) .map(ResultDelegate::firstOrNull)
.map(accountMapping::toEntity) .map(accountMapping::toEntity)
@ -62,7 +63,7 @@ public class XmppAccountRepository
} }
@Override @Override
public Maybe<Account> getAccount(long accountId) { public Maybe<Account> getAccount(UUID accountId) {
return dao.get(accountId).maybe() return dao.get(accountId).maybe()
.map(accountMapping::toEntity) .map(accountMapping::toEntity)
.subscribeOn(subscriberScheduler()) .subscribeOn(subscriberScheduler())

View file

@ -11,6 +11,7 @@ import org.mercury_im.messenger.util.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -57,7 +58,7 @@ public class XmppDirectChatRepository
} }
@Override @Override
public Observable<Optional<DirectChat>> observeDirectChat(long chatId) { public Observable<Optional<DirectChat>> observeDirectChat(UUID chatId) {
return dao.get(chatId).observableResult() return dao.get(chatId).observableResult()
.map(ResultDelegate::firstOrNull) .map(ResultDelegate::firstOrNull)
.map(directChatMapping::toEntity) .map(directChatMapping::toEntity)
@ -67,7 +68,7 @@ public class XmppDirectChatRepository
} }
@Override @Override
public Maybe<DirectChat> getDirectChat(long chatId) { public Maybe<DirectChat> getDirectChat(UUID chatId) {
return dao.get(chatId).maybe() return dao.get(chatId).maybe()
.map(directChatMapping::toEntity) .map(directChatMapping::toEntity)
.subscribeOn(subscriberScheduler()) .subscribeOn(subscriberScheduler())
@ -77,12 +78,13 @@ public class XmppDirectChatRepository
@Override @Override
public Single<DirectChat> getOrCreateChatWithPeer(Peer peer) { public Single<DirectChat> getOrCreateChatWithPeer(Peer peer) {
return getDirectChatByPeer(peer) return getDirectChatByPeer(peer)
.switchIfEmpty(insertDirectChat(new IDirectChat(){ .switchIfEmpty(Single.just(new IDirectChat())
{ .map(chat -> {
setAccount(peer.getAccount()); chat.setAccount(peer.getAccount());
setPeer(peer); chat.setPeer(peer);
} return chat;
})) })
.flatMap(this::insertDirectChat))
.subscribeOn(subscriberScheduler()) .subscribeOn(subscriberScheduler())
.observeOn(observerScheduler()); .observeOn(observerScheduler());
} }

View file

@ -11,6 +11,7 @@ import org.mercury_im.messenger.util.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -54,7 +55,7 @@ public class XmppGroupChatRepository
} }
@Override @Override
public Observable<Optional<GroupChat>> observeGroupChat(long chatId) { public Observable<Optional<GroupChat>> observeGroupChat(UUID chatId) {
return dao.get(chatId).observableResult() return dao.get(chatId).observableResult()
.map(ResultDelegate::firstOrNull) .map(ResultDelegate::firstOrNull)
.map(groupChatMapping::toEntity) .map(groupChatMapping::toEntity)
@ -64,7 +65,7 @@ public class XmppGroupChatRepository
} }
@Override @Override
public Maybe<GroupChat> getGroupChat(long chatId) { public Maybe<GroupChat> getGroupChat(UUID chatId) {
return dao.get(chatId).maybe() return dao.get(chatId).maybe()
.map(groupChatMapping::toEntity) .map(groupChatMapping::toEntity)
.subscribeOn(subscriberScheduler()) .subscribeOn(subscriberScheduler())
@ -87,7 +88,7 @@ public class XmppGroupChatRepository
} }
@Override @Override
public Observable<Optional<GroupChat>> observeGroupChatByRoomAddress(long accountId, String roomAddress) { public Observable<Optional<GroupChat>> observeGroupChatByRoomAddress(UUID accountId, String roomAddress) {
return dao.get(accountId, roomAddress).observableResult() return dao.get(accountId, roomAddress).observableResult()
.map(ResultDelegate::firstOrNull) .map(ResultDelegate::firstOrNull)
.map(groupChatMapping::toEntity) .map(groupChatMapping::toEntity)
@ -97,7 +98,7 @@ public class XmppGroupChatRepository
} }
@Override @Override
public Maybe<GroupChat> getGroupChatByRoomAddress(long accountId, String roomAddress) { public Maybe<GroupChat> getGroupChatByRoomAddress(UUID accountId, String roomAddress) {
return dao.get(accountId, roomAddress).maybe() return dao.get(accountId, roomAddress).maybe()
.map(groupChatMapping::toEntity) .map(groupChatMapping::toEntity)
.subscribeOn(subscriberScheduler()) .subscribeOn(subscriberScheduler())

View file

@ -13,6 +13,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -30,8 +31,7 @@ public class XmppPeerRepository
extends RequeryRepository extends RequeryRepository
implements PeerRepository { implements PeerRepository {
@Inject private final AccountRepository accountRepository;
AccountRepository accountRepository;
private final PeerMapping peerMapping; private final PeerMapping peerMapping;
@ -39,9 +39,10 @@ public class XmppPeerRepository
public XmppPeerRepository(ReactiveEntityStore<Persistable> data, public XmppPeerRepository(ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler,
PeerMapping peerMapping) { PeerMapping peerMapping, AccountRepository accountRepository) {
super(data, subscriberScheduler, observerScheduler); super(data, subscriberScheduler, observerScheduler);
this.peerMapping = peerMapping; this.peerMapping = peerMapping;
this.accountRepository = accountRepository;
} }
@Override @Override
@ -53,7 +54,7 @@ public class XmppPeerRepository
} }
@Override @Override
public Observable<Optional<Peer>> observePeer(long peerId) { public Observable<Optional<Peer>> observePeer(UUID peerId) {
return data().select(PeerModel.class) return data().select(PeerModel.class)
.where(PeerModel.ID.eq(peerId)) .where(PeerModel.ID.eq(peerId))
.get().observableResult() .get().observableResult()
@ -63,7 +64,7 @@ public class XmppPeerRepository
} }
@Override @Override
public Maybe<Peer> getPeer(long peerId) { public Maybe<Peer> getPeer(UUID peerId) {
return data().select(PeerModel.class) return data().select(PeerModel.class)
.where(PeerModel.ID.eq(peerId)) .where(PeerModel.ID.eq(peerId))
.get().maybe() .get().maybe()
@ -73,7 +74,7 @@ public class XmppPeerRepository
} }
@Override @Override
public Observable<Optional<Peer>> observePeerByAddress(long accountId, String address) { public Observable<Optional<Peer>> observePeerByAddress(UUID accountId, String address) {
return data().select(PeerModel.class) return data().select(PeerModel.class)
.where(PeerModel.ACCOUNT_ID.eq(accountId)) .where(PeerModel.ACCOUNT_ID.eq(accountId))
.and(PeerModel.ADDRESS.eq(address)) .and(PeerModel.ADDRESS.eq(address))
@ -86,13 +87,13 @@ public class XmppPeerRepository
} }
@Override @Override
public Single<Peer> getOrCreatePeer(long accountId, String address) { public Single<Peer> getOrCreatePeer(UUID accountId, String address) {
return accountRepository.getAccount(accountId).toSingle() return accountRepository.getAccount(accountId).toSingle()
.flatMap(account -> getOrCreatePeer(account, address)); .flatMap(account -> getOrCreatePeer(account, address));
} }
@Override @Override
public Maybe<Peer> getPeerByAddress(long accountId, String address) { public Maybe<Peer> getPeerByAddress(UUID accountId, String address) {
return data().select(PeerModel.class) return data().select(PeerModel.class)
.where(PeerModel.ACCOUNT_ID.eq(accountId)) .where(PeerModel.ACCOUNT_ID.eq(accountId))
.and(PeerModel.ADDRESS.eq(address)) .and(PeerModel.ADDRESS.eq(address))
@ -134,7 +135,7 @@ public class XmppPeerRepository
} }
@Override @Override
public Observable<List<Peer>> observeAllContactsOfAccount(long accountId) { public Observable<List<Peer>> observeAllContactsOfAccount(UUID accountId) {
return data().select(PeerModel.class) return data().select(PeerModel.class)
.where(PeerModel.ACCOUNT_ID.eq(accountId)) .where(PeerModel.ACCOUNT_ID.eq(accountId))
.and(PeerModel.SUBSCRIPTION_DIRECTION.in( .and(PeerModel.SUBSCRIPTION_DIRECTION.in(
@ -194,7 +195,7 @@ public class XmppPeerRepository
} }
@Override @Override
public Completable deletePeer(long accountId, String address) { public Completable deletePeer(UUID accountId, String address) {
return null; return null;
} }
} }

View file

@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao;
import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.model.AccountModel;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import io.reactivex.Single; import io.reactivex.Single;
@ -20,7 +22,7 @@ public class AccountDao extends RequeryDao {
return data().insert(account); return data().insert(account);
} }
public ReactiveResult<AccountModel> get(long accountId) { public ReactiveResult<AccountModel> get(UUID accountId) {
return data().select(AccountModel.class) return data().select(AccountModel.class)
.where(AccountModel.ID.eq(accountId)) .where(AccountModel.ID.eq(accountId))
.get(); .get();
@ -37,7 +39,7 @@ public class AccountDao extends RequeryDao {
.get(); .get();
} }
public Single<Integer> delete(long accountId) { public Single<Integer> delete(UUID accountId) {
return data().delete(AccountModel.class) return data().delete(AccountModel.class)
.where(AccountModel.ID.eq(accountId)) .where(AccountModel.ID.eq(accountId))
.get().single(); .get().single();

View file

@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao;
import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.data.model.DirectChatModel;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import io.reactivex.Single; import io.reactivex.Single;
@ -20,13 +22,13 @@ public class DirectChatDao extends RequeryDao {
return data().insert(chat); return data().insert(chat);
} }
public ReactiveResult<DirectChatModel> get(long chatId) { public ReactiveResult<DirectChatModel> get(UUID chatId) {
return data().select(DirectChatModel.class) return data().select(DirectChatModel.class)
.where(DirectChatModel.ID.eq(chatId)) .where(DirectChatModel.ID.eq(chatId))
.get(); .get();
} }
public ReactiveResult<DirectChatModel> getByPeer(long peerId) { public ReactiveResult<DirectChatModel> getByPeer(UUID peerId) {
return data().select(DirectChatModel.class) return data().select(DirectChatModel.class)
.where(DirectChatModel.PEER_ID.eq(peerId)) .where(DirectChatModel.PEER_ID.eq(peerId))
.get(); .get();
@ -37,7 +39,7 @@ public class DirectChatDao extends RequeryDao {
.get(); .get();
} }
public Single<Integer> delete(long chatId) { public Single<Integer> delete(UUID chatId) {
return data().delete(DirectChatModel.class) return data().delete(DirectChatModel.class)
.where(DirectChatModel.ID.eq(chatId)) .where(DirectChatModel.ID.eq(chatId))
.get() .get()

View file

@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao;
import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.model.GroupChatModel;
import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import io.reactivex.Single; import io.reactivex.Single;
@ -20,13 +22,13 @@ public class GroupChatDao extends RequeryDao {
return data().insert(chat); return data().insert(chat);
} }
public ReactiveResult<GroupChatModel> get(long chatId) { public ReactiveResult<GroupChatModel> get(UUID chatId) {
return data().select(GroupChatModel.class) return data().select(GroupChatModel.class)
.where(GroupChatModel.ID.eq(chatId)) .where(GroupChatModel.ID.eq(chatId))
.get(); .get();
} }
public ReactiveResult<GroupChatModel> get(long accountId, String address) { public ReactiveResult<GroupChatModel> get(UUID accountId, String address) {
return data().select(GroupChatModel.class) return data().select(GroupChatModel.class)
.where(GroupChatModel.ACCOUNT_ID.eq(accountId)) .where(GroupChatModel.ACCOUNT_ID.eq(accountId))
.and(GroupChatModel.ADDRESS.eq(address)) .and(GroupChatModel.ADDRESS.eq(address))
@ -38,7 +40,7 @@ public class GroupChatDao extends RequeryDao {
.get(); .get();
} }
public Single<Integer> delete(long chatId) { public Single<Integer> delete(UUID chatId) {
return data().delete(GroupChatModel.class) return data().delete(GroupChatModel.class)
.where(GroupChatModel.ID.eq(chatId)) .where(GroupChatModel.ID.eq(chatId))
.get() .get()

View file

@ -6,6 +6,8 @@ import org.mercury_im.messenger.data.model.GroupChatModel;
import org.mercury_im.messenger.data.model.GroupMessagesRelation; import org.mercury_im.messenger.data.model.GroupMessagesRelation;
import org.mercury_im.messenger.data.model.MessageModel; import org.mercury_im.messenger.data.model.MessageModel;
import java.util.UUID;
import io.reactivex.Single; import io.reactivex.Single;
import io.requery.Persistable; import io.requery.Persistable;
import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveEntityStore;
@ -26,7 +28,7 @@ public class MessageDao extends RequeryDao {
return data().insert(message); return data().insert(message);
} }
public ReactiveResult<MessageModel> get(long messageId) { public ReactiveResult<MessageModel> get(UUID messageId) {
return data().select(MessageModel.class) return data().select(MessageModel.class)
.where(MessageModel.ID.eq(messageId)) .where(MessageModel.ID.eq(messageId))
.get(); .get();

View file

@ -25,13 +25,11 @@ public class AccountMappingTest {
static { static {
ACCOUNT_MISSION_CONTROL = new IAccount(); ACCOUNT_MISSION_CONTROL = new IAccount();
ACCOUNT_MISSION_CONTROL.setId(1);
ACCOUNT_MISSION_CONTROL.setAddress("mission-controll@planet.earth"); ACCOUNT_MISSION_CONTROL.setAddress("mission-controll@planet.earth");
ACCOUNT_MISSION_CONTROL.setEnabled(true); ACCOUNT_MISSION_CONTROL.setEnabled(true);
ACCOUNT_MISSION_CONTROL.setPassword("notBecauseTheyAreEasy"); ACCOUNT_MISSION_CONTROL.setPassword("notBecauseTheyAreEasy");
ACCOUNT_LITTLE_JOE = new IAccount(); ACCOUNT_LITTLE_JOE = new IAccount();
ACCOUNT_LITTLE_JOE.setId(2);
ACCOUNT_LITTLE_JOE.setAddress("little-joe@planet.earth"); ACCOUNT_LITTLE_JOE.setAddress("little-joe@planet.earth");
ACCOUNT_LITTLE_JOE.setEnabled(false); ACCOUNT_LITTLE_JOE.setEnabled(false);
ACCOUNT_LITTLE_JOE.setPassword("butBecauseTheyAreHard"); ACCOUNT_LITTLE_JOE.setPassword("butBecauseTheyAreHard");
@ -47,7 +45,7 @@ public class AccountMappingTest {
AccountModel model = accountMapping.toModel(ACCOUNT_MISSION_CONTROL); AccountModel model = accountMapping.toModel(ACCOUNT_MISSION_CONTROL);
assertEquals("Since we cannot set the id of the model in the mapper, it is still 0.", assertEquals("Since we cannot set the id of the model in the mapper, it is still 0.",
0, model.getId()); ACCOUNT_MISSION_CONTROL.getId(), model.getId());
assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId());
assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress()); assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress());
assertEquals(ACCOUNT_MISSION_CONTROL.getPassword(), model.getPassword()); assertEquals(ACCOUNT_MISSION_CONTROL.getPassword(), model.getPassword());
@ -62,22 +60,10 @@ public class AccountMappingTest {
model.setEnabled(true); model.setEnabled(true);
model.setPassword("12345"); model.setPassword("12345");
// I hate reflections... Set ID to 12
setIdUsingReflections(model, 12L);
assertEquals(12L, model.getId());
Account entity = accountMapping.toEntity(model); Account entity = accountMapping.toEntity(model);
assertEquals(model.getId(), entity.getId()); assertEquals(model.getId(), entity.getId());
assertEquals(model.getAddress(), entity.getAddress()); assertEquals(model.getAddress(), entity.getAddress());
assertEquals(model.getPassword(), entity.getPassword()); assertEquals(model.getPassword(), entity.getPassword());
} }
private void setIdUsingReflections(AccountModel model, long id) throws NoSuchFieldException, IllegalAccessException {
Field field = model.getClass().getDeclaredField("$proxy");
field.setAccessible(true);
EntityProxy<AccountModel> proxy = (EntityProxy<AccountModel>) field.get(model);
proxy.set(AccountModel.ID, id);
}
} }

View file

@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.model.AccountModel;
import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.data.model.PeerModel;
import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.IPeer;
import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.Peer;
import org.mercury_im.messenger.entity.contact.SubscriptionDirection;
import javax.inject.Inject; import javax.inject.Inject;
@ -21,10 +22,9 @@ public class PeerMappingTest {
static { static {
PEER_GORDO = new IPeer(); PEER_GORDO = new IPeer();
PEER_GORDO.setAccount(AccountMappingTest.ACCOUNT_MISSION_CONTROL); PEER_GORDO.setAccount(AccountMappingTest.ACCOUNT_MISSION_CONTROL);
PEER_GORDO.setId(1);
PEER_GORDO.setAddress("gordo@big.joe"); PEER_GORDO.setAddress("gordo@big.joe");
PEER_GORDO.setName("Gordo"); PEER_GORDO.setName("Gordo");
PEER_GORDO.setSubscriptionDirection(SubscriptionMode.TO_THEM_ACCEPTED_PREAPPROVED); PEER_GORDO.setSubscriptionDirection(SubscriptionDirection.both);
} }
public PeerMappingTest() { public PeerMappingTest() {

View file

@ -53,7 +53,6 @@ public class AccountRepositoryTest {
d.add(accountRepository.insertAccount(a1).subscribe()); d.add(accountRepository.insertAccount(a1).subscribe());
Thread.sleep(100); Thread.sleep(100);
a1.setId(1);
Account a2 = new IAccount(); Account a2 = new IAccount();
a2.setAddress("a2@example.com"); a2.setAddress("a2@example.com");

View file

@ -12,6 +12,7 @@ import org.mercury_im.messenger.xmpp.MercuryConnection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -22,7 +23,7 @@ public class Messenger implements ClientStateListener {
public static final String TAG = "MercuryIM"; public static final String TAG = "MercuryIM";
private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName()); private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName());
private final Map<Long, MercuryConnection> connections = new HashMap<>(); private final Map<UUID, MercuryConnection> connections = new HashMap<>();
private Repositories repositories; private Repositories repositories;
@Inject @Inject

View file

@ -4,6 +4,7 @@ import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.util.Optional;
import java.util.List; import java.util.List;
import java.util.UUID;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Maybe; import io.reactivex.Maybe;
@ -14,9 +15,9 @@ public interface AccountRepository {
Single<Account> insertAccount(Account account); Single<Account> insertAccount(Account account);
Observable<Optional<Account>> observeAccount(long accountId); Observable<Optional<Account>> observeAccount(UUID accountId);
Maybe<Account> getAccount(long accountId); Maybe<Account> getAccount(UUID accountId);
Observable<Optional<Account>> observeAccountByAddress(String address); Observable<Optional<Account>> observeAccountByAddress(String address);

View file

@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.chat.DirectChat;
import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.Peer;
import java.util.List; import java.util.List;
import java.util.UUID;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Maybe; import io.reactivex.Maybe;
@ -19,9 +20,9 @@ public interface DirectChatRepository {
return observeDirectChat(chat.getId()); return observeDirectChat(chat.getId());
} }
Observable<Optional<DirectChat>> observeDirectChat(long chatId); Observable<Optional<DirectChat>> observeDirectChat(UUID chatId);
Maybe<DirectChat> getDirectChat(long chatId); Maybe<DirectChat> getDirectChat(UUID chatId);
Single<DirectChat> getOrCreateChatWithPeer(Peer peer); Single<DirectChat> getOrCreateChatWithPeer(Peer peer);

View file

@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.chat.GroupChat;
import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.util.Optional;
import java.util.List; import java.util.List;
import java.util.UUID;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Maybe; import io.reactivex.Maybe;
@ -15,9 +16,9 @@ public interface GroupChatRepository {
Single<GroupChat> insertGroupChat(GroupChat chat); Single<GroupChat> insertGroupChat(GroupChat chat);
Observable<Optional<GroupChat>> observeGroupChat(long chatId); Observable<Optional<GroupChat>> observeGroupChat(UUID chatId);
Maybe<GroupChat> getGroupChat(long chatId); Maybe<GroupChat> getGroupChat(UUID chatId);
Single<GroupChat> getOrCreateGroupChat(Account account, String roomAddress); Single<GroupChat> getOrCreateGroupChat(Account account, String roomAddress);
@ -25,13 +26,13 @@ public interface GroupChatRepository {
return observeGroupChatByRoomAddress(account.getId(), roomAddress); return observeGroupChatByRoomAddress(account.getId(), roomAddress);
} }
Observable<Optional<GroupChat>> observeGroupChatByRoomAddress(long accountId, String roomAddress); Observable<Optional<GroupChat>> observeGroupChatByRoomAddress(UUID accountId, String roomAddress);
default Maybe<GroupChat> getGroupChatByRoomAddress(Account account, String roomAddress) { default Maybe<GroupChat> getGroupChatByRoomAddress(Account account, String roomAddress) {
return getGroupChatByRoomAddress(account.getId(), roomAddress); return getGroupChatByRoomAddress(account.getId(), roomAddress);
} }
Maybe<GroupChat> getGroupChatByRoomAddress(long accountId, String roomAddress); Maybe<GroupChat> getGroupChatByRoomAddress(UUID accountId, String roomAddress);
Observable<List<GroupChat>> observeAllGroupChats(); Observable<List<GroupChat>> observeAllGroupChats();

View file

@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.Peer;
import java.util.List; import java.util.List;
import java.util.UUID;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Maybe; import io.reactivex.Maybe;
@ -19,25 +20,25 @@ public interface PeerRepository {
return observePeer(peer.getId()); return observePeer(peer.getId());
} }
Observable<Optional<Peer>> observePeer(long PeerId); Observable<Optional<Peer>> observePeer(UUID PeerId);
Maybe<Peer> getPeer(long PeerId); Maybe<Peer> getPeer(UUID PeerId);
default Observable<Optional<Peer>> observePeerByAddress(Account account, String address) { default Observable<Optional<Peer>> observePeerByAddress(Account account, String address) {
return observePeerByAddress(account.getId(), address); return observePeerByAddress(account.getId(), address);
} }
Observable<Optional<Peer>> observePeerByAddress(long accountId, String address); Observable<Optional<Peer>> observePeerByAddress(UUID accountId, String address);
default Maybe<Peer> getPeerByAddress(Account account, String address) { default Maybe<Peer> getPeerByAddress(Account account, String address) {
return getPeerByAddress(account.getId(), address); return getPeerByAddress(account.getId(), address);
} }
Maybe<Peer> getPeerByAddress(long accountId, String address); Maybe<Peer> getPeerByAddress(UUID accountId, String address);
Single<Peer> getOrCreatePeer(Account account, String address); Single<Peer> getOrCreatePeer(Account account, String address);
Single<Peer> getOrCreatePeer(long accountId, String address); Single<Peer> getOrCreatePeer(UUID accountId, String address);
Observable<List<Peer>> observeAllPeers(); Observable<List<Peer>> observeAllPeers();
@ -45,7 +46,7 @@ public interface PeerRepository {
return observeAllContactsOfAccount(account.getId()); return observeAllContactsOfAccount(account.getId());
} }
Observable<List<Peer>> observeAllContactsOfAccount(long accountId); Observable<List<Peer>> observeAllContactsOfAccount(UUID accountId);
Single<Peer> updatePeer(Peer Peer); Single<Peer> updatePeer(Peer Peer);
@ -53,5 +54,5 @@ public interface PeerRepository {
Completable deletePeer(Peer Peer); Completable deletePeer(Peer Peer);
Completable deletePeer(long accountId, String address); Completable deletePeer(UUID accountId, String address);
} }

View file

@ -39,6 +39,7 @@ public class MercuryRosterStore implements RosterStore {
this.account = account; this.account = account;
this.peerRepository = rosterRepository; this.peerRepository = rosterRepository;
this.accountRepository = accountRepository; this.accountRepository = accountRepository;
LOGGER.log(Level.INFO, "Construct Roster Store for " + account.getId());
} }
public void subscribe() { public void subscribe() {
@ -93,6 +94,10 @@ public class MercuryRosterStore implements RosterStore {
// Update database // Update database
Peer contact = toEntity(item); Peer contact = toEntity(item);
disposable.add(peerRepository.upsertPeer(contact) disposable.add(peerRepository.upsertPeer(contact)
.map(p -> {
LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId());
return p;
})
.subscribe( .subscribe(
success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"),
error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + contact, error) error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + contact, error)
@ -116,6 +121,10 @@ public class MercuryRosterStore implements RosterStore {
for (RosterPacket.Item item : items) { for (RosterPacket.Item item : items) {
Peer model = toEntity(item); Peer model = toEntity(item);
disposable.add(peerRepository.upsertPeer(model) disposable.add(peerRepository.upsertPeer(model)
.map(p -> {
LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId());
return p;
})
.subscribe( .subscribe(
success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"),
error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + model, error) error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + model, error)

View file

@ -1,5 +1,7 @@
package org.mercury_im.messenger.entity; package org.mercury_im.messenger.entity;
import java.util.UUID;
/** /**
* User Account entity. * User Account entity.
* *
@ -7,9 +9,9 @@ package org.mercury_im.messenger.entity;
*/ */
public interface Account { public interface Account {
void setId(long id); void setId(UUID id);
long getId(); UUID getId();
void setAddress(String address); void setAddress(String address);

View file

@ -1,22 +1,27 @@
package org.mercury_im.messenger.entity; package org.mercury_im.messenger.entity;
import java.util.UUID;
public class IAccount implements Account { public class IAccount implements Account {
protected long id; protected UUID id;
protected String address; protected String address;
protected String password; protected String password;
protected String host; protected String host;
protected int port; protected int port;
protected boolean enabled; protected boolean enabled;
@Override public IAccount() {
public void setId(long id) { this.id = UUID.randomUUID();
}
@Override
public void setId(UUID id) {
this.id = id; this.id = id;
} }
@Override @Override
public long getId() { public UUID getId() {
return id; return id;
} }

View file

@ -2,6 +2,8 @@ package org.mercury_im.messenger.entity.chat;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import java.util.UUID;
/** /**
* Generic interface defining shared properties of chats. * Generic interface defining shared properties of chats.
* *
@ -9,9 +11,9 @@ import org.mercury_im.messenger.entity.Account;
*/ */
public interface Chat { public interface Chat {
long getId(); UUID getId();
void setId(long id); void setId(UUID id);
Account getAccount(); Account getAccount();

View file

@ -3,13 +3,19 @@ package org.mercury_im.messenger.entity.chat;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.Peer;
import java.util.UUID;
public class IDirectChat implements DirectChat { public class IDirectChat implements DirectChat {
protected long id; protected UUID id;
protected Peer peer; protected Peer peer;
protected Account account; protected Account account;
protected ChatPreferences preferences; protected ChatPreferences preferences;
public IDirectChat() {
this.id = UUID.randomUUID();
}
@Override @Override
public Peer getPeer() { public Peer getPeer() {
return peer; return peer;
@ -21,12 +27,12 @@ public class IDirectChat implements DirectChat {
} }
@Override @Override
public long getId() { public UUID getId() {
return id; return id;
} }
@Override @Override
public void setId(long id) { public void setId(UUID id) {
this.id = id; this.id = id;
} }

View file

@ -4,16 +4,21 @@ import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.Peer;
import java.util.Set; import java.util.Set;
import java.util.UUID;
public class IGroupChat implements GroupChat { public class IGroupChat implements GroupChat {
private long id; private UUID id;
private Account account; private Account account;
private String roomAddress; private String roomAddress;
private String roomName; private String roomName;
protected ChatPreferences preferences; protected ChatPreferences preferences;
protected Set<Peer> participants; protected Set<Peer> participants;
public IGroupChat() {
this.id = UUID.randomUUID();
}
@Override @Override
public Set<Peer> getParticipants() { public Set<Peer> getParticipants() {
return participants; return participants;
@ -45,12 +50,12 @@ public class IGroupChat implements GroupChat {
} }
@Override @Override
public long getId() { public UUID getId() {
return id; return id;
} }
@Override @Override
public void setId(long id) { public void setId(UUID id) {
this.id = id; this.id = id;
} }

View file

@ -2,9 +2,11 @@ package org.mercury_im.messenger.entity.contact;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import java.util.UUID;
public class IPeer implements Peer { public class IPeer implements Peer {
protected long id; protected UUID id;
protected Account account; protected Account account;
protected String address; protected String address;
protected String name; protected String name;
@ -12,13 +14,17 @@ public class IPeer implements Peer {
protected boolean pending; protected boolean pending;
protected boolean approved; protected boolean approved;
public IPeer() {
this.id = UUID.randomUUID();
}
@Override @Override
public long getId() { public UUID getId() {
return id; return id;
} }
@Override @Override
public void setId(long id) { public void setId(UUID id) {
this.id = id; this.id = id;
} }

View file

@ -2,6 +2,8 @@ package org.mercury_im.messenger.entity.contact;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import java.util.UUID;
/** /**
* Defines a user on the network (eg. a contact, chat partner, group chat member etc). * Defines a user on the network (eg. a contact, chat partner, group chat member etc).
* Basically anyone that may send you a message is a Peer. * Basically anyone that may send you a message is a Peer.
@ -10,9 +12,9 @@ import org.mercury_im.messenger.entity.Account;
*/ */
public interface Peer { public interface Peer {
long getId(); UUID getId();
void setId(long id); void setId(UUID id);
Account getAccount(); Account getAccount();

View file

@ -2,10 +2,11 @@ package org.mercury_im.messenger.entity.message;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
public class IMessage implements Message { public class IMessage implements Message {
protected long id; protected UUID id;
protected String sender; protected String sender;
protected String recipient; protected String recipient;
protected Date timestamp; protected Date timestamp;
@ -16,12 +17,12 @@ public class IMessage implements Message {
@Override @Override
public long getId() { public UUID getId() {
return id; return id;
} }
@Override @Override
public void setId(long id) { public void setId(UUID id) {
this.id = id; this.id = id;
} }

View file

@ -2,12 +2,13 @@ package org.mercury_im.messenger.entity.message;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
public interface Message { public interface Message {
long getId(); UUID getId();
void setId(long id); void setId(UUID id);
String getSender(); String getSender();