You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ke...@apache.org on 2007/07/17 14:47:17 UTC

svn commit: r556909 - /incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java

Author: kelvingoodson
Date: Tue Jul 17 05:47:15 2007
New Revision: 556909

URL: http://svn.apache.org/viewvc?view=rev&rev=556909
Log:
copy fix for TUSCANY-1110 to branch

Modified:
    incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java

Modified: incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java?view=diff&rev=556909&r1=556908&r2=556909
==============================================================================
--- incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java (original)
+++ incubator/tuscany/branches/sdo-1.0-incubating/impl/src/main/java/org/apache/tuscany/sdo/helper/TypeHelperImpl.java Tue Jul 17 05:47:15 2007
@@ -19,6 +19,7 @@
  */
 package org.apache.tuscany.sdo.helper;
 
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -34,7 +35,6 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.util.ExtendedMetaData;
 
 import commonj.sdo.DataObject;
@@ -96,47 +96,57 @@
         return null;
     }
 
-
+    private Method getGetStaticTypeMethod(Class classObj) {
+        try {
+            Method method = classObj.getMethod("getStaticType", null);
+            return method;
+        }
+        catch (Exception e) {
+            return null;
+        }
+    }
+    
     public Type getType(Class interfaceClass) {
         Type type = SDOUtil.getJavaSDOType(interfaceClass);
         if (type != null) {
             return type;
         }
         
-        SDOExtendedMetaDataImpl sdoExtendedMetaData = (SDOExtendedMetaDataImpl)extendedMetaData;
-
-        // TODO more efficient implementation ... this is a really bad one!
-
-        // check the local scope package registry
-        for (Iterator iter = sdoExtendedMetaData.getRegistry().values().iterator(); iter.hasNext();) {
-            Object value = iter.next();
-            if (value instanceof EPackage) {
-                EPackage ePackage = (EPackage)value;
-                for (Iterator iter2 = ePackage.getEClassifiers().iterator(); iter2.hasNext();) {
-                    EClassifier eClassifier = (EClassifier)iter2.next();
-                    if (eClassifier.getInstanceClass() == interfaceClass) {
-                        return (Type)eClassifier;
-                    }
+        Class sdoTypeImplClass = interfaceClass;
+        Method getStaticTypeMethod = getGetStaticTypeMethod(interfaceClass);
+        if (getStaticTypeMethod == null) {
+            String sdoTypeImplClassName = interfaceClass.getName();
+            if (sdoTypeImplClassName.endsWith("Impl") == false) {
+                int index = sdoTypeImplClassName.lastIndexOf('.');
+                if (index == -1) {
+                    sdoTypeImplClassName = "impl." + sdoTypeImplClassName + "Impl";
                 }
-            }
-        }
-
-        // if it wasnt in the local scope look in the EMF global package
-        // registry
-        for (Iterator iter = EPackage.Registry.INSTANCE.values().iterator(); iter.hasNext();) {
-            Object value = iter.next();
-            if (value instanceof EPackage) {
-                EPackage ePackage = (EPackage)value;
-                for (Iterator iter2 = ePackage.getEClassifiers().iterator(); iter2.hasNext();) {
-                    EClassifier eClassifier = (EClassifier)iter2.next();
-                    if (eClassifier.getInstanceClass() == interfaceClass) {
-                        return (Type)eClassifier;
-                    }
+                else {
+                    sdoTypeImplClassName = sdoTypeImplClassName.substring(0, index) + ".impl" + sdoTypeImplClassName.substring(index) + "Impl";
+                }
+                try {
+                    sdoTypeImplClass = Class.forName(sdoTypeImplClassName);
+                }
+                catch (Exception e) {
+                    return null;
+                }
+                getStaticTypeMethod = getGetStaticTypeMethod(sdoTypeImplClass);
+                if (getStaticTypeMethod == null) {
+                    return null;
                 }
             }
+            else {
+                return null;
+            }
+        }
+        
+        try {
+            Object implInstance = sdoTypeImplClass.newInstance();
+            return (Type)getStaticTypeMethod.invoke(implInstance, null);
+        }
+        catch (Exception e) {
+            return null;
         }
-
-        return null;
     }
 
     public Type define(DataObject type) {



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org