| /* 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 misc.detailed; |
| |
| import misc.common.JiraTestBase; |
| import org.apache.xmlbeans.*; |
| import org.apache.xmlbeans.impl.tool.Parameters; |
| import org.apache.xmlbeans.impl.tool.SchemaCompiler; |
| import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.NamedNodeMap; |
| import xmlbeans48.FeedInfoType; |
| |
| import javax.xml.namespace.QName; |
| import java.io.*; |
| import java.util.*; |
| |
| import static org.junit.Assert.*; |
| |
| public class JiraRegression1_50Test extends JiraTestBase { |
| |
| /* |
| * [XMLBEANS-2] Problem with XmlError.forObject(String,int,XmlObject) |
| */ |
| @Test |
| public void test_jira_xmlbeans02() throws Exception { |
| StringBuilder xmlstringbuf = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); |
| xmlstringbuf.append("<test>"); |
| xmlstringbuf.append("<testchild attr=\"abcd\"> Jira02 </testchild>"); |
| xmlstringbuf.append("</test>"); |
| |
| XmlObject myxmlobj = null; |
| List errors = new ArrayList(); |
| XmlOptions options = new XmlOptions().setErrorListener(errors); |
| try { |
| myxmlobj = XmlObject.Factory.parse(xmlstringbuf.toString(), options); |
| XmlCursor cur = myxmlobj.newCursor(); |
| XmlError xmlerr = XmlError.forObject("This is my custom error message", XmlError.SEVERITY_ERROR, myxmlobj); |
| |
| // call an API on the cursor : verification of cursor not being disposed |
| System.out.println("Cursor Text Value: " + cur.getTextValue()); |
| |
| } catch (XmlException xme) { |
| if (!xme.getErrors().isEmpty()) { |
| for (Iterator itr = xme.getErrors().iterator(); itr.hasNext();) { |
| System.out.println("Parse Errors :" + itr.next()); |
| } |
| } |
| |
| } catch (NullPointerException npe) { |
| fail("test_jira_xmlbeans02() : Null Pointer Exception thrown !"); |
| } |
| |
| printOptionErrMsgs(errors); |
| } |
| |
| /* |
| * [XMLBEANS-4] xs:decimal size greater than 18 results in uncompilable java code |
| */ |
| @Test |
| public void test_jira_xmlbeans04() { |
| List errors = new ArrayList(); |
| |
| Parameters params = new Parameters(); |
| params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_04.xsd_")}); |
| params.setErrorListener(errors); |
| params.setSrcDir(schemaCompSrcDir); |
| params.setClassesDir(schemaCompClassesDir); |
| |
| SchemaCompiler.compile(params); |
| if (printOptionErrMsgs(errors)) { |
| fail("test_jira_xmlbeans04() : Errors found when executing scomp"); |
| } |
| } |
| |
| |
| |
| /* |
| * [XMLBEANS-9] Null Pointer Exception when running validate from cmd line |
| */ |
| @Test |
| @Ignore("no shell tests on junit") |
| public void test_jira_xmlbeans09() throws Exception { |
| // Exec validate script from cmd line - Refer xmlbeans_09.xsd, xmlbeans_09.xml |
| |
| StringBuilder sb = new StringBuilder(" "); |
| sb.append(System.getProperty("xbean.rootdir") + P + "bin" + P + "validate.cmd "); |
| sb.append(scompTestFilesRoot + "xmlbeans_09.xsd_" + " " + scompTestFilesRoot + "xmlbeans_09.xml"); |
| Process validator_proc = null; |
| try { |
| validator_proc = Runtime.getRuntime().exec(sb.toString()); |
| } catch (NullPointerException npe) { |
| fail("test_jira_xmlbeans09() : Null Pointer Exception when running validate for schema"); |
| } |
| |
| System.out.println("cmd:" + sb); |
| BufferedInputStream inbuf = new BufferedInputStream(validator_proc.getInputStream()); |
| BufferedReader reader = new BufferedReader(new InputStreamReader(inbuf)); |
| String eachline = reader.readLine(); |
| try { |
| |
| while (reader.readLine() != null) { |
| System.out.println("output: " + eachline); |
| } |
| } catch (IOException ioe) { |
| ioe.getMessage(); |
| ioe.printStackTrace(); |
| } |
| |
| } |
| |
| /* |
| * [XMLBEANS-11]: Calling getUnionMemberTypes() on SchemaType for non-union types results in NullPointerException |
| * status : fixed |
| */ |
| @Test |
| public void test_jira_xmlbeans11() throws Exception { |
| |
| StringBuilder xsdAsString = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); |
| xsdAsString.append(" <!-- W3C Schema generated by XML Spy v4.3 U (http://www.xmlspy.com)\n"); |
| xsdAsString.append(" --> \n"); |
| xsdAsString.append(" <xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">\n"); |
| xsdAsString.append(" <xs:simpleType name=\"restrictsString\">\n"); |
| xsdAsString.append(" <xs:restriction base=\"xs:string\">\n"); |
| xsdAsString.append(" <xs:length value=\"10\" /> \n"); |
| xsdAsString.append(" </xs:restriction>\n"); |
| xsdAsString.append(" </xs:simpleType>\n"); |
| xsdAsString.append(" </xs:schema>"); |
| |
| // load schema file as SchemaDocument XmlObject |
| SchemaDocument sd = SchemaDocument.Factory.parse(xsdAsString.toString()); |
| |
| // compile loaded XmlObject |
| SchemaTypeSystem sts = XmlBeans.compileXsd((XmlObject[]) Collections.singletonList(sd).toArray(new XmlObject[]{}), |
| XmlBeans.getContextTypeLoader(), |
| new XmlOptions()); |
| sts.resolve(); |
| |
| SchemaType[] st = sts.globalTypes(); |
| |
| System.out.println("NUMBER OF GLOBAL TYPES: " + st.length); |
| |
| try { |
| for (int i = 0; i < st.length; i++) |
| // check if it is union type |
| { |
| System.out.println("IS UNION TYPE: " + (st[i].getUnionMemberTypes() != null)); |
| } |
| } catch (NullPointerException npe) { |
| fail("test_jira_xmlbeans11(): Null Pointer Exception thrown !"); |
| } |
| |
| } |
| |
| /* |
| * [XMLBEANS-14]: newDomNode() throws NullPointerException |
| */ |
| @Test |
| public void test_jira_xmlbeans14() throws Exception { |
| XmlObject xObj = XmlObject.Factory.parse("<Baz/>"); |
| // add element |
| XmlCursor xCursor = xObj.newCursor(); |
| xCursor.toFirstContentToken(); |
| xCursor.insertElementWithText(new QName("Some uri", "SomeName"), "SomeValue"); |
| xCursor.insertElementWithText(new QName("Some uri", "SomeName1"), "SomeValue1"); |
| xCursor.dispose(); |
| |
| // debug |
| xObj.save(System.out); |
| |
| // throws npe in v1 |
| try { |
| xObj.newDomNode(); |
| } catch (NullPointerException npe) { |
| fail("test_jira_xmlbeans14() : Null Pointer Exception when create Dom Node"); |
| } |
| |
| } |
| |
| |
| /* |
| * [XMLBEANS-16]: newDomNode creates a DOM with empty strings for namespace URIs for unprefixed |
| * attributes (rather than null) |
| * status : fails with crimson and not with Xerces |
| */ |
| @Test |
| @Ignore("still happens with current xerces 2.11") |
| public void test_jira_xmlbeans16() throws Exception { |
| StringBuilder sb = new StringBuilder(100); |
| sb.append("<?xml version='1.0'?>\n"); |
| sb.append("<test noprefix='nonamespace' \n"); |
| sb.append(" ns:prefix='namespace' \n"); |
| sb.append(" xmlns:ns='http://xml.apache.org/xmlbeans'>value</test>"); |
| |
| // Parse it using XMLBeans |
| XmlObject xdoc = XmlObject.Factory.parse(sb.toString()); |
| |
| // Convert to a DOM Element |
| Element firstChild = (Element) xdoc.newDomNode().getFirstChild(); |
| |
| // We expect to find a null namespace for the first attribute and 'ns' for the second |
| NamedNodeMap attributes = firstChild.getAttributes(); |
| System.out.println("Prefix for attr noprefix is:" + attributes.getNamedItem("noprefix").getPrefix() + ":"); |
| assertNull("Expected null namespace for attribute noprefix", attributes.getNamedItem("noprefix").getPrefix()); |
| assertEquals("Wrong namespace for attribute prefix", "ns", attributes.getNamedItem("ns:prefix").getPrefix()); |
| |
| // We should be able to lookup 'prefix' by specifying the appropriate URI |
| String prefix = firstChild.getAttributeNS("http://xml.apache.org/xmlbeans", "prefix"); |
| assertEquals("Wrong value for prefixed attribute", "namespace", prefix); |
| |
| // And 'noprefix' by specifying a null namespace URI |
| String noprefix = firstChild.getAttributeNS(null, "noprefix"); |
| assertEquals("Wrong value for unprefixed attribute", "nonamespace", noprefix); // This assertion fails under Crimson |
| |
| } |
| |
| /* |
| * [XMLBEANS-33]: insertions occur in improper order when subclassing schema types |
| */ |
| @Test |
| public void test_jira_xmlbeans33() throws Exception { |
| |
| xbeansJira33B.SubjectType subject = |
| xbeansJira33B.SubjectType.Factory.newInstance(); |
| subject.addNewIDPProvidedNameIdentifier(); |
| subject.addNewSubjectConfirmation().addConfirmationMethod("foo"); |
| subject.addNewNameIdentifier(); |
| XmlOptions options = new XmlOptions(); |
| ArrayList list = new ArrayList(); |
| options.setErrorListener(list); |
| |
| boolean bResult = subject.validate(options); |
| System.out.println(bResult ? "valid" : "invalid"); |
| |
| // print out errors |
| for (int i = 0; i < list.size(); i++) { |
| System.out.println("Validation Error : " + list.get(i)); |
| } |
| assertTrue("Validation Failed, should pass", bResult); |
| |
| } |
| |
| /* |
| * [XMLBEANS-34]: error compiling classes when using a schema with a redefined subelement |
| */ |
| @Test |
| public void test_jira_xmlbeans34() throws Exception { |
| List errors = new ArrayList(); |
| |
| Parameters params = new Parameters(); |
| params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_34b.xsd_")}); |
| params.setErrorListener(errors); |
| params.setSrcDir(schemaCompSrcDir); |
| params.setClassesDir(schemaCompClassesDir); |
| params.setDownload(true); |
| params.setNoPvr(true); |
| |
| SchemaCompiler.compile(params); |
| if (printOptionErrMsgs(errors)) { |
| fail("test_jira_xmlbeans34() : Errors found when executing scomp"); |
| } |
| |
| } |
| |
| |
| /** |
| * BUGBUG: [XMLBEANS-38] |
| * [XMLBEANS-38] Does not support xs:key (keyRef NoIllegalEntries) |
| */ |
| public void test_jira_xmlbeans38() throws Exception { |
| String keyrefXSD = "<?xml version=\"1.0\"?>" + |
| "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + |
| "<xsd:element name=\"supermarket\">" + |
| "<xsd:complexType>" + |
| "<xsd:sequence> " + |
| "<xsd:element name=\"aisle\" maxOccurs=\"unbounded\"> \n" + |
| "<xsd:complexType> " + |
| "<xsd:sequence>" + |
| "<xsd:element name=\"item\" maxOccurs=\"unbounded\"> \n" + |
| "<xsd:complexType> " + |
| "<xsd:simpleContent>" + |
| "<xsd:extension base=\"xsd:string\"> \n" + |
| "<xsd:attribute name=\"code\" type=\"xsd:positiveInteger\"/> \n" + |
| "<xsd:attribute name=\"quantity\" type=\"xsd:positiveInteger\"/> \n" + |
| "<xsd:attribute name=\"price\" type=\"xsd:decimal\"/> \n" + |
| "</xsd:extension> \n" + |
| "</xsd:simpleContent> \n" + |
| "</xsd:complexType> \n" + |
| "</xsd:element> \n" + |
| "</xsd:sequence> \n" + //"<!-- Attribute Of Aisle --> \n" + |
| "<xsd:attribute name=\"name\" type=\"xsd:string\"/> \n" + |
| "<xsd:attribute name=\"number\" type=\"xsd:positiveInteger\"/> \n" + //"<!-- Of Aisle --> \n" + |
| "</xsd:complexType> \n" + |
| "<xsd:keyref name=\"NoIllegalEntries\" refer=\"itemKey\"> \n" + |
| "<xsd:selector xpath=\"item\"/> \n" + |
| "<xsd:field xpath=\"@code\"/> \n" + |
| "</xsd:keyref> \n" + |
| "</xsd:element> \n" + |
| "<xsd:element name=\"items\"> \n" + |
| "<xsd:complexType> \n" + |
| "<xsd:sequence> \n" + |
| "<xsd:element name=\"item\" maxOccurs=\"unbounded\"> \n" + |
| "<xsd:complexType> \n" + |
| "<xsd:simpleContent> \n" + |
| "<xsd:extension base=\"xsd:string\"> \n" + |
| "<xsd:attribute name=\"code\" type=\"xsd:positiveInteger\"/> \n" + |
| "</xsd:extension> \n" + |
| "</xsd:simpleContent> \n" + |
| "</xsd:complexType> \n" + |
| "</xsd:element> \n" + |
| "</xsd:sequence> \n" + |
| "</xsd:complexType> \n" + |
| "</xsd:element> \n" + |
| "</xsd:sequence> \n" + |
| "<xsd:attribute name=\"name\" type=\"xsd:string\"/> \n" + |
| "</xsd:complexType> \n" + |
| "<xsd:key name=\"itemKey\"> \n" + |
| "<xsd:selector xpath=\"items/item\"/> \n" + |
| "<xsd:field xpath=\"@code\"/> \n" + |
| "</xsd:key> \n" + |
| "</xsd:element> \n" + |
| "</xsd:schema>"; |
| |
| |
| String keyRefInstance = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n" + |
| "<supermarket xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"C:\\tmp\\Supermarket.xsd\" name=\"String\"> \n" + |
| "<aisle name=\"String\" number=\"2\"> \n" + |
| "<item code=\"1234\" quantity=\"2\" price=\"3.1415926535897932384626433832795\">String</item> \n" + |
| "</aisle> \n" + |
| "<items> \n" + |
| "<item code=\"1234\">Java</item> \n" + |
| "</items> \n" + |
| "</supermarket>"; |
| |
| validateInstance(new String[]{keyrefXSD}, new String[]{keyRefInstance}, null); |
| } |
| |
| |
| /** |
| * Loads the class at runtime and inspects for appropriate methods |
| * Statically using methods (class.getGeneration()) would stop build |
| * if the bug resurfaced. |
| * <p/> |
| * [XMLBEANS-45] <xsd:redefine> tag is not supported |
| */ |
| public void test_jira_XmlBeans45() throws Exception { |
| //this class is built during the build.schemas target |
| Class cls = Class.forName("xmlbeans45.PersonName"); |
| //check for methods in class |
| //getGeneration() |
| if (cls.getMethod("getGeneration") == null) |
| throw new Exception("getGeneration() was not found in class"); |
| //getTitle() |
| if (cls.getMethod("getTitle") == null) |
| throw new Exception("getTitle() was not found in class"); |
| //getForenameArray() |
| if (cls.getMethod("getForenameArray") == null) |
| throw new Exception("getForenameArray() was not found in class"); |
| |
| } |
| |
| /** |
| * Could not Repro this |
| * [XMLBEANS-46] Regex validation fails in multi-threaded, multi-processor environment |
| */ |
| public void test_jira_XmlBeans46() throws Exception { |
| RegexThread[] threads = new RegexThread[45]; |
| |
| for (int i = 0; i < threads.length; i++) { |
| threads[i] = new RegexThread(); |
| System.out.println("Thread[" + i + "]-starting "); |
| threads[i].start(); |
| } |
| |
| Thread.sleep(6000); |
| System.out.println("Done with RegEx Threading Test..."); |
| |
| StringBuilder sb = new StringBuilder(); |
| for (int i = 0; i < threads.length; i++) { |
| if (threads[i].getException() != null) |
| sb.append(threads[i].getException().getMessage() + "\n"); |
| } |
| |
| if (sb.length() > 0) |
| throw new Exception("Threaded Regex Validation Failed\n" + sb.toString()); |
| } |
| |
| |
| /** |
| * Incorrect XML |
| * [XMLBEANS-48] Bug with Root.fetch ( Splay parent, QName name, QNameSet set, int n ) |
| */ |
| public void test_jira_XmlBeans48() throws Exception { |
| String incorrectXml = "<sch:Feed xmlns:sch=\"http://xmlbeans_48\">" + |
| "<sch:Feed>" + |
| "<sch:Location>http://xmlbeans.apache.org</sch:Location>" + |
| "<sch:TimeEntered>2004-08-11T15:50:23.064-04:00</sch:TimeEntered>" + |
| "</sch:Feed>" + |
| "</sch:Feed>"; |
| |
| xmlbeans48.FeedDocument feedDoc = (xmlbeans48.FeedDocument) XmlObject.Factory.parse(incorrectXml); |
| FeedInfoType feedInfoType = feedDoc.getFeed(); |
| String location = feedInfoType.getLocation(); |
| System.out.println("Location: " + location); |
| if (location != null) |
| throw new Exception("Location value should not have been populated"); |
| |
| String correctXml = "<sch:Feed xmlns:sch=\"http://xmlbeans_48\">" + |
| "<sch:Location>http://xmlbeans.apache.org</sch:Location>" + |
| "<sch:TimeEntered>2004-08-11T15:50:23.064-04:00</sch:TimeEntered>" + |
| "</sch:Feed>"; |
| |
| feedDoc = (xmlbeans48.FeedDocument) XmlObject.Factory.parse(correctXml); |
| feedInfoType = feedDoc.getFeed(); |
| location = feedInfoType.getLocation(); |
| System.out.println("Location: " + location); |
| if (location == null) |
| throw new Exception("Location value should have been populated"); |
| } |
| |
| /* |
| * [XMLBEANS-49]: Schema compiler won't compile portlet.xsd from jsr168/pluto |
| * |
| */ |
| public void test_jira_xmlbeans49() { |
| List errors = new ArrayList(); |
| Parameters params = new Parameters(); |
| params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_49.xsd_")}); |
| params.setErrorListener(errors); |
| params.setSrcDir(schemaCompSrcDir); |
| params.setClassesDir(schemaCompClassesDir); |
| |
| // needs network downloads enabled |
| params.setDownload(true); |
| |
| try { |
| SchemaCompiler.compile(params); |
| } catch (Exception ex) { |
| if (!errors.isEmpty()) { |
| for (Iterator itr = errors.iterator(); itr.hasNext();) { |
| System.out.println("scomp errors: "); |
| } |
| } |
| |
| fail("test_jira_xmlbeans49() :Exception thrown with above errors!"); |
| } |
| |
| // view errors |
| if (printOptionErrMsgs(errors)) { |
| fail("test_jira_xmlbeans49() : Errors found when executing scomp"); |
| } |
| } |
| |
| /** |
| * For Testing jira issue 46 |
| */ |
| public static class RegexThread extends TestThread |
| { |
| private xmlbeans46.UsPhoneNumberDocument phone; |
| Random rand; |
| |
| public RegexThread() |
| { |
| super(); |
| phone = xmlbeans46.UsPhoneNumberDocument.Factory.newInstance(); |
| rand = new Random(); |
| } |
| |
| /** |
| * Validates a type that uses the following pattern |
| * <xs:restriction base="xs:string"> |
| * <xs:pattern value="\d{3}\-\d{3}\-\d{4}"/> |
| * </xs:restriction> |
| */ |
| public void run() |
| { |
| try { |
| |
| for (int i = 0; i < 9; i++) { |
| int pre = rand.nextInt(999); |
| int mid = rand.nextInt(999); |
| int post = rand.nextInt(9999); |
| String testVal = ((pre > 100) ? String.valueOf(pre) : "128") + "-" + |
| ((mid > 100) ? String.valueOf(mid) : "256") + "-" + |
| ((post > 1000) ? String.valueOf(post) : "1024"); |
| |
| String xmlData = "<xb:usPhoneNumber xmlns:xb=\"http://xmlbeans_46\">" + |
| testVal + |
| "</xb:usPhoneNumber>"; |
| //cannot repro using this method |
| //phone.setUsPhoneNumber(testVal); |
| //if (!phone.validate(xm)) { |
| // _throwable = new Throwable("Multi Threaded Regular " + |
| // "Expression did not validate - " + testVal); |
| // if (errors != null && errors.size() > 0) |
| // System.err.println("ERROR: " + errors); |
| //} |
| |
| boolean validated = parseAndValidate(xmlData); |
| if (!validated) { |
| System.out.println("Not Valid!!!"); |
| } |
| System.out.println("Validated " + testVal + " successfully "); |
| } |
| _result = true; |
| |
| } catch (Throwable t) { |
| _throwable = t; |
| t.printStackTrace(); |
| } |
| } |
| |
| private boolean parseAndValidate(String val) throws XmlException |
| { |
| xmlbeans46.UsPhoneNumberDocument xml = xmlbeans46.UsPhoneNumberDocument.Factory.parse(val); |
| return validate(xml); |
| } |
| |
| private boolean validate(xmlbeans46.UsPhoneNumberDocument rdd) |
| { |
| Collection errors = new ArrayList(); |
| XmlOptions validateOptions = new XmlOptions(); |
| validateOptions.setErrorListener(errors); |
| boolean valid = rdd.validate(validateOptions); |
| if (!valid) { |
| for (Iterator iterator = errors.iterator(); iterator.hasNext();) { |
| XmlError xmlError = (XmlError) iterator.next(); |
| System.out.println("XML Error - " + xmlError.getMessage() + " at\n" + xmlError.getCursorLocation().xmlText()); |
| } |
| |
| } |
| return valid; |
| } |
| } |
| } |