package test;
import java.io.*;
import java.util.
List;
import javax.xml.stream.*;
import org.codehaus.stax2.
LocationInfo;
import org.codehaus.stax2.
XMLInputFactory2;
import org.codehaus.stax2.
XMLStreamReader2;
// import org.codehaus.stax2.io.Stax2ByteArraySource;
/**
* Simple helper test class for checking how stream reader handles xml
* documents.
*/
public class
TestStreamReader
implements
XMLStreamConstants
{
protected
TestStreamReader() {
}
protected
XMLInputFactory getFactory()
{
System.
setProperty("javax.xml.stream.XMLInputFactory",
"com.fasterxml.aalto.stax.InputFactoryImpl");
XMLInputFactory f =
XMLInputFactory.
newInstance();
System.
out.
println("Factory instance: "+
f.
getClass());
//f.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
f.
setProperty(
XMLInputFactory.
IS_COALESCING,
Boolean.
TRUE);
f.
setProperty(
XMLInputFactory.
IS_NAMESPACE_AWARE,
Boolean.
TRUE);
//f.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
f.
setProperty(
XMLInputFactory.
IS_REPLACING_ENTITY_REFERENCES,
Boolean.
FALSE
//Boolean.TRUE
);
f.
setProperty(
XMLInputFactory.
SUPPORT_DTD,
Boolean.
TRUE);
//f.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
f.
setProperty(
XMLInputFactory.
IS_VALIDATING,
Boolean.
FALSE);
//f.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.TRUE);
return
f;
}
@
SuppressWarnings({ "unchecked", "resource" })
protected int
test(
File file)
throws
Exception
{
XMLInputFactory f =
getFactory();
System.
out.
print("Coalesce: "+
f.
getProperty(
XMLInputFactory.
IS_COALESCING));
System.
out.
println(", NS-aware: "+
f.
getProperty(
XMLInputFactory.
IS_NAMESPACE_AWARE));
System.
out.
print("Entity-expanding: "+
f.
getProperty(
XMLInputFactory.
IS_REPLACING_ENTITY_REFERENCES));
System.
out.
println(", validating: "+
f.
getProperty(
XMLInputFactory.
IS_VALIDATING));
//System.out.println(", name interning: "+f.getProperty(XMLInputFactory2.P_INTERN_NAMES));
int
total = 0;
XMLStreamReader2 sr;
// Let's deal with gzipped files too?
/*
if (file.getName().endsWith(".gz")) {
System.out.println("[gzipped input file!]");
sr = f.createXMLStreamReader
(new InputStreamReader(new GZIPInputStream
(new FileInputStream(file)), "UTF-8"));
} else {
sr = f.createXMLStreamReader(new FileInputStream(file));
//sr = f.createXMLStreamReader(new FileReader(file));
}
*/
/*
{
byte[] data = readData(file);
sr = f.createXMLStreamReader(new Stax2ByteArraySource(data, 0, data.length));
System.out.println("File '"+file+"', read "+data.length+" bytes in.");
}
*/
sr = (
XMLStreamReader2)
f.
createXMLStreamReader(new
InputStreamReader(new
FileInputStream(
file), "UTF-8"));
//sr = f.createXMLStreamReader(new FileInputStream(file));
System.
out.
println("SR; name interning: "+
sr.
getProperty(
XMLInputFactory2.
P_INTERN_NAMES));
System.
out.
println("SR; URI interning: "+
sr.
getProperty(
XMLInputFactory2.
P_INTERN_NS_URIS));
int
type =
sr.
getEventType();
System.
out.
println("START: version = '"+
sr.
getVersion()
+"', xml-encoding = '"+
sr.
getCharacterEncodingScheme()
+"', input encoding = '"+
sr.
getEncoding()+"'");
while (
type !=
END_DOCUMENT) {
type =
sr.
next();
total +=
type; // so it won't be optimized out...
//boolean hasName = sr.hasName();
System.
out.
print("["+
type+"]");
if (
sr.
hasText()) {
String text =
sr.
getText();
total +=
text.
length(); // to prevent dead code elimination
if (
type ==
CHARACTERS ||
type ==
CDATA ||
type ==
COMMENT) {
System.
out.
println(" Text("+
text.
length()+" = '"+
text+"'.");
if (
text.
length() >= 1) {
System.
out.
println(" [first char code: 0x"+
Integer.
toHexString(
text.
charAt(0))+"]");
}
LocationInfo li =
sr.
getLocationInfo();
System.
out.
println(" [Loc, start: "+
li.
getStartLocation()+", end: "+
li.
getEndLocation()+"]");
} else if (
type ==
SPACE) {
System.
out.
print(" Ws = '"+
text+"'.");
char
c = (
text.
length() == 0) ? ' ':
text.
charAt(
text.
length()-1);
if (
c != '\r' &&
c != '\n') {
System.
out.
println();
}
} else if (
type ==
DTD) {
System.
out.
println(" DTD;");
List<
Object>
entities = (
List<
Object>)
sr.
getProperty("javax.xml.stream.entities");
List<
Object>
notations = (
List<
Object>)
sr.
getProperty("javax.xml.stream.notations");
int
entCount = (
entities == null) ? -1 :
entities.
size();
int
notCount = (
notations == null) ? -1 :
notations.
size();
System.
out.
print(" ("+
entCount+" entities, "+
notCount
+" notations), sysid ");
System.
out.
print(", declaration = <<");
System.
out.
print(
text);
System.
out.
println(">>");
} else if (
type ==
ENTITY_REFERENCE) {
// entity ref
System.
out.
println(" Entity ref: &"+
sr.
getLocalName()+" -> '"+
sr.
getText()+"'.");
//hasName = false; // to suppress further output
} else { // PI?
;
}
}
if (
type ==
PROCESSING_INSTRUCTION) {
System.
out.
println(" PI target = '"+
sr.
getPITarget()+"'.");
System.
out.
println(" PI data = '"+
sr.
getPIData()+"'.");
} else if (
type ==
START_ELEMENT) {
String prefix =
sr.
getPrefix();
System.
out.
print('<');
if (
prefix != null &&
prefix.
length() > 0) {
System.
out.
print(
prefix);
System.
out.
print(':');
}
System.
out.
print(
sr.
getLocalName());
//System.out.println("[first char 0x"+Integer.toHexString(sr.getLocalName().charAt(0))+"]");
System.
out.
print(" [QNameNS: "+
sr.
getName().
getNamespaceURI()+"]");
System.
out.
print(" {ns '");
System.
out.
print(
sr.
getNamespaceURI());
System.
out.
print("'}> ");
int
count =
sr.
getAttributeCount();
int
nsCount =
sr.
getNamespaceCount();
System.
out.
println(" ["+
nsCount+" ns, "+
count+" attrs]");
// debugging:
for (int
i = 0;
i <
nsCount; ++
i) {
System.
out.
println(" ns#"+
i+": '"+
sr.
getNamespacePrefix(
i)
+"' -> '"+
sr.
getNamespaceURI(
i)
+"'");
}
for (int
i = 0;
i <
count; ++
i) {
String val =
sr.
getAttributeValue(
i);
System.
out.
print(" attr#"+
i+": "+
sr.
getAttributePrefix(
i)
+":"+
sr.
getAttributeLocalName(
i)
+" ("+
sr.
getAttributeNamespace(
i)
+") -> '"+
val
+"' ["+(
val.
length())+"]");
System.
out.
println(
sr.
isAttributeSpecified(
i) ?
"[specified]" : "[Default]");
}
} else if (
type ==
END_ELEMENT) {
System.
out.
print("</");
String prefix =
sr.
getPrefix();
if (
prefix != null &&
prefix.
length() > 0) {
System.
out.
print(
prefix);
System.
out.
print(':');
}
System.
out.
print(
sr.
getLocalName());
System.
out.
print(" {ns '");
System.
out.
print(
sr.
getNamespaceURI());
System.
out.
print("'}> ");
int
nsCount =
sr.
getNamespaceCount();
System.
out.
println(" ["+
nsCount+" ns unbound]");
} else if (
type ==
START_DOCUMENT) { // only for multi-doc mode
System.
out.
print("XML-DECL: version = '"+
sr.
getVersion()
+"', xml-decl-encoding = '"+
sr.
getCharacterEncodingScheme()
+"', app-encoding = '"+
sr.
getEncoding()
+"', stand-alone set: "+
sr.
standaloneSet());
}
}
return
total;
}
public static void
main(
String[]
args)
throws
Exception
{
if (
args.length != 1) {
System.
err.
println("Usage: java ... "+
TestStreamReader.class+" [file]");
System.
exit(1);
}
try {
int
total = new
TestStreamReader().
test(new
File(
args[0]));
System.
out.
println();
System.
out.
println("Total: "+
total);
} catch (
Throwable t) {
System.
err.
println("Error: "+
t);
t.
printStackTrace();
}
}
}