package com.sissi.persistent.impl;
import java.util.Map;
import com.sissi.config.Dictionary;
import com.sissi.context.JIDBuilder;
import com.sissi.protocol.Element;
import com.sissi.protocol.message.Message;
import com.sissi.protocol.message.MessageType;
import com.sissi.protocol.offline.Delay;
/**
* Delay Message</p>索引策略:{"id":1}
*
* @author kim 2013-11-15
*/
public class PersistentMessage extends PersistentProtocol {
/**
* bare = true
*
* @param jidBuilder
* @param tip Delay.tip
*/
public PersistentMessage(JIDBuilder jidBuilder, String tip) {
super(Message.class, jidBuilder, tip, true);
}
protected PersistentMessage(JIDBuilder jidBuilder, String tip, boolean bare) {
super(Message.class, jidBuilder, tip, bare);
}
/**
* Delay.from = message.from, Delay.stamp = element.delay
*
* @param element
* @param message
* @return
*/
protected Delay delay(Map<String, Object> element, Message message) {
return new Delay(super.tip, message.getFrom(), element.get(Dictionary.FIELD_DELAY).toString());
}
/*
* {"ack",!message.request(),"thread":message.thread(),"body":message.content() ? message.getBody().getText() : null}
*
* @see com.sissi.persistent.impl.PersistentProtocol#write(com.sissi.protocol.Element)
*/
@Override
public Map<String, Object> write(Element element) {
Map<String, Object> entity = super.write(element);
Message message = Message.class.cast(element);
entity.put(Dictionary.FIELD_ACK, !message.request());
entity.put(Dictionary.FIELD_THREAD, message.thread());
entity.put(Dictionary.FIELD_BODY, message.content() ? message.getBody().getText() : null);
return entity;
}
/*
* Body, Delay, Thread, Request
*
* @see com.sissi.persistent.PersistentElement#read(java.util.Map)
*/
@Override
public Message read(Map<String, Object> element) {
Message message = Message.class.cast(super.read(element, new Message()));
return message.body(super.toString(element, Dictionary.FIELD_BODY)).delay(this.delay(element, message)).setThread(super.toString(element, Dictionary.FIELD_THREAD)).request(Boolean.valueOf(element.get(Dictionary.FIELD_ACK).toString()));
}
/*
* 1, 符合Class 2, 符合isSupportMessage
*
* @see com.sissi.persistent.impl.PersistentProtocol#isSupport(com.sissi.protocol.Element)
*/
public boolean isSupport(Element element) {
return super.isSupport(element) && this.isSupportMessage(Message.class.cast(element));
}
/**
* 1, 含Body 2,Mesage.type(CHAT) 3,!Message.received()
*
* @param message
* @return
*/
protected boolean isSupportMessage(Message message) {
return message.body() && message.type(MessageType.CHAT) && !message.received();
}
public Class<? extends Element> support() {
return Message.class;
}
}