blob: 8cca0f61834e78f7be0d1623523875602a4ae5ff [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package xmlobject.checkin;
import org.apache.xml.test.selectChldAtt.DocDocument;
import org.apache.xml.test.selectChldAtt.TypeExtendedC;
import org.apache.xmlbeans.*;
import org.junit.Test;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import static org.junit.Assert.assertTrue;
public class SelectChldAttTests {
private static final String XSI_URI = "http://www.w3.org/2001/XMLSchema-instance";
@Test
public void testSelect() throws XmlException {
String uri = "http://xml.apache.org/test/selectChldAtt";
String xml = "<doc xmlns='" + uri + "'>\n" +
" <int>7</int>\n" +
" <string> ... some text ... </string>\n" +
" <elemA price='4.321'>\n" +
" <topLevelElement> this is wildcard bucket </topLevelElement>\n" +
" </elemA>\n" +
" <elemB xmlns:p='uri:other_namespace' \n" +
" p:att='attribute in #other namespace'>\n" +
" <someElement>2</someElement>\n" +
" <p:otherElement> element in #other namespace </p:otherElement>\n" +
" </elemB>\n" +
" <elemC xmlns:xsi='" + XSI_URI + "' \n" +
" xmlns:p='uri_other_namespace' \n" +
" xsi:type='typeExtendedC' \n" +
" att1='attribute from typeC' \n" +
" aditionalAtt='attribute added in type extension' \n" +
" p:validAtt='attribute in any bucket' >\n" +
" <someElement> element from typeC </someElement>\n" +
" <p:validElement> element in the 'any' bucket for typeExtendedC </p:validElement>\n" +
" <aditionalElement> element from typeExtendedC </aditionalElement>\n" +
" </elemC>\n" +
"</doc>";
DocDocument document = DocDocument.Factory.parse(xml);
DocDocument.Doc doc = document.getDoc();
Collection errors = new ArrayList();
assertTrue("Valid instance", doc.validate(new XmlOptions().setErrorListener(errors)));
printErrors(errors);
XmlObject xo;
XmlObject[] xos;
// select a known element
xos = doc.selectChildren(new QName(uri, "int"));
//print("1 selectChildren 'int' : ", xos);
assertTrue("1 selectChildren 'int' : ", verifyResult(xos, new String[]{"<xml-fragment>7</xml-fragment>"}));
xos = doc.selectChildren(uri, "string");
//print("2 selectChildren 'string' : ", xos);
assertTrue("2 selectChildren 'string' : ", verifyResult(xos, new String[]{"<xml-fragment> ... some text ... </xml-fragment>"}));
// elemA
xos = doc.selectChildren(new QName(uri, "elemA"));
//print("3 selectChildren 'elemA' : ", xos);
assertTrue("3 selectChildren 'elemA' : ",
verifyResult(xos, new String[]{"<xml-fragment price=\"4.321\" xmlns:sel=\"" + uri + "\">\n" +
" <sel:topLevelElement> this is wildcard bucket </sel:topLevelElement>\n" +
"</xml-fragment>"}));
// select a known attribute
xo = xos[0].selectAttribute(new QName("", "price"));
//print("4 selectAttribute 'price' : ", xo);
assertTrue("4 selectAttribute 'price' : ",
verifyResult(xo, "<xml-fragment>4.321</xml-fragment>"));
// select all attributes
QNameSet qns = QNameSet.forWildcardNamespaceString("##any", uri);
xos = xos[0].selectAttributes(qns);
//print("5 selectAttributes set'##any' :", xos);
assertTrue("5 selectAttributes set'##any' :",
verifyResult(xos, new String[]{"<xml-fragment>4.321</xml-fragment>"}));
// elemB
xos = doc.selectChildren(new QName(uri, "elemB"));
//print("6 selectChildren 'elemB' : ", xos);
//print("7 selectChildren set'##other' : " , xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##other", uri)));
assertTrue("7 selectChildren set'##other' : ",
verifyResult(xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##other", uri))
, new String[]{"<xml-fragment xmlns:p=\"uri:other_namespace\"> element in #other namespace </xml-fragment>"}));
//print("8 selectAttributes set'##other' : ", xos[0].selectAttributes(QNameSet.forWildcardNamespaceString("##other", uri)));
assertTrue("8 selectAttributes set'##other' : ",
verifyResult(xos[0].selectAttributes(QNameSet.forWildcardNamespaceString("##other", uri)),
new String[]{"<xml-fragment xmlns:p=\"uri:other_namespace\">attribute in #other namespace</xml-fragment>"}));
// elemC
xos = doc.selectChildren(new QName(uri, "elemC"));
//print("9 selectChildren 'elemC' : ", xos);
//print("10 selectChildren set'##any' : " , xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##any", uri)));
assertTrue("10 selectChildren set'##any' : ",
verifyResult(xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##any", uri))
, new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element from typeC </xml-fragment>",
"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>",
"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element from typeExtendedC </xml-fragment>"}));
// select elements in the any bucket by excluding the the known elements
QNameSetBuilder qnsb = new QNameSetBuilder();
qnsb.add(new QName(uri, "someElement"));
qnsb.add(new QName(uri, "aditionalElement"));
qnsb.invert();
//print("11a selectChildren in the any bucket for typeExtendedC: " , xos[0].selectChildren(qnsb.toQNameSet()));
assertTrue("11a selectChildren in the any bucket for typeExtendedC: ",
verifyResult(xos[0].selectChildren(qnsb.toQNameSet()),
new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>"}));
//print("11b selectChildren in the any bucket for typeExtendedC: " , xos[0].selectChildren(TypeExtendedC.type.qnameSetForWildcardElements()));
assertTrue("11b selectChildren in the any bucket for typeExtendedC: ",
verifyResult(xos[0].selectChildren(TypeExtendedC.type.qnameSetForWildcardElements()),
new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>"}));
// select attributes in the any bucket by excluding the the known attributes
qnsb = new QNameSetBuilder();
qnsb.add(new QName("", "att1"));
qnsb.add(new QName("", "aditionalAtt"));
qnsb.add(new QName(XSI_URI, "type"));
qnsb.invert();
//print("12a selectChildren in the any bucket for typeExtendedC: " , xos[0].selectAttributes(qnsb.toQNameSet()));
assertTrue("12a selectChildren in the any bucket for typeExtendedC: ",
verifyResult(xos[0].selectAttributes(qnsb.toQNameSet()),
new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">attribute in any bucket</xml-fragment>"}));
//print("12b selectChildren in the any bucket for typeExtendedC: " , xos[0].selectAttributes(TypeExtendedC.type.qnameSetForWildcardAttributes()));
assertTrue("12b selectChildren in the any bucket for typeExtendedC: ",
verifyResult(xos[0].selectAttributes(TypeExtendedC.type.qnameSetForWildcardAttributes()),
new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">typeExtendedC</xml-fragment>",
"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">attribute in any bucket</xml-fragment>"}));
}
private static void printErrors(Collection errors) {
for (Iterator i = errors.iterator(); i.hasNext(); ) {
System.out.println("ERROR: " + i.next());
}
}
private static boolean verifyResult(XmlObject[] xos, String[] expected) {
if (xos == null && expected == null)
return true;
if (xos == null || expected == null)
return false;
if (xos.length != expected.length)
return false;
for (int i = 0; i < xos.length; i++) {
XmlObject xo = xos[i];
if (!equalsIgnoreNewLine(xo.toString(), expected[i])) {
System.out.println("ERROR:\n Actual:\n" + xo.toString() + "\n Expected:\n" + expected[i]);
return false;
}
}
return true;
}
private static boolean verifyResult(XmlObject xo, String expected) {
if (xo == null && expected == null)
return true;
if (xo == null || expected == null)
return false;
if (!xo.toString().equals(expected)) {
System.out.println("ERROR:\n Actual:\n" + xo.toString() + "\n Expected:\n" + expected);
return false;
} else
return true;
}
private static boolean equalsIgnoreNewLine(String s1, String s2) {
if (s1 == null && s2 == null)
return true;
if (s1 == null || s2 == null)
return false;
int i1 = 0, i2 = 0;
while (i1 < s1.length() || i2 < s2.length()) {
if (s1.charAt(i1) == '\n' || s1.charAt(i1) == '\r') {
i1++;
continue;
}
if (s2.charAt(i2) == '\n' || s2.charAt(i2) == '\r') {
i2++;
continue;
}
if (s1.charAt(i1) != s2.charAt(i2))
return false;
i1++;
i2++;
}
return (i1 == s1.length()) && (i2 == s2.length());
}
}