Hello All,

My name is James Snell.  I'm working with Frank Budinsky on various
parts of the SDO implementation.  There are a number of things he's
asked me to look at.  The first of which is updating the automatic name
mapping/mangling that EMF does in the XSD2Ecore conversion process.  The
attached patch should take care of most of the name mangling issues and
allow the xsd conversion process to output the appropriate SDO names (as
opposed to the old EMF mapping).  Included in the patch are a couple of
changes to the EMF XSDHelperImpl class from EMF.  I needed to modify
that class in order to allow our SDO subclass to override the default
name mangling behavior.

In any case, I'll have a few more patches coming later this week.

- James
package org.apache.tuscany.sdo.helper;

import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDNamedComponent;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.XSDVariety;
import org.eclipse.xsd.ecore.XSDEcoreBuilder;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Element;

/**
 * TODO: 
 *  - Implement support for the SDO XSD Schema annotations
 *  - Override the default ecore type mappings
 *  
 * DONE:
 *  - Override the default XSDEcoreBuilder name mangling
 */
class SDOXSDEcoreBuilder extends XSDEcoreBuilder
{
  public SDOXSDEcoreBuilder(ExtendedMetaData extendedMetaData)
  {
    super(extendedMetaData);
  }

  protected String getEcoreAttribute(Element element, String attribute)
  {
    String sdoAttribute = null;
    
    if ("name".equals(attribute))
      sdoAttribute = "name";
    else if ("opposite".equals(attribute))
      sdoAttribute = "oppositeProperty";
    else if ("mixed".equals(attribute))
      sdoAttribute = "sequence";
    
    if (sdoAttribute != null)
    {
      return 
        element != null && element.hasAttributeNS("commonj.sdo/xml", sdoAttribute) ? 
          element.getAttributeNS("commonj.sdo/xml", sdoAttribute) : 
          null;
    }
    
    if ("package".equals(attribute))
      sdoAttribute = "package";
    else if ("instanceClass".equals(attribute))
      sdoAttribute = "instanceClass";

    if (sdoAttribute != null)
    {
      return 
        element != null && element.hasAttributeNS("commonj.sdo/java", sdoAttribute) ? 
          element.getAttributeNS("commonj.sdo/java", sdoAttribute) : 
          null;
    }

    return super.getEcoreAttribute(element, attribute);
  }

  protected XSDTypeDefinition getEcoreTypeQNameAttribute(XSDConcreteComponent xsdConcreteComponent, String attribute)
  {
    String sdoAttribute = null;
    
    if ("reference".equals(attribute)) sdoAttribute = "propertyType";
    
    if (sdoAttribute != null)
    {
      Element element = xsdConcreteComponent.getElement();
      return  element == null ? null : getEcoreTypeQNameAttribute(xsdConcreteComponent, element, "commonj.sdo/xml", sdoAttribute);
    }

    return super.getEcoreTypeQNameAttribute(xsdConcreteComponent, attribute);
  }
   
  /**
   * Override default EMF behavior so that the name is not mangled.
   */
  @Override
  protected String validName(String name, int casing, String prefix) {
    return name; 
  }

  /**
   * Override default EMF name mangling for anonymous types (simple and complex)
   */
  @Override
  protected String validAliasName(XSDTypeDefinition xsdTypeDefinition, boolean b) {
    String result = xsdTypeDefinition.getName();
    if (result == null)
    {
      XSDConcreteComponent container = xsdTypeDefinition.getContainer(); 
      if (container instanceof XSDNamedComponent)
      {
        XSDNamedComponent xsdNamedComponent = (XSDNamedComponent)container;
        String baseName = xsdNamedComponent.getAliasName();
        result = baseName;
      }
    }
    return result;
  }
  
}
Index: src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.xsd/plugins/org.eclipse.xsd/src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java,v
retrieving revision 1.49
diff -u -r1.49 XSDEcoreBuilder.java
--- src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java	31 Jan 2006 15:05:38 -0000	1.49
+++ src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java	27 Feb 2006 17:33:50 -0000
@@ -323,7 +323,6 @@
     {
       return (EDataType)getBuiltInEClassifier(rootSchema.getSchemaForSchemaNamespace(), "anySimpleType");
     }
