You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by fr...@apache.org on 2006/09/12 00:05:47 UTC
svn commit: r442371 - in /incubator/tuscany/java/sdo/impl/src:
main/java/org/apache/tuscany/sdo/helper/
main/java/org/apache/tuscany/sdo/util/
test/java/org/apache/tuscany/sdo/test/ test/resources/
Author: frankb
Date: Mon Sep 11 15:05:46 2006
New Revision: 442371
URL: http://svn.apache.org/viewvc?view=rev&rev=442371
Log:
Early implementation of new SDO 2.1 TypeHelper methods: defineOpenContentProperty and getOpenContentProperty
Added:
incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineOpenContentPropertyTestCase.java
incubator/tuscany/java/sdo/impl/src/test/resources/openContentProperty.xml
Modified:
incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java
incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java
incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java
Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java?view=diff&rev=442371&r1=442370&r2=442371
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java Mon Sep 11 15:05:46 2006
@@ -112,6 +112,11 @@
boolean isDataType = modeledType.isDataType();
Type definedType = SDOUtil.createType(this, modeledType.getUri(), modeledType.getName(), isDataType);
+ if (definedType == null)
+ {
+ // If type already defined, return the existing Type.
+ return getType(modeledType.getUri(), modeledType.getName());
+ }
SDOUtil.setJavaClassName(definedType, modeledType.getInstanceClassName());
@@ -211,5 +216,68 @@
return definedContainingType.getProperty(propertyName);
}
}
+
+ public static final String TUSCANY_NO_URI="http://tuscany-no-uri";
+
+ public Property defineOpenContentProperty(String uri, DataObject property)
+ {
+ // validate property and get type
+ if (!(property instanceof org.apache.tuscany.sdo.model.impl.PropertyImpl))
+ throw new IllegalArgumentException();
+ org.apache.tuscany.sdo.model.Property modeledProperty = (org.apache.tuscany.sdo.model.Property)property;
+ Type propertyType = getDefinedType(modeledProperty.getType_());
+
+ if (uri == null) uri = TUSCANY_NO_URI;
+ // get/create document root
+ EPackage ePackage = extendedMetaData.getPackage(uri);
+ Type documentRoot =
+ ePackage != null ? (Type)extendedMetaData.getType(extendedMetaData.getPackage(uri), "") : null;
+ if (documentRoot == null)
+ {
+ documentRoot = SDOUtil.createType(this, uri, null, false);
+ }
+
+ // Determine if property already exists
+ Property newProperty = documentRoot.getProperty(modeledProperty.getName());
+ if (newProperty == null)
+ {
+ //FB TBD ... is this code really supposed to be the same as in define()? If so, factor it out and reuse
+
+ // Create the new property 'under' the document root.....
+ newProperty = SDOUtil.createProperty(documentRoot, modeledProperty.getName(), propertyType);
+
+ // Propagate the modeled property's attributes
+ SDOUtil.setMany(newProperty, modeledProperty.isMany());
+ SDOUtil.setDefault(newProperty, modeledProperty.getDefault_());
+ SDOUtil.setReadOnly(newProperty, modeledProperty.isReadOnly());
+ for (Iterator iter = modeledProperty.getAliasName().iterator(); iter.hasNext();)
+ {
+ String aliasName = (String)iter.next();
+ SDOUtil.addAliasName(newProperty, aliasName);
+ }
+ if (!propertyType.isDataType())
+ {
+ SDOUtil.setContainment(newProperty, modeledProperty.isContainment());
+ if (modeledProperty.getOpposite_() != null)
+ {
+ SDOUtil.setOpposite(newProperty, getDefinedProperty(modeledProperty.getOpposite_()));
+ }
+ }
+ }
+ else
+ {
+ // if property already exists, validate the expected type
+ if (!newProperty.getType().equals(propertyType))
+ throw new IllegalArgumentException();
+ }
+
+ return newProperty;
+ }
+
+ public Property getOpenContentProperty(String uri, String propertyName)
+ {
+ //FB TBD ... in the future we will allow elements or attributes - see SDOUtil.createProperty()
+ return (Property)extendedMetaData.getElement(uri, propertyName);
+ }
}
Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java?view=diff&rev=442371&r1=442370&r2=442371
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/util/SDOUtil.java Mon Sep 11 15:05:46 2006
@@ -363,8 +363,11 @@
}
EClassifier eClassifier = ePackage.getEClassifier(name);
- if (eClassifier != null)
- throw new IllegalArgumentException(); // already defined
+ if (eClassifier != null) // already defined?
+ {
+ //throw new IllegalArgumentException();
+ return null;
+ }
if (name != null)
{
@@ -409,6 +412,8 @@
ExtendedMetaData.INSTANCE.setProcessingKind(eAttribute, ExtendedMetaData.LAX_PROCESSING);
ExtendedMetaData.INSTANCE.setWildcards(eAttribute, Collections.singletonList("##any"));
+ //FB TBD Add an "anyAttribute" EAttribute as well.
+
if (type.isSequenced()) {
eAttribute.setDerived(true);
eAttribute.setTransient(true);
@@ -465,16 +470,24 @@
public static Property createProperty(Type containingType, String name, Type propertyType)
{
- EStructuralFeature eStructuralFeature = propertyType.isDataType() ? (EStructuralFeature)SDOFactory.eINSTANCE.createAttribute() : (EStructuralFeature)SDOFactory.eINSTANCE.createReference();
+ EStructuralFeature eStructuralFeature =
+ propertyType.isDataType() ?
+ (EStructuralFeature)SDOFactory.eINSTANCE.createAttribute() :
+ (EStructuralFeature)SDOFactory.eINSTANCE.createReference();
+
eStructuralFeature.setName(name);
eStructuralFeature.setEType((EClassifier)propertyType);
((EClass)containingType).getEStructuralFeatures().add(eStructuralFeature);
//if (containingType.getName() == null)
- if ("".equals(ExtendedMetaData.INSTANCE.getName((EClass)containingType)))
+ if ("".equals(ExtendedMetaData.INSTANCE.getName((EClass)containingType))) // DocumentRoot containingType?
{
+ //FB TBD ... figure out how to decide whether to use ELEMENT_FEATURE or ATTRIBUTE_FEATURE
ExtendedMetaData.INSTANCE.setFeatureKind(eStructuralFeature, ExtendedMetaData.ELEMENT_FEATURE);
+
ExtendedMetaData.INSTANCE.setNamespace(eStructuralFeature, containingType.getURI());
+ //FB???eStructuralFeature.setUnique(false);
+ //FB???eStructuralFeature.setUpperBound(ETypedElement.UNSPECIFIED_MULTIPLICITY);
}
if (containingType.isSequenced()) {
Added: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineOpenContentPropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineOpenContentPropertyTestCase.java?view=auto&rev=442371
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineOpenContentPropertyTestCase.java (added)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineOpenContentPropertyTestCase.java Mon Sep 11 15:05:46 2006
@@ -0,0 +1,119 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.net.URL;
+
+import org.apache.tuscany.sdo.util.SDOUtil;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
+import junit.framework.TestCase;
+
+
+public class DefineOpenContentPropertyTestCase extends TestCase {
+ private final String TEST_MODEL = "/open.xsd";
+ private final String TEST_NAMESPACE = "http://www.example.com/open";
+ private final String TEST_DATA = "/openContentProperty.xml";
+
+ private TypeHelper typeHelper;
+ private XSDHelper xsdHelper;
+ private XMLHelper xmlHelper;
+ private DataFactory dataFactory;
+
+ public void testDefineOpenContentProperty() throws IOException {
+ Type quoteType = typeHelper.getType(TEST_NAMESPACE, "OpenQuote");
+ DataObject quote = dataFactory.create(quoteType);
+
+ quote.setString("symbol", "s1");
+
+ Property companyProperty = typeHelper.getOpenContentProperty(TEST_NAMESPACE, "company");
+ DataObject company = quote.createDataObject(companyProperty);
+ company.setString("name", "FlyByNightTechnology");
+
+ Property priceProperty = typeHelper.getOpenContentProperty(TEST_NAMESPACE, "price");
+ quote.getList(priceProperty).add(new BigDecimal("1000.0"));
+
+ // Define a new SDO open content property with simple type
+ DataObject p = dataFactory.create("commonj.sdo", "Property");
+ p.set("type", typeHelper.getType("commonj.sdo", "Decimal"));
+ p.set("name", "highPrice");
+ Property highPrice = typeHelper.defineOpenContentProperty(TEST_NAMESPACE, p);
+
+ quote.setBigDecimal(highPrice, new BigDecimal("1100.0"));
+
+ // Define a new SDO open content property with complex type
+ DataObject mutualFundQuotePropertyDef = dataFactory.create("commonj.sdo", "Property");
+ mutualFundQuotePropertyDef.set("type", quoteType);
+ mutualFundQuotePropertyDef.set("name", "mutualFundQuote");
+ mutualFundQuotePropertyDef.setBoolean("containment", true);
+ Property mutualFundQuoteProperty = typeHelper.defineOpenContentProperty(TEST_NAMESPACE, mutualFundQuotePropertyDef);
+
+ DataObject mutualFundQuote = quote.createDataObject(mutualFundQuoteProperty);
+ mutualFundQuote.setString("symbol", "mutual-1");
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ xmlHelper.save(quote, TEST_NAMESPACE, "openStockQuote", baos);
+
+ assertTrue(TestUtil.equalXmlFiles(new ByteArrayInputStream(baos.toByteArray()), getClass().getResource(TEST_DATA)));
+
+ // validate existing property condition
+ Property duplicateProp = typeHelper.defineOpenContentProperty(TEST_NAMESPACE, p);
+ assertTrue(highPrice.equals(duplicateProp));
+
+ // validate error condition, where new property exists with different type
+ boolean errorCondition = false;
+ try
+ {
+ p = dataFactory.create("commonj.sdo", "Property");
+ p.set("type", typeHelper.getType("commonj.sdo", "String"));
+ p.set("name", "highPrice");
+ highPrice = typeHelper.defineOpenContentProperty(TEST_NAMESPACE, p);
+ }
+ catch( IllegalArgumentException ex )
+ {
+ errorCondition = true;
+ }
+ assertTrue(errorCondition);
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ typeHelper = SDOUtil.createTypeHelper();
+ xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+ xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+ dataFactory = SDOUtil.createDataFactory(typeHelper);
+
+ // Populate the meta data for the test (Stock Quote) model
+ URL url = getClass().getResource(TEST_MODEL);
+ InputStream inputStream = url.openStream();
+ xsdHelper.define(inputStream, url.toString());
+ inputStream.close();
+ }
+}
Modified: incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java?view=diff&rev=442371&r1=442370&r2=442371
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java (original)
+++ incubator/tuscany/java/sdo/impl/src/test/java/org/apache/tuscany/sdo/test/DefineTypeTestCase.java Mon Sep 11 15:05:46 2006
@@ -558,7 +558,7 @@
openQuoteType.set("name", "OpenQuote");
openQuoteType.set("open", Boolean.TRUE);
openQuoteType.setBoolean("open", true);
-
+
types.define(openQuoteType);
// Define new type - CompanyType
@@ -574,46 +574,37 @@
types.define(companyType);
- // 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");
+ // Define open content property - company
+ DataObject symbolProperty = factory.create("commonj.sdo", "Property");
symbolProperty.set("name", "symbol");
symbolProperty.set("type", stringType);
- symbolProperty.set("containment", Boolean.TRUE);
-
- // Define a global property - company
- DataObject companyProperty = globalType.createDataObject("property");
+ 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 a global property - price
- DataObject priceProperty = globalType.createDataObject("property");
+ // Define open content property - price
+ DataObject priceProperty = factory.create("commonj.sdo", "Property");
priceProperty.set("name", "price");
priceProperty.set("type", decimalType);
-
- types.define(globalType);
+ 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());
- // Get global type
- Type definedGlobalType = types.getType("http://www.example.com/open", null);
-
- Property definedSymbolProperty = definedGlobalType.getProperty("symbol");
+ Property definedSymbolProperty = types.getOpenContentProperty("http://www.example.com/open", "symbol");
openQuote.set(definedSymbolProperty, "s1");
- Property definedCompanyProperty = definedGlobalType.getProperty("company");
-
+ Property definedCompanyProperty = types.getOpenContentProperty("http://www.example.com/open", "company");
DataObject company = openQuote.createDataObject(definedCompanyProperty);
company.setString("name", "FlyByNightTechnology");
- Property definedPriceProperty = definedGlobalType.getProperty("price");
+ Property definedPriceProperty = types.getOpenContentProperty("http://www.example.com/open", "price");
openQuote.setBigDecimal(definedPriceProperty, new BigDecimal("1000.0"));
assertEquals(definedPriceProperty.getType(), decimalType);
Added: incubator/tuscany/java/sdo/impl/src/test/resources/openContentProperty.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/test/resources/openContentProperty.xml?view=auto&rev=442371
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/test/resources/openContentProperty.xml (added)
+++ incubator/tuscany/java/sdo/impl/src/test/resources/openContentProperty.xml Mon Sep 11 15:05:46 2006
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="ASCII"?>
+<open:openStockQuote xmlns:open="http://www.example.com/open">
+ <symbol>s1</symbol>
+ <open:company>
+ <name>FlyByNightTechnology</name>
+ </open:company>
+ <open:price>1000.0</open:price>
+ <open:highPrice>1100.0</open:highPrice>
+ <open:mutualFundQuote>
+ <symbol>mutual-1</symbol>
+ </open:mutualFundQuote>
+</open:openStockQuote>
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org