XMLHelper.java
package com.tradecloud.domain.helper;
import com.tradecloud.domain.configuration.TreasuryConfig;
import com.tradecloud.domain.model.ForexGroup;
import com.tradecloud.domain.model.Money;
import com.tradecloud.domain.model.fec.BankDetails;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
public class XMLHelper {
private static final DateTimeFormatter FULL_DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm");
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd");
private static final boolean useCDATAStringEncoding = true;
private static final String CDATA_END_TAG = "]]>";
private static String CDATA_START_TAG = "<![CDATA[";
private static Map<String, String> encodings;
static {
encodings = new HashMap<String, String>();
encodings.put("&", "&");
encodings.put("<", "<");
encodings.put(">", ">");
encodings.put("'", "'");
encodings.put("\"", """);
}
public static String getMoneyXML(Money money) {
StringBuilder builder = new StringBuilder();
builder.append("<currency>").append((money == null) ? "" : money.getCurrency().toString()).append("</currency>");
builder.append("<value>").append((money == null) ? "0" : money.getValue()).append("</value>");
return builder.toString();
}
public static String getMoneyXML(Money money, int decimalPlace) {
StringBuilder builder = new StringBuilder();
builder.append("<currency>").append((money == null) ? "" : money.getCurrency().toString()).append("</currency>");
builder.append("<value>").append((money == null) ? "0" : money.getValue().setScale(decimalPlace, RoundingMode.HALF_UP).toString()).
append("</value>");
return builder.toString();
}
public static String getDateXML(LocalDate date) {
StringBuilder builder = new StringBuilder();
builder.append((date == null) ? "" : date.toString(DATE_FORMATTER));
return builder.toString();
}
public static String getDateTimeXML(LocalDateTime dateTime) {
StringBuilder builder = new StringBuilder();
builder.append((dateTime == null) ? "" : dateTime.toString(DATE_TIME_FORMATTER));
return builder.toString();
}
public static String getFullDateTimeXML(LocalDateTime dateTime) {
StringBuilder builder = new StringBuilder();
builder.append((dateTime == null) ? "" : dateTime.toString(FULL_DATE_TIME_FORMATTER));
return builder.toString();
}
public static String getBankDetailsXML(BankDetails bankDetails) {
StringBuilder builder = new StringBuilder();
builder.append("<name>").append((bankDetails == null) ? "" : bankDetails.getTreasuryBank().getName()).append("</name>");
builder.append("<dealer>").append((bankDetails == null) ? "" : bankDetails.getDealer()).append("</dealer>");
return builder.toString();
}
public static String getLocalCurrencyXML(BigDecimal forwardRate, BigDecimal amount) {
Money localCurrencyAmount = new Money(forwardRate.multiply(amount), TreasuryConfig.getDefaultLocalCurrency());
return getMoneyXML(localCurrencyAmount);
}
public static String getForexGroupXML(ForexGroup forexGroup) {
StringBuilder builder = new StringBuilder();
builder.append("<name>").append((forexGroup == null) ? "" : forexGroup.getName()).append("</name>");
builder.append("<code>").append((forexGroup == null) ? "" : forexGroup.getCode()).append("</code>");
return builder.toString();
}
public static String getOrganisationalUnitXML(OrganisationalUnit organisationalUnit) {
StringBuilder builder = new StringBuilder();
builder.append("<name>").append((organisationalUnit == null) ? "" : organisationalUnit.getName()).append("</name>");
builder.append("<code>").append((organisationalUnit == null) ? "" : organisationalUnit.getCode()).append("</code>");
return builder.toString();
}
public static Document makeNewDocument() throws ParserConfigurationException {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
return docBuilder.newDocument();
}
public static Document makeNewDocumentWithRootElement(String rootElementName) throws ParserConfigurationException {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document document = docBuilder.newDocument();
Element element = document.createElement(rootElementName);
document.appendChild(element);
return document;
}
public static String documentAsXML(Document document) throws TransformerException {
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(document);
trans.transform(source, result);
return sw.toString();
}
public static Element makeElementAndAddToRootElement(Document document, String elementName, String elementValue) {
Element newElement = document.createElement(elementName);
document.getDocumentElement().appendChild(newElement);
newElement.setTextContent(elementValue);
return newElement;
}
public static String encodeToXMLString(String toBeEncoded) {
if (useCDATAStringEncoding) {
return CDATA_START_TAG + toBeEncoded + CDATA_END_TAG;
} else {
for (String encodingElement : encodings.keySet()) {
toBeEncoded = toBeEncoded.replace(encodingElement, encodings.get(encodingElement));
}
return toBeEncoded;
}
}
public static Element makeAndAppendMoneyElement(Document document, String name, Money money) throws ParserConfigurationException {
Element element = document.createElement(name);
Element currencyElement = document.createElement("currency");
currencyElement.setTextContent((money == null) ? "" : money.getCurrency().toString());
Element valueElement = document.createElement("value");
valueElement.setTextContent((money == null) ? "0" : money.getValue().toString());
element.appendChild(currencyElement);
element.appendChild(valueElement);
document.getDocumentElement().appendChild(element);
return element;
}
public static Element makeAndAppendOrganisationalUnitElement(Document document, String name, OrganisationalUnit organisationalUnit)
throws ParserConfigurationException {
Element element = document.createElement(name);
Element nameElement = document.createElement("name");
nameElement.setTextContent((organisationalUnit == null || organisationalUnit.getCode() == null) ? "" : organisationalUnit.getName());
Element codeElement = document.createElement("code");
codeElement.setTextContent((organisationalUnit == null || organisationalUnit.getCode() == null) ? "" : organisationalUnit.getCode());
element.appendChild(nameElement);
element.appendChild(codeElement);
document.getDocumentElement().appendChild(element);
return element;
}
public static Element makeAndAppendForexGroupElement(Document document, String name, ForexGroup forexGroup) throws ParserConfigurationException {
Element element = document.createElement(name);
Element nameElement = document.createElement("name");
nameElement.setTextContent(forexGroup == null ? "" : forexGroup.getName());
Element codeElement = document.createElement("id");
codeElement.setTextContent(forexGroup == null ? "" : "" + forexGroup.getId());
element.appendChild(nameElement);
element.appendChild(codeElement);
document.getDocumentElement().appendChild(element);
return element;
}
}