This commit is contained in:
Lana Steuck 2014-11-13 09:39:08 -08:00
commit 46d6511c65
54 changed files with 2918 additions and 25 deletions

View File

@ -213,6 +213,10 @@ public class DescendingVisitor implements Visitor {
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {
stack.push(obj);
obj.accept(visitor);
LocalVariable[] vars = obj.getLocalVariableTypeTable();
for(int i=0; i < vars.length; i++)
vars[i].accept(this);
stack.pop();
}

View File

@ -87,6 +87,7 @@ public class MethodGen extends FieldGenOrMethodGen {
private boolean strip_attributes;
private ArrayList variable_vec = new ArrayList();
private ArrayList type_vec = new ArrayList();
private ArrayList line_number_vec = new ArrayList();
private ArrayList exception_vec = new ArrayList();
private ArrayList throws_vec = new ArrayList();
@ -260,7 +261,7 @@ public class MethodGen extends FieldGenOrMethodGen {
}
} else if (a instanceof LocalVariableTypeTable) {
LocalVariable[] lv = ((LocalVariableTypeTable) a).getLocalVariableTypeTable();
removeLocalVariables();
removeLocalVariableTypes();
for (int k = 0; k < lv.length; k++) {
LocalVariable l = lv[k];
InstructionHandle start = il.findHandle(l.getStartPC());
@ -272,7 +273,7 @@ public class MethodGen extends FieldGenOrMethodGen {
if (null == end) {
end = il.getEnd();
}
addLocalVariable(l.getName(), Type.getType(l.getSignature()), l
addLocalVariableType(l.getName(), Type.getType(l.getSignature()), l
.getIndex(), start, end);
}
} else
@ -406,6 +407,31 @@ public class MethodGen extends FieldGenOrMethodGen {
return lg;
}
/*
* If the range of the variable has not been set yet, it will be set to be
* val id from the start to the end of the instruction list.
*
* @return array of declared local variable types sorted by index
*/
private LocalVariableGen[] getLocalVariableTypes() {
int size = type_vec.size();
LocalVariableGen[] lg = new LocalVariableGen[size];
type_vec.toArray(lg);
for(int i=0; i < size; i++) {
if(lg[i].getStart() == null)
lg[i].setStart(il.getStart());
if(lg[i].getEnd() == null)
lg[i].setEnd(il.getEnd());
}
if(size > 1)
sort(lg, 0, size - 1);
return lg;
}
/**
* @return `LocalVariableTable' attribute of all the local variables of this method.
*/
@ -421,6 +447,68 @@ public class MethodGen extends FieldGenOrMethodGen {
2 + lv.length * 10, lv, cp.getConstantPool());
}
/**
* @return `LocalVariableTypeTable' attribute of all the local variable
* types of this method.
*/
public LocalVariableTypeTable getLocalVariableTypeTable(ConstantPoolGen cp) {
LocalVariableGen[] lg = getLocalVariableTypes();
int size = lg.length;
LocalVariable[] lv = new LocalVariable[size];
for(int i=0; i < size; i++)
lv[i] = lg[i].getLocalVariable(cp);
return new LocalVariableTypeTable(cp.addUtf8("LocalVariableTypeTable"),
2 + lv.length * 10, lv, cp.getConstantPool());
}
/**
* Adds a local variable type to this method.
*
* @param name variable name
* @param type variable type
* @param slot the index of the local variable, if type is long or double, the next available
* index is slot+2
* @param start from where the variable is valid
* @param end until where the variable is valid
* @return new local variable object
* @see LocalVariable
*/
private LocalVariableGen addLocalVariableType(String name, Type type, int slot,
InstructionHandle start,
InstructionHandle end) {
byte t = type.getType();
if(t != Constants.T_ADDRESS) {
int add = type.getSize();
if(slot + add > max_locals)
max_locals = slot + add;
LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end);
int i;
if((i = type_vec.indexOf(l)) >= 0) // Overwrite if necessary
type_vec.set(i, l);
else
type_vec.add(l);
return l;
} else {
throw new IllegalArgumentException("Can not use " + type +
" as type for local variable");
}
}
/**
* Remove all local variable types.
*/
private void removeLocalVariableTypes() {
type_vec.clear();
}
/**
* Give an instruction a line number corresponding to the source code line.
*
@ -637,12 +725,17 @@ public class MethodGen extends FieldGenOrMethodGen {
LineNumberTable lnt = null;
LocalVariableTable lvt = null;
LocalVariableTypeTable lvtt = null;
/* Create LocalVariableTable and LineNumberTable attributes (for debuggers, e.g.)
/* Create LocalVariableTable, LocalvariableTypeTable, and LineNumberTable
* attributes (for debuggers, e.g.)
*/
if((variable_vec.size() > 0) && !strip_attributes)
addCodeAttribute(lvt = getLocalVariableTable(cp));
if((type_vec.size() > 0) && !strip_attributes)
addCodeAttribute(lvtt = getLocalVariableTypeTable(cp));
if((line_number_vec.size() > 0) && !strip_attributes)
addCodeAttribute(lnt = getLineNumberTable(cp));
@ -691,6 +784,7 @@ public class MethodGen extends FieldGenOrMethodGen {
// Undo effects of adding attributes
if(lvt != null) removeCodeAttribute(lvt);
if(lvtt != null) removeCodeAttribute(lvtt);
if(lnt != null) removeCodeAttribute(lnt);
if(code != null) removeAttribute(code);
if(et != null) removeAttribute(et);

View File

@ -146,8 +146,9 @@ public class XML11EntityScanner
fCurrentEntity.lineNumber++;
fCurrentEntity.columnNumber = 1;
if (fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = (char)c;
load(1, false, true);
load(1, false, false);
}
if (c == '\r' && external) {
int cc = fCurrentEntity.ch[fCurrentEntity.position++];
@ -305,9 +306,10 @@ public class XML11EntityScanner
if (XML11Char.isXML11NameStart(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
fCurrentEntity.columnNumber++;
String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);
return symbol;
@ -316,9 +318,10 @@ public class XML11EntityScanner
}
else if (XML11Char.isXML11NameHighSurrogate(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
--fCurrentEntity.position;
--fCurrentEntity.startPosition;
return null;
@ -331,10 +334,11 @@ public class XML11EntityScanner
return null;
}
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(2);
fCurrentEntity.ch[0] = ch;
fCurrentEntity.ch[1] = ch2;
offset = 0;
if (load(2, false, true)) {
if (load(2, false, false)) {
fCurrentEntity.columnNumber += 2;
String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2);
return symbol;
@ -463,9 +467,10 @@ public class XML11EntityScanner
if (XML11Char.isXML11NCNameStart(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
fCurrentEntity.columnNumber++;
String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);
return symbol;
@ -474,9 +479,10 @@ public class XML11EntityScanner
}
else if (XML11Char.isXML11NameHighSurrogate(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
--fCurrentEntity.position;
--fCurrentEntity.startPosition;
return null;
@ -489,10 +495,11 @@ public class XML11EntityScanner
return null;
}
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(2);
fCurrentEntity.ch[0] = ch;
fCurrentEntity.ch[1] = ch2;
offset = 0;
if (load(2, false, true)) {
if (load(2, false, false)) {
fCurrentEntity.columnNumber += 2;
String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2);
return symbol;
@ -627,9 +634,10 @@ public class XML11EntityScanner
if (XML11Char.isXML11NCNameStart(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
fCurrentEntity.columnNumber++;
String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);
qname.setValues(null, name, name, null);
@ -639,9 +647,10 @@ public class XML11EntityScanner
}
else if (XML11Char.isXML11NameHighSurrogate(ch)) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = ch;
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
--fCurrentEntity.startPosition;
--fCurrentEntity.position;
return false;
@ -654,10 +663,11 @@ public class XML11EntityScanner
return false;
}
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(2);
fCurrentEntity.ch[0] = ch;
fCurrentEntity.ch[1] = ch2;
offset = 0;
if (load(2, false, true)) {
if (load(2, false, false)) {
fCurrentEntity.columnNumber += 2;
String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2);
qname.setValues(null, name, name, null);
@ -834,8 +844,9 @@ public class XML11EntityScanner
load(0, true, true);
}
else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
load(1, false, true);
load(1, false, false);
fCurrentEntity.position = 0;
fCurrentEntity.startPosition = 0;
}
@ -975,8 +986,9 @@ public class XML11EntityScanner
load(0, true, true);
}
else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
load(1, false, true);
load(1, false, false);
fCurrentEntity.startPosition = 0;
fCurrentEntity.position = 0;
}
@ -1345,8 +1357,9 @@ public class XML11EntityScanner
else if (c == '\n' && (cc == '\r' ) && fCurrentEntity.isExternal()) {
// handle newlines
if (fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = (char)cc;
load(1, false, true);
load(1, false, false);
}
int ccc = fCurrentEntity.ch[++fCurrentEntity.position];
if (ccc == '\n' || ccc == 0x85) {
@ -1407,8 +1420,9 @@ public class XML11EntityScanner
fCurrentEntity.lineNumber++;
fCurrentEntity.columnNumber = 1;
if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = (char)c;
entityChanged = load(1, true, true);
entityChanged = load(1, true, false);
if (!entityChanged) {
// the load change the position to be 1,
// need to restore it when entity not changed

View File

@ -538,8 +538,9 @@ public class XMLEntityScanner implements XMLLocator {
fCurrentEntity.lineNumber++;
fCurrentEntity.columnNumber = 1;
if (fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = (char)c;
load(1, false, true);
load(1, false, false);
}
if (c == '\r' && isExternal) {
if (fCurrentEntity.ch[fCurrentEntity.position++] != '\n') {
@ -670,9 +671,10 @@ public class XMLEntityScanner implements XMLLocator {
int offset = fCurrentEntity.position;
if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
fCurrentEntity.columnNumber++;
String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);
@ -776,10 +778,11 @@ public class XMLEntityScanner implements XMLLocator {
if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {
if (++fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];
offset = 0;
if (load(1, false, true)) {
if (load(1, false, false)) {
fCurrentEntity.columnNumber++;
//adding into symbol table.
//XXX We are trying to add single character in SymbolTable??????
@ -906,8 +909,9 @@ public class XMLEntityScanner implements XMLLocator {
if (fCurrentEntity.position == fCurrentEntity.count) {
load(0, true, true);
} else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
load(1, false, true);
load(1, false, false);
fCurrentEntity.position = 0;
}
@ -1054,8 +1058,9 @@ public class XMLEntityScanner implements XMLLocator {
if (fCurrentEntity.position == fCurrentEntity.count) {
load(0, true, true);
} else if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];
load(1, false, true);
load(1, false, false);
fCurrentEntity.position = 0;
}
@ -1427,8 +1432,9 @@ public class XMLEntityScanner implements XMLLocator {
} else if (c == '\n' && cc == '\r' && isExternal) {
// handle newlines
if (fCurrentEntity.position == fCurrentEntity.count) {
invokeListeners(1);
fCurrentEntity.ch[0] = (char)cc;
load(1, false, true);
load(1, false, false);
}
fCurrentEntity.position++;
if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {
@ -1502,8 +1508,9 @@ public class XMLEntityScanner implements XMLLocator {
fCurrentEntity.lineNumber++;
fCurrentEntity.columnNumber = 1;
if (fCurrentEntity.position == fCurrentEntity.count - 1) {
invokeListeners(0);
fCurrentEntity.ch[0] = (char)c;
entityChanged = load(1, true, true);
entityChanged = load(1, true, false);
if (!entityChanged){
// the load change the position to be 1,
// need to restore it when entity not changed

View File

@ -0,0 +1,386 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_LANGUAGE;
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_SOURCE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.nio.file.Paths;
import java.util.GregorianCalendar;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import static jaxp.library.JAXPTestUtilities.bomStream;
import static jaxp.library.JAXPTestUtilities.failUnexpected;
import org.testng.annotations.Test;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.TypeInfo;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.SAXException;
import static test.auctionportal.HiBidConstants.PORTAL_ACCOUNT_NS;
import static test.auctionportal.HiBidConstants.XML_DIR;
/**
* This is the user controller class for the Auction portal HiBid.com.
*/
public class AuctionController {
/**
* Check for DOMErrorHandler handling DOMError. Before fix of bug 4890927
* DOMConfiguration.setParameter("well-formed",true) throws an exception.
*/
@Test
public void testCreateNewItem2Sell() {
String xmlFile = XML_DIR + "novelsInvalid.xml";
try {
Document document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(xmlFile);
document.getDomConfig().setParameter("well-formed", true);
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
MyDOMOutput domOutput = new MyDOMOutput();
domOutput.setByteStream(System.out);
LSSerializer writer = impl.createLSSerializer();
writer.write(document, domOutput);
} catch (ParserConfigurationException | SAXException | IOException
| ClassNotFoundException | InstantiationException
| IllegalAccessException | ClassCastException e) {
failUnexpected(e);
}
}
/**
* Check for DOMErrorHandler handling DOMError. Before fix of bug 4896132
* test throws DOM Level 1 node error.
*/
@Test
public void testCreateNewItem2SellRetry() {
String xmlFile = XML_DIR + "accountInfo.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document document = dbf.newDocumentBuilder().parse(xmlFile);
DOMConfiguration domConfig = document.getDomConfig();
MyDOMErrorHandler errHandler = new MyDOMErrorHandler();
domConfig.setParameter("error-handler", errHandler);
DOMImplementationLS impl =
(DOMImplementationLS) DOMImplementationRegistry.newInstance()
.getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
MyDOMOutput domoutput = new MyDOMOutput();
domoutput.setByteStream(System.out);
writer.write(document, domoutput);
document.normalizeDocument();
writer.write(document, domoutput);
assertFalse(errHandler.isError());
} catch (ParserConfigurationException | SAXException | IOException
| ClassNotFoundException | InstantiationException
| IllegalAccessException | ClassCastException e) {
failUnexpected(e);
}
}
/**
* Check if setting the attribute to be of type ID works. This will affect
* the Attr.isID method according to the spec.
*/
@Test
public void testCreateID() {
String xmlFile = XML_DIR + "accountInfo.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document document = dbf.newDocumentBuilder().parse(xmlFile);
Element account = (Element)document
.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
account.setIdAttributeNS(PORTAL_ACCOUNT_NS, "accountID", true);
Attr aID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
assertTrue(aID.isId());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Check the user data on the node.
*/
@Test
public void testCheckingUserData() {
String xmlFile = XML_DIR + "accountInfo.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document document = docBuilder.parse(xmlFile);
Element account = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
assertEquals(account.getNodeName(), "acc:Account");
Element firstName = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
assertEquals(firstName.getNodeName(), "FirstName");
Document doc1 = docBuilder.newDocument();
Element someName = doc1.createElement("newelem");
someName.setUserData("mykey", "dd",
(operation, key, data, src, dst) -> {
System.err.println("In UserDataHandler" + key);
System.out.println("In UserDataHandler");
});
Element impAccount = (Element)document.importNode(someName, true);
assertEquals(impAccount.getNodeName(), "newelem");
document.normalizeDocument();
String data = (someName.getUserData("mykey")).toString();
assertEquals(data, "dd");
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Check the UTF-16 XMLEncoding xml file.
* @see <a href="content/movies.xml">movies.xml</a>
*/
@Test
public void testCheckingEncoding() {
// Note since movies.xml is UTF-16 encoding. We're not using stanard XML
// file suffix.
String xmlFile = XML_DIR + "movies.xml.data";
//try (FileInputStream is = new FileInputStream(xmlFile)) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
InputStream source = bomStream("UTF-16", xmlFile);
Document document = dbf.newDocumentBuilder().parse(source);
assertEquals(document.getXmlEncoding(), "UTF-16");
assertEquals(document.getXmlStandalone(), true);
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Check validation API features. A schema which is including in Bug 4909119
* used to be testing for the functionalities.
* @see <a href="content/userDetails.xsd">userDetails.xsd</a>
*/
@Test
public void testGetOwnerInfo() {
String schemaFile = XML_DIR + "userDetails.xsd";
String xmlFile = XML_DIR + "userDetails.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(Paths.get(schemaFile).toFile());
Validator validator = schema.newValidator();
MyErrorHandler eh = new MyErrorHandler();
validator.setErrorHandler(eh);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.parse(new FileInputStream(xmlFile));
DOMResult dResult = new DOMResult();
DOMSource domSource = new DOMSource(document);
validator.validate(domSource, dResult);
assertFalse(eh.isAnyError());
} catch (SAXException | ParserConfigurationException | IOException e) {
failUnexpected(e);
}
}
/**
* Check grammar caching with imported schemas.
* @see <a href="content/coins.xsd">coins.xsd</a>
* @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
*/
@Test
public void testGetOwnerItemList() {
String xsdFile = XML_DIR + "coins.xsd";
String xmlFile = XML_DIR + "coins.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
dbf.setValidating(false);
SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File(((xsdFile))));
MyErrorHandler eh = new MyErrorHandler();
Validator validator = schema.newValidator();
validator.setErrorHandler(eh);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document document = docBuilder.parse(new FileInputStream(xmlFile));
validator.validate(new DOMSource(document), new DOMResult());
assertFalse(eh.isAnyError());
} catch (SAXException | ParserConfigurationException | IOException e) {
failUnexpected(e);
}
}
/**
* Check for the same imported schemas but will use SAXParserFactory and try
* parsing using the SAXParser. SCHEMA_SOURCE attribute is using for this
* test.
* @see <a href="content/coins.xsd">coins.xsd</a>
* @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
*/
@Test
public void testGetOwnerItemList1() {
String xsdFile = XML_DIR + "coins.xsd";
String xmlFile = XML_DIR + "coins.xml";
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(true);
SAXParser sp = spf.newSAXParser();
sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
sp.setProperty(JAXP_SCHEMA_SOURCE, xsdFile);
MyErrorHandler eh = new MyErrorHandler();
sp.parse(new File(xmlFile), eh);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Check usage of javax.xml.datatype.Duration class.
*/
@Test
public void testGetItemDuration() {
String xmlFile = XML_DIR + "itemsDuration.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document document = dbf.newDocumentBuilder().parse(xmlFile);
Element durationElement = (Element) document.getElementsByTagName("sellDuration").item(0);
NodeList childList = durationElement.getChildNodes();
for (int i = 0; i < childList.getLength(); i++) {
System.out.println("child " + i + childList.item(i));
}
Duration duration = DatatypeFactory.newInstance().newDuration("P365D");
Duration sellDuration = DatatypeFactory.newInstance().newDuration(childList.item(0).getNodeValue());
assertFalse(sellDuration.isShorterThan(duration));
assertFalse(sellDuration.isLongerThan(duration));
assertEquals(sellDuration.getField(DatatypeConstants.DAYS), BigInteger.valueOf(365));
assertEquals(sellDuration.normalizeWith(new GregorianCalendar(1999, 2, 22)), duration);
Duration myDuration = sellDuration.add(duration);
assertEquals(myDuration.normalizeWith(new GregorianCalendar(2003, 2, 22)),
DatatypeFactory.newInstance().newDuration("P730D"));
} catch (ParserConfigurationException | DatatypeConfigurationException
| SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Check usage of TypeInfo interface introduced in DOM L3.
*/
@Test
public void testGetTypeInfo() {
String xmlFile = XML_DIR + "accountInfo.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
docBuilder.setErrorHandler(new MyErrorHandler());
Document document = docBuilder.parse(xmlFile);
Element userId = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "UserID").item(0);
TypeInfo typeInfo = userId.getSchemaTypeInfo();
assertTrue(typeInfo.getTypeName().equals("nonNegativeInteger"));
assertTrue(typeInfo.getTypeNamespace().equals(W3C_XML_SCHEMA_NS_URI));
Element role = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Role").item(0);
TypeInfo roletypeInfo = role.getSchemaTypeInfo();
assertTrue(roletypeInfo.getTypeName().equals("BuyOrSell"));
assertTrue(roletypeInfo.getTypeNamespace().equals(PORTAL_ACCOUNT_NS));
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
}

View File

@ -0,0 +1,482 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import static com.sun.org.apache.xerces.internal.impl.Constants.SP_ENTITY_EXPANSION_LIMIT;
import static com.sun.org.apache.xerces.internal.impl.Constants.SP_MAX_OCCUR_LIMIT;
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_LANGUAGE;
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_SOURCE;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import static jaxp.library.JAXPTestUtilities.compareDocumentWithGold;
import static jaxp.library.JAXPTestUtilities.failCleanup;
import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import static test.auctionportal.HiBidConstants.CLASS_DIR;
import static test.auctionportal.HiBidConstants.GOLDEN_DIR;
import static test.auctionportal.HiBidConstants.XML_DIR;
/**
* This is a test class for the Auction portal HiBid.com.
*/
public class AuctionItemRepository {
/**
* XML file for parsing.
*/
private final static String ENTITY_XML = XML_DIR + "entity.xml";
/**
* Feature name.
*/
private final static String FEATURE_NAME = "http://xml.org/sax/features/namespace-prefixes";
/**
* Setting the EntityExpansion Limit to 128000 and checks if the XML
* document that has more than two levels of entity expansion is parsed or
* not. Previous system property was changed to jdk.xml.entityExpansionLimit
* see http://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html.
*/
@Test
public void testEntityExpansionSAXPos() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
// Secure processing will limit XML processing to conform to
// implementation limits.
factory.setFeature(FEATURE_SECURE_PROCESSING, true);
// Set entityExpansionLimit as 2 should expect fatalError
System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(128000));
SAXParser parser = factory.newSAXParser();
MyErrorHandler fatalHandler = new MyErrorHandler();
parser.parse(new File(ENTITY_XML), fatalHandler);
assertFalse(fatalHandler.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Setting the EntityExpansion Limit to 2 and checks if the XML
* document that has more than two levels of entity expansion is parsed or
* not. Previous system property was changed to jdk.xml.entityExpansionLimit
* see http://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html.
*/
@Test(expectedExceptions = SAXParseException.class)
public void testEntityExpansionSAXNeg() throws SAXParseException {
//
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
// Secure processing will limit XML processing to conform to
// implementation limits.
factory.setFeature(FEATURE_SECURE_PROCESSING, true);
// Set entityExpansionLimit as 2 should expect SAXParseException
System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
SAXParser parser = factory.newSAXParser();
MyErrorHandler fatalHandler = new MyErrorHandler();
parser.parse(new File(ENTITY_XML), fatalHandler);
} catch (SAXParseException e) {
throw e;
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Testing set MaxOccursLimit to 10000 in the secure processing enabled for
* SAXParserFactory.
*/
@Test
public void testMaxOccurLimitPos() {
String schema_file = XML_DIR + "toys.xsd";
String xml_file = XML_DIR + "toys.xml";
try (InputStream is = new FileInputStream(xml_file)) {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setFeature(FEATURE_SECURE_PROCESSING, true);
System.setProperty(SP_MAX_OCCUR_LIMIT, String.valueOf(10000));
SAXParser parser = factory.newSAXParser();
parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
parser.setProperty(JAXP_SCHEMA_SOURCE, new File(schema_file));
MyErrorHandler eh = new MyErrorHandler();
parser.parse(is, eh);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Use a DocumentBuilder to create a DOM object and see if Secure Processing
* feature affects the entity expansion.
*/
@Test
public void testEntityExpansionDOMPos() {
try {
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(10000));
DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
dBuilder.setErrorHandler(eh);
dBuilder.parse(ENTITY_XML);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | IOException | SAXException e) {
failUnexpected(e);
}
}
/**
* Use a DocumentBuilder to create a DOM object and see how does the Secure
* Processing feature and entityExpansionLimit value affects output.
* Negative test that when entityExpansionLimit is too small.
*/
@Test(expectedExceptions = SAXParseException.class)
public void testEntityExpansionDOMNeg() throws SAXParseException {
try {
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
dBuilder.setErrorHandler(eh);
dBuilder.parse(ENTITY_XML);
} catch (SAXParseException e) {
throw e;
} catch (ParserConfigurationException | IOException | SAXException e) {
failUnexpected(e);
}
}
/**
* Test xi:include with a SAXParserFactory.
*/
@Test
public void testXIncludeSAXPos() {
String resultFile = CLASS_DIR + "doc_xinclude.out";
String goldFile = GOLDEN_DIR + "doc_xincludeGold.xml";
String xmlFile = XML_DIR + "doc_xinclude.xml";
try {
try(FileOutputStream fos = new FileOutputStream(resultFile)) {
XInclHandler xh = new XInclHandler(fos, null);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);
spf.setFeature(FEATURE_NAME, true);
spf.newSAXParser().parse(new File(xmlFile), xh);
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test the simple case of including a document using xi:include using a
* DocumentBuilder.
*/
@Test
public void testXIncludeDOMPos() {
String resultFile = CLASS_DIR + "doc_xincludeDOM.out";
String goldFile = GOLDEN_DIR + "doc_xincludeGold.xml";
String xmlFile = XML_DIR + "doc_xinclude.xml";
try {
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
doc.setXmlStandalone(true);
TransformerFactory.newInstance().newTransformer().
transform(new DOMSource(doc), new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test the simple case of including a document using xi:include within a
* xi:fallback using a DocumentBuilder.
*/
@Test
public void testXIncludeFallbackDOMPos() {
String resultFile = CLASS_DIR + "doc_fallbackDOM.out";
String goldFile = GOLDEN_DIR + "doc_fallbackGold.xml";
String xmlFile = XML_DIR + "doc_fallback.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
doc.setXmlStandalone(true);
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(doc), new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test for xi:fallback where the fall back text is parsed as text. This
* test uses a nested xi:include for the fallback test.
*/
@Test
public void testXIncludeFallbackTextPos() {
String resultFile = CLASS_DIR + "doc_fallback_text.out";
String goldFile = GOLDEN_DIR + "doc_fallback_textGold.xml";
String xmlFile = XML_DIR + "doc_fallback_text.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
doc.setXmlStandalone(true);
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(doc), new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test the XPointer element() framework with XInclude.
*/
@Test
public void testXpointerElementPos() {
String resultFile = CLASS_DIR + "doc_xpointer_element.out";
String goldFile = GOLDEN_DIR + "doc_xpointerGold.xml";
String xmlFile = XML_DIR + "doc_xpointer_element.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(db.parse(new File(xmlFile))),
new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test the XPointer framework with a SAX object.
*/
@Test
public void testXPointerPos() {
String resultFile = CLASS_DIR + "doc_xpointer.out";
String goldFile = GOLDEN_DIR + "doc_xpointerGold.xml";
String xmlFile = XML_DIR + "doc_xpointer.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);
spf.setFeature(FEATURE_NAME, true);
// parse the file
spf.newSAXParser().parse(new File(xmlFile), new XInclHandler(fos, null));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test if xi:include may reference the doc containing the include if the
* parse type is text.
*/
@Test
public void testXIncludeLoopPos() {
String resultFile = CLASS_DIR + "doc_xinc_loops.out";
String goldFile = GOLDEN_DIR + "doc_xinc_loopGold.xml";
String xmlFile = XML_DIR + "doc_xinc_loops.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(xmlFile));
doc.normalizeDocument();
doc.setXmlStandalone(true);
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(doc), new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
/**
* Test if two non nested xi:include elements can include the same document
* with an xi:include statement.
*/
@Test
public void testXIncludeNestedPos() {
String resultFile = CLASS_DIR + "schedule.out";
String goldFile = GOLDEN_DIR + "scheduleGold.xml";
String xmlFile = XML_DIR + "schedule.xml";
try{
try (FileOutputStream fos = new FileOutputStream(resultFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
doc.setXmlStandalone(true);
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(doc), new StreamResult(fos));
}
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ParserConfigurationException | SAXException | IOException
| TransformerException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import org.w3c.dom.DOMErrorHandler;
import org.w3c.dom.DOMError;
/**
* Error handler for recording DOM processing error.
*/
public class MyDOMErrorHandler implements DOMErrorHandler {
/**
* flag shows if there is any error.
*/
private volatile boolean errorOccured = false;
/**
* Set errorOcurred to true when an error occurs.
* @param error The error object that describes the error. This object
* may be reused by the DOM implementation across multiple calls to
* the handleError method.
* @return true that processing may continue depending on.
*/
@Override
public boolean handleError (DOMError error) {
System.err.println( "ERROR" + error.getMessage());
System.err.println( "ERROR" + error.getRelatedData());
errorOccured = true;
return true;
}
/**
* Showing if any error was handled.
* @return true if there is one or more error.
* false no error occurs.
*/
public boolean isError() {
return errorOccured;
}
}

View File

@ -0,0 +1,137 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import org.w3c.dom.ls.LSOutput;
import java.io.OutputStream;
import java.io.Writer;
/**
* A Thread-safe LS output destination for DOM processing. LSOutput objects
* belong to the application. The DOM implementation will never modify them
* (though it may make copies and modify the copies, if necessary).
*/
public class MyDOMOutput implements LSOutput {
/**
* An attribute of a language and binding dependent type that represents a
* writable stream of bytes.
*/
private OutputStream bytestream;
/**
* character encoding to use for the output.
*/
private String encoding;
/**
* The system identifier.
*/
private String sysId;
/**
* Writable stream to which 16-bit units can be output.
*/
private Writer writer;
/**
* An attribute of a language and binding dependent type that represents a
* writable stream of bytes.
*
* @return a writable stream.
*/
@Override
public OutputStream getByteStream() {
return bytestream;
}
/**
* An attribute of a language and binding dependent type that represents a
* writable stream to which 16-bit units can be output.
*
* @return writable stream instance.
*/
@Override
public Writer getCharacterStream() {
return writer;
}
/**
* The character encoding to use for the output.
*
* @return the character encoding.
*/
@Override
public String getEncoding() {
return encoding;
}
/**
* The system identifier for this output destination.
*
* @return system identifier.
*/
@Override
public String getSystemId() {
return sysId;
}
/**
* Set writable stream of bytes.
*
* @param bs OutputStream instance
*/
@Override
public void setByteStream(OutputStream bs) {
bytestream = bs;
}
/**
* Set 16 bits unit writable stream.
*
* @param bs a Writer instance
*/
@Override
public void setCharacterStream(Writer cs) {
writer = cs;
}
/**
* Set character encoding to use for the output.
*
* @param encoding encoding set to the output
*/
@Override
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* Set the system identifier for the output.
*
* @param sysId system identifier string.
*/
@Override
public void setSystemId(String sysId) {
this.sysId = sysId;
}
}

View File

@ -0,0 +1,100 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**
* ErrorHandler for error handling. Set state if any method in error, warning
* or fatalError was called.
*/
public final class MyErrorHandler extends DefaultHandler {
/**
* Enumeration for ErrorHandler's state.
*/
private enum STATE { ERROR, FATAL, WARNING, NORMAL};
/**
* Set state as normal by default.
*/
private volatile STATE state = STATE.NORMAL;
/**
* Keep exception for further investigation.
*/
private volatile SAXParseException exception;
/**
* Save exception and set state to ERROR.
* @param e exception wrap error.
*/
@Override
public void error (SAXParseException e) {
state = STATE.ERROR;
exception = e;
}
/**
* Save exception and set state to FATAL.
* @param e exception wrap error.
*/
@Override
public void fatalError (SAXParseException e) {
state = STATE.FATAL;
exception = e;
}
/**
* Save exception and set state to WARNING.
* @param e exception wrap error.
*/
@Override
public void warning (SAXParseException e) {
state = STATE.WARNING;
exception = e;
}
/**
* return ErrorHandle's state .
* @return true No error, fatalError and warning.
* false there is any error, fatalError or warning in processing.
*/
public boolean isAnyError() {
if (state != STATE.NORMAL)
System.out.println(exception);
return state != STATE.NORMAL;
}
/**
* return whether fatalError is the only error.
* @return true fatalError is the only error.
* false there is no error, or other error besides fatalError.
*/
public boolean isFatalError() {
if (state == STATE.FATAL)
System.out.println(exception);
return state == STATE.FATAL;
}
}

View File

@ -0,0 +1,338 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_LANGUAGE;
import static org.testng.Assert.assertFalse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import static jaxp.library.JAXPTestUtilities.compareDocumentWithGold;
import static jaxp.library.JAXPTestUtilities.failCleanup;
import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.SAXException;
import static test.auctionportal.HiBidConstants.CLASS_DIR;
import static test.auctionportal.HiBidConstants.GOLDEN_DIR;
import static test.auctionportal.HiBidConstants.PORTAL_ACCOUNT_NS;
import static test.auctionportal.HiBidConstants.XML_DIR;
/**
* This is the user controller class for the Auction portal HiBid.com.
*/
public class UserController {
/**
* Checking when creating an XML document using DOM Level 2 validating
* it without having a schema source or a schema location It must throw a
* sax parse exception.
*/
@Test
public void testCreateNewUser() {
String resultFile = CLASS_DIR + "accountInfoOut.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.newDocument();
Element account = document.createElementNS(PORTAL_ACCOUNT_NS, "acc:Account");
Attr accountID = document.createAttributeNS(PORTAL_ACCOUNT_NS, "acc:accountID");
account.setAttributeNode(accountID);
account.appendChild(document.createElement("FirstName"));
account.appendChild(document.createElementNS(PORTAL_ACCOUNT_NS, "acc:LastName"));
account.appendChild(document.createElement("UserID"));
DOMImplementationLS impl
= (DOMImplementationLS) DOMImplementationRegistry
.newInstance().getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
LSParser builder = impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
FileOutputStream output = new FileOutputStream(resultFile);
MyDOMOutput domOutput = new MyDOMOutput();
domOutput.setByteStream(output);
writer.write(account, domOutput);
docBuilder.parse(resultFile);
assertTrue(eh.isAnyError());
} catch (ParserConfigurationException | ClassNotFoundException |
InstantiationException | IllegalAccessException
| ClassCastException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Checking conflicting namespaces and use renameNode and normalizeDocument.
* @see <a href="content/accountInfo.xml">accountInfo.xml</a>
*/
@Test
public void testAddUser() {
String resultFile = CLASS_DIR + "accountRole.out";
String xmlFile = XML_DIR + "accountInfo.xml";
try {
// Copy schema for outputfile
Files.copy(Paths.get(XML_DIR, "accountInfo.xsd"),
Paths.get(CLASS_DIR, "accountInfo.xsd"),
StandardCopyOption.REPLACE_EXISTING);
MyErrorHandler eh = new MyErrorHandler();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
dbf.setNamespaceAware(true);
dbf.setValidating(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.parse(xmlFile);
Element sell = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Sell").item(0);
Element role = (Element) sell.getParentNode();
Element buy = (Element) document.renameNode(sell, PORTAL_ACCOUNT_NS, "acc:Buy");
role.appendChild(buy);
DOMImplementationLS impl
= (DOMImplementationLS) DOMImplementationRegistry
.newInstance().getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
try(FileOutputStream output = new FileOutputStream(resultFile)) {
MyDOMOutput mydomoutput = new MyDOMOutput();
mydomoutput.setByteStream(output);
writer.write(document, mydomoutput);
}
docBuilder.parse(resultFile);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException
| ClassNotFoundException | InstantiationException
| IllegalAccessException | ClassCastException e) {
failUnexpected(e);
}
}
/**
* Checking Text content in XML file.
* @see <a href="content/accountInfo.xml">accountInfo.xml</a>
*/
@Test
public void testMoreUserInfo() {
String xmlFile = XML_DIR + "accountInfo.xml";
try {
System.out.println("Checking additional user info");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
dbf.setNamespaceAware(true);
dbf.setValidating(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.parse(xmlFile);
Element account = (Element)document
.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
String textContent = account.getTextContent();
assertTrue(textContent.trim().regionMatches(0, "Rachel", 0, 6));
assertEquals(textContent, "RachelGreen744");
Attr accountID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
assertTrue(accountID.getTextContent().trim().equals("1"));
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* This will check if adoptNode works will adoptNode from
* @see <a href="content/userInfo.xml">userInfo.xml</a>
* @see <a href="content/accountInfo.xml">accountInfo.xml</a>. This is
* adopting a node from the XML file which is validated by a DTD and
* into an XML file which is validated by the schema This covers Row 5
* for the table
* http://javaweb.sfbay/~jsuttor/JSR206/jsr-206-html/ch03s05.html. Filed
* bug 4893745 because there was a difference in behavior
*/
@Test
public void testCreateUserAccount() {
System.out.println("Creating user account");
String userXmlFile = XML_DIR + "userInfo.xml";
String accountXmlFile = XML_DIR + "accountInfo.xml";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.parse(userXmlFile);
Element user = (Element) document.getElementsByTagName("FirstName").item(0);
// Set schema after parsing userInfo.xml. Otherwise it will conflict
// with DTD validation.
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
DocumentBuilder docBuilder1 = dbf.newDocumentBuilder();
docBuilder1.setErrorHandler(eh);
Document accDocument = docBuilder1.parse(accountXmlFile);
Element firstName = (Element) accDocument
.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
Element adoptedAccount = (Element) accDocument.adoptNode(user);
Element parent = (Element) firstName.getParentNode();
parent.replaceChild(adoptedAccount, firstName);
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
MyDOMOutput mydomoutput = new MyDOMOutput();
mydomoutput.setByteStream(System.out);
writer.write(document, mydomoutput);
writer.write(accDocument, mydomoutput);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException
| ClassNotFoundException | InstantiationException
| IllegalAccessException | ClassCastException e) {
failUnexpected(e);
}
}
/**
* Checking for Row 8 from the schema table when setting the schemaSource
* without the schemaLanguage must report an error.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void testUserError() throws IllegalArgumentException {
System.out.println("Creating an error in user account");
String xmlFile = XML_DIR + "userInfo.xml";
String schema = "http://java.sun.com/xml/jaxp/properties/schemaSource";
String schemaValue = "http://dummy.com/dummy.xsd";
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute(schema, schemaValue);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
MyErrorHandler eh = new MyErrorHandler();
docBuilder.setErrorHandler(eh);
Document document = docBuilder.parse(xmlFile);
assertFalse(eh.isAnyError());
} catch (ParserConfigurationException | SAXException | IOException e) {
failUnexpected(e);
}
}
/**
* Checking for namespace normalization.
* @see <a href="content/screenName.xml">screenName.xml</a> has prefix of
* userName is bound to "http://hibid.com/user" namespace normalization
* will create a namespace of prefix us and attach userEmail.
*/
@Test
public void testCheckScreenNameExists() {
String resultFile = CLASS_DIR + "screenName.out";
String xmlFile = XML_DIR + "screenName.xml";
String goldFile = GOLDEN_DIR + "screenNameGold.xml";
String nsTagName = "http://hibid.com/screenName";
String userNs = "http://hibid.com/user";
try (FileOutputStream output = new FileOutputStream(resultFile)) {
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
LSSerializer writer = impl.createLSSerializer();
LSParser builder = impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
Document document = builder.parseURI(xmlFile);
NodeList nl = document.getElementsByTagNameNS(nsTagName, "screen-name");
assertEquals(nl.getLength(), 1);
Element screenName = (Element)nl.item(0);
Element userEmail = document.createElementNS(userNs, "userEmail");
assertTrue(userEmail.isDefaultNamespace(userNs));
Text email = document.createTextNode("myid@hibid.com");
userEmail.appendChild(email);
screenName.appendChild(userEmail);
document.normalizeDocument();
MyDOMOutput domoutput = new MyDOMOutput();
domoutput.setByteStream(output);
writer.write(document, domoutput);
assertTrue(compareDocumentWithGold(goldFile, resultFile));
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | ClassCastException | IOException
| ParserConfigurationException | SAXException e) {
failUnexpected(e);
} finally {
try {
Path resultPath = Paths.get(resultFile);
if (Files.exists(resultPath)) {
Files.delete(resultPath);
}
} catch (IOException ex) {
failCleanup(ex, resultFile);
}
}
}
}

View File

@ -0,0 +1,382 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.stream.Collectors;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.DefaultHandler;
/**
* A SAX2 event handlers.
* This SAX2 ContentHandler receives callback event then print whole document
* that is parsed.
*/
public class XInclHandler extends DefaultHandler implements LexicalHandler {
/**
* Print writer.
*/
private final PrintWriter fOut;
/**
* Canonical output.
*/
private volatile boolean fCanonical;
/**
* Element depth.
*/
private volatile int fElementDepth;
/**
* Sets whether output is canonical.
*/
public void setCanonical(boolean canonical) {
fCanonical = canonical;
}
/**
* Sets the output stream for printing.
* @param stream OutputStream for message output.
* @param encoding File encoding for message output.
*/
public XInclHandler(OutputStream stream, String encoding)
throws UnsupportedEncodingException {
// At least set one encoding.
if (encoding == null) {
encoding = "UTF8";
}
fOut = new PrintWriter(new OutputStreamWriter(stream, encoding), false);
}
/**
* Receive notification of the beginning of the document. Write the start
* document tag if it's not canonical mode.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void startDocument() throws SAXException {
fElementDepth = 0;
if (!fCanonical) {
writeFlush("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
}
/**
* Receive notification of a processing instruction.
* @param target The processing instruction target.
* @param data The processing instruction data, or null if
* none is supplied.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void processingInstruction (String target, String data)
throws SAXException {
if (fElementDepth > 0) {
StringBuilder instruction = new StringBuilder("<?").append(target);
if (data != null && data.length() > 0) {
instruction.append(' ').append(data);
}
instruction.append("?>");
writeFlush(instruction.toString());
}
}
/**
* Receive notification of the start of an element then write the normalized
* output to the file.
* @param uri The Namespace URI, or the empty string if the
* element has no Namespace URI or if Namespace
* processing is not being performed.
* @param localName The local name (without prefix), or the
* empty string if Namespace processing is not being
* performed.
* @param qName The qualified name (with prefix), or the
* empty string if qualified names are not available.
* @param attributes The attributes attached to the element. If
* there are no attributes, it shall be an empty
* Attributes object.
*/
@Override
public void startElement(String uri, String local, String raw,
Attributes attrs) throws SAXException {
fElementDepth++;
StringBuilder start = new StringBuilder().append('<').append(raw);
if (attrs != null) {
for (int i = 0; i < attrs.getLength(); i++) {
start.append(' ').append(attrs.getQName(i)).append("=\"").
append(normalizeAndPrint(attrs.getValue(i))).append('"');
}
}
start.append('>');
writeFlush(start.toString());
}
/**
* Receive notification of character data inside an element and write
* normalized characters to file.
* @param ch The characters.
* @param start The start position in the character array.
* @param length The number of characters to use from the
* character array.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
writeFlush(normalizeAndPrint(ch, start, length));
}
/**
* Receiving notification of ignorable whitespace in element content and
* writing normalized ignorable characters to file.
* @param ch The characters.
* @param start The start position in the character array.
* @param length The number of characters to use from the
* character array.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void ignorableWhitespace(char ch[], int start, int length)
throws SAXException {
characters(ch, start, length);
}
/**
* Receive notification of the end of an element and print end element.
*
* @param uri The Namespace URI, or the empty string if the
* element has no Namespace URI or if Namespace
* processing is not being performed.
* @param localName The local name (without prefix), or the
* empty string if Namespace processing is not being
* performed.
* @param qName The qualified name (with prefix), or the
* empty string if qualified names are not available.
*/
@Override
public void endElement(String uri, String local, String raw)
throws SAXException {
fElementDepth--;
writeFlush("</" + raw + ">");
}
/**
* Receive notification of a parser warning and print it out.
* @param e The warning information encoded as an exception.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void warning(SAXParseException ex) throws SAXException {
printError("Warning", ex);
}
/**
* Receive notification of a parser error and print it out.
* @param e The error information encoded as an exception.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void error(SAXParseException ex) throws SAXException {
printError("Error", ex);
}
/**
* Receive notification of a parser fatal error. Throw out fatal error
* following print fatal error message.
* @param e The fatal error information encoded as an exception.
* @exception org.xml.sax.SAXException Any SAX exception, possibly
* wrapping another exception.
*/
@Override
public void fatalError(SAXParseException ex) throws SAXException {
printError("Fatal Error", ex);
throw ex;
}
/**
* Do nothing on start DTD.
* @param name The document type name.
* @param publicId The declared public identifier for the
* external DTD subset, or null if none was declared.
* @param systemId The declared system identifier for the
* external DTD subset, or null if none was declared.
* (Note that this is not resolved against the document
* base URI.)
* @exception SAXException The application may raise an
* exception.
*/
@Override
public void startDTD(String name, String publicId, String systemId)
throws SAXException {
}
/**
* Do nothing on end DTD.
* @exception SAXException The application may raise an exception.
*/
@Override
public void endDTD() throws SAXException {
}
/**
* Do nothing on start entity.
* @param name The name of the entity. If it is a parameter
* entity, the name will begin with '%', and if it is the
* external DTD subset, it will be "[dtd]".
* @exception SAXException The application may raise an exception.
*/
@Override
public void startEntity(String name) throws SAXException {
}
/**
* Do nothing on end entity.
* @param name The name of the entity. If it is a parameter
* entity, the name will begin with '%', and if it is the
* external DTD subset, it will be "[dtd]".
* @exception SAXException The application may raise an exception.
*/
@Override
public void endEntity(String name) throws SAXException {
}
/**
* Do nothing on start CDATA section.
* @exception SAXException The application may raise an exception.
*/
@Override
public void startCDATA() throws SAXException {
}
/**
* Do nothing on end CDATA section.
* @exception SAXException The application may raise an exception.
*/
@Override
public void endCDATA() throws SAXException {
}
/**
* Report an normalized XML comment when receive a comment in the document.
*
* @param ch An array holding the characters in the comment.
* @param start The starting position in the array.
* @param length The number of characters to use from the array.
* @exception SAXException The application may raise an exception.
*/
@Override
public void comment(char ch[], int start, int length) throws SAXException {
if (!fCanonical && fElementDepth > 0) {
writeFlush("<!--" + normalizeAndPrint(ch, start, length) + "-->");
}
}
/**
* Normalizes and prints the given string.
* @param s String to be normalized
*/
private String normalizeAndPrint(String s) {
return s.chars().mapToObj(c -> normalizeAndPrint((char)c)).
collect(Collectors.joining());
}
/**
* Normalizes and prints the given array of characters.
* @param ch The characters to be normalized.
* @param start The start position in the character array.
* @param length The number of characters to use from the
* character array.
*/
private String normalizeAndPrint(char[] ch, int offset, int length) {
return normalizeAndPrint(new String(ch, offset, length));
}
/**
* Normalizes given character.
* @param c char to be normalized.
*/
private String normalizeAndPrint(char c) {
switch (c) {
case '<':
return "&lt;";
case '>':
return "&gt;";
case '&':
return "&amp;";
case '"':
return "&quot;";
case '\r':
case '\n':
return fCanonical ? "&#" + Integer.toString(c) + ";" : String.valueOf(c);
default:
return String.valueOf(c);
}
}
/**
* Prints the error message.
* @param type error type
* @param ex exception that need to be printed
*/
private void printError(String type, SAXParseException ex) {
System.err.print("[" + type + "] ");
String systemId = ex.getSystemId();
if (systemId != null) {
int index = systemId.lastIndexOf('/');
if (index != -1)
systemId = systemId.substring(index + 1);
System.err.print(systemId);
}
System.err.print(':' + ex.getLineNumber());
System.err.print(':' + ex.getColumnNumber());
System.err.println(": " + ex.getMessage());
System.err.flush();
}
/**
* Write out and flush.
* @param out string to be written.
*/
private void writeFlush(String out) {
fOut.print(out);
fOut.flush();
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<acc:Account xmlns="http://www.auctionportal.org/Accounts"
xmlns:acc="http://www.auctionportal.org/Accounts"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.auctionportal.org/Accounts accountInfo.xsd" acc:accountID="1">
<FirstName>Rachel</FirstName>
<LastName>Green</LastName>
<UserID>744</UserID>
<Role><Sell/></Role>
</acc:Account>

View File

@ -0,0 +1,61 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.auctionportal.org/Accounts"
xmlns:acc="http://www.auctionportal.org/Accounts"
xmlns="http://www.auctionportal.org/Accounts" elementFormDefault="qualified">
<xs:element name="Account">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type ="xs:string"/>
<xs:element name="MiddleInitial" type ="xs:string" minOccurs="0"/>
<xs:element ref="LastName"/>
<!-- This is to associate the account with the screenName
later will work on uniqueness with identity constraints
importing/including this schema in another one
-->
<xs:element name="UserID" type ="xs:nonNegativeInteger" />
<xs:element name="Role" type ="BuyOrSell" minOccurs="0" maxOccurs="1" />
<!-- This may not make sense but this is to test the date -->
<xs:element name="DateOfBirth" type ="DateType" minOccurs="0" maxOccurs="1" />
<xs:element name="EmailQname" type ="xs:QName" minOccurs="0" maxOccurs="1" />
<xs:element name="AptNo" type ="xs:unsignedShort" minOccurs="0" maxOccurs="1" />
<xs:element name="StreetNo" type ="xs:short" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute ref="accountID"/>
</xs:complexType>
</xs:element>
<xs:element name="LastName" type ="xs:string"/>
<!-- The accountID is same as UserID This is just to check how
global attributes are treated-->
<xs:attribute name="accountID" type="xs:integer"/>
<xs:complexType name="BuyOrSell">
<xs:choice>
<xs:element name="Buy" type="PlaceHolder"/>
<xs:element name="Sell" type="PlaceHolder"/>
</xs:choice>
</xs:complexType>
<!-- an empty complex type declared globally-->
<xs:complexType name="PlaceHolder">
</xs:complexType>
<!-- This may all not make too much sense
but just to check the date features of schema-->
<xs:complexType name="DateType">
<xs:sequence>
<!--<xs:all>-->
<xs:element name="YearMonth" type="xs:gYearMonth"/>
<xs:element name="MonthDay" type="xs:gMonthDay"/>
<xs:element name="Date" type="xs:date"/>
<!--</xs:all>-->
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" ?>
<activity id="1" >
<name>Code</name>
<description>Some description</description>
</activity>

View File

@ -0,0 +1,13 @@
<!ELEMENT document ANY>
<!ELEMENT title (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT book (#PCDATA)>
<!ELEMENT bookurn (#PCDATA)>
<!ELEMENT xmlns:pages (#PCDATA)>
<!ATTLIST book price CDATA "$100">
<!ATTLIST book author CDATA "Herold">
<!ATTLIST book number ID #REQUIRED>
<!ATTLIST bookurn xmlns CDATA "10">
<!ATTLIST bookurn xmlns:isbn CDATA "10">
<!ENTITY ws "Walter Sam Communications">
<!ENTITY af "Alfred publication">

View File

@ -0,0 +1,25 @@
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE document SYSTEM "bookInfo.dtd">
<document>
Publishers of the Music of New York Women Composers
<title>The Publishers </title>
<publisher>
Alfred Publishing
&ws;
15535 Morrison
South Oaks CA 91403
</publisher>
<book price="$100" author = "Herold" number = "no_11">
eXtensible Markup Language
</book>
<bookurn xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'/>
<xmlns:pages />
Publishers are not noted in report by time.
</document>

View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<im:coin
xmlns:im="http://www.hibid.com/items"
xmlns="http://www.hibid.com/items"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:it="http://someimport.com">
<im:description>
<im:info> 1950 gold coin
</im:info>
</im:description>
<dates_data xmlns="http://www.hibid.com/items">
<it:mint>1950-04-04T00:00:00</it:mint>
<it:circulation> 1960
</it:circulation>
</dates_data>
</im:coin>

View File

@ -0,0 +1,47 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.hibid.com/items"
xmlns="http://www.hibid.com/items"
xmlns:im="http://someimport.com"
elementFormDefault="qualified"
xmlns:it="http://www.hibid.com/items" >
<xs:import schemaLocation="coinsImportMe.xsd" namespace="http://someimport.com"/>
<xs:element name="coin">
<xs:complexType>
<xs:sequence>
<xs:element name="description" type="it:description" />
<xs:element name="dates_data" type="im:dates_data" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="description">
<xs:sequence>
<xs:element name="info" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="yearType">
<xs:restriction base="xs:int">
<xs:enumeration value="1930" />
<xs:enumeration value="1949" />
</xs:restriction>
</xs:simpleType>
<xs:element name="YearInfo">
<xs:complexType>
<xs:sequence>
<xs:element name="reMintYear" type="yearType" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://someimport.com"
xmlns="http://someimport.com"
elementFormDefault="qualified"
xmlns:im="http://someimport.com" >
<xs:complexType name="dates_data">
<xs:sequence>
<xs:element name="mint" type="xs:dateTime" />
<xs:element name="circulation" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="designer">
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -0,0 +1,18 @@
<?xml version='1.0'?>
<data id="employee">
<employee id="employee">
<name>timepass</name>
<sex>M</sex>
<age>10</age>
<complexion>Fair</complexion>
<figure>36-28-36</figure>
</employee>
<employee>
<name>COOOOL</name>
<sex>F</sex>
<age>20</age>
<complexion>Dark</complexion>
<figure>26-32-26</figure>
</employee>
</data>

View File

@ -0,0 +1,11 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "task.xml" resource:</p>
<example>
<xi:include href="task.xml" parse="xml">
<xi:fallback >
<xi:include href="fallback.xml" parse="xml" />
</xi:fallback>
</xi:include>
</example>
</document>

View File

@ -0,0 +1,11 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "tasks.xml" resource:</p>
<example>
<xi:include href="task.xml" parse="xml">
<xi:fallback >
<xi:include href="fallback_text.xml" parse="text" />
</xi:fallback>
</xi:include>
</example>
</document>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the outer XML file</p>
<example>
<xi:include href="task.xml" parse="xml">
<xi:fallback>
<xi:include href="doc_xinc_loops.xml" parse="text" />
</xi:fallback>
</xi:include>
</example>
</root>

View File

@ -0,0 +1,6 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "data.xml" resource:</p>
<example><xi:include href="tasks.xml" parse="xml"/></example>
</document>

View File

@ -0,0 +1,6 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "tasks.xml" resource:</p>
<example><xi:include href="tasks.xml" xpointer="element(/1/2/1)" parse="xml"/></example>
</document>

View File

@ -0,0 +1,5 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "tasks.xml" resource:</p>
<example><xi:include href="tasks.xml" xpointer="element(/1/2/1)" parse="xml"/></example>
</document>

View File

@ -0,0 +1,6 @@
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "data.xml" resource:</p>
<example><xi:include href="data.xml" parse="xml"/></example>
</document>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : entity.xml
Created on : August 6, 2003, 5:39 PM
Author : Prasad Subramanian
Description:
To create a base XML document to test the entiity expansion limit
-->
<!DOCTYPE status[
<!ENTITY firstEntity "fe">
<!ENTITY secondEntity "&firstEntity;&firstEntity;" >
<!ENTITY thirdEntity "&secondEntity;&secondEntity;" >
<!ENTITY fourthEntity "&thirdEntity;&thirdEntity;" >
<!ENTITY fifthEntity "&fourthEntity;&fourthEntity;" >
<!-- <!ENTITY sixthEntity "&fifthEntity;&fifthEntity;">
<!ENTITY seventhEntity "&sixthEntity;&sixthEntity;" >
<!ENTITY eighthEntity "&seventhEntity;&seventhEntity;" >
<!ENTITY ninthEntity "&eighthEntity;&eighthEntity;" >
<!ENTITY tenthEntity "&ninthEntity;&ninthEntity;" >
<!ENTITY eleventhEntity "&tenthEntity;&tenthEntity;"> -->
]>
<report>
<tests>
<test>
<id>Test Id</id>
<name>Test Name</name>
<description>My Desc</description>
<status>&fifthEntity;</status>
</test>
</tests>
</report>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<fallback> This is the fallback text </fallback>

View File

@ -0,0 +1 @@
This is the fallback text as a text

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<activities xmlns:xi="http://www.w3.org/2001/XInclude" >
<xi:include href="activity.xml" parse="xml" />
</activities>

View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<item xmlns="http://www.hibid.com/items" itemID="i1" name="Warn Bros Pitcher" category="other" country="US">
<description> 20th century vase. Really unique . Really antique</description>
<ownerID>2</ownerID>
<sellStartDateTime> 2002-03-11T15:23:45</sellStartDateTime>
<sellStartDate> 2002-03-11</sellStartDate>
<sellStartTime> 15:23:45</sellStartTime>
<sellDuration>P365D</sellDuration>
<bidderID>a2</bidderID>
<bidPrice></bidPrice>
<elapsedTime></elapsedTime>
</item>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<Collection>
<movies>
<movie>
<name>&#2720;&#2709;&#2724;</name>
<director>Vipul Shah</director>
<country>Indian</country>
<language>Gujarati</language>
<releaseDate>1997-03-02-08:00</releaseDate>
</movie>
</movies>
</Collection>

View File

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="www.novels.com"
xsi:schemaLocation=""www.novels.com" novels.xsd" >
<xs:element name="novel" type="novelType" />
<xs:complexType name="novelType">
<xs:sequence maxOccurs ="3" minOccurs="1">
<xs:element name="mystery" type="xs:string"/>
<xs:element name="links" type="linksType"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="linksType">
<xs:restriction base="xs:anyURI">
<xs:enumeration value="http://www.links.com"/>
<xs:enumeration value="http://www.mystery.com"/>
<xs:enumeration value="http://www.hitchcock.com"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<novel>
<mystery>Mystery of Whispering Mummy</mystery>
<links>http://www.links.com </links>
<mystery>Mystery of Vanishing Treasure</mystery>
<links>http://www.alfrdhitchcock.com </links>
</novel>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<schedule xmlns:xi="http://www.w3.org/2001/XInclude" >
<task xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="inclusion.xml" parse="xml" />
</task>
<task xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="inclusion.xml" parse="xml" />
</task>
</schedule>

View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<us:screen-names xmlns:us="http://hibid.com/screenName">
xmlns="http://hibid.com/screenName">
<us:screen-name>
<us:userName xmlns:us="http://hibid.com/user"> tom </us:userName>
<userNo>10 </userNo>
</us:screen-name>
</us:screen-names>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" ?>
<tasks>
<task id="task1" >
<owner>John doe</owner>
<startdate>10/02/2003</startdate>
<enddate>11/02/2003</enddate>
<description>This is task 1</description>
</task>
<task id="task2" >
<owner>Jane Doe</owner>
<startdate>10/02/2003</startdate>
<enddate>11/02/2003</enddate>
<description>This is task 2</description>
</task>
</tasks>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : toys.xml
Created on : August 11, 2003, 6:42 PM
Author : Prasad Subramanian
Description:
-->
<toys>
<toy>
<name>Lego-Model01</name>
<price>65.99</price>
</toy>
<toy>
<name>Lego-Model2</name>
<price>69.99</price>
</toy>
<toy>
<name>Lego-Model3</name>
<price>14.99</price>
</toy>
<toy>
<name>Barbie-Pink</name>
<price>12.99</price>
</toy>
<toy>
<name>Barbie-Blue</name>
<price>13.99</price>
</toy>
<toy>
<name>Barbie-White</name>
<price>13.99</price>
</toy>
<toy>
<name>Barbie-Plain</name>
<price>13.99</price>
</toy>
</toys>

View File

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="toys">
<xs:complexType>
<xs:sequence>
<xs:element name="toy" maxOccurs="200">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element name="price" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.hibid.com/useraccount"
xmlns="http://www.hibid.com/useraccount"
xmlns:user="http://www.hibid.com/useraccount" elementFormDefault="qualified">
<xs:complexType name="AddressType">
<xs:sequence>
<xs:element name="StreetInfo" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<user xmlns="http://www.hibid.com/useraccount"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hibid.com/useraccount userDetails.xsd http://www.hibid.com/useraccount userAddress.xsd">
<Name>Bob </Name>
<addresses>
<homeAddress>
<StreetInfo>555 Beverly Hills Rd
</StreetInfo>
</homeAddress>
</addresses>
</user>

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding = "utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.hibid.com/useraccount"
xmlns="http://www.hibid.com/useraccount"
xmlns:user="http://www.hibid.com/useraccount" elementFormDefault="qualified" >
<xs:include schemaLocation="userAddress.xsd"/>
<xs:simpleType name="charType">
<xs:restriction base="xs:NCName">
<xs:minLength value="1" />
<xs:maxLength value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="_2CharsType">
<xs:restriction base="xs:string">
<xs:length value="2" fixed="true"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="_3digits">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{3}" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="_7digits">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{7}" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="EmptyElement" />
<!-- *************************************
*** phone number type ****
*************************************
-->
<xs:complexType name="international_AreaCode_Type">
<xs:sequence>
<xs:element name="countryCode" type="_3digits"/>
<xs:element name="areaCode" type="_3digits"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="us_AreaCode_Type">
<xs:sequence>
<xs:element name="areaCode" type="_3digits"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="us_phonenumber_type">
<xs:complexContent>
<xs:extension base="us_AreaCode_Type">
<xs:sequence>
<xs:element name="localNumber" type="_7digits"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="international_phonenumber_type">
<xs:complexContent>
<xs:extension base="international_AreaCode_Type">
<xs:sequence>
<xs:element name="localNumber" type="_7digits"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- *************************************
*** address type ****
*************************************
-->
<xs:simpleType name="stateAbrvType">
<xs:restriction base="_2CharsType">
<xs:pattern value="[A-Z]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="us_zipCodeType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{5}(-[0-9]{4})?" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="state.zip_type">
<xs:union memberTypes="stateAbrvType us_zipCodeType"/>
</xs:simpleType>
<xs:simpleType name="CityInfo_type">
<xs:restriction base="xs:normalizedString">
<xs:whiteSpace value="collapse" />
</xs:restriction>
</xs:simpleType>
<!-- *************************************
*** user ****
*************************************
-->
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="addresses">
<xs:complexType>
<xs:sequence>
<xs:element name="homeAddress" type="AddressType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -0,0 +1,6 @@
<!ELEMENT userInfo (user+)>
<!ELEMENT user (FirstName,LastName,UserID)>
<!ELEMENT FirstName (#PCDATA)>
<!ELEMENT LastName (#PCDATA)>
<!ELEMENT UserID (#PCDATA)>
<!ATTLIST user accountID CDATA "100">

View File

@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE userInfo SYSTEM "userInfo.dtd">
<userInfo>
<user accountID="a111">
<FirstName>King
</FirstName>
<LastName>Kong
</LastName>
<UserID>007
</UserID>
</user>
</userInfo>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?><document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "task.xml" resource:</p>
<example>
<fallback xml:base="fallback.xml"> This is the fallback text </fallback>
</example>
</document>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "tasks.xml" resource:</p>
<example>
This is the fallback text as a text
</example>
</document>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the outer XML file</p>
<example>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;root xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
&lt;p&gt;The following is the outer XML file&lt;/p&gt;
&lt;example&gt;
&lt;xi:include href="task.xml" parse="xml"&gt;
&lt;xi:fallback&gt;
&lt;xi:include href="doc_xinc_loops.xml" parse="text" /&gt;
&lt;/xi:fallback&gt;
&lt;/xi:include&gt;
&lt;/example&gt;
&lt;/root&gt;
</example>
</root>

View File

@ -0,0 +1,18 @@
<?xml version='1.0' encoding="UTF-8"?><document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the &quot;data.xml&quot; resource:</p>
<example><tasks xml:base="tasks.xml">
<task id="task1" >
<owner>John doe</owner>
<startdate>10/02/2003</startdate>
<enddate>11/02/2003</enddate>
<description>This is task 1</description>
</task>
<task id="task2" >
<owner>Jane Doe</owner>
<startdate>10/02/2003</startdate>
<enddate>11/02/2003</enddate>
<description>This is task 2</description>
</task>
</tasks></example>
</document>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><document xmlns:xi="http://www.w3.org/2001/XInclude">
<p>The following is the source of the "tasks.xml" resource:</p>
<example><owner xml:base="tasks.xml">Jane Doe</owner></example>
</document>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?><schedule xmlns:xi="http://www.w3.org/2001/XInclude">
<task>
<activities xml:base="inclusion.xml">
<activity id="1" xml:base="activity.xml">
<name>Code</name>
<description>Some description</description>
</activity>
</activities>
</task>
<task>
<activities xml:base="inclusion.xml">
<activity id="1" xml:base="activity.xml">
<name>Code</name>
<description>Some description</description>
</activity>
</activities>
</task>
</schedule>

View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<us:screen-names xmlns:us="http://hibid.com/screenName">
xmlns="http://hibid.com/screenName">
<us:screen-name>
<us:userName xmlns:us="http://hibid.com/user"> tom </us:userName>
<userNo>10 </userNo>
<userEmail xmlns="http://hibid.com/user">myid@hibid.com</userEmail></us:screen-name>
</us:screen-names>

View File

@ -22,11 +22,23 @@
*/
package jaxp.library;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.UnsupportedCharsetException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import static org.testng.Assert.fail;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* This is an interface provide basic support for JAXP functional test.
@ -58,6 +70,22 @@ public class JAXPTestUtilities {
*/
public static final String TEMP_DIR = System.getProperty("java.io.tmpdir", ".");
/**
* BOM table for storing BOM header.
*/
private final static Map<String, byte[]> bom = new HashMap();
/**
* Initialize all BOM headers.
*/
static {
bom.put("UTF-8", new byte[]{(byte)0xEF, (byte) 0xBB, (byte) 0xBF});
bom.put("UTF-16BE", new byte[]{(byte)0xFE, (byte)0xFF});
bom.put("UTF-16LE", new byte[]{(byte)0xFF, (byte)0xFE});
bom.put("UTF-32BE", new byte[]{(byte)0x00, (byte)0x00, (byte)0xFE, (byte)0xFF});
bom.put("UTF-32LE", new byte[]{(byte)0xFF, (byte)0xFE, (byte)0x00, (byte)0x00});
}
/**
* Compare contents of golden file with test output file line by line.
* return true if they're identical.
@ -74,6 +102,63 @@ public class JAXPTestUtilities {
equals(Files.readAllLines(Paths.get(outputfile)));
}
/**
* Compare contents of golden file with test output file by their document
* representation.
* Here we ignore the white space and comments. return true if they're
* lexical identical.
* @param goldfile Golden output file name.
* @param resultFile Test output file name.
* @return true if two file's document representation are identical.
* false if two file's document representation are not identical.
* @throws javax.xml.parsers.ParserConfigurationException if the
* implementation is not available or cannot be instantiated.
* @throws SAXException If any parse errors occur.
* @throws IOException if an I/O error occurs reading from the file or a
* malformed or unmappable byte sequence is read .
*/
public static boolean compareDocumentWithGold(String goldfile, String resultFile)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setCoalescing(true);
factory.setIgnoringElementContentWhitespace(true);
factory.setIgnoringComments(true);
DocumentBuilder db = factory.newDocumentBuilder();
Document goldD = db.parse(Paths.get(goldfile).toFile());
goldD.normalizeDocument();
Document resultD = db.parse(Paths.get(resultFile).toFile());
resultD.normalizeDocument();
return goldD.isEqualNode(resultD);
}
/**
* Convert stream to ByteArrayInputStream by given character set.
* @param charset target character set.
* @param file a file that contains no BOM head content.
* @return a ByteArrayInputStream contains BOM heads and bytes in original
* stream
* @throws IOException I/O operation failed or unsupported character set.
*/
public static InputStream bomStream(String charset, String file)
throws IOException {
String localCharset = charset;
if (charset.equals("UTF-16") || charset.equals("UTF-32")) {
localCharset
+= ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN ? "BE" : "LE";
}
if (!bom.containsKey(localCharset))
throw new UnsupportedCharsetException("Charset:" + localCharset);
byte[] content = Files.readAllLines(Paths.get(file)).stream().
collect(Collectors.joining()).getBytes(localCharset);
byte[] head = bom.get(localCharset);
ByteBuffer bb = ByteBuffer.allocate(content.length + head.length);
bb.put(head);
bb.put(content);
return new ByteArrayInputStream(bb.array());
}
/**
* Prints error message if an exception is thrown
* @param ex The exception is thrown by test.

View File

@ -0,0 +1,68 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.auctionportal;
import static jaxp.library.JAXPTestUtilities.FILE_SEP;
import static jaxp.library.JAXPTestUtilities.USER_DIR;
/**
* This is the Base test class provide basic support for Auction portal test.
*/
public class HiBidConstants {
/**
* Current test directory.
*/
public static final String CLASS_DIR
= System.getProperty("test.classes", ".") + FILE_SEP;
/**
* Package name that separates by slash.
*/
public static final String PACKAGE_NAME = FILE_SEP +
HiBidConstants.class.getPackage().getName().replaceAll("[.]", FILE_SEP);
/**
* Java source directory.
*/
public static final String SRC_DIR = System.getProperty("test.src", USER_DIR)
.replaceAll("\\" + System.getProperty("file.separator"), "/")
+ PACKAGE_NAME + FILE_SEP;
/**
* Source XML file directory.
*/
public static final String XML_DIR = SRC_DIR + "content" + FILE_SEP;
/**
* Golden output file directory.
* We pre-define all expected output in golden output file. Test verifies
* whether the standard output is same as content of golden file.
*/
public static final String GOLDEN_DIR = SRC_DIR + "golden" + FILE_SEP;
/**
* Name space for account operation.
*/
public static final String PORTAL_ACCOUNT_NS = "http://www.auctionportal.org/Accounts";
}