package com.brightgenerous.datasource;
import static com.brightgenerous.commons.StringUtils.*;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
class Loader {
private Loader() {
}
public static List<String> loadCreateTables(InputStream stream) throws XMLStreamException {
return load(stream, "create");
}
public static List<String> loadDropTables(InputStream stream) throws XMLStreamException {
return load(stream, "drop");
}
public static List<String> loadInitSqls(InputStream stream) throws XMLStreamException {
return load(stream, "sql");
}
public static List<String> loadDummySqls(InputStream stream) throws XMLStreamException {
return load(stream, "sql");
}
private static List<String> load(InputStream stream, String elem) throws XMLStreamException {
List<String> ret = new ArrayList<>();
XMLStreamReader reader = null;
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
reader = factory.createXMLStreamReader(stream);
String localName = null;
StringBuilder text = null;
for (; reader.hasNext(); reader.next()) {
int eventType = reader.getEventType();
if (eventType == XMLStreamConstants.START_ELEMENT) {
localName = reader.getLocalName();
if (localName.equals(elem)) {
text = new StringBuilder();
}
} else if (eventType == XMLStreamConstants.CHARACTERS) {
if ((localName != null) && (text != null)) {
if (localName.equals(elem)) {
text.append(reader.getText());
}
}
} else if (eventType == XMLStreamConstants.END_ELEMENT) {
if (text != null) {
localName = reader.getLocalName();
if (localName.equals(elem)) {
String sql = text.toString().trim();
if (isNotEmpty(sql)) {
ret.add(sql);
}
}
}
}
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (XMLStreamException e) {
}
}
}
return ret;
}
}