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 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
