OdfUtils.java
package org.jbehave.core.io.odf;
import static org.apache.commons.lang3.StringUtils.join;
import static org.odftoolkit.simple.common.TextExtractor.newOdfTextExtractor;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
import org.odftoolkit.simple.Document;
import org.odftoolkit.simple.TextDocument;
import org.odftoolkit.simple.table.Cell;
import org.odftoolkit.simple.table.Row;
import org.odftoolkit.simple.table.Table;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class OdfUtils {
public static TextDocument loadOdt(InputStream resourceAsStream) {
try {
return TextDocument.loadDocument(resourceAsStream);
} catch (Exception cause) {
throw new OdfDocumentLoadingFailed(resourceAsStream, cause);
}
}
public static String parseOdt(TextDocument document) {
List<String> lines = new ArrayList<>();
try {
NodeList list = document.getContentRoot().getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node item = list.item(i);
if (isTextNode(item)) {
lines.add(parseTextNode(item));
} else if (isTableNode(item)) {
lines.addAll(parseTable(item));
}
}
} catch (Exception e) {
throw new OdfDocumentParsingFailed(document, e);
}
return join(lines, System.getProperty("line.separator"));
}
private static Collection<String> parseTable(Node item) {
ArrayList<String> lines = new ArrayList<>();
Table table = Table.getInstance((TableTableElement) item);
for (Row row : table.getRowList()) {
lines.add(parseTableRow(row));
}
return lines;
}
private static String parseTableRow(Row row) {
String line = "|";
for (int i = 0; i < row.getCellCount(); i++) {
Cell cell = row.getCellByIndex(i);
line += cell.getDisplayText() + "|";
}
return line;
}
private static boolean isTableNode(Node item) {
return item instanceof TableTableElement;
}
private static String parseTextNode(Node item) {
TextParagraphElementBase textItem = (TextParagraphElementBase) item;
return newOdfTextExtractor(textItem).getText();
}
private static boolean isTextNode(Node item) {
return item instanceof TextParagraphElementBase;
}
@SuppressWarnings("serial")
public static class OdfDocumentLoadingFailed extends RuntimeException {
public OdfDocumentLoadingFailed(InputStream stream, Throwable cause) {
super("Failed to load ODF document from stream " + stream, cause);
}
}
@SuppressWarnings("serial")
public static class OdfDocumentParsingFailed extends RuntimeException {
public OdfDocumentParsingFailed(Document document, Throwable cause) {
super("Failed to parse ODF document " + document, cause);
}
}
}