Map message payload/content

This commit is contained in:
Paul Schaub 2019-12-01 23:13:25 +01:00
parent a07f12d63b
commit 7a216fed9d
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
13 changed files with 303 additions and 13 deletions

View file

@ -1,7 +1,12 @@
package org.mercury_im.messenger.data.di;
import org.mercury_im.messenger.data.mapping.AccountMapping;
import org.mercury_im.messenger.data.mapping.ContactMapping;
import org.mercury_im.messenger.data.mapping.DirectChatMapping;
import org.mercury_im.messenger.data.mapping.GroupChatMapping;
import org.mercury_im.messenger.data.mapping.MessageContentMapping;
import org.mercury_im.messenger.data.mapping.MessageMapping;
import org.mercury_im.messenger.data.mapping.MessagePayloadMapping;
import org.mercury_im.messenger.data.mapping.PeerMapping;
import javax.inject.Singleton;
@ -14,19 +19,49 @@ public class MappingModule {
@Provides
@Singleton
public static AccountMapping accountMapping() {
static AccountMapping provideAccountMapping() {
return new AccountMapping();
}
@Provides
@Singleton
public static PeerMapping peerMapping() {
return new PeerMapping(accountMapping());
static PeerMapping providePeerMapping() {
return new PeerMapping(provideAccountMapping());
}
@Provides
@Singleton
public static DirectChatMapping directChatMapping() {
return new DirectChatMapping(peerMapping());
static ContactMapping provideContactMapping() {
return new ContactMapping(provideAccountMapping());
}
@Provides
@Singleton
static DirectChatMapping provideDirectChatMapping() {
return new DirectChatMapping(providePeerMapping());
}
@Provides
@Singleton
static GroupChatMapping provideGroupChatMapping() {
return new GroupChatMapping(provideAccountMapping());
}
@Provides
@Singleton
static MessageMapping provideMessageMapping() {
return new MessageMapping(provideMessagePayloadMapping());
}
@Provides
@Singleton
static MessagePayloadMapping provideMessagePayloadMapping() {
return new MessagePayloadMapping(provideMessageContentMapping());
}
@Provides
@Singleton
static MessageContentMapping provideMessageContentMapping() {
return new MessageContentMapping();
}
}

View file

@ -0,0 +1,8 @@
package org.mercury_im.messenger.data.enums;
public enum MessageContentType {
/**
* Content is a message body.
*/
body
}

View file

@ -3,8 +3,17 @@ package org.mercury_im.messenger.data.mapping;
import org.mercury_im.messenger.data.model.ContactModel;
import org.mercury_im.messenger.entity.contact.Contact;
import javax.inject.Inject;
public class ContactMapping implements Mapping<Contact, ContactModel> {
private final AccountMapping accountMapping;
@Inject
public ContactMapping(AccountMapping accountMapping) {
this.accountMapping = accountMapping;
}
@Override
public ContactModel entityToModel(Contact entity, ContactModel model) {
if (entity == null) {
@ -13,7 +22,6 @@ public class ContactMapping implements Mapping<Contact, ContactModel> {
if (model == null) {
model = new ContactModel();
}
return null;
}

View file

@ -0,0 +1,45 @@
package org.mercury_im.messenger.data.mapping;
import org.mercury_im.messenger.data.enums.MessageContentType;
import org.mercury_im.messenger.data.model.MessageContentModel;
import org.mercury_im.messenger.entity.message.content.MessageContent;
import org.mercury_im.messenger.entity.message.content.TextMessageContent;
import static org.mercury_im.messenger.data.enums.MessageContentType.body;
public class MessageContentMapping implements Mapping<MessageContent, MessageContentModel> {
@Override
public MessageContentModel entityToModel(MessageContent entity, MessageContentModel model) {
if (entity == null) {
return null;
}
if (model == null) {
model = new MessageContentModel();
}
if (entity instanceof TextMessageContent) {
model.setType(body);
model.setBody(((TextMessageContent) entity).getBody());
}
// else if (...)
return model;
}
@Override
public MessageContent modelToEntity(MessageContentModel model, MessageContent entity) {
if (model == null) {
model = new MessageContentModel();
}
switch (model.getType()) {
case body:
if (entity == null) {
TextMessageContent body = new TextMessageContent();
body.setId(model.getId());
body.setBody(model.getBody());
entity = body;
}
}
return entity;
}
}

View file

@ -0,0 +1,52 @@
package org.mercury_im.messenger.data.mapping;
import org.mercury_im.messenger.data.model.MessageModel;
import org.mercury_im.messenger.data.model.MessagePayloadModel;
import org.mercury_im.messenger.entity.message.IMessage;
import org.mercury_im.messenger.entity.message.Message;
import org.mercury_im.messenger.entity.message.MessagePayload;
import javax.inject.Inject;
public class MessageMapping implements Mapping<Message, MessageModel> {
private final MessagePayloadMapping messagePayloadMapping;
@Inject
public MessageMapping(MessagePayloadMapping messagePayloadMapping) {
this.messagePayloadMapping = messagePayloadMapping;
}
@Override
public MessageModel entityToModel(Message entity, MessageModel model) {
if (entity == null) {
return null;
}
if (model == null) {
model = new MessageModel();
}
model.setSender(entity.getSender());
model.setRecipient(entity.getRecipient());
model.setTimestamp(entity.getTimestamp());
model.getPayloads().clear();
for (MessagePayload payload : entity.getMessagePayloads()) {
MessagePayloadModel payloadModel = messagePayloadMapping.entityToModel(payload, new MessagePayloadModel());
payloadModel.setMessage(model);
model.getPayloads().add(payloadModel);
}
return model;
}
@Override
public Message modelToEntity(MessageModel model, Message entity) {
if (model == null) {
return null;
}
if (entity == null) {
entity = new IMessage();
}
return null;
}
}

View file

@ -0,0 +1,62 @@
package org.mercury_im.messenger.data.mapping;
import org.mercury_im.messenger.data.model.MessageContentModel;
import org.mercury_im.messenger.data.model.MessagePayloadModel;
import org.mercury_im.messenger.entity.message.IMessagePayload;
import org.mercury_im.messenger.entity.message.MessagePayload;
import org.mercury_im.messenger.entity.message.content.MessageContent;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
public class MessagePayloadMapping implements Mapping<MessagePayload, MessagePayloadModel> {
private final MessageContentMapping messageContentMapping;
@Inject
public MessagePayloadMapping(MessageContentMapping messageContentMapping) {
this.messageContentMapping = messageContentMapping;
}
@Override
public MessagePayloadModel entityToModel(MessagePayload entity, MessagePayloadModel model) {
if (entity == null) {
return null;
}
if (model == null) {
model = new MessagePayloadModel();
}
model.getContents().clear();
for (MessageContent contentEntity : entity.getMessageContents()) {
MessageContentModel contentModel = messageContentMapping.entityToModel(contentEntity, new MessageContentModel());
contentModel.setPayload(model);
model.getContents().add(contentModel);
}
return model;
}
@Override
public MessagePayload modelToEntity(MessagePayloadModel model, MessagePayload entity) {
if (model == null) {
return null;
}
if (entity == null) {
entity = new IMessagePayload();
}
entity.setId(model.getId());
List<MessageContent> contents = new ArrayList<>(model.getContents().size());
for (MessageContentModel contentModel : model.getContents()) {
MessageContent contentEntity = messageContentMapping.modelToEntity(contentModel, null);
contents.add(contentEntity);
}
entity.setMessageContents(contents);
return entity;
}
}

View file

@ -0,0 +1,27 @@
package org.mercury_im.messenger.data.model;
import org.mercury_im.messenger.data.enums.MessageContentType;
import io.requery.Column;
import io.requery.Entity;
import io.requery.Generated;
import io.requery.Key;
import io.requery.ManyToOne;
import io.requery.Table;
@Entity
@Table(name = "message_contents")
public abstract class AbstractMessageContentModel {
@Key @Generated
long id;
@ManyToOne
MessagePayloadModel payload;
@Column
String body;
@Column(nullable = false)
MessageContentType type;
}

View file

@ -1,11 +1,13 @@
package org.mercury_im.messenger.data.model;
import java.util.Date;
import java.util.Set;
import io.requery.Column;
import io.requery.Entity;
import io.requery.Generated;
import io.requery.Key;
import io.requery.OneToMany;
import io.requery.Persistable;
import io.requery.Table;
@ -16,20 +18,17 @@ public abstract class AbstractMessageModel implements Persistable {
@Key @Generated
long id;
String body;
@Column(name = "\"timestamp\"", nullable = false)
Date timestamp;
@Column(nullable = false)
String sender;
@Column(nullable = false)
String recipient;
boolean incoming;
@Column(name = "\"timestamp\"", nullable = false)
Date timestamp;
String thread;
@OneToMany
Set<MessagePayloadModel> payloads;
@Column(nullable = false)
String legacyId;

View file

@ -0,0 +1,24 @@
package org.mercury_im.messenger.data.model;
import java.util.Set;
import io.requery.Entity;
import io.requery.Generated;
import io.requery.Key;
import io.requery.ManyToOne;
import io.requery.OneToMany;
import io.requery.Table;
@Entity
@Table(name = "message_payloads")
public abstract class AbstractMessagePayloadModel {
@Key @Generated
long id;
@ManyToOne
MessageModel message;
@OneToMany
Set<MessageContentModel> contents;
}

View file

@ -6,8 +6,19 @@ import java.util.List;
public class IMessagePayload implements MessagePayload {
protected long id;
protected List<MessageContent> contents;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
@Override
public List<MessageContent> getMessageContents() {
return contents;

View file

@ -13,6 +13,10 @@ import java.util.List;
*/
public interface MessagePayload {
long getId();
void setId(long id);
List<MessageContent> getMessageContents();
void setMessageContents(List<MessageContent> messageContents);

View file

@ -2,6 +2,10 @@ package org.mercury_im.messenger.entity.message.content;
public interface MessageContent {
long getId();
void setId(long id);
interface Body extends MessageContent {
String getBody();

View file

@ -2,8 +2,19 @@ package org.mercury_im.messenger.entity.message.content;
public class TextMessageContent implements MessageContent.Body {
private long id;
private String body;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
@Override
public String getBody() {
return body;