package at.ac.tuwien.dsg.scaledom.test;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import at.ac.tuwien.dsg.scaledom.ScaleDom;
import at.ac.tuwien.dsg.scaledom.ScaleDomDocumentBuilder;
import at.ac.tuwien.dsg.scaledom.ScaleDomDocumentBuilderFactory;
import at.ac.tuwien.dsg.scaledom.io.impl.FileDocumentSource;
import at.ac.tuwien.dsg.scaledom.lazy.LazyLoadingStrategy;
import at.ac.tuwien.dsg.scaledom.test.util.MeasuredTask;
public abstract class TestBase {
// Only true is supported until Apache Xerces is repackaged in ScaleDOM!
public static boolean USE_SCALEDOM = true;
protected static Document parseDocument(final File file, final String fileEncoding) throws Exception {
return parseDocument(file, fileEncoding, null);
}
protected static Document parseDocument(final File file, final String fileEncoding,
final Class<? extends LazyLoadingStrategy> strategy) throws Exception {
if(!USE_SCALEDOM) {
System.err.println("Only ScaleDOM is supported until Apache Xerces is repackaged in ScaleDOM! Currently, you may not use Apache Xerces directly!");
System.err.println("Please set USE_SCALEDOM = true!");
}
// Create ScaleDOM document builder factory
final DocumentBuilderFactory dbf;
if (USE_SCALEDOM) {
dbf = DocumentBuilderFactory.newInstance(ScaleDomDocumentBuilderFactory.class.getName(),
ScaleDomDocumentBuilderFactory.class.getClassLoader());
} else {
dbf = DocumentBuilderFactory.newInstance();
}
// Configure document builder factory
dbf.setNamespaceAware(true);
dbf.setValidating(true);
if (strategy != null) {
dbf.setAttribute(ScaleDom.ATTRIBUTE_LAZYLOADINGSTRATEGY_IMPLEMENTATION, strategy);
}
// Create ScaleDOM document builder
final DocumentBuilder db = dbf.newDocumentBuilder();
// Parse document
final Document doc = new MeasuredTask<Document>("Initial parsing") {
@Override
protected Document runTask() throws Exception {
if(USE_SCALEDOM) {
// Use internal API instead of JAXP to be able to set encoding
final FileDocumentSource fds = new FileDocumentSource(file, fileEncoding);
return ((ScaleDomDocumentBuilder) db).parse(fds);
} else {
return db.parse(file);
}
}
}.run();
return doc;
}
}