Code Search for Developers
 
 
  

MonkeyClassLoader.java from Groovy Eclipse Monkey at Krugle


Show MonkeyClassLoader.java syntax highlighted

/*******************************************************************************
 * Copyright (c) 2006 Eclipse Foundation
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Bjorn Freeman-Benson - initial implementation
 *     Ward Cunningham - initial implementation
 *******************************************************************************/

package net.sf.groovyMonkey;
import static java.lang.reflect.AccessibleObject.setAccessible;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MonkeyClassLoader 
extends ClassLoader 
{
	private final List< ClassLoader > loaders = new ArrayList< ClassLoader >();
	private final Map< String, Class<?> > clases = new HashMap< String, Class<?> >();
    
	public MonkeyClassLoader()
    {
        super();
    }
    public MonkeyClassLoader( final ClassLoader parent )
    {
        super( parent );
    }
    public void add( final ClassLoader loader ) 
    {
		loaders.add( loader );
	}
	@Override
    public Class< ? > loadClass( final String name ) 
    throws ClassNotFoundException 
    {
        if( clases.containsKey( name ) )
            return clases.get( name );
        for( final ClassLoader loader : loaders )
        {
			try
            {
                if( loader == null )
                    continue;
                final Class<?> clase = loader.loadClass( name );
                if( clase != null )
                {
                    clases.put( name, clase );
                    return clase;
                }
            }
            catch( final ClassNotFoundException e )
            {
                // continue the loop
            }
            catch( final Throwable e )
            {
                throw new RuntimeException( e );
            }
		}
        final Class<?> clase = super.loadClass( name );
        if( clase != null )
            return clase;
		throw new ClassNotFoundException( name );
	}
    @Override
    protected synchronized Class< ? > loadClass( final String name, 
                                                 final boolean resolve ) 
    throws ClassNotFoundException
    {
        if( clases.containsKey( name ) )
            return clases.get( name );
        for( final ClassLoader loader : loaders )
        {
            try
            {
                if( loader == null )
                    continue;
                final Class<?> clase = invoke( loader, "loadClass", name, resolve );
                if( clase != null )
                {
                    clases.put( name, clase );
                    return clase;
                }
            }
            catch( final Throwable e )
            {
                throw new RuntimeException( e );
            }
        }
        final Class<?> clase = super.loadClass( name, resolve );
        if( clase != null )
            return clase;
        throw new ClassNotFoundException( name );
    }
    @Override
    protected Class< ? > findClass( final String name ) 
    throws ClassNotFoundException
    {
        if( clases.containsKey( name ) )
            return clases.get( name );
        for( final ClassLoader loader : loaders )
        {
            if( loader == null )
                continue;
            Class< ? > clase = invoke( loader, "findClass", name );
            if( clase != null )
            {
                clases.put( name, clase );
                return clase;
            }
            clase = invoke( loader, "findLocalClass", name );
            if( clase != null )
            {
                clases.put( name, clase );
                return clase;
            }
        }
        return super.findClass( name );
    }
    private Class< ? > invoke( final ClassLoader loader, 
                               final String methodName, 
                               final String name )
    {
        try
        {
            final Method method = loader.getClass().getDeclaredMethod( methodName, new Class<?>[] { String.class } );
            setAccessible( new Method[] { method }, true );
            final Object object = method.invoke( loader, name );
            if( object == null || !( object instanceof Class ) )
                return null;
            return ( Class<?> )object;
        }
        catch( final SecurityException se )
        {
        }
        catch( final NoSuchMethodException e )
        {
        }
        catch( final IllegalArgumentException e )
        {
        }
        catch( final IllegalAccessException e )
        {
        }
        catch( final InvocationTargetException e )
        {
        }
        return null;
    }
    private Class< ? > invoke( final ClassLoader loader, 
                               final String methodName, 
                               final String name,
                               final boolean resolve )
    {
        try
        {
            final Method method = loader.getClass().getDeclaredMethod( methodName, new Class<?>[]{ String.class, boolean.class } );
            setAccessible( new Method[]{ method }, true );
            final Object object = method.invoke( loader, name, resolve );
            if( object == null || !( object instanceof Class ) )
                return null;
            return ( Class<?> )object;
        }
        catch( final SecurityException se )
        {
        }
        catch( final NoSuchMethodException e )
        {
        }
        catch( final IllegalArgumentException e )
        {
        }
        catch( final IllegalAccessException e )
        {
        }
        catch( final InvocationTargetException e )
        {
        }
        return null;
    }
    @Override
    protected URL findResource( final String name )
    {
        return super.findResource( name );
    }
    @Override
    protected Enumeration< URL > findResources( final String name ) 
    throws IOException
    {
        return super.findResources( name );
    }
    
}




See more files for this project here

Groovy Eclipse Monkey

Groovy Monkey is a Utility for Eclipse that enables you to create scripts in Groovy, Beanshell, Python or Ruby to run directly in Eclipse. This tool can be used to Eclipse API exploration, automation scripts, and rapid plugin prototyping.

Project homepage: http://sourceforge.net/projects/groovy-monkey
Programming language(s): Groovy,Java,XML
License: other

  actions/
    CreateGroovyMonkeyExamplesAction.java
    PasteScriptFromClipboardAction.java
    PublishScript.java
    PublishScriptForBlogger.java
    PublishScriptForEmail.java
    PublishScriptForWiki.java
    RecreateMonkeyMenuAction.java
    SelectScriptPathDialog.java
  dom/
    bundle/
      BundleDOM.java
      BundleDOMFactory.java
    resources/
      File.java
      Line.java
      Resources.java
      ResourcesDOMFactory.java
    runner/
      RunnerDOM.java
      RunnerDOMFactory.java
    window/
      WindowDOMFactory.java
    workspace/
      WorkspaceDOMFactory.java
    BSFFunctionsDOMFactory.java
    IDynamicState.java
    IMonkeyDOMFactory.java
    MetadataDOMFactory.java
    MonitorDOM.java
    Utilities.java
  lang/
    IMonkeyScript.java
    IMonkeyScriptFactory.java
    MonkeyScript.java
    MonkeyScriptFactoryAbstract.java
  preferences/
    GroovyMonkeyPreferencePage.java
    PreferenceInitializer.java
  util/
    ListUtil.java
    MapUtil.java
    SetUtil.java
    StringUtil.java
    Transformer.java
    TreeList.java
  BundleClassLoaderAdapter.java
  DOMDescriptor.java
  ErrorDialog.java
  GroovyMonkeyPlugin.java
  Marker.java
  MonkeyClassLoader.java
  RunMonkeyScript.java
  ScriptMetadata.java
  Subscription.java
  Tags.java
  UpdateMonkeyActionsResourceChangeListener.java