1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package test.auctionportal;
  24 
  25 import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_LANGUAGE;
  26 import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_SOURCE;
  27 import static org.testng.Assert.assertEquals;
  28 import static org.testng.Assert.assertFalse;
  29 import static org.testng.Assert.assertTrue;
  30 
  31 import java.io.File;
  32 import java.io.FileInputStream;
  33 import java.io.IOException;
  34 import java.io.InputStream;
  35 import java.math.BigInteger;
  36 import java.nio.file.Paths;
  37 import java.util.GregorianCalendar;
  38 import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
  39 
  40 import javax.xml.datatype.DatatypeConfigurationException;
  41 import javax.xml.datatype.DatatypeConstants;
  42 import javax.xml.datatype.DatatypeFactory;
  43 import javax.xml.datatype.Duration;
  44 import javax.xml.parsers.DocumentBuilder;
  45 import javax.xml.parsers.DocumentBuilderFactory;
  46 import javax.xml.parsers.ParserConfigurationException;
  47 import javax.xml.parsers.SAXParser;
  48 import javax.xml.parsers.SAXParserFactory;
  49 import javax.xml.transform.dom.DOMResult;
  50 import javax.xml.transform.dom.DOMSource;
  51 import javax.xml.validation.Schema;
  52 import javax.xml.validation.SchemaFactory;
  53 import javax.xml.validation.Validator;
  54 import static jaxp.library.JAXPTestUtilities.bomStream;
  55 import static jaxp.library.JAXPTestUtilities.failUnexpected;
  56 import org.testng.annotations.Test;
  57 import org.w3c.dom.Attr;
  58 import org.w3c.dom.DOMConfiguration;
  59 import org.w3c.dom.Document;
  60 import org.w3c.dom.Element;
  61 import org.w3c.dom.NodeList;
  62 import org.w3c.dom.TypeInfo;
  63 import org.w3c.dom.bootstrap.DOMImplementationRegistry;
  64 import org.w3c.dom.ls.DOMImplementationLS;
  65 import org.w3c.dom.ls.LSSerializer;
  66 import org.xml.sax.SAXException;
  67 import static test.auctionportal.HiBidConstants.PORTAL_ACCOUNT_NS;
  68 import static test.auctionportal.HiBidConstants.XML_DIR;
  69 
  70 /**
  71  * This is the user controller  class for the Auction portal HiBid.com.
  72  */
  73 public class AuctionController {
  74     /**
  75      * Check for DOMErrorHandler handling DOMError. Before fix of bug 4890927
  76      * DOMConfiguration.setParameter("well-formed",true) throws an exception.
  77      */
  78     @Test
  79     public void testCreateNewItem2Sell() {
  80         String xmlFile = XML_DIR + "novelsInvalid.xml";
  81 
  82         try {
  83             Document document = DocumentBuilderFactory.newInstance()
  84                     .newDocumentBuilder().parse(xmlFile);
  85 
  86             document.getDomConfig().setParameter("well-formed", true);
  87 
  88             DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
  89             DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
  90             MyDOMOutput domOutput = new MyDOMOutput();
  91             domOutput.setByteStream(System.out);
  92             LSSerializer writer = impl.createLSSerializer();
  93             writer.write(document, domOutput);
  94         } catch (ParserConfigurationException | SAXException | IOException
  95                 | ClassNotFoundException | InstantiationException
  96                 | IllegalAccessException | ClassCastException e) {
  97             failUnexpected(e);
  98         }
  99     }
 100 
 101     /**
 102      * Check for DOMErrorHandler handling DOMError. Before fix of bug 4896132
 103      * test throws DOM Level 1 node error.
 104      */
 105     @Test
 106     public void testCreateNewItem2SellRetry() {
 107         String xmlFile = XML_DIR + "accountInfo.xml";
 108 
 109         try {
 110             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 111             dbf.setNamespaceAware(true);
 112             Document document = dbf.newDocumentBuilder().parse(xmlFile);
 113 
 114             DOMConfiguration domConfig = document.getDomConfig();
 115             MyDOMErrorHandler errHandler = new MyDOMErrorHandler();
 116             domConfig.setParameter("error-handler", errHandler);
 117 
 118             DOMImplementationLS impl =
 119                  (DOMImplementationLS) DOMImplementationRegistry.newInstance()
 120                          .getDOMImplementation("LS");
 121             LSSerializer writer = impl.createLSSerializer();
 122             MyDOMOutput domoutput = new MyDOMOutput();
 123 
 124             domoutput.setByteStream(System.out);
 125             writer.write(document, domoutput);
 126 
 127             document.normalizeDocument();
 128             writer.write(document, domoutput);
 129             assertFalse(errHandler.isError());
 130         } catch (ParserConfigurationException | SAXException | IOException
 131                 | ClassNotFoundException | InstantiationException
 132                 | IllegalAccessException | ClassCastException e) {
 133             failUnexpected(e);
 134         }
 135     }
 136 
 137     /**
 138      * Check if setting the attribute to be of type ID works. This will affect
 139      * the Attr.isID method according to the spec.
 140      */
 141     @Test
 142     public void testCreateID() {
 143         String xmlFile = XML_DIR + "accountInfo.xml";
 144 
 145         try {
 146             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 147             dbf.setNamespaceAware(true);
 148 
 149             Document document = dbf.newDocumentBuilder().parse(xmlFile);
 150             Element account = (Element)document
 151                 .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
 152 
 153             account.setIdAttributeNS(PORTAL_ACCOUNT_NS, "accountID", true);
 154             Attr aID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
 155             assertTrue(aID.isId());
 156         } catch (ParserConfigurationException | SAXException | IOException e) {
 157             failUnexpected(e);
 158         }
 159     }
 160 
 161     /**
 162      * Check the user data on the node.
 163      */
 164     @Test
 165     public void testCheckingUserData() {
 166         String xmlFile = XML_DIR + "accountInfo.xml";
 167 
 168         try {
 169             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 170             dbf.setNamespaceAware(true);
 171 
 172             DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 173             Document document = docBuilder.parse(xmlFile);
 174 
 175             Element account = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
 176             assertEquals(account.getNodeName(), "acc:Account");
 177             Element firstName = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
 178             assertEquals(firstName.getNodeName(), "FirstName");
 179 
 180             Document doc1 = docBuilder.newDocument();
 181             Element someName = doc1.createElement("newelem");
 182 
 183             someName.setUserData("mykey", "dd",
 184                 (operation, key,  data, src,  dst) ->  {
 185                     System.err.println("In UserDataHandler" + key);
 186                     System.out.println("In UserDataHandler");
 187                 });
 188             Element impAccount = (Element)document.importNode(someName, true);
 189             assertEquals(impAccount.getNodeName(), "newelem");
 190             document.normalizeDocument();
 191             String data = (someName.getUserData("mykey")).toString();
 192             assertEquals(data, "dd");
 193         } catch (ParserConfigurationException | SAXException | IOException e) {
 194             failUnexpected(e);
 195         }
 196     }
 197 
 198 
 199     /**
 200      * Check the UTF-16 XMLEncoding xml file.
 201      * @see <a href="content/movies.xml">movies.xml</a>
 202      */
 203     @Test
 204     public void testCheckingEncoding() {
 205         // Note since movies.xml is UTF-16 encoding. We're not using stanard XML
 206         // file suffix.
 207         String xmlFile = XML_DIR + "movies.xml.data";
 208 
 209         //try (FileInputStream is = new FileInputStream(xmlFile)) {
 210         try {
 211             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 212             dbf.setNamespaceAware(true);
 213             InputStream source = bomStream("UTF-16", xmlFile);
 214             Document document = dbf.newDocumentBuilder().parse(source);
 215             assertEquals(document.getXmlEncoding(), "UTF-16");
 216             assertEquals(document.getXmlStandalone(), true);
 217         } catch (ParserConfigurationException | SAXException | IOException e) {
 218             failUnexpected(e);
 219         }
 220     }
 221 
 222     /**
 223      * Check validation API features. A schema which is including in Bug 4909119
 224      * used to be testing for the functionalities.
 225      * @see <a href="content/userDetails.xsd">userDetails.xsd</a>
 226      */
 227     @Test
 228     public void testGetOwnerInfo() {
 229         String schemaFile = XML_DIR + "userDetails.xsd";
 230         String xmlFile = XML_DIR + "userDetails.xml";
 231 
 232         try {
 233             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 234             dbf.setNamespaceAware(true);
 235             dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
 236 
 237             SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
 238             Schema schema = schemaFactory.newSchema(Paths.get(schemaFile).toFile());
 239 
 240             Validator validator = schema.newValidator();
 241             MyErrorHandler eh = new MyErrorHandler();
 242             validator.setErrorHandler(eh);
 243 
 244             DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 245             docBuilder.setErrorHandler(eh);
 246 
 247             Document document = docBuilder.parse(new FileInputStream(xmlFile));
 248             DOMResult dResult = new DOMResult();
 249             DOMSource domSource = new DOMSource(document);
 250             validator.validate(domSource, dResult);
 251             assertFalse(eh.isAnyError());
 252         } catch (SAXException | ParserConfigurationException | IOException e) {
 253             failUnexpected(e);
 254         }
 255     }
 256 
 257     /**
 258      * Check grammar caching with imported schemas.
 259      * @see <a href="content/coins.xsd">coins.xsd</a>
 260      * @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
 261      */
 262     @Test
 263     public void testGetOwnerItemList() {
 264         String xsdFile = XML_DIR + "coins.xsd";
 265         String xmlFile = XML_DIR + "coins.xml";
 266 
 267         try {
 268             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 269             dbf.setNamespaceAware(true);
 270             dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
 271             dbf.setValidating(false);
 272 
 273             SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
 274             Schema schema = schemaFactory.newSchema(new File(((xsdFile))));
 275 
 276             MyErrorHandler eh = new MyErrorHandler();
 277             Validator validator = schema.newValidator();
 278             validator.setErrorHandler(eh);
 279 
 280             DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 281             Document document = docBuilder.parse(new FileInputStream(xmlFile));
 282             validator.validate(new DOMSource(document), new DOMResult());
 283             assertFalse(eh.isAnyError());
 284         } catch (SAXException | ParserConfigurationException | IOException e) {
 285             failUnexpected(e);
 286         }
 287     }
 288 
 289 
 290     /**
 291      * Check for the same imported schemas but will use SAXParserFactory and try
 292      * parsing using the SAXParser. SCHEMA_SOURCE attribute is using for this
 293      * test.
 294      * @see <a href="content/coins.xsd">coins.xsd</a>
 295      * @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
 296      */
 297 
 298     @Test
 299     public void testGetOwnerItemList1() {
 300         String xsdFile = XML_DIR + "coins.xsd";
 301         String xmlFile = XML_DIR + "coins.xml";
 302 
 303         try {
 304             SAXParserFactory spf = SAXParserFactory.newInstance();
 305             spf.setNamespaceAware(true);
 306             spf.setValidating(true);
 307 
 308             SAXParser sp = spf.newSAXParser();
 309             sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
 310             sp.setProperty(JAXP_SCHEMA_SOURCE, xsdFile);
 311 
 312             MyErrorHandler eh = new MyErrorHandler();
 313             sp.parse(new File(xmlFile), eh);
 314             assertFalse(eh.isAnyError());
 315         } catch (ParserConfigurationException | SAXException | IOException e) {
 316             failUnexpected(e);
 317         }
 318     }
 319 
 320     /**
 321      * Check usage of javax.xml.datatype.Duration class.
 322      */
 323     @Test
 324     public void testGetItemDuration() {
 325         String xmlFile = XML_DIR + "itemsDuration.xml";
 326 
 327         try {
 328             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 329             dbf.setNamespaceAware(true);
 330             Document document = dbf.newDocumentBuilder().parse(xmlFile);
 331 
 332             Element durationElement = (Element) document.getElementsByTagName("sellDuration").item(0);
 333 
 334             NodeList childList = durationElement.getChildNodes();
 335 
 336             for (int i = 0; i < childList.getLength(); i++) {
 337                 System.out.println("child " + i + childList.item(i));
 338             }
 339 
 340             Duration duration = DatatypeFactory.newInstance().newDuration("P365D");
 341             Duration sellDuration = DatatypeFactory.newInstance().newDuration(childList.item(0).getNodeValue());
 342             assertFalse(sellDuration.isShorterThan(duration));
 343             assertFalse(sellDuration.isLongerThan(duration));
 344             assertEquals(sellDuration.getField(DatatypeConstants.DAYS), BigInteger.valueOf(365));
 345             assertEquals(sellDuration.normalizeWith(new GregorianCalendar(1999, 2, 22)), duration);
 346 
 347             Duration myDuration = sellDuration.add(duration);
 348             assertEquals(myDuration.normalizeWith(new GregorianCalendar(2003, 2, 22)),
 349                     DatatypeFactory.newInstance().newDuration("P730D"));
 350         } catch (ParserConfigurationException | DatatypeConfigurationException
 351                 | SAXException | IOException e) {
 352             failUnexpected(e);
 353         }
 354     }
 355 
 356     /**
 357      * Check usage of TypeInfo interface introduced in DOM L3.
 358      */
 359     @Test
 360     public void testGetTypeInfo() {
 361         String xmlFile = XML_DIR + "accountInfo.xml";
 362 
 363         try {
 364             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 365             dbf.setNamespaceAware(true);
 366             dbf.setValidating(true);
 367             dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
 368 
 369             DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 370             docBuilder.setErrorHandler(new MyErrorHandler());
 371 
 372             Document document = docBuilder.parse(xmlFile);
 373             Element userId = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "UserID").item(0);
 374             TypeInfo typeInfo = userId.getSchemaTypeInfo();
 375             assertTrue(typeInfo.getTypeName().equals("nonNegativeInteger"));
 376             assertTrue(typeInfo.getTypeNamespace().equals(W3C_XML_SCHEMA_NS_URI));
 377 
 378             Element role = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Role").item(0);
 379             TypeInfo roletypeInfo = role.getSchemaTypeInfo();
 380             assertTrue(roletypeInfo.getTypeName().equals("BuyOrSell"));
 381             assertTrue(roletypeInfo.getTypeNamespace().equals(PORTAL_ACCOUNT_NS));
 382         } catch (ParserConfigurationException | SAXException | IOException e) {
 383             failUnexpected(e);
 384         }
 385     }
 386 }