/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 tests;
import org.apache.ws.commons.schema.*;
import org.junit.Assert;
import org.junit.Test;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.List;
public class ConstraintsTest extends Assert {
/**
* This method will test the unique, key, and keyref constaints.
*
* @throws Exception Any exception encountered
*/
@Test
public void testConstraints() throws Exception {
/*
* <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
* xmlns:tns="http://soapinterop.org/types" targetNamespace="http://soapinterop.org/types"
* elementFormDefault="qualified"> <element name="constraintTest"> <complexType> <sequence> <element
* name="manufacturers" type="tns:ManufacturerType"/> <element name="products"
* type="tns:ProductType"/> </sequence> </complexType> <unique name="uniqueTest"> <selector
* xpath="tns:manufacturers/tns:location"/> <field xpath="@district"/> </unique> <key name="keyTest">
* <selector xpath="tns:products/tns:productName"/> <field xpath="@productId"/> </key> <keyref
* name="keyRefTest" refer="tns:keyTest"> <selector
* xpath="tns:manufacturers/tns:location/tns:productName"/> <field xpath="@productId"/> </keyref>
* </element> <complexType name="ManufacturerType"> <sequence> <element name="location"
* maxOccurs="unbounded"> <complexType> <sequence> <element name="productName" maxOccurs="unbounded"/>
* <complexType> <complexContent> <extension base="string"> <attribute name="productId"
* type="integer"/> <attribute name="units" type="integer"/> </extension> </complexContent>
* </complexType> </element> </sequence> <attribute name="district" type="integer"/> </complexType>
* </element> </sequence> </complexType> <complexType name="ProductType"> <sequence> <element
* name="productName" maxOccurs="unbounded"> <complexType> <simpleContent> <extension base="string">
* <attribute name="productId" type="integer"/> </extension> </simpleContent> </complexType>
* </element> </sequence> </complexType> </schema>
*/
QName elementQName = new QName("http://soapinterop.org/types", "constraintTest");
InputStream is = new FileInputStream(Resources.asURI("constraints.xsd"));
XmlSchemaCollection schemaCol = new XmlSchemaCollection();
XmlSchema schema = schemaCol.read(new StreamSource(is));
XmlSchemaElement elem = schemaCol.getElementByQName(elementQName);
assertNotNull(elem);
assertEquals("constraintTest", elem.getName());
assertEquals(new QName("http://soapinterop.org/types", "constraintTest"), elem.getQName());
List<XmlSchemaIdentityConstraint> c = elem.getConstraints();
assertEquals(6, c.size());
{
assertTrue(c.get(0) instanceof XmlSchemaKey);
XmlSchemaKey key = (XmlSchemaKey) c.get(0);
assertEquals("keyTest", key.getName());
XmlSchemaXPath selectorXpath = key.getSelector();
assertEquals("tns:products/tns:productName", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = key.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@productId", fieldXpath.getXPath());
}
{
assertTrue(c.get(1) instanceof XmlSchemaKey);
XmlSchemaKey key = (XmlSchemaKey) c.get(1);
assertEquals("keyTest2", key.getName());
XmlSchemaXPath selectorXpath = key.getSelector();
assertEquals("tns:products/tns:productName", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = key.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@productId", fieldXpath.getXPath());
}
{
assertTrue(c.get(2) instanceof XmlSchemaKeyref);
XmlSchemaKeyref keyref = (XmlSchemaKeyref) c.get(2);
assertEquals("keyRefTest", keyref.getName());
assertEquals(new QName("http://soapinterop.org/types", "keyTest"), keyref.getRefer());
XmlSchemaXPath selectorXpath = keyref.getSelector();
assertEquals("tns:manufacturers/tns:location/tns:productName", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = keyref.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@productId", fieldXpath.getXPath());
}
{
assertTrue(c.get(3) instanceof XmlSchemaKeyref);
XmlSchemaKeyref keyref = (XmlSchemaKeyref) c.get(3);
assertEquals("keyRefTest2", keyref.getName());
assertEquals(new QName("http://soapinterop.org/types", "keyTest2"), keyref.getRefer());
XmlSchemaXPath selectorXpath = keyref.getSelector();
assertEquals("tns:manufacturers/tns:location/tns:productName", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = keyref.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@productId", fieldXpath.getXPath());
}
{
assertTrue(c.get(4) instanceof XmlSchemaUnique);
XmlSchemaUnique unique = (XmlSchemaUnique) c.get(4);
assertNotNull(unique);
assertEquals("uniqueTest", unique.getName());
XmlSchemaXPath selectorXpath = unique.getSelector();
assertEquals("tns:manufacturers/tns:location", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = unique.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@district", fieldXpath.getXPath());
}
{
assertTrue(c.get(5) instanceof XmlSchemaUnique);
XmlSchemaUnique unique = (XmlSchemaUnique) c.get(5);
assertNotNull(unique);
assertEquals("uniqueTest2", unique.getName());
XmlSchemaXPath selectorXpath = unique.getSelector();
assertEquals("tns:products/tns:productName", selectorXpath.getXPath());
List<XmlSchemaXPath> fields = unique.getFields();
assertEquals(1, fields.size());
XmlSchemaXPath fieldXpath = null;
for (int j = 0; j < fields.size(); j++) {
fieldXpath = fields.get(j);
}
assertNotNull(fieldXpath);
assertEquals("@productId", fieldXpath.getXPath());
}
StringWriter writer = new StringWriter();
schema.write(writer);
String str = writer.toString();
assertTrue(str.contains("name=\"uniqueTest\""));
assertTrue(str.contains("name=\"uniqueTest2\""));
assertTrue(str.contains("name=\"keyTest\""));
assertTrue(str.contains("name=\"keyTest2\""));
assertTrue(str.contains("name=\"keyRefTest\""));
assertTrue(str.contains("name=\"keyRefTest2\""));
}
}