/*
* © Copyright IBM Corp. 2013
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.ibm.sbt.services.client.connections.activities.serializers;
import static com.ibm.sbt.services.client.base.CommonConstants.APPLICATION_ATOM_XML;
import static com.ibm.sbt.services.client.base.CommonConstants.CONTENT_TYPE;
import static com.ibm.sbt.services.client.base.ConnectionsConstants.dateFormat;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
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.activities.ActivityAttachment;
import com.ibm.sbt.services.client.connections.activities.DateField;
import com.ibm.sbt.services.client.connections.activities.Field;
import com.ibm.sbt.services.client.connections.activities.FileField;
import com.ibm.sbt.services.client.connections.activities.LinkField;
import com.ibm.sbt.services.client.connections.activities.NodeEntity;
import com.ibm.sbt.services.client.connections.activities.PersonField;
import com.ibm.sbt.services.client.connections.activities.TextField;
/**
* @author mwallace
*
*/
class NodeSerializer extends AtomEntitySerializer<NodeEntity> {
public NodeSerializer(NodeEntity nodeEntity) {
super(nodeEntity);
}
protected List<Element> fields() {
Field[] fields = entity.getFields();
if (fields == null) {
return null;
}
ArrayList<Element> elements = new ArrayList<Element>();
for (Field field : fields) {
Element element = element(Namespace.SNX.getUrl(), "field",
attribute("fid", field.getFid()),
attribute("name", field.getName()),
attribute("type", field.getType()),
attribute("hidden", field.isHidden()));
if (field.hasPosition()) {
element.setAttribute("position", "" + field.getPosition());
}
if (field instanceof DateField) {
DateField dateField = (DateField)field;
addText(element, DateSerializer.toString(dateFormat, dateField.getDate()));
} else if (field instanceof FileField) {
FileField fileField = (FileField)field;
if (fileField.getEditMediaLink() != null) {
Element link = element(Namespace.ATOM.getUrl(), "link",
attribute("href", fileField.getEditMediaLink().getHref()),
attribute("type", fileField.getEditMediaLink().getType()),
attribute("size", fileField.getEditMediaLink().getSize()));
appendChildren(element, link);
}
} else if (field instanceof LinkField) {
LinkField linkField = (LinkField)field;
Element link = element(Namespace.ATOM.getUrl(), "link",
attribute("href", linkField.getLink().getHref()),
attribute("title", linkField.getLink().getTitle()));
appendChildren(element, link);
} else if (field instanceof PersonField) {
PersonField personField = (PersonField)field;
Element name = addText(element(Namespace.ATOM.getUrl(), "name"), personField.getPerson().getName());
Element email = addText(element(Namespace.ATOM.getUrl(), "email"), personField.getPerson().getEmail());
Element userid = addText(element(Namespace.SNX.getUrl(), "userid"), personField.getPerson().getUserid());
if (personField.getPerson().getEmail() != null) {
appendChildren(element, name, email, userid);
} else {
appendChildren(element, name, userid);
};
} else if (field instanceof TextField) {
TextField textField = (TextField)field;
Element summary = element(Namespace.ATOM.getUrl(), "summary",
attribute("type", "text"));
addText(summary, textField.getSummary());
appendChildren(element, summary);
}
elements.add(element);
}
return elements;
}
protected Element activityNodeCategory() {
return element("category",
attribute("scheme", "http://www.ibm.com/xmlns/prod/sn/type"),
attribute("term", "activity"),
attribute("label", "Activity"));
}
protected Element activityUuid() {
return textElement(Namespace.SNX.getUrl(), "activity", entity.getActivityUuid());
}
@Override
protected Element content() {
return textElement("content", entity.getContent(),
attribute("type", "application/atom+xml"));
}
protected boolean hasAttachments() {
return entity.hasAttachments();
}
protected MimeMultipart multipart(String atom) throws MessagingException {
MimeMultipart multipart = new MimeMultipart();
// add atom
MimeBodyPart atomPart = new MimeBodyPart();
atomPart.setContent(atom, APPLICATION_ATOM_XML);
atomPart.setHeader(CONTENT_TYPE, APPLICATION_ATOM_XML);
multipart.addBodyPart(atomPart, 0);
// add the attachments
List<ActivityAttachment> attachments = entity.getAttachments();
for (ActivityAttachment attachment : attachments) {
multipart.addBodyPart(attachment.toMimeBodyPart());
}
return multipart;
}
public String payload(String atom) {
if (hasAttachments()) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
MimeMultipart multipart = multipart(atom);
multipart.writeTo(baos);
return new String(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} else {
return atom;
}
}
}