Add more modules and entites

This commit is contained in:
Paul Schaub 2019-11-08 00:47:17 +01:00
parent 605fccf18d
commit 4a72937f04
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
60 changed files with 439 additions and 168 deletions

View file

@ -73,7 +73,7 @@ check.configure {
dependencies {
// Depend on the core project for XMPP related stuff
implementation project(':core')
implementation project(':core-old')
implementation "io.requery:requery-android:$requeryVersion"
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41'

1
core-old/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

45
core-old/build.gradle Normal file
View file

@ -0,0 +1,45 @@
apply plugin: 'java-library'
// Add the generated folder to the source directories so that we can work with generated classes
// This is apparently necessary for use with requery.
sourceSets {
main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/"
}
dependencies {
api project(':entity') // Entities
api project(':repository') // Repository
api project(":thread_utils")
// Smack
// Not all of those are needed, but it may be a good idea to define those versions explicitly
api "org.igniterealtime.smack:smack-core:$smackCoreVersion"
api "org.igniterealtime.smack:smack-experimental:$smackExperimentalVersion"
api "org.igniterealtime.smack:smack-extensions:$smackExtensionsVersion"
api "org.igniterealtime.smack:smack-im:$smackImVersion"
api "org.igniterealtime.smack:smack-tcp:$smackTcpVersion"
// api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion"
// api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion"
// api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion"
// api "org.igniterealtime.smack:smack-resolver-minidns:$smackResolverMiniDnsVersion"
// RxJava2
api "io.reactivex.rxjava2:rxjava:$rxJava2Version"
// Dagger 2 for dependency injection
implementation "com.google.dagger:dagger:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
// Requery ORM
api "io.requery:requery:$requeryVersion"
annotationProcessor "io.requery:requery-processor:$requeryVersion"
// JUnit for testing
testImplementation "junit:junit:$junitVersion"
}
sourceCompatibility = "8"
targetCompatibility = "8"

View file

@ -1,42 +1,18 @@
apply plugin: 'java-library'
// Add the generated folder to the source directories so that we can work with generated classes
// This is apparently necessary for use with requery.
sourceSets {
main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/"
}
dependencies {
api project(':entity') // Entities
api project(':repository') // Repository
api project(":thread_utils")
// Smack
// Not all of those are needed, but it may be a good idea to define those versions explicitly
api "org.igniterealtime.smack:smack-core:$smackCoreVersion"
api "org.igniterealtime.smack:smack-experimental:$smackExperimentalVersion"
api "org.igniterealtime.smack:smack-extensions:$smackExtensionsVersion"
api "org.igniterealtime.smack:smack-im:$smackImVersion"
api "org.igniterealtime.smack:smack-tcp:$smackTcpVersion"
// api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion"
// api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion"
// api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion"
// api "org.igniterealtime.smack:smack-resolver-minidns:$smackResolverMiniDnsVersion"
implementation project(':entity')
implementation project(':repository')
implementation project(":thread_utils")
// RxJava2
api "io.reactivex.rxjava2:rxjava:$rxJava2Version"
implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version"
// Dagger 2 for dependency injection
implementation "com.google.dagger:dagger:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
// Requery ORM
api "io.requery:requery:$requeryVersion"
annotationProcessor "io.requery:requery-processor:$requeryVersion"
// JUnit for testing
testImplementation "junit:junit:$junitVersion"
}

View file

@ -0,0 +1,16 @@
package org.mercury_im.core.connection;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.chat.DirectChat;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
import org.mercury_im.messenger.core.entity.message.AbstractMessage;
public interface IncomingDirectMessageListener<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
IL extends Interlocutor<AC, AD>> {
void onIncomingDirectMessage(AC account, DirectChat<IL, AC, AD> chat, AbstractMessage<AD, ?> message);
}

View file

@ -0,0 +1,19 @@
package org.mercury_im.core.connection;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.chat.DirectChat;
import org.mercury_im.messenger.core.entity.chat.GroupChat;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
import org.mercury_im.messenger.core.entity.message.AbstractMessage;
public interface IncomingGroupChatMessageListener<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
RA extends Address.RoomAddress,
PA extends Address.RoomParticipantAddress,
IL extends Interlocutor<AC, AD>> {
void onIncomingDirectMessage(AC account, GroupChat<AC, AD, RA, PA> chat, AbstractMessage<PA, ?> message);
}

View file

@ -1,13 +0,0 @@
package org.mercury_im.messenger.core.entity;
public interface DirectChat<
IL extends Interlocutor<AC, AD>,
AC extends Account<AD, ?>,
AD extends Address.UserAddress>
extends Chat<AC, AD> {
IL getInterlocutor();
void setInterlocutor(IL interlocutor);
}

View file

@ -1,16 +0,0 @@
package org.mercury_im.messenger.core.entity;
public interface GroupChat<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
RA extends Address.RoomAddress>
extends Chat<AC, AD> {
RA getRoomAddress();
void setRoomAddress(RA roomAddress);
String getRoomName();
void setRoomName(String roomName);
}

View file

@ -1,28 +0,0 @@
package org.mercury_im.messenger.core.entity;
/**
* Defines a user on the network (eg. a contact, chat partner etc).
*
* @param <AC> Account Type
* @param <AD> UserAddress Type
*/
public interface Interlocutor<
AC extends Account<AD, ?>,
AD extends Address.UserAddress> {
long getId();
void setId(long id);
AC getAccount();
void setAccount(AC account);
AD getAddress();
void setAddress(AD address);
String getName();
void setName(String name);
}

View file

@ -1,8 +0,0 @@
package org.mercury_im.messenger.core.entity;
public interface MessageContent {
String getBody();
void setBody(String body);
}

View file

@ -1,6 +1,10 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.chat;
public class AbstractDirectChat<
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
public abstract class AbstractDirectChat<
IL extends Interlocutor<AC, AD>,
AC extends Account<AD, ?>,
AD extends Address.UserAddress>
@ -9,6 +13,7 @@ public class AbstractDirectChat<
protected long id;
protected IL interlocutor;
protected AC account;
protected ChatPreferences preferences;
@Override
public IL getInterlocutor() {
@ -39,4 +44,14 @@ public class AbstractDirectChat<
public void setAccount(AC account) {
this.account = account;
}
@Override
public ChatPreferences getChatPreferences() {
return preferences;
}
@Override
public void setChatPreferences(ChatPreferences chatPreferences) {
this.preferences = chatPreferences;
}
}

View file

@ -1,6 +1,9 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.chat;
public class AbstractGroupChat<
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Account;
public abstract class AbstractGroupChat<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
RA extends Address.RoomAddress>
@ -10,6 +13,7 @@ public class AbstractGroupChat<
private AC account;
private RA roomAddress;
private String roomName;
protected ChatPreferences preferences;
@Override
public RA getRoomAddress() {
@ -50,4 +54,16 @@ public class AbstractGroupChat<
public void setAccount(AC account) {
this.account = account;
}
@Override
public ChatPreferences getChatPreferences() {
return preferences;
}
@Override
public void setChatPreferences(ChatPreferences chatPreferences) {
this.preferences = preferences;
}
}

View file

@ -1,4 +1,7 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.chat;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Account;
public interface Chat<
AC extends Account<AD, ?>,

View file

@ -1,4 +1,4 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.chat;
public interface ChatPreferences {

View file

@ -0,0 +1,17 @@
package org.mercury_im.messenger.core.entity.chat;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
public interface DirectChat<
IL extends Interlocutor<AC, AD, AD>,
AC extends Account<AD, ?>,
AD extends Address.UserAddress>
extends Chat<AC, AD> {
IL getInterlocutor();
void setInterlocutor(IL interlocutor);
}

View file

@ -0,0 +1,28 @@
package org.mercury_im.messenger.core.entity.chat;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
import java.util.Set;
public interface GroupChat<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
RA extends Address.RoomAddress,
PA extends Address.RoomParticipantAddress,
IL extends Interlocutor<AC, PA, AD>>
extends Chat<AC, AD> {
Set<IL> getParticipants();
void setParticipants(Set<IL> participants);
RA getRoomAddress();
void setRoomAddress(RA roomAddress);
String getRoomName();
void setRoomName(String roomName);
}

View file

@ -1,13 +1,17 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.contact;
public class AbstractInterlocutor<
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
public abstract class AbstractInterlocutor<
AC extends Account<AD, ?>,
IA extends Address,
AD extends Address.UserAddress>
implements Interlocutor<AC, AD> {
implements Interlocutor<AC, IA, AD> {
protected long id;
protected AC account;
protected AD address;
protected IA address;
protected String name;
@Override
@ -31,12 +35,12 @@ public class AbstractInterlocutor<
}
@Override
public AD getAddress() {
public IA getAddress() {
return address;
}
@Override
public void setAddress(AD address) {
public void setAddress(IA address) {
this.address = address;
}

View file

@ -1,9 +1,12 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.contact;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
public interface Contact<
AC extends Account<AD, ?>,
AD extends Address.UserAddress>
extends Interlocutor<AC, AD> {
extends Interlocutor<AC, AD, AD> {
SubscriptionMode getSubscriptionMode();

View file

@ -0,0 +1,34 @@
package org.mercury_im.messenger.core.entity.contact;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
/**
* Defines a user on the network (eg. a contact, chat partner, group chat member etc).
* Basically anyone that may send you a message is an Interlocutor.
*
* @param <AC> Account Type
* @param <IA> Address type for the Interlocutor
* @param <AD> UserAddress type for the account
*/
public interface Interlocutor<
AC extends Account<AD, ?>,
IA extends Address,
AD extends Address.UserAddress> {
long getId();
void setId(long id);
AC getAccount();
void setAccount(AC account);
IA getAddress();
void setAddress(IA address);
String getName();
void setName(String name);
}

View file

@ -1,14 +1,20 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.message;
import org.mercury_im.messenger.core.entity.Address;
import java.util.Date;
import java.util.List;
public class AbstractMessage<AD extends Address, MM extends MessageMetadata> implements Message<AD, MM> {
public abstract class AbstractMessage<
AD extends Address,
MM extends MessageMetadata>
implements Message<AD, MM> {
protected long id;
protected AD sender;
protected AD recipient;
protected Date timestamp;
protected String body;
protected List<MessagePayload> payloads;
protected MessageDeliveryState deliveryState;
protected MM metadata;
@ -53,13 +59,13 @@ public class AbstractMessage<AD extends Address, MM extends MessageMetadata> imp
}
@Override
public String getBody() {
return body;
public List<MessagePayload> getMessagePayloads() {
return payloads;
}
@Override
public void setBody(String body) {
this.body = body;
public void setMessagePayloads(List<MessagePayload> list) {
this.payloads = list;
}
@Override

View file

@ -1,6 +1,9 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.message;
import org.mercury_im.messenger.core.entity.Address;
import java.util.Date;
import java.util.List;
public interface Message<MA extends Address, MM extends MessageMetadata> {
@ -20,9 +23,9 @@ public interface Message<MA extends Address, MM extends MessageMetadata> {
void setTimestamp(Date timestamp);
String getBody();
List<MessagePayload> getMessagePayloads();
void setBody(String body);
void setMessagePayloads(List<MessagePayload> messagePayloads);
MessageDeliveryState getDeliveryState();

View file

@ -0,0 +1,12 @@
package org.mercury_im.messenger.core.entity.message;
public interface MessageContent {
interface Body extends MessageContent {
String getBody();
void setBody(String body);
}
}

View file

@ -1,4 +1,4 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.message;
public enum MessageDeliveryState {
pending_delivery,

View file

@ -1,4 +1,4 @@
package org.mercury_im.messenger.core.entity;
package org.mercury_im.messenger.core.entity.message;
/**
* Interface to allow additional, protocol specific metadata to be attached to the message.

View file

@ -0,0 +1,11 @@
package org.mercury_im.messenger.core.entity.message;
import java.util.List;
public interface MessagePayload {
List<MessageContent> getMessageContents();
void setMessageContents(List<MessageContent> messageContents);
}

View file

@ -0,0 +1,16 @@
package org.mercury_im.messenger.core.entity.message;
public class TextMessageContent implements MessageContent.Body {
private String body;
@Override
public String getBody() {
return body;
}
@Override
public void setBody(String body) {
this.body = body;
}
}

View file

@ -1,7 +0,0 @@
package org.mercury_im.messenger.xmpp.entity;
import org.mercury_im.messenger.core.entity.AbstractDirectChat;
public class XmppDirectChat extends AbstractDirectChat<XmppInterlocutor, XmppAccount, XmppAddress.XmppUserAddress> {
}

View file

@ -1,7 +0,0 @@
package org.mercury_im.messenger.xmpp.entity;
import org.mercury_im.messenger.core.entity.AbstractGroupChat;
public class XmppGroupChat extends AbstractGroupChat<XmppAccount, XmppAddress.XmppUserAddress, XmppAddress.XmppRoomAddress> {
}

View file

@ -1,7 +0,0 @@
package org.mercury_im.messenger.xmpp.entity;
import org.mercury_im.messenger.core.entity.AbstractInterlocutor;
public class XmppInterlocutor extends AbstractInterlocutor<XmppAccount, XmppAddress.XmppUserAddress> {
}

View file

@ -1,7 +0,0 @@
package org.mercury_im.messenger.xmpp.entity;
import org.mercury_im.messenger.core.entity.AbstractMessage;
public class XmppMessage extends AbstractMessage<XmppAddress, XmppMessageMetadata> {
}

View file

@ -1,7 +0,0 @@
package org.mercury_im.messenger.xmpp.entity;
import org.mercury_im.messenger.core.entity.MessageMetadata;
public class XmppMessageMetadata implements MessageMetadata {
}

View file

@ -0,0 +1,10 @@
package org.mercury_im.messenger.xmpp.entity.chat;
import org.mercury_im.messenger.core.entity.chat.AbstractDirectChat;
import org.mercury_im.messenger.xmpp.entity.XmppAccount;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
import org.mercury_im.messenger.xmpp.entity.contact.XmppDirectInterlocutor;
public class XmppDirectChat extends AbstractDirectChat<XmppDirectInterlocutor, XmppAccount, XmppAddress.XmppUserAddress> {
}

View file

@ -0,0 +1,9 @@
package org.mercury_im.messenger.xmpp.entity.chat;
import org.mercury_im.messenger.core.entity.chat.AbstractGroupChat;
import org.mercury_im.messenger.xmpp.entity.XmppAccount;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
public class XmppMuc extends AbstractGroupChat<XmppAccount, XmppAddress.XmppUserAddress, XmppAddress.XmppRoomAddress> {
}

View file

@ -0,0 +1,12 @@
package org.mercury_im.messenger.xmpp.entity.contact;
import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor;
import org.mercury_im.messenger.xmpp.entity.XmppAccount;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
public class XmppContact extends AbstractInterlocutor<
XmppAccount,
XmppAddress.XmppUserAddress,
XmppAddress.XmppUserAddress> {
}

View file

@ -0,0 +1,12 @@
package org.mercury_im.messenger.xmpp.entity.contact;
import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor;
import org.mercury_im.messenger.xmpp.entity.XmppAccount;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
public class XmppDirectInterlocutor extends AbstractInterlocutor<
XmppAccount,
XmppAddress.XmppUserAddress,
XmppAddress.XmppUserAddress> {
}

View file

@ -0,0 +1,12 @@
package org.mercury_im.messenger.xmpp.entity.contact;
import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor;
import org.mercury_im.messenger.xmpp.entity.XmppAccount;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
public class XmppMucParticipant extends AbstractInterlocutor<
XmppAccount,
XmppAddress.XmppRoomParticipantAddress,
XmppAddress.XmppUserAddress> {
}

View file

@ -0,0 +1,32 @@
package org.mercury_im.messenger.xmpp.entity.message;
import org.mercury_im.messenger.core.entity.message.AbstractMessage;
import org.mercury_im.messenger.xmpp.entity.XmppAddress;
public final class XmppMessage extends AbstractMessage<
XmppAddress,
XmppMessageMetadata> {
private XmppMessage() {
}
public class DirectMessage extends AbstractMessage<
XmppAddress.XmppUserAddress,
XmppMessageMetadata> {
}
public class MucMessage extends AbstractMessage<
XmppAddress.XmppRoomParticipantAddress,
XmppMessageMetadata> {
}
// Maybe?
public class MixMessage extends AbstractMessage<
XmppAddress.XmppRoomParticipantAddress,
XmppMessageMetadata> {
}
}

View file

@ -0,0 +1,7 @@
package org.mercury_im.messenger.xmpp.entity.message;
import org.mercury_im.messenger.core.entity.message.MessageMetadata;
public class XmppMessageMetadata implements MessageMetadata {
}

View file

@ -2,7 +2,7 @@ package org.mercury_im.messenger.core.repository;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.Contact;
import org.mercury_im.messenger.core.entity.contact.Contact;
import org.mercury_im.messenger.core.util.Optional;
import java.util.List;

View file

@ -2,10 +2,11 @@ package org.mercury_im.messenger.core.repository;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.DirectChat;
import org.mercury_im.messenger.core.entity.Interlocutor;
import org.mercury_im.messenger.core.entity.Message;
import org.mercury_im.messenger.core.entity.MessageMetadata;
import org.mercury_im.messenger.core.entity.chat.DirectChat;
import org.mercury_im.messenger.core.entity.contact.Interlocutor;
import org.mercury_im.messenger.core.entity.message.Message;
import org.mercury_im.messenger.core.entity.message.MessageMetadata;
import org.mercury_im.messenger.core.entity.message.MessagePayload;
import org.mercury_im.messenger.core.util.Optional;
import java.util.List;
@ -20,8 +21,9 @@ public interface DirectChatRepository<
IL extends Interlocutor<AC, AD>,
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
M extends Message<AD, MM>,
MM extends MessageMetadata> {
M extends Message<AD, MM, MP>,
MM extends MessageMetadata,
MP extends MessagePayload> {
Single<DC> insertDirectChat(DC chat);

View file

@ -2,9 +2,10 @@ package org.mercury_im.messenger.core.repository;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
import org.mercury_im.messenger.core.entity.GroupChat;
import org.mercury_im.messenger.core.entity.Message;
import org.mercury_im.messenger.core.entity.MessageMetadata;
import org.mercury_im.messenger.core.entity.chat.GroupChat;
import org.mercury_im.messenger.core.entity.message.Message;
import org.mercury_im.messenger.core.entity.message.MessageMetadata;
import org.mercury_im.messenger.core.entity.message.MessagePayload;
import org.mercury_im.messenger.core.util.Optional;
import java.util.List;
@ -19,8 +20,9 @@ public interface GroupChatRepository<
AC extends Account<AD, ?>,
AD extends Address.UserAddress,
RA extends Address.RoomAddress,
M extends Message<AD, MM>,
MM extends MessageMetadata> {
M extends Message<AD, MM, MP>,
MM extends MessageMetadata,
MP extends MessagePayload> {
Single<GC> insertGroupChat(GC chat);

View file

@ -2,9 +2,11 @@ include ':entity',
':entity_xmpp',
':repository',
':repository_xmpp',
':core',
':transport',
':transport_xmpp',
':app',
':thread_utils',
':core'
':core-old'
includeBuild 'libs/Smack'

1
transport/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

21
transport/build.gradle Normal file
View file

@ -0,0 +1,21 @@
apply plugin: 'java-library'
dependencies {
implementation project(':entity')
implementation project(':repository')
implementation project(":thread_utils")
// RxJava2
implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version"
// Dagger 2 for dependency injection
implementation "com.google.dagger:dagger:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
// JUnit for testing
testImplementation "junit:junit:$junitVersion"
}
sourceCompatibility = "8"
targetCompatibility = "8"

View file

@ -0,0 +1,4 @@
package org.mercury_im.core;
public class Messenger {
}

View file

@ -0,0 +1,14 @@
package org.mercury_im.core.connection;
import org.mercury_im.messenger.core.entity.Account;
import org.mercury_im.messenger.core.entity.Address;
public interface ConnectionMethod<
AC extends Account<AD, ?>,
AD extends Address.UserAddress> {
AC getAccount();
void setAccount(AC account);
}

View file

@ -0,0 +1,6 @@
package org.mercury_im.core.connection.exception;
public class ConnectionFailedException extends Exception {
private static final long serialVersionUID = 1L;
}