package com.sissi.persistent.impl; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.time.FastDateFormat; import com.mongodb.BasicDBObjectBuilder; import com.sissi.config.Dictionary; import com.sissi.config.impl.MongoUtils; import com.sissi.context.JID; import com.sissi.context.JIDBuilder; import com.sissi.persistent.PersistentElement; import com.sissi.protocol.Element; /** * @author kim 2013-11-15 */ abstract class PersistentProtocol implements PersistentElement { private final FastDateFormat format = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZ"); protected final String tip; protected final JIDBuilder jidBuilder; private final boolean bare; private final Class<? extends Element> support; public PersistentProtocol(Class<? extends Element> support, JIDBuilder jidBuilder, String tip, boolean bare) { super(); this.tip = tip; this.bare = bare; this.support = support; this.jidBuilder = jidBuilder; } /* * {"id":Xxx} * * @see com.sissi.persistent.PersistentElement#query(com.sissi.protocol.Element) */ public Map<String, Object> query(Element element) { return MongoUtils.asMap(BasicDBObjectBuilder.start(Dictionary.FIELD_PID, element.getId()).get()); } /** * ID,FROM,TO,TYPE * * @param storage * @param element * @return */ protected Element read(Map<String, Object> storage, Element element) { return element.setId(this.toString(storage, Dictionary.FIELD_PID)).setFrom(this.toString(storage, Dictionary.FIELD_FROM)).setTo(this.toString(storage, Dictionary.FIELD_TO)).setType(this.toString(storage, Dictionary.FIELD_TYPE)); } public Map<String, Object> write(Element element) { Map<String, Object> entity = new HashMap<String, Object>(); entity.put(Dictionary.FIELD_RESEND, 0); entity.put(Dictionary.FIELD_ACTIVATE, true); entity.put(Dictionary.FIELD_PID, element.getId()); entity.put(Dictionary.FIELD_TYPE, element.getType()); entity.put(Dictionary.FIELD_TIMESTAMP, System.currentTimeMillis()); entity.put(Dictionary.FIELD_DELAY, this.format.format(new Date())); entity.put(Dictionary.FIELD_CLASS, element.getClass().getSimpleName()); JID to = this.jidBuilder.build(element.getTo()); JID from = this.jidBuilder.build(element.getFrom()); entity.put(Dictionary.FIELD_TO, this.bare ? to.asStringWithBare() : to.asString()); entity.put(Dictionary.FIELD_FROM, this.bare ? from.asStringWithBare() : from.asString()); return entity; } /* * Class比较 * * @see com.sissi.persistent.PersistentElement#isSupport(java.util.Map) */ @Override public boolean isSupport(Map<String, Object> element) { return this.support.getSimpleName().equals(element.get(Dictionary.FIELD_CLASS)); } /* * Class比较 * * @see com.sissi.persistent.PersistentElement#isSupport(com.sissi.protocol.Element) */ public boolean isSupport(Element element) { return this.support == element.getClass(); } protected String toString(Map<String, Object> element, String key) { Object value = element.get(key); return value != null ? value.toString() : null; } }