package org.robolectric.res.builder;
import javax.annotation.Nullable;
import org.robolectric.res.FsFile;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
/**
* An XML block is a parsed representation of a resource XML file. Similar in nature
* to Android's XmlBlock class.
*/
public class XmlBlock {
private static DocumentBuilder documentBuilder;
private final Document document;
private final String filename;
private final String packageName;
private synchronized static Document parse(FsFile xmlFile) {
InputStream inputStream = null;
try {
if (documentBuilder == null) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setIgnoringComments(true);
documentBuilderFactory.setIgnoringElementContentWhitespace(true);
documentBuilder = documentBuilderFactory.newDocumentBuilder();
}
inputStream = xmlFile.getInputStream();
return documentBuilder.parse(inputStream);
} catch (ParserConfigurationException | IOException | SAXException e) {
throw new RuntimeException(e);
} finally {
if (inputStream != null) try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@Nullable
public static XmlBlock create(FsFile fsFile, String packageName) {
Document document = parse(fsFile);
return document == null
? null
: new XmlBlock(document, fsFile.getPath(), packageName);
}
private XmlBlock(Document document, String filename, String packageName) {
this.document = document;
this.filename = filename;
this.packageName = packageName;
}
public Document getDocument() {
return document;
}
public String getFilename() {
return filename;
}
public String getPackageName() {
return packageName;
}
}