package org.wiztools.restclient.persistence; import java.util.List; import nu.xom.Attribute; import nu.xom.Element; import org.wiztools.commons.MultiValueMap; import org.wiztools.commons.StringUtil; import org.wiztools.restclient.bean.*; import org.wiztools.restclient.util.Util; /** * * @author subwiz */ class XmlBodyWrite { Element getReqEntity(ReqEntity bean) { Element eBody = new Element("body"); if(bean instanceof ReqEntityString) { ReqEntityString entity = (ReqEntityString) bean; Element eStringContent = new Element("string"); addContentTypeCharsetAttribute(entity.getContentType(), eStringContent); eStringContent.appendChild(entity.getBody()); eBody.appendChild(eStringContent); } else if(bean instanceof ReqEntityFile) { ReqEntityFile entity = (ReqEntityFile) bean; Element eFile = new Element("file"); addContentTypeCharsetAttribute(entity.getContentType(), eFile); eFile.appendChild(entity.getBody().getAbsolutePath()); eBody.appendChild(eFile); } else if(bean instanceof ReqEntityByteArray) { ReqEntityByteArray entity = (ReqEntityByteArray) bean; Element eByte = new Element("byte-array"); addContentTypeCharsetAttribute(entity.getContentType(), eByte); eByte.appendChild(Util.base64encode(entity.getBody())); eBody.appendChild(eByte); } else if(bean instanceof ReqEntityUrlStream) { ReqEntityUrlStream entity = (ReqEntityUrlStream) bean; Element eUrlStream = new Element("url-stream"); addContentTypeCharsetAttribute(entity.getContentType(), eUrlStream); eUrlStream.appendChild(entity.getUrl().toString()); eBody.appendChild(eUrlStream); } else if(bean instanceof ReqEntityMultipart) { ReqEntityMultipart entity = (ReqEntityMultipart) bean; Element eMultipart = new Element("multipart"); eMultipart.addAttribute( new Attribute("subtype", entity.getSubtype().name())); eMultipart.addAttribute( new Attribute("mode", entity.getMode().name())); List<ReqEntityPart> parts = entity.getBody(); for(ReqEntityPart part: parts) { if(part instanceof ReqEntityStringPart) { ReqEntityStringPart p = (ReqEntityStringPart) part; Element ePart = new Element("string"); addContentTypeCharsetAttribute(p.getContentType(), ePart); ePart.addAttribute(new Attribute("name", p.getName())); Element eContent = new Element("content"); eContent.appendChild(p.getPart()); ePart.appendChild(eContent); Element eFields = new Element("fields"); MultiValueMap<String, String> fields = p.getFields(); for(String k: fields.keySet()) { for(String value: fields.get(k)) { Element eField = new Element("field"); Element eName = new Element("name"); eName.appendChild(k); eField.appendChild(eName); Element eValue = new Element("value"); eValue.appendChild(value); eField.appendChild(eValue); eFields.appendChild(eField); } } eMultipart.appendChild(ePart); } else if(part instanceof ReqEntityFilePart) { ReqEntityFilePart p = (ReqEntityFilePart) part; Element ePart = new Element("file"); addContentTypeCharsetAttribute(p.getContentType(), ePart); ePart.addAttribute(new Attribute("name", p.getName())); { // filename: backward compatibility! String fileName = p.getFilename(); if(StringUtil.isNotEmpty(fileName)) { ePart.addAttribute(new Attribute("filename", p.getFilename())); } else { ePart.addAttribute(new Attribute("filename", p.getPart().getName())); } } Element eContent = new Element("content"); eContent.appendChild(p.getPart().getAbsolutePath()); ePart.appendChild(eContent); eMultipart.appendChild(ePart); } } eBody.appendChild(eMultipart); } return eBody; } private static void addContentTypeCharsetAttribute(ContentType c, Element e) { if(c != null) { e.addAttribute(new Attribute("content-type", c.getContentType())); if(c.getCharset() != null) { e.addAttribute(new Attribute("charset", c.getCharset().name())); } } } }