blob: 2b7e1da8ad6c9388204baf3b968cb81b33805b53 [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tests.api.javax.xml.parsers;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.xml.sax.Attributes;
import org.xml.sax.HandlerBase;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Support for SAXParserTest. Shares the element keys used in the golden files.
* Compares the result of the parser with golden data.
* Contains the handler classes used to track the output of the parser.
*/
class SAXParserTestSupport {
public static final char SEPARATOR_ELEMENT = '^';
public static final char SEPARATOR_STRING = '$';
public static final char SEPARATOR_DATA = '#';
public static final String XML_WF = "/wf/";
public static final String XML_NWF = "/nwf/";
public static final String XML_WF_OUT_DH = "/out_dh/";
public static final String XML_WF_OUT_HB = "/out_hb/";
public static final String XML_SYSTEM_ID = "." + "/systemid/";
public static final String KEY_IS_START_DOC = "isEndDocument";
public static final String KEY_IS_END_DOC = "isStartDocument";
public static final String KEY_TEXT = "text";
public static final String KEY_ERROR = "error";
public static final String KEY_FATAL_ERROR = "fatalError";
public static final String KEY_WARNING = "warning";
public static final String KEY_END_ELEMENT = "endElement";
public static final String KEY_END_PREFIX_MAPPING = "endPrefixMapping";
public static final String KEY_IGNORABLE_WHITE_SPACE =
"ignorableWhitespace";
public static final String KEY_NOTATION_DECL = "notationDecl";
public static final String KEY_PROCESSING_INSTRUCTION =
"processingInstruction";
public static final String KEY_RESOLVE_ENTITY = "resolveEntity";
public static final String KEY_DOCUMENT_LOCATORS = "documentLocators";
public static final String KEY_SKIPPED_ENTITY = "skippedEntity";
public static final String KEY_START_ELEMENT = "startElement";
public static final String KEY_START_PREFIX_MAPPING = "startPrefixMapping";
public static final String KEY_UNPARSED_ENTITY_DECL = "unparsedEntityDecl";
static String [] KEYS = {KEY_IS_START_DOC, KEY_IS_END_DOC, KEY_TEXT,
KEY_ERROR, KEY_FATAL_ERROR, KEY_WARNING, KEY_END_ELEMENT,
KEY_END_PREFIX_MAPPING, KEY_PROCESSING_INSTRUCTION,
KEY_SKIPPED_ENTITY, KEY_START_ELEMENT,
KEY_START_PREFIX_MAPPING};
static {
String tmp = System.getProperty("java.io.tmpdir", ".");
new File(tmp).mkdirs();
new File(tmp, XML_WF).mkdirs();
new File(tmp, XML_NWF).mkdirs();
new File(tmp, XML_WF_OUT_DH).mkdirs();
new File(tmp, XML_WF_OUT_HB).mkdirs();
}
/**
* Initialize the SAXParserTest reference by filling in the data from the
* file passed to the method. This will be the reference to compare
* against with the output of the parser.
*/
public HashMap<String, String> readFile(String fileName) {
HashMap<String, String> storage = new HashMap<String, String>();
try {
InputStream is = new FileInputStream(fileName);
int c = is.read();
StringBuffer str = new StringBuffer();
int i = 0;
while(c != -1) {
if((char)c == SEPARATOR_DATA) {
// if(str.length() > 0) {
if(i < KEYS.length) {
storage.put(KEYS[i], str.toString());
// System.out.println(str.toString());
str.setLength(0);
i++;
}
// }
} else {
str.append((char)c);
}
try {
c = is.read();
} catch (Exception e) {
c = -1;
}
}
try {
is.close();
} catch (IOException e) {
}
} catch(IOException ioe) {
System.out.println("IOException during processing the file: "
+ fileName);
}
return storage;
}
/**
* Compares the content of two HashMaps. One map should be the reference
* containing the correct string for each xml document element and the other
* should contain the elements filled with output from the parser.
*
* @param original the reference
* @param result the result of the parser
* @return true if they're equal.
*/
public static boolean equalsMaps(HashMap<String, String> original,
HashMap<String, String> result) {
if(original == null && result == null) {
return true;
} else {
if(original.size() != result.size()) return false;
for(int i = 0; i < KEYS.length; i++) {
if(!original.get(KEYS[i]).equals(result.get(KEYS[i]))) {
System.out.println("for "+KEYS[i]+": original:" +
original.get(KEYS[i]));
System.out.println();
System.out.println(" result:" + result.get(KEYS[i]));
System.out.println();
return false;
}
}
return true;
}
}
static class MyDefaultHandler extends DefaultHandler {
public StringBuffer data_isEndDocument = new StringBuffer();
public StringBuffer data_isStartDocument = new StringBuffer();
public StringBuffer data_text = new StringBuffer();
public StringBuffer data_error = new StringBuffer();
public StringBuffer data_fatalError = new StringBuffer();
public StringBuffer data_warning = new StringBuffer();
public StringBuffer data_endElement = new StringBuffer();
public StringBuffer data_endPrefixMapping = new StringBuffer();
public StringBuffer data_processingInstruction = new StringBuffer();
public StringBuffer data_skippedEntity = new StringBuffer();
public StringBuffer data_startElement = new StringBuffer();
public StringBuffer data_startPrefixMapping = new StringBuffer();
public HashMap<String, String> createData() {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put(KEY_IS_END_DOC, data_isEndDocument.toString());
hm.put(KEY_IS_START_DOC, data_isStartDocument.toString());
hm.put(KEY_TEXT, data_text.toString());
hm.put(KEY_ERROR, data_error.toString());
hm.put(KEY_FATAL_ERROR, data_fatalError.toString());
hm.put(KEY_WARNING, data_warning.toString());
hm.put(KEY_END_ELEMENT, data_endElement.toString());
hm.put(KEY_END_PREFIX_MAPPING, data_endPrefixMapping.toString());
hm.put(KEY_PROCESSING_INSTRUCTION,
data_processingInstruction.toString());
hm.put(KEY_SKIPPED_ENTITY, data_skippedEntity.toString());
hm.put(KEY_START_ELEMENT, data_startElement.toString());
hm.put(KEY_START_PREFIX_MAPPING,
data_startPrefixMapping.toString());
return hm;
}
public void printMap() {
System.out.print(data_isStartDocument.toString() + SEPARATOR_DATA +
data_isEndDocument.toString() + SEPARATOR_DATA +
data_text.toString() + SEPARATOR_DATA +
data_error.toString()+ SEPARATOR_DATA +
data_fatalError.toString()+ SEPARATOR_DATA +
data_warning.toString()+ SEPARATOR_DATA +
data_endElement.toString() + SEPARATOR_DATA+
data_endPrefixMapping.toString()+ SEPARATOR_DATA +
data_processingInstruction.toString() + SEPARATOR_DATA +
data_skippedEntity.toString() + SEPARATOR_DATA +
data_startElement.toString() + SEPARATOR_DATA +
data_startPrefixMapping.toString()+ SEPARATOR_DATA);
}
@Override
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length);
data_text.append(str);
// different sax parsers are allowed to handle chunking differently,
// therefore we cannot rely on identical chunks being delivered.
//data_text.append(ParsingSupport.SEPARATOR_ELEMENT);
}
@Override
public void endDocument() {
data_isEndDocument.append(true);
data_isEndDocument.append(SEPARATOR_ELEMENT);
}
@Override
public void endElement(String uri, String localName, String qName) {
StringBuffer sb = new StringBuffer();
sb.append(uri);
sb.append(SEPARATOR_STRING);
sb.append(localName);
sb.append(SEPARATOR_STRING);
sb.append(qName);
data_endElement.append(sb);
data_endElement.append(SEPARATOR_ELEMENT);
}
@Override
public void endPrefixMapping(String prefix) {
data_endPrefixMapping.append(prefix);
data_endPrefixMapping.append(SEPARATOR_ELEMENT);
}
@Override
public void error(SAXParseException e) {
data_error.append(e);
data_error.append(SEPARATOR_ELEMENT);
}
@Override
public void fatalError(SAXParseException e) {
data_fatalError.append(e);
data_fatalError.append(SEPARATOR_ELEMENT);
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) {
/* String s = new String(ch, start, length);
ignorableWhitespace.append(s);
ignorableWhitespace.append(ParsingSupport.SEPARATOR_ELEMENT);*/
}
@Override
public void notationDecl(String name, String publicId,
String systemId) {
/* data_notationDecl.append(name + ParsingSupport.SEPARATOR_STRING +
publicId + ParsingSupport.SEPARATOR_STRING +
systemId + ParsingSupport.SEPARATOR_STRING);
data_notationDecl.append(ParsingSupport.SEPARATOR_ELEMENT);*/
}
@Override
public void processingInstruction(String target, String data) {
data_processingInstruction.append(target + SEPARATOR_STRING + data);
data_processingInstruction.append(SEPARATOR_ELEMENT);
}
@Override
public InputSource resolveEntity(String publicId, String systemId) {
// data_resolveEntity.append(publicId +
// ParsingSupport.SEPARATOR_STRING + systemId);
// data_resolveEntity.append(ParsingSupport.SEPARATOR_ELEMENT);
return null;
}
@Override
public void setDocumentLocator(Locator locator) {
// data_documentLocators.append(locator);
// data_documentLocators.append(ParsingSupport.SEPARATOR_ELEMENT);
}
@Override
public void skippedEntity(String name) {
data_skippedEntity.append(name);
data_skippedEntity.append(SEPARATOR_ELEMENT);
}
@Override
public void startDocument() {
data_isStartDocument.append(true);
data_isStartDocument.append(SEPARATOR_ELEMENT);
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) {
data_startElement.append(uri);
data_startElement.append(SEPARATOR_STRING);
data_startElement.append(localName);
data_startElement.append(SEPARATOR_STRING);
data_startElement.append(qName);
for(int i = 0; i < attributes.getLength(); i ++)
data_startElement.append(
SEPARATOR_STRING +attributes.getQName(i) +
SEPARATOR_STRING + attributes.getValue(i));
data_isStartDocument.append(SEPARATOR_ELEMENT);
}
@Override
public void startPrefixMapping(String prefix, String uri) {
data_startPrefixMapping.append(prefix + SEPARATOR_STRING + uri);
}
@Override
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) {
// data_unparsedEntityDecl.append(name
// + ParsingSupport.SEPARATOR_STRING + publicId
// + ParsingSupport.SEPARATOR_STRING
// + systemId + ParsingSupport.SEPARATOR_STRING + notationName);
}
@Override
public void warning(SAXParseException e) {
data_warning.append(e);
}
}
@SuppressWarnings("deprecation")
static class MyHandler extends HandlerBase {
public StringBuffer data_isEndDocument = new StringBuffer();
public StringBuffer data_isStartDocument = new StringBuffer();
public StringBuffer data_text = new StringBuffer();
public StringBuffer data_error = new StringBuffer();
public StringBuffer data_fatalError = new StringBuffer();
public StringBuffer data_warning = new StringBuffer();
public StringBuffer data_endElement = new StringBuffer();
public StringBuffer data_endPrefixMapping = new StringBuffer();
public StringBuffer data_processingInstruction = new StringBuffer();
public StringBuffer data_skippedEntity = new StringBuffer();
public StringBuffer data_startElement = new StringBuffer();
public StringBuffer data_startPrefixMapping = new StringBuffer();
public void printMap() {
System.out.print(data_isStartDocument.toString() + SEPARATOR_DATA +
data_isEndDocument.toString() + SEPARATOR_DATA +
data_text.toString() + SEPARATOR_DATA +
data_error.toString()+ SEPARATOR_DATA +
data_fatalError.toString()+ SEPARATOR_DATA +
data_warning.toString()+ SEPARATOR_DATA +
data_endElement.toString() + SEPARATOR_DATA+
data_endPrefixMapping.toString()+ SEPARATOR_DATA +
data_processingInstruction.toString() + SEPARATOR_DATA +
data_skippedEntity.toString() + SEPARATOR_DATA +
data_startElement.toString() + SEPARATOR_DATA +
data_startPrefixMapping.toString()+ SEPARATOR_DATA);
}
public HashMap<String, String> createData() {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put(KEY_IS_END_DOC, data_isEndDocument.toString());
hm.put(KEY_IS_START_DOC, data_isStartDocument.toString());
hm.put(KEY_TEXT, data_text.toString());
hm.put(KEY_ERROR, data_error.toString());
hm.put(KEY_FATAL_ERROR, data_fatalError.toString());
hm.put(KEY_WARNING, data_warning.toString());
hm.put(KEY_END_ELEMENT, data_endElement.toString());
hm.put(KEY_END_PREFIX_MAPPING, data_endPrefixMapping.toString());
hm.put(KEY_PROCESSING_INSTRUCTION,
data_processingInstruction.toString());
hm.put(KEY_SKIPPED_ENTITY, data_skippedEntity.toString());
hm.put(KEY_START_ELEMENT, data_startElement.toString());
hm.put(KEY_START_PREFIX_MAPPING,
data_startPrefixMapping.toString());
return hm;
}
@Override
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length);
data_text.append(str);
// different sax parsers are allowed to handle chunking differently,
// therefore we cannot rely on identical chunks being delivered.
//data_text.append(ParsingSupport.SEPARATOR_ELEMENT);
}
@Override
public void endDocument() {
data_isEndDocument.append(true);
data_isEndDocument.append(SEPARATOR_ELEMENT);
}
public void endElement(String uri, String localName, String qName) {
StringBuffer sb = new StringBuffer();
sb.append(uri);
sb.append(SEPARATOR_STRING);
sb.append(localName);
sb.append(SEPARATOR_STRING);
sb.append(qName);
data_endElement.append(sb);
data_endElement.append(SEPARATOR_ELEMENT);
}
@Override
public void error(SAXParseException e) {
data_error.append(e);
data_error.append(SEPARATOR_ELEMENT);
}
@Override
public void fatalError(SAXParseException e) {
data_fatalError.append(e);
data_fatalError.append(SEPARATOR_ELEMENT);
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) {
}
@Override
public void notationDecl(String name, String publicId,
String systemId) {
}
@Override
public void processingInstruction(String target, String data) {
data_processingInstruction.append(target + SEPARATOR_STRING + data);
data_processingInstruction.append(SEPARATOR_ELEMENT);
}
@Override
public InputSource resolveEntity(String publicId, String systemId) {
return null;
}
@Override
public void setDocumentLocator(Locator locator) {
}
@Override
public void startDocument() {
data_isStartDocument.append(true);
data_isStartDocument.append(SEPARATOR_ELEMENT);
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) {
data_startElement.append(uri);
data_startElement.append(SEPARATOR_STRING);
data_startElement.append(localName);
data_startElement.append(SEPARATOR_STRING);
data_startElement.append(qName);
for(int i = 0; i < attributes.getLength(); i ++)
data_startElement.append(SEPARATOR_STRING
+ attributes.getQName(i) +
SEPARATOR_STRING + attributes.getValue(i));
data_isStartDocument.append(SEPARATOR_ELEMENT);
}
@Override
public void unparsedEntityDecl(String name, String publicId,
String systemId, String notationName) {
}
@Override
public void warning(SAXParseException e) {
data_warning.append(e);
}
}
}