1 /*
   2  * Copyright (c) 2014, 2015, 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 
  24 package validation;
  25 
  26 import java.io.File;
  27 
  28 import javax.xml.XMLConstants;
  29 import javax.xml.parsers.DocumentBuilder;
  30 import javax.xml.parsers.DocumentBuilderFactory;
  31 import javax.xml.validation.Schema;
  32 import javax.xml.validation.SchemaFactory;
  33 
  34 import org.testng.Assert;
  35 import org.testng.annotations.Test;
  36 import org.xml.sax.ErrorHandler;
  37 import org.xml.sax.SAXException;
  38 import org.xml.sax.SAXParseException;
  39 
  40 /*
  41  * @summary Test maxOccurs validation.
  42  */
  43 public class IssueTracker30 {
  44 
  45     boolean errorFound;
  46 
  47     @Test
  48     public void testMaxOccursErrorNoOptimization() throws Exception {
  49 
  50         // Parsing this document should result in an error
  51         try {
  52                 if (!testMaxOccurs("IssueTracker30_occurs-error.xml", "IssueTracker30_occurs.xsd"))
  53                         Assert.fail("Expected validation error not reported");
  54         } catch (SAXException ex) {
  55             Assert.fail(ex.getMessage(), ex);
  56         }
  57     }
  58 
  59     @Test
  60     public void testMaxOccursOKNoOptimization() throws Exception {
  61 
  62         // Parsing this document should *not* result in an error
  63         try {
  64                 if (testMaxOccurs("IssueTracker30_occurs-ok.xml", "IssueTracker30_occurs.xsd"))
  65                         Assert.fail("Unexpected validation error reported");
  66         } catch (SAXException ex) {
  67             Assert.fail(ex.getMessage(), ex);
  68         }
  69     }
  70 
  71     @Test
  72     public void testMaxOccursErrorOptimization() throws Exception {
  73 
  74         // Parsing this document should result in an error
  75         try {
  76                 if (!testMaxOccurs("IssueTracker30_occurs-optimize-error.xml", "IssueTracker30_occurs-optimize.xsd"))
  77                         Assert.fail("Expected validation error not reported");
  78         } catch (SAXException ex) {
  79             Assert.fail(ex.getMessage(), ex);
  80         }
  81     }
  82 
  83     @Test
  84     public void testMaxOccursOKOptimization() throws Exception {
  85 
  86         // Parsing this document should *not* result in an error
  87         try {
  88                 if (testMaxOccurs("IssueTracker30_occurs-optimize-ok.xml", "IssueTracker30_occurs-optimize.xsd"))
  89                         Assert.fail("Unexpected validation error reported");
  90         } catch (SAXException ex) {
  91             Assert.fail(ex.getMessage(), ex);
  92         }
  93     }
  94 
  95 
  96     private boolean testMaxOccurs(String xmlFileName, String xsdFileName) throws Exception {
  97         File xmlFile = new File(getClass().getResource(xmlFileName).getFile());
  98 
  99         SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 100         Schema schema = factory.newSchema(new File(getClass().getResource(xsdFileName).getFile()));
 101 
 102         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 103         dbf.setNamespaceAware(true);
 104         dbf.setSchema(schema);
 105 
 106         DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
 107         documentBuilder.setErrorHandler(new ErrorHandler() {
 108             public void error(SAXParseException e) throws SAXException {
 109                 System.out.println("Error: " + e.getMessage());
 110                 errorFound = true;
 111             }
 112 
 113             public void fatalError(SAXParseException e) throws SAXException {
 114                 System.out.println("Fatal error: " + e.getMessage());
 115                 throw e;
 116             }
 117 
 118             public void warning(SAXParseException e) throws SAXException {
 119                 System.out.println("Warning: " + e.getMessage());
 120             }
 121         });
 122 
 123         errorFound = false;
 124         documentBuilder.parse(xmlFile);
 125         return errorFound;
 126     }
 127 
 128 }