在进行一些程序内操作之后,我最终得到了一个包含我想要执行的ChangeLog的xom Document对象。根据我的理解,我必须在ChangeLogParser的帮助下将其转换为liquibase XML格式,ParsedNode。但是接口假定了解析方法中的外部表示。使用ResourceAccessor将Document对象注入解析器也是不可能的,因为方法getResourcesAsStream返回一组InputStream。 因此,我能想到使用liquibase基础结构的唯一方法是对String执行Document打印,并通过ByteArrayInputStream将其反馈给它。 或者我需要写一个独立的文档 - > ParsedNode转换器?
答案 0 :(得分:0)
原来是一个明智的选择。在快速浏览一下SAX hander后,这很有效:
import liquibase.changelog.DatabaseChangeLog;
import liquibase.exception.SetupException;
import liquibase.parser.core.ParsedNode;
import liquibase.parser.core.ParsedNodeException;
import liquibase.resource.ClassLoaderResourceAccessor;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import org.apache.commons.lang3.StringUtils;
/**
* Convert a xom Document containing a liquibase changelog
* to a DatabaseChangeLog.
*/
public class XOMDocumentToDatabaseChangeLogConverter {
/**
* Convert the Document ot a DatabaseChangeLog.
* @param changeLogXML to convert.
* @return contained changelog.
* @throws SetupException on error.
* @throws ParsedNodeException on error.
*/
public static DatabaseChangeLog convert(Document changeLogXML) throws SetupException, ParsedNodeException {
DatabaseChangeLog result = new DatabaseChangeLog();
result.setPhysicalFilePath("");
Element rootElement = changeLogXML.getRootElement();
result.load(convert(rootElement), new ClassLoaderResourceAccessor());
return result;
}
/**
* Internal recursive method doing the node rollup.
* @param element to convert.
* @return converted node.
* @throws ParsedNodeException on error.
*/
protected static ParsedNode convert(Element element) throws ParsedNodeException {
ParsedNode node = new ParsedNode(null, element.getLocalName());
for (int i = 0; i < element.getAttributeCount(); ++i) {
node.addChild(null, element.getAttribute(i).getLocalName(), element.getAttribute(i).getValue());
}
String seenText = element.getValue();
if (!StringUtils.trimToEmpty(seenText).equals("")) {
node.setValue(seenText.trim());
}
Elements children = element.getChildElements();
for (int i = 0; i < children.size(); ++i) {
node.addChild(convert(children.get(i)));
}
return node;
}
}