-
     String explicitInstanceClassName = getEcoreAttribute(xsdSimpleTypeDefinition, "instanceClass");
     if (explicitInstanceClassName != null)
     {
@@ -333,10 +332,12 @@
       String aliasName = getEcoreAttribute(xsdSimpleTypeDefinition, "name");
       if (aliasName == null)
       {
-         aliasName = validName(xsdSimpleTypeDefinition.getAliasName(), true);
+         aliasName = validAliasName(xsdSimpleTypeDefinition, true);
       }
+
       eDataType.setName(aliasName);
-      extendedMetaData.setName(eDataType, xsdSimpleTypeDefinition.getAliasName());
+
+      extendedMetaData.setName(eDataType, validAliasName(xsdSimpleTypeDefinition, true));
 
       eDataType.setInstanceClassName(explicitInstanceClassName);
 
@@ -371,11 +372,11 @@
           String name = getEcoreAttribute(xsdSimpleTypeDefinition, "name");
           if (name == null)
           {
-            name = validName(xsdSimpleTypeDefinition.getAliasName(), true);
+            name = validAliasName(xsdSimpleTypeDefinition, true);
           }
 
           eDataType.setName(name);
-          extendedMetaData.setName(eDataType, xsdSimpleTypeDefinition.getAliasName());
+          extendedMetaData.setName(eDataType, validAliasName(xsdSimpleTypeDefinition, true));
 
           EPackage ePackage = getEPackage(xsdSimpleTypeDefinition);
           addToSortedList(ePackage.getEClassifiers(), eDataType);
@@ -441,6 +442,10 @@
     }
   }
 
+  protected String validAliasName(XSDTypeDefinition xsdTypeDefinition, boolean b) {
+    return validName(xsdTypeDefinition.getAliasName(), b);
+  }
+
   protected static final List PRIMITIVES = 
     Arrays.asList
       (new String [] 
@@ -632,10 +637,10 @@
       String name = getEcoreAttribute(xsdSimpleTypeDefinition, "name");
       if (name == null)
       {
-        name = validName(xsdSimpleTypeDefinition.getAliasName(), true);
+        name = validAliasName(xsdSimpleTypeDefinition, true);
       }
       eEnum.setName(name);
-      extendedMetaData.setName(eEnum, xsdSimpleTypeDefinition.getAliasName());
+      extendedMetaData.setName(eEnum, validAliasName(xsdSimpleTypeDefinition, true));
 
       EPackage ePackage = getEPackage(xsdSimpleTypeDefinition);
       addToSortedList(ePackage.getEClassifiers(), eEnum);
@@ -720,10 +725,10 @@
     String aliasName = getEcoreAttribute(xsdComplexTypeDefinition, "name");
     if (aliasName == null)
     {
-      aliasName = validName(xsdComplexTypeDefinition.getAliasName(), true);
+      aliasName = validAliasName(xsdComplexTypeDefinition, true);
     }
     eClass.setName(aliasName);
-    extendedMetaData.setName(eClass, xsdComplexTypeDefinition.getAliasName());
+    extendedMetaData.setName(eClass, validAliasName(xsdComplexTypeDefinition, true));
 
     EPackage ePackage = getEPackage(xsdComplexTypeDefinition);
     addToSortedList(ePackage.getEClassifiers(), eClass);
@@ -1593,7 +1598,7 @@
   {
     XSDTypeDefinition elementTypeDefinition = xsdElementDeclaration.getTypeDefinition();
     EClassifier eClassifier = getEClassifier(elementTypeDefinition);
-  
+ 
     XSDTypeDefinition referenceType = getEcoreTypeQNameAttribute(xsdComponent, "reference");
     if (referenceType == null)
     {
@@ -2024,7 +2029,6 @@
           resolveNameConflict(eClassifierMap, eClassifier, "");
         }
         eClassifierMap.put(eClassifier.getName().toLowerCase(), eClassifier);
-
         String xmlName = extendedMetaData.getName(eClassifier);
         otherEClassifier = extendedMetaData.getType(ePackage, xmlName);
         if (otherEClassifier != eClassifier)
@@ -2211,7 +2215,7 @@
       String name = getEcoreAttribute(xsdFeature, "name");
       if (name == null)
       {
-        name= validName(xsdFeature.getName(), false);
+        name= validName(xsdFeature.getName(), false);       
       }
       
       if (xsdFeature instanceof XSDElementDeclaration)
@@ -2220,8 +2224,7 @@
         // but can nevertheless be recognized as being unspecified and perhaps still be treat as many.
         //
         EStructuralFeature result = 
-          createFeature(documentEClass, (XSDElementDeclaration)xsdFeature, name, xsdFeature, 0, ETypedElement.UNSPECIFIED_MULTIPLICITY);
-            
+          createFeature(documentEClass, (XSDElementDeclaration)xsdFeature, name, xsdFeature, 0, ETypedElement.UNSPECIFIED_MULTIPLICITY);            
         result.setDerived(true);
         result.setTransient(true);
         result.setVolatile(true);
Index: /home/jasnell/workspaces/tuscany/tuscany.sdo.impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java
===================================================================
--- /home/jasnell/workspaces/tuscany/tuscany.sdo.impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java	(revision 379833)
+++ /home/jasnell/workspaces/tuscany/tuscany.sdo.impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java	(working copy)
@@ -39,12 +39,9 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.xsd.XSDConcreteComponent;
 import org.eclipse.xsd.XSDSchema;
-import org.eclipse.xsd.XSDTypeDefinition;
 import org.eclipse.xsd.ecore.XSDEcoreBuilder;
 import org.eclipse.xsd.util.XSDResourceImpl;
-import org.w3c.dom.Element;
 import org.xml.sax.InputSource;
 
 import commonj.sdo.Property;
@@ -207,64 +204,5 @@
   {
     throw new UnsupportedOperationException(); //TODO
   }
-  
-  protected static class SDOXSDEcoreBuilder extends XSDEcoreBuilder
-  {
-    public SDOXSDEcoreBuilder(ExtendedMetaData extendedMetaData)
-    {
-      super(extendedMetaData);
-    }
-
-    protected String getEcoreAttribute(Element element, String attribute)
-    {
-      String sdoAttribute = null;
-      
-      if ("name".equals(attribute))
-        sdoAttribute = "name";
-      else if ("opposite".equals(attribute))
-        sdoAttribute = "oppositeProperty";
-      else if ("mixed".equals(attribute))
-        sdoAttribute = "sequence";
-      
-      if (sdoAttribute != null)
-      {
-        return 
-          element != null && element.hasAttributeNS("commonj.sdo/xml", sdoAttribute) ? 
-            element.getAttributeNS("commonj.sdo/xml", sdoAttribute) : 
-            null;
-      }
-      
-      if ("package".equals(attribute))
-        sdoAttribute = "package";
-      else if ("instanceClass".equals(attribute))
-        sdoAttribute = "instanceClass";
-
-      if (sdoAttribute != null)
-      {
-        return 
-          element != null && element.hasAttributeNS("commonj.sdo/java", sdoAttribute) ? 
-            element.getAttributeNS("commonj.sdo/java", sdoAttribute) : 
-            null;
-      }
-
-      return super.getEcoreAttribute(element, attribute);
-    }
-
-    protected XSDTypeDefinition getEcoreTypeQNameAttribute(XSDConcreteComponent xsdConcreteComponent, String attribute)
-    {
-      String sdoAttribute = null;
-      
-      if ("reference".equals(attribute)) sdoAttribute = "propertyType";
-      
-      if (sdoAttribute != null)
-      {
-        Element element = xsdConcreteComponent.getElement();
-        return  element == null ? null : getEcoreTypeQNameAttribute(xsdConcreteComponent, element, "commonj.sdo/xml", sdoAttribute);
-      }
-
-      return super.getEcoreTypeQNameAttribute(xsdConcreteComponent, attribute);
-    }
-     
-  }
 
 }

Reply via email to