/** * * 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 org.apache.tuscany.sdo.test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import junit.framework.TestCase; import org.apache.tuscany.sdo.helper.TypeHelperImpl; import org.apache.tuscany.sdo.util.SDOUtil; import commonj.sdo.DataObject; import commonj.sdo.Property; import commonj.sdo.Sequence; import commonj.sdo.Type; import commonj.sdo.helper.DataFactory; import commonj.sdo.helper.TypeHelper; import commonj.sdo.helper.XMLDocument; import commonj.sdo.helper.XMLHelper; import commonj.sdo.helper.XSDHelper; public class DefineTypeTestCase extends TestCase { private static final String CUSTOMER1_XML = "/customer1.xml"; private static final String CUSTOMER2_XML = "/customer2.xml"; private static final String OPEN_XML = "/open2.xml"; private static final String MIXED_XML = "/mixed2.xml"; private static final String MIXEDOPEN_XML = "/mixedopen.xml"; public void testDefineTypeRoundTrip() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type intType = types.getType("commonj.sdo", "Int"); Type stringType = types.getType("commonj.sdo", "String"); // create a new Type for Customers DataObject customerType = factory.create("commonj.sdo", "Type"); customerType.set("uri", "http://example.com/customer"); customerType.set("name", "Customer"); // create a customer number property DataObject custNumProperty = customerType.createDataObject("property"); custNumProperty.set("name", "custNum"); custNumProperty.set("type", intType); // create a first name property DataObject firstNameProperty = customerType.createDataObject("property"); firstNameProperty.set("name", "firstName"); firstNameProperty.set("type", stringType); // create a last name property DataObject lastNameProperty = customerType.createDataObject("property"); lastNameProperty.set("name", "lastName"); lastNameProperty.set("type", stringType); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save(customerType, "commonj.sdo", "type", baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); XMLDocument xdoc = xmlHelper.load(bais); customerType = xdoc.getRootObject(); // now define the Customer type so that customers can be made types.define(customerType); DataObject customer1 = factory.create("http://example.com/customer", "Customer"); customer1.setInt("custNum", 1); customer1.set("firstName", "John"); customer1.set("lastName", "Adams"); DataObject customer2 = factory.create("http://example.com/customer", "Customer"); customer2.setInt("custNum", 2); customer2.set("firstName", "Jeremy"); customer2.set("lastName", "Pavick"); assertNotNull(customer1); Type type = customer1.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); assertNotNull(customer2); type = customer2.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); baos = new ByteArrayOutputStream(); xmlHelper.save( customer1, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER1_XML))); baos = new ByteArrayOutputStream(); xmlHelper.save( customer2, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER2_XML))); } public void testDefineType() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type intType = types.getType("commonj.sdo", "Int"); Type stringType = types.getType("commonj.sdo", "String"); // create a new Type for Customers DataObject customerType = factory.create("commonj.sdo", "Type"); customerType.set("uri", "http://example.com/customer"); customerType.set("name", "Customer"); // create a customer number property DataObject custNumProperty = customerType.createDataObject("property"); custNumProperty.set("name", "custNum"); custNumProperty.set("type", intType); // create a first name property DataObject firstNameProperty = customerType.createDataObject("property"); firstNameProperty.set("name", "firstName"); firstNameProperty.set("type", stringType); // create a last name property DataObject lastNameProperty = customerType.createDataObject("property"); lastNameProperty.set("name", "lastName"); lastNameProperty.set("type", stringType); // now define the Customer type so that customers can be made types.define(customerType); DataObject customer1 = factory.create("http://example.com/customer", "Customer"); customer1.setInt("custNum", 1); customer1.set("firstName", "John"); customer1.set("lastName", "Adams"); DataObject customer2 = factory.create("http://example.com/customer", "Customer"); customer2.setInt("custNum", 2); customer2.set("firstName", "Jeremy"); customer2.set("lastName", "Pavick"); assertNotNull(customer1); Type type = customer1.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); assertNotNull(customer2); type = customer2.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save( customer1, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER1_XML))); baos = new ByteArrayOutputStream(); xmlHelper.save( customer2, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER2_XML))); } public void testDefineDataType() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XSDHelper xsdHelper = SDOUtil.createXSDHelper(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Property javaClassProperty = xsdHelper.getGlobalProperty("commonj.sdo/java", "javaClass", false); // create a data types DataObject intType = factory.create("commonj.sdo", "Type"); intType.set("uri", "http://example.com/customer"); intType.set("name", "MyIntType"); intType.setBoolean("dataType", true); intType.set(javaClassProperty, "int"); DataObject stringType = factory.create("commonj.sdo", "Type"); stringType.set("uri", "http://example.com/customer"); stringType.set("name", "MyStringType"); stringType.setBoolean("dataType", true); stringType.set(javaClassProperty, "java.lang.String"); // create a new Type for Customers DataObject customerType = factory.create("commonj.sdo", "Type"); customerType.set("uri", "http://example.com/customer"); customerType.set("name", "Customer"); // create a customer number property DataObject custNumProperty = customerType.createDataObject("property"); custNumProperty.set("name", "custNum"); custNumProperty.set("type", intType); // create a first name property DataObject firstNameProperty = customerType.createDataObject("property"); firstNameProperty.set("name", "firstName"); firstNameProperty.set("type", stringType); // create a last name property DataObject lastNameProperty = customerType.createDataObject("property"); lastNameProperty.set("name", "lastName"); lastNameProperty.set("type", stringType); // now define the Customer type so that customers can be made types.define(customerType); DataObject customer1 = factory.create("http://example.com/customer", "Customer"); customer1.setInt("custNum", 1); customer1.set("firstName", "John"); customer1.set("lastName", "Adams"); DataObject customer2 = factory.create("http://example.com/customer", "Customer"); customer2.setInt("custNum", 2); customer2.set("firstName", "Jeremy"); customer2.set("lastName", "Pavick"); assertNotNull(customer1); Type type = customer1.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); type = type.getProperty("custNum").getType(); assertEquals(type.getURI(), "http://example.com/customer"); assertEquals(type.getName(), "MyIntType"); assertTrue(type.isDataType()); assertNotNull(customer2); type = customer2.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save( customer1, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER1_XML))); baos = new ByteArrayOutputStream(); xmlHelper.save( customer2, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER2_XML))); } public void testFastDefineType() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type intType = types.getType("commonj.sdo", "Int"); Type stringType = types.getType("commonj.sdo", "String"); // create a new Type for Customers Type customerType = SDOUtil.createType(types, "http://example.com/customer", "Customer", false); // create a customer number property SDOUtil.createProperty(customerType, "custNum", intType); // create a first name property SDOUtil.createProperty(customerType, "firstName", stringType); // create a last name property SDOUtil.createProperty(customerType, "lastName", stringType); DataObject customer1 = factory.create("http://example.com/customer", "Customer"); customer1.setInt("custNum", 1); customer1.set("firstName", "John"); customer1.set("lastName", "Adams"); DataObject customer2 = factory.create("http://example.com/customer", "Customer"); customer2.setInt("custNum", 2); customer2.set("firstName", "Jeremy"); customer2.set("lastName", "Pavick"); assertNotNull(customer1); Type type = customer1.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); assertNotNull(customer2); type = customer2.getType(); assertNotNull(type.getProperty("custNum")); assertNotNull(type.getProperty("firstName")); assertNotNull(type.getProperty("lastName")); assertEquals(type.getProperty("custNum").getType(), intType); assertEquals(type.getProperty("firstName").getType(), stringType); assertEquals(type.getProperty("lastName").getType(), stringType); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save( customer1, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER1_XML))); baos = new ByteArrayOutputStream(); xmlHelper.save( customer2, "http://example.com/customer", "Customer", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(CUSTOMER2_XML))); } public void testDefineSequencedType() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type stringType = types.getType("commonj.sdo", "String"); Type decimalType = types.getType("commonj.sdo", "Decimal"); // Define a new mixed type - MixedQuote DataObject mixedQuoteType = factory.create("commonj.sdo", "Type"); mixedQuoteType.set("uri", "http://www.example.com/mixed"); mixedQuoteType.set("name", "MixedQuote"); mixedQuoteType.set("sequenced", Boolean.TRUE); DataObject symbolProperty = mixedQuoteType.createDataObject("property"); symbolProperty.set("name", "symbol"); symbolProperty.set("type", stringType); DataObject companyNameProperty = mixedQuoteType.createDataObject("property"); companyNameProperty.set("name", "companyName"); companyNameProperty.set("type", stringType); DataObject priceProperty = mixedQuoteType.createDataObject("property"); priceProperty.set("name", "price"); priceProperty.set("type", decimalType); DataObject quotesProperty = mixedQuoteType.createDataObject("property"); quotesProperty.set("name", "quotes"); quotesProperty.set("type", mixedQuoteType); quotesProperty.set("many", Boolean.TRUE); quotesProperty.set("containment", Boolean.TRUE); types.define(mixedQuoteType); DataObject quote = factory.create("http://www.example.com/mixed", "MixedQuote"); assertTrue(quote.getType().isSequenced()); Sequence sequence = quote.getSequence(); sequence.add("\n "); quote.setString("symbol", "fbnt"); sequence.add("\n "); quote.setString("companyName", "FlyByNightTechnology"); sequence.add("\n some text\n "); DataObject child = quote.createDataObject("quotes"); child.setBigDecimal("price", new BigDecimal("2000.0")); sequence.add("\n more text\n "); // quote.setBigDecimal("price", new BigDecimal("1000.0")); sequence.add("price", new BigDecimal("1000.0")); sequence.add("\n"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save(quote, "http://www.example.com/mixed", "mixedStockQuote", baos); assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(MIXED_XML))); } public void testDefineSequencedOpenType() throws Exception { TypeHelper types = SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type stringType = types.getType("commonj.sdo", "String"); Type decimalType = types.getType("commonj.sdo", "Decimal"); // Define a new mixed type - MixedQuote DataObject mixedQuoteType = factory.create("commonj.sdo", "Type"); mixedQuoteType.set("uri", "http://www.example.com/mixed"); mixedQuoteType.set("name", "MixedOpenQuote"); mixedQuoteType.set("sequenced", Boolean.TRUE); mixedQuoteType.set("open", Boolean.TRUE); // DataObject symbolProperty = mixedQuoteType.createDataObject("property"); // symbolProperty.set("name", "symbol"); // symbolProperty.set("type", stringType); DataObject companyNameProperty = mixedQuoteType.createDataObject("property"); companyNameProperty.set("name", "companyName"); companyNameProperty.set("type", stringType); DataObject priceProperty = mixedQuoteType.createDataObject("property"); priceProperty.set("name", "price"); priceProperty.set("type", decimalType); DataObject quotesProperty = mixedQuoteType.createDataObject("property"); quotesProperty.set("name", "quotes"); quotesProperty.set("type", mixedQuoteType); quotesProperty.set("many", Boolean.TRUE); quotesProperty.set("containment", Boolean.TRUE); types.define(mixedQuoteType); // Define a global type DataObject globalType = factory.create("commonj.sdo", "Type"); globalType.set("uri", "http://www.example.com/open"); // Don't set the type's name - null is used for types containing global properties. DataObject symbolProperty = globalType.createDataObject("property"); symbolProperty.set("name", "symbol"); symbolProperty.set("type", stringType); symbolProperty.set("containment", Boolean.TRUE); types.define(globalType); DataObject quote = factory.create("http://www.example.com/mixed", "MixedOpenQuote"); assertTrue(quote.getType().isSequenced()); Sequence sequence = quote.getSequence(); sequence.add("\n "); Type definedGlobalType = types.getType("http://www.example.com/open", null); Property definedSymbolProperty = definedGlobalType.getProperty("symbol"); quote.setString(definedSymbolProperty, "fbnt"); sequence.add("\n "); quote.setString("companyName", "FlyByNightTechnology"); sequence.add("\n some text\n "); DataObject child = quote.createDataObject("quotes"); child.setBigDecimal("price", new BigDecimal("2000.0")); sequence.add("\n more text\n "); // quote.setBigDecimal("price", new BigDecimal("1000.0")); sequence.add("price", new BigDecimal("1000.0")); sequence.add("\n"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save(quote, "http://www.example.com/mixed", "mixedOpenStockQuote", baos); assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(MIXEDOPEN_XML))); } public void testDefineOpenType() throws Exception { TypeHelperImpl types = (TypeHelperImpl)SDOUtil.createTypeHelper(); DataFactory factory = SDOUtil.createDataFactory(types); XMLHelper xmlHelper = SDOUtil.createXMLHelper(types); Type stringType = types.getType("commonj.sdo", "String"); Type decimalType = types.getType("commonj.sdo", "Decimal"); // Define a new open type - OpenQuote DataObject openQuoteType = factory.create("commonj.sdo", "Type"); openQuoteType.set("uri", "http://www.example.com/open"); openQuoteType.set("name", "OpenQuote"); openQuoteType.set("open", Boolean.TRUE); openQuoteType.setBoolean("open", true); types.define(openQuoteType); // Define new type - CompanyType DataObject companyType = factory.create("commonj.sdo", "Type"); companyType.set("uri", "http://www.example.com/open"); companyType.set("name", "CompanyType"); // Create CompanyType property - "name" DataObject nameProperty = companyType.createDataObject("property"); nameProperty.set("name", "name"); nameProperty.set("type", stringType); nameProperty.set("containment", Boolean.TRUE); types.define(companyType); // Define open content property - company DataObject symbolProperty = factory.create("commonj.sdo", "Property"); symbolProperty.set("name", "symbol"); symbolProperty.set("type", stringType); types.defineOpenContentProperty("http://www.example.com/open", symbolProperty); // Define open content property - company DataObject companyProperty = factory.create("commonj.sdo", "Property"); companyProperty.set("name", "company"); companyProperty.set("type", companyType); companyProperty.set("containment", Boolean.TRUE); types.defineOpenContentProperty("http://www.example.com/open", companyProperty); // Define open content property - price DataObject priceProperty = factory.create("commonj.sdo", "Property"); priceProperty.set("name", "price"); priceProperty.set("type", decimalType); types.defineOpenContentProperty("http://www.example.com/open", priceProperty); // Create DataObject instances DataObject openQuote = factory.create("http://www.example.com/open", "OpenQuote"); assertTrue(openQuote.getType().isOpen()); Property definedSymbolProperty = types.getOpenContentProperty("http://www.example.com/open", "symbol"); openQuote.set(definedSymbolProperty, "s1"); Property definedCompanyProperty = types.getOpenContentProperty("http://www.example.com/open", "company"); DataObject company = openQuote.createDataObject(definedCompanyProperty); company.setString("name", "FlyByNightTechnology"); Property definedPriceProperty = types.getOpenContentProperty("http://www.example.com/open", "price"); openQuote.setBigDecimal(definedPriceProperty, new BigDecimal("1000.0")); assertEquals(definedPriceProperty.getType(), decimalType); ByteArrayOutputStream baos = new ByteArrayOutputStream(); xmlHelper.save( openQuote, "http://www.example.com/open", "openStockQuote", baos); assertTrue( TestUtil.equalXmlFiles( new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(OPEN_XML))); } }