package com.ibm.sbt.services.client.connections.forums.serializers;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.CATEGORY;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.CONTENT;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.HTML;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.REF;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.SCHEME;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.TERM;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.TYPE;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.ANSWER;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.ANSWERED;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.FORUM;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.FORUM_REPLY;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.FORUM_TOPIC;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.LOCKED;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.PINNED;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.QUESTION;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.THR_IN_REPLY_TO;
import static com.ibm.sbt.services.client.connections.forums.utils.ForumConstants.XMLNS_THR;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.ibm.sbt.services.client.base.ConnectionsConstants.Namespace;
import com.ibm.sbt.services.client.base.serializers.AtomEntitySerializer;
import com.ibm.sbt.services.client.connections.forums.Forum;
import com.ibm.sbt.services.client.connections.forums.ForumReply;
import com.ibm.sbt.services.client.connections.forums.ForumTopic;
import com.ibm.sbt.services.client.connections.forums.model.BaseForumEntity;
public class ForumSerializer extends AtomEntitySerializer<BaseForumEntity> {
public ForumSerializer(BaseForumEntity entity) {
super(entity);
}
public String generateCreate() {
return generateUpdate();
}
public String generateUpdate() {
Node entry = entry();
appendChildren(entry, title(), content(), typeCategory());
appendChildren(entry, tags());
if (isForumTopic()) {
appendChildren(entry, pinned(), locked(), question(), answered());
}
if (isForumReply()) {
appendChildren(entry, answer(), inReplyTo());
}
return serializeToString();
}
protected Element answer() {
if (!isForumReply()) {
return null;
}
ForumReply reply = (ForumReply) entity;
return reply.isAnswer() ? element(CATEGORY,
attribute(SCHEME, Namespace.FLAGS.getUrl()),
attribute(TERM, ANSWER)) : null;
}
protected Element answered() {
if (!isForumTopic()) {
return null;
}
ForumTopic topic = (ForumTopic) entity;
return topic.isAnswered() ? element(CATEGORY,
attribute(SCHEME, Namespace.FLAGS.getUrl()),
attribute(TERM, ANSWERED)) : null;
}
@Override
protected Element content() {
Element element = element(CONTENT, attribute(TYPE, HTML));
addText(element, entity.getContent());
return element;
}
protected Element inReplyTo() {
if (!isForumReply()) {
return null;
}
ForumReply reply = (ForumReply) entity;
return element(
THR_IN_REPLY_TO,
attribute(XMLNS_THR, Namespace.THR.getUrl()),
attribute(REF, "urn:lsid:ibm.com:forum:" + reply.getTopicUuid()));
}
protected Element locked() {
if (!isForumTopic()) {
return null;
}
ForumTopic topic = (ForumTopic) entity;
return topic.isLocked() ? element(CATEGORY,
attribute(SCHEME, Namespace.FLAGS.getUrl()),
attribute(TERM, LOCKED)) : null;
}
protected Element pinned() {
if (!isForumTopic()) {
return null;
}
ForumTopic topic = (ForumTopic) entity;
return topic.isPinned() ? element(CATEGORY,
attribute(SCHEME, Namespace.FLAGS.getUrl()),
attribute(TERM, PINNED)) : null;
}
protected Element question() {
if (!isForumTopic()) {
return null;
}
ForumTopic topic = (ForumTopic) entity;
return topic.isQuestion() ? element(CATEGORY,
attribute(SCHEME, Namespace.FLAGS.getUrl()),
attribute(TERM, QUESTION)) : null;
}
protected Element typeCategory() {
Element element = element(CATEGORY,
attribute(SCHEME, Namespace.TYPE.getUrl()),
attribute(TERM, getTypeCategoryTerm()));
return element;
}
private String getTypeCategoryTerm() {
if (isForum()) {
return FORUM;
} else if (isForumTopic()) {
return FORUM_TOPIC;
} else if (isForumReply()) {
return FORUM_REPLY;
}
return null;
}
private boolean isForum() {
if (entity instanceof Forum) {
return true;
}
return false;
}
private boolean isForumReply() {
if (entity instanceof ForumReply) {
return true;
}
return false;
}
private boolean isForumTopic() {
if (entity instanceof ForumTopic) {
return true;
}
return false;
}
}