org.roda.core.common.MetadataFileUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.core.common.MetadataFileUtils.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE file at the root of the source
 * tree and available online at
 *
 * https://github.com/keeps/roda
 */
package org.roda.core.common;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.jdom2.Element;
import org.jdom2.IllegalDataException;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.storage.Binary;
import org.roda.core.storage.ContentPayload;
import org.roda.core.storage.StringContentPayload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.google.common.xml.XmlEscapers;

public class MetadataFileUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(MetadataFileUtils.class);

    /** Private empty constructor */
    private MetadataFileUtils() {
        // do nothing
    }

    public static ContentPayload getMetadataPayload(TransferredResource transferredResource) {
        try {
            Element root = new Element("metadata");
            org.jdom2.Document doc = new org.jdom2.Document();
            Element child = new Element("field");
            child.setAttribute("name", "title");
            child.addContent(transferredResource.getName());
            root.addContent(child);
            doc.setRootElement(root);
            XMLOutputter outter = new XMLOutputter();
            outter.setFormat(Format.getPrettyFormat());
            outter.outputString(doc);
            return new StringContentPayload(outter.outputString(doc));
        } catch (IllegalDataException e) {
            LOGGER.debug("Error generating TransferredResource metadata file {}", e.getMessage());
            return new StringContentPayload("");
        }
    }

    public static Map<String, List<String>> parseBinary(Binary binary)
            throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        Map<String, List<String>> otherProperties = new HashMap<>();
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(binary.getContent().createInputStream());
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile("//field");
        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            String name = nodes.item(i).getAttributes().getNamedItem("name").getNodeValue() + "_txt";
            String value = nodes.item(i).getTextContent();
            List<String> values = new ArrayList<>();
            if (otherProperties.containsKey(name)) {
                values = otherProperties.get(name);
            }
            values.add(value);
            otherProperties.put(name, values);
        }
        return otherProperties;
    }

    public static String escapeAttribute(String value) {
        return XmlEscapers.xmlAttributeEscaper().escape(value);
    }

    public static String escapeContent(String value) {
        return XmlEscapers.xmlContentEscaper().escape(value);
    }

}