package at.ac.tuwien.infosys.jaxb; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.w3c.dom.Document; import com.pellcorp.jaxb.test.AbstractTestCase; public class XmlSchemaEnhancerTest extends AbstractTestCase { public static final String DOC_SCHEMALEVEL_1 = "schema-level doc 123"; public static final String DOC_SCHEMALEVEL_2 = "schema-level doc 234"; public static final String APPINFO_STRING = "schema-level appinfo 1234"; public static final String APPINFO_ELEMENT = "<myInfo xmlns=\"ns1\" xmlns:tns=\"ns2\" attr1=\"foo\">" + APPINFO_STRING + "<tns:foo>" + APPINFO_STRING + "</tns:foo>" + "</myInfo>"; public static final String ATTR_NAME_1 = "attr1"; public static final String ATTR_NAMESPACE_1 = "http://example.com/attr1"; public static final String ATTR_NAMESPACE_2 = "http://example.com/attr2"; public static final String ATTR_VALUE_1 = "value1"; public static final String ATTR_NAME_2 = "attr2"; public static final String ATTR_VALUE_2 = "value2"; @BeforeClass public static void startServers() throws Exception { /* enable XSD 1.1 features */ XmlSchemaEnhancer.XSD_11_ENABLED.set(true); createServer(PersonService.class, new PersonServiceImpl()); createServer(PersonServiceNoNS.class, new PersonServiceNoNSImpl()); } @AfterClass public static void cleanup() throws Exception { cleanupServers(); } @Test public void testGenderEnumDocs() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:simpleType[@name='gender']/xs:annotation/xs:documentation", doc); assertEquals("Gender Type", value); value = engine.evaluate("//xs:simpleType[@name='gender']/xs:restriction/xs:enumeration[@value='F']/xs:annotation/xs:documentation", doc); assertEquals("Female", value); value = engine.evaluate("//xs:simpleType[@name='gender']/xs:restriction/xs:enumeration[@value='M']/xs:annotation/xs:documentation", doc); assertEquals("Male", value); value = engine.evaluate("//xs:simpleType[@name='gender']/xs:restriction/xs:enumeration[@value='O']/xs:annotation/xs:documentation", doc); assertEquals("Other", value); } @Test public void testAgeDerivedTypeFacets() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:simpleType[@name='Age']/xs:restriction/xs:minInclusive/@value", doc); assertEqualsInDoc("5", value, doc); value = engine.evaluate("//xs:simpleType[@name='Age']/xs:restriction/xs:maxInclusive/@value", doc); assertEqualsInDoc("120", value, doc); } @Test public void testComplexTypeBuddyDocs() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='Buddy']/xs:annotation/xs:documentation", doc); assertEquals("A Buddy.", value); value = engine.evaluate("//xs:complexType[@name='Buddy']/xs:sequence/xs:element/xs:annotation/xs:documentation", doc); assertEquals("Name of buddy.", value); } @Test public void testComplexTypeTestRequest() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:annotation[@id='id123']/xs:appinfo[@source='src 1']/*[local-name()='foo']", doc); assertEquals("appinfo 1", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:annotation[@id='id123']/xs:documentation[@source='src 1']", doc); assertEquals("doc 1", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:annotation[@id='id123']/xs:documentation[2]", doc); assertEquals("doc 2", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:annotation[@id='id123']/xs:documentation[3]", doc); assertEquals("doc 3", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:sequence/xs:element[@name='bar']/xs:annotation/xs:documentation/b", doc); assertEquals("string bar", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:attribute[@name='foo']/xs:annotation/xs:appinfo[@source='src 1']/*[local-name()='bar']", doc); assertEquals("appinfo 1", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:attribute[@name='foo']/xs:annotation/xs:documentation/b", doc); assertEquals("string foo", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:attribute[@name='foo1']/xs:annotation/xs:documentation[1]", doc); assertEquals("this is the first line", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:attribute[@name='foo1']/xs:annotation/xs:documentation[2]", doc); assertEquals("this is the second line", value); } @Test public void testFacetOnXmlValue() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:simpleType[@name='TimeZoneOffset']/xs:restriction/@base", doc); assertTrue(value != null && value.endsWith("integer")); } @Test public void testPersonNameFacets() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:element[@name='firstName']//xs:restriction/xs:pattern/@value", doc); assertEquals("[A-Z]+", value); } @Test public void testDocumentationOnEnum() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:simpleType[@name='Country']//" + "xs:enumeration[@value='AUS']/xs:annotation/xs:documentation", doc); assertEquals("Australia", value); value = engine.evaluate("//xs:simpleType[@name='Country']//" + "xs:enumeration[@value='AUT']/xs:annotation/xs:documentation", doc); assertEquals("Austria", value); value = engine.evaluate("//xs:simpleType[@name='Country']/" + "xs:annotation/xs:documentation", doc); assertEquals("The 3-letter ISO 3166-1 codes for countries", value); } @Test public void testAdditionalFacetsOnEnum() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:simpleType[@name='gender']/" + "xs:restriction/xs:maxLength/@value", doc); assertEquals("20", value); } @Test public void testFieldAnnotationMinMaxOccurs() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String minOccurs = engine.evaluate("//xs:complexType[@name='Person']/xs:sequence/xs:element[@name='lastName']/@minOccurs", doc); String maxOccurs = engine.evaluate("//xs:complexType[@name='Person']/xs:sequence/xs:element[@name='lastName']/@maxOccurs", doc); assertEquals("1", minOccurs); assertEquals("3", maxOccurs); minOccurs = engine.evaluate("//xs:complexType[@name='Person']/xs:sequence/xs:element[@name='firstName']/@minOccurs", doc); maxOccurs = engine.evaluate("//xs:complexType[@name='Person']/xs:sequence/xs:element[@name='firstName']/@maxOccurs", doc); assertEquals("1", minOccurs); assertEquals("2", maxOccurs); } @Test //@Ignore public void testMemberAnnotationMinMaxOccurs() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String minOccurs = engine.evaluate("//xs:complexType[@name='Applicant']/xs:sequence/xs:element[@name='lastName']/@minOccurs", doc); String maxOccurs = engine.evaluate("//xs:complexType[@name='Applicant']/xs:sequence/xs:element[@name='lastName']/@maxOccurs", doc); assertEquals("1", minOccurs); assertEquals("3", maxOccurs); minOccurs = engine.evaluate("//xs:complexType[@name='Applicant']/xs:sequence/xs:element[@name='firstName']/@minOccurs", doc); maxOccurs = engine.evaluate("//xs:complexType[@name='Applicant']/xs:sequence/xs:element[@name='firstName']/@maxOccurs", doc); assertEquals("1", minOccurs); assertEquals("2", maxOccurs); } @Test public void testAppinfoWithXMLContent() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); //System.out.println(getWsdlSchemaAsString(PersonServiceNoNS.class)); addNamespace("ns1", "ns1"); addNamespace("ns2", "ns2"); String value = engine.evaluate("//xs:complexType[@name='Person']/xs:annotation/xs:appinfo[1]/ns1:myInfo/text()", doc); assertEquals(APPINFO_STRING, value); value = engine.evaluate("//xs:complexType[@name='Person']/xs:annotation/xs:appinfo[1]/ns1:myInfo/ns2:foo/text()", doc); assertEquals(APPINFO_STRING, value); } @Test public void testAnnotationAttributes() throws Exception { Document doc = getWsdlSchemaAsDocument(PersonService.class); addNamespace("ns1", ATTR_NAMESPACE_1); addNamespace("ns2", ATTR_NAMESPACE_2); String value = engine.evaluate("//xs:complexType[@name='Person']/xs:annotation/@ns1:" + ATTR_NAME_1, doc); assertEquals(ATTR_VALUE_1, value); value = engine.evaluate("//xs:complexType[@name='Person']/xs:annotation/@ns2:" + ATTR_NAME_2, doc); assertEquals(ATTR_VALUE_2, value); } @Test public void testPackageLevelXSDAnnotations() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonServiceNoNS.class)); Document doc = getWsdlSchemaAsDocument(PersonServiceNoNS.class); String value = engine.evaluate("/xs:schema/xs:annotation/xs:appinfo[1]", doc); assertEquals(APPINFO_STRING, value); value = engine.evaluate("/xs:schema/xs:annotation/xs:documentation[1]", doc); assertEquals(DOC_SCHEMALEVEL_1, value); value = engine.evaluate("/xs:schema/xs:annotation/xs:documentation[2]", doc); assertEquals(DOC_SCHEMALEVEL_2, value); } @Test public void testXSDAnnotationOnChoice() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:choice/xs:element[@name='country1']//xs:documentation/text()", doc); assertEquals("Country or Buddy INSIDE", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:choice[xs:element[@name='country1']]/xs:annotation/xs:documentation/text()", doc); assertEquals("", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:choice/xs:element[@name='buddy2']//xs:documentation/text()", doc); assertEquals("", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:choice/xs:element[@name='country2']//xs:documentation/text()", doc); assertEquals("", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:choice[xs:element[@name='country2']]/xs:annotation/xs:documentation/text()", doc); assertEquals("Country or Buddy OUTSIDE", value); } @Test public void testXSDAnnotationOnWrapper() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:element[@name='buddies']/xs:annotation/xs:documentation/text()", doc); assertEquals("List of buddies", value); value = engine.evaluate("//xs:complexType[@name='TestRequest']//xs:element[@name='buddies']//xs:element[@name='buddy']//xs:documentation/text()", doc); assertEquals("", value); } @Test public void testXSDAssertOnWrapper() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='TestRequest']/xs:assert/@test", doc); assertTrue(value != null && !value.trim().equals("")); } @Test public void testXSDTypeOnAttributeWithAnnotation() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='simpleDuration']/" + "xs:attribute[@name='from']/@type", doc); assertTrue(value != null && !value.trim().equals("")); } @Test public void testXSDPatternOnIDREF() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); //System.out.println(XMLUtils.toString(engine.getMatchingNodes("//xs:complexType[@name='loan']", doc).item(0))); //System.out.println(XMLUtils.toString(engine.getMatchingNodes("//xs:complexType[@name='book']", doc).item(0))); String value1 = engine.evaluate("//xs:complexType[@name='book']/" + "xs:attribute[@name='isbn']//xs:restriction/@base", doc); assertTrue(value1 != null && value1.trim().endsWith(":ID")); String value = engine.evaluate("//xs:complexType[@name='loan']/" + "xs:attribute[@name='book']//xs:restriction/@base", doc); assertTrue(value != null && value.trim().endsWith(":IDREF")); String value2 = engine.evaluate("//xs:complexType[@name='loanWithISBN']/" + "xs:attribute[@name='isbn']//xs:restriction/@base", doc); assertTrue(value2 != null && value2.trim().endsWith(":IDREF")); } @Test public void testFacetWithJaxbAdapterAndExplicitType() throws Exception { //System.out.println(getWsdlSchemaAsString(PersonService.class)); Document doc = getWsdlSchemaAsDocument(PersonService.class); String value = engine.evaluate("//xs:complexType[@name='TestRequest']//" + "xs:element[@name='salary']//xs:restriction/@base", doc); assertTrue(value.endsWith(":decimal")); value = engine.evaluate("//xs:complexType[@name='TestRequest']//" + "xs:element[@name='salary']//xs:restriction//xs:maxInclusive/@value", doc); assertEquals(value, "9999.2"); } }