svn commit: r14726 - trunk/src/argouml-app/src/org/argouml/uml/reveng/java

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2008-05-13 09:09:47-0700
New Revision: 14726

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java
   trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java
   trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java

Log:
Issue 5077 - Centralize multiple copies of class loading code. Catch LinkageErrors from class loader.

Modified: trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java?view=diff&rev=14726&p1=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java&p2=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java&r1=14725&r2=14726
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/reveng/java/Context.java	2008-05-13 09:09:47-0700
@@ -29,7 +29,11 @@
 
 package org.argouml.uml.reveng.java;
 
+import java.net.MalformedURLException;
+
+import org.apache.log4j.Logger;
 import org.argouml.model.Model;
+import org.argouml.uml.reveng.ImportClassLoader;
 
 /**
    The context is the current available namespaces via import in the
@@ -39,7 +43,9 @@
 */
 abstract class Context
 {
-    /** The succeding context. May be null. */
+    private static final Logger LOG = Logger.getLogger(Context.class);
+    
+    /** The parent context. May be null. */
     private Context context;
 
     /**
@@ -111,5 +117,53 @@
     protected Context getContext() {
         return context;
     }
+
+    protected Class<?> findClass(String name, boolean interfacesOnly) {
+        Class<?> clazz = null;
+        try {
+            // TODO: Do we ever want to look up things on our own classpath?
+            // This really should only be used for default Java types and even
+            // then probably should be done after searching the user classpath
+            clazz = Class.forName(name);
+        } catch (ClassNotFoundException e) {
+            clazz = findClassOnUserClasspath(name, interfacesOnly);
+        } catch (LinkageError e) {
+            // We found the class, but we couldn't load it for some reason
+            // most likely a missing dependency on the class path, but could
+            // be wrong class file version or something else
+            // TODO: Need to make this visible to the user
+            LOG.warn("Linkage error loading found class " + name, e);
+            // We'll continue the search, but this is probably the one we wanted
+            clazz = findClassOnUserClasspath(name, interfacesOnly);
+        }
+        // Got something, but it wasn't what we wanted.  Try again.
+        if (clazz != null && interfacesOnly && !clazz.isInterface()) {
+            clazz = findClassOnUserClasspath(name, interfacesOnly);
+        }
+        return clazz;
+    }
+
+    private Class<?> findClassOnUserClasspath(String name,
+            boolean interfacesOnly) {
+        Class<?> clazz = null;
+        try {
+            clazz = ImportClassLoader.getInstance().loadClass(name);
+        } catch (MalformedURLException e) {
+            // TODO: Need to make this visible to the user
+            LOG.warn("Classpath configuration error", e);
+        } catch (ClassNotFoundException e) {
+            return null;
+        } catch (LinkageError e) {
+            // We found the class, but we couldn't load it for some reason
+            // most likely a missing dependency on the class path
+            // TODO: Need to make this visible to the user
+            LOG.warn("Linkage error loading found class " + name, e);
+            return null;
+        }
+        if (clazz != null && interfacesOnly && !clazz.isInterface()) {
+            return null;
+        }
+        return clazz;
+    }
 }
 

Modified: trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java?view=diff&rev=14726&p1=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java&p2=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java&r1=14725&r2=14726
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/reveng/java/OuterClassifierContext.java	2008-05-13 09:09:47-0700
@@ -95,82 +95,26 @@
 
 	if (iClassifier == null) {
 	    Class classifier;
-	    // Try to find it via the classpath
-	    try {
-
-		// Special case for model
-		if (Model.getFacade().isAModel(mPackage)) {
-		    classifier = Class.forName(namePrefix + name);
-		}
-		else {
-                    String clazzName =
-			packageJavaName + "." + namePrefix + name;
-		    classifier =
-			Class.forName(clazzName);
-		}
-		if (classifier.isInterface()) {
-		    iClassifier =
-			Model.getCoreFactory()
-			    .buildInterface(name, mClassifier);
-		}
-		else {
-		    if (interfacesOnly) {
-		        throw new ClassNotFoundException();
-		    } else {
-		        iClassifier =
-                                Model.getCoreFactory().buildClass(
-                                        name, mClassifier);
-		    }
-		}
-	    }
-	    catch (ClassNotFoundException e) {
-
-                // try USER classpath
-                try {
-
-                    // Special case for model
-                    if (Model.getFacade().isAModel(mPackage)) {
-                        classifier =
-			    ImportClassLoader.getInstance()
-			        .loadClass(namePrefix + name);
-                    }
-                    else {
-                        String clazzName =
-			    packageJavaName + "." + namePrefix + name;
-                        classifier =
-			    ImportClassLoader.getInstance()
-			        .loadClass(clazzName);
-                    }
-                    if (classifier.isInterface()) {
-                        iClassifier =
-			    Model.getCoreFactory()
-			        .buildInterface(name, mClassifier);
-                    }
-                    else {
-                        if (interfacesOnly) {
-                            throw new ClassNotFoundException();
-                        } else {
-                            iClassifier =
-                                    Model.getCoreFactory().buildClass(
-                                            name, mClassifier);
-                        }
-                    }
-
-                }
-                catch (Exception e1) {
-                    // TODO: This too broad an exception catch to just continue
-                    // with - narrow to specific expected errors that can be
-                    // ignored - tfm
-                    if (!(e1 instanceof ClassNotFoundException)) {
-                        LOG.warn(e1);
-                    }
-                    
-                    // Continue the search through the rest of the model
-                    if (getContext() != null) {
-                        iClassifier = getContext().get(name, interfacesOnly);
-                    }
+	    String clazzName = namePrefix + name;
+	    // Special case for model
+	    if (!Model.getFacade().isAModel(mPackage)) {
+	        clazzName =
+	            packageJavaName + "." + namePrefix + name;
+	    } 
+	    classifier = findClass(clazzName, interfacesOnly);
+	    if (classifier != null) {
+                if (classifier.isInterface()) {
+                    iClassifier = Model.getCoreFactory().buildInterface(name,
+                            mClassifier);
+                } else {
+                    iClassifier = Model.getCoreFactory().buildClass(name,
+                            mClassifier);
                 }
-	    }
+            }
+        }
+	if (iClassifier == null && getContext() != null) {
+            // Continue the search through the rest of the model
+	    iClassifier = getContext().get(name, interfacesOnly);
 	}
 	return iClassifier;
     }

Modified: trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java?view=diff&rev=14726&p1=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java&p2=trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java&r1=14725&r2=14726
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/reveng/java/PackageContext.java	2008-05-13 09:09:47-0700
@@ -24,12 +24,10 @@
 
 package org.argouml.uml.reveng.java;
 
-import java.net.MalformedURLException;
 
 import org.apache.log4j.Logger;
 import org.argouml.model.Facade;
 import org.argouml.model.Model;
-import org.argouml.uml.reveng.ImportClassLoader;
 
 /**
  * This context is a package.
@@ -38,7 +36,7 @@
  */
 class PackageContext extends Context {
     
-    private static final Logger LOG = Logger.getLogger(PackageContext.class);
+    static final Logger LOG = Logger.getLogger(PackageContext.class);
     
     /** The package this context represents. */
     private Object mPackage;
@@ -95,70 +93,24 @@
 
 	if (mClassifier == null) {
 	    Class classifier;
-	    // Try to find it via the classpath
-	    try {
-
-		// Special case for model
-		if (Model.getFacade().isAModel(mPackage)) {
-		    classifier = Class.forName(name);
-		}
-		else {
-                    String clazzName = javaName + "." + name;
-                    classifier = Class.forName(clazzName);
-		}
-		if (classifier.isInterface()) {
-		    mClassifier =
-                            Model.getCoreFactory().buildInterface(
-                                    name, mPackage);
-		} else {
-                    if (!interfacesOnly) {
-                        mClassifier =
-                                Model.getCoreFactory().buildClass(
-                                        name, mPackage);
-                    }
-		}
+	    String clazzName = name;
+	    // Special case for model
+	    if (!Model.getFacade().isAModel(mPackage)) {
+	        clazzName = javaName + "." + name;
+	    }
+	    classifier = findClass(clazzName, interfacesOnly);
+	    if (classifier != null) {
+	        if (classifier.isInterface()) {
+                    mClassifier = Model.getCoreFactory().buildInterface(name,
+                            mPackage);
+                } else {
+                    mClassifier = Model.getCoreFactory().buildClass(name,
+                            mPackage);
+                }
                 if (mClassifier != null) {
                     setGeneratedTag(mClassifier);
                 }
 	    }
-	    catch (ClassNotFoundException e) {
-		// No class or interface found
-                // try USER classpath
-
-                try {
-                    // Special case for model
-                    if (Model.getFacade().isAModel(mPackage)) {
-                        classifier =
-			    ImportClassLoader.getInstance().loadClass(name);
-                    }
-                    else {
-                        String clazzName = javaName + "." + name;
-                        classifier =
-			    ImportClassLoader.getInstance()
-			        .loadClass(clazzName);
-                    }
-		    if (classifier.isInterface()) {
-			mClassifier =
-                                Model.getCoreFactory().buildInterface(
-                                        name, mPackage);
-		    } else {
-		        if (!interfacesOnly) {
-                            mClassifier =
-                                    Model.getCoreFactory().buildClass(
-                                            name, mPackage);
-                        }
-		    }
-                    if (mClassifier != null) {
-                        setGeneratedTag(mClassifier);
-                    }
-                }
-                catch (ClassNotFoundException e1) {
-                    // Ignore - we'll deal with this later by checking to see
-                    // if we found anything.
-                } catch (MalformedURLException e1) {
-                    LOG.warn("Classpath configuration error", e1);
-                }
-            }
 	}
 	if (mClassifier == null) {
 	    // Continue the search through the rest of the model
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.