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("&", "&amp;");
        encodings.put("<", "&lt;");
        encodings.put(">", "&gt;");
        encodings.put("'", "&apos;");
        encodings.put("\"", "&quot;");
    }

    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;
    }
}