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