JavuPlugClassLoader1.java :  » Web-Framework » wingS » com » javujavu » javux » app » compat » Java Open Source

Java Open Source » Web Framework » wingS 
wingS » com » javujavu » javux » app » compat » JavuPlugClassLoader1.java
package com.javujavu.javux.app.compat;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Hashtable;
import java.util.Vector;

import com.javujavu.javux.app.compat.protocol.javuplug1.JavuPlugURLConnection1;



public class JavuPlugClassLoader1 extends ClassLoader
{
  protected final Vector jars;
  protected final Hashtable cache;
  private final String urlPrefix;
  
  public JavuPlugClassLoader1()
  {
    jars= new Vector();
    cache= new Hashtable();
    urlPrefix= Integer.toString(hashCode(), 16);
  }
  private String checkFile(String fileName)
  {
    File f= new File(fileName);
    if(f.isFile())
    {
      try { return f.getCanonicalPath(); }
      catch(IOException e) {}
    }    
    return null;
  }
  public synchronized JavuPlugJarClassLoader1 getJarLoader(String fileName)
  {
    fileName= checkFile(fileName);
    if(fileName!=null)
    {
      for(int i= 0; i<jars.size(); i++)
      {
        JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
        if(fileName.equals(jar.fileName)) return jar;
      }
    }
    return null;
  }

  
  public synchronized JavuPlugJarClassLoader1 loadJar(String fileName)
  {
    fileName= checkFile(fileName);
    if(fileName==null) return null;
    JavuPlugJarClassLoader1 jar= getJarLoader(fileName);
    if(jar==null)
    {
      try
      {
        jar= new JavuPlugJarClassLoader1(fileName, this);
        jars.addElement(jar);

        if(jars.size()==1)
        {
          JavuPlugURLConnection1.addHandler(getUrlPrefix(), this);
        }
      }
      catch(IOException e) {}
    }
    return jar;
  }
  
  protected String getUrlPrefix()
  {
    return urlPrefix;
  }

  public synchronized void unloadJar(String fileName)
  {
    JavuPlugJarClassLoader1 jar= getJarLoader(fileName);
    if(jar!=null)
    {
      jar.closeJar();
      jars.removeElement(jar);
      if(jars.size()==0)
      {
        JavuPlugURLConnection1.removeHandler(getUrlPrefix());
      }
      cache.clear();
    }
  }
  public synchronized void unloadAllJars()
  {
    for(int i= 0; i<jars.size(); i++)
    {
      JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
      jar.closeJar();
    }
    jars.removeAllElements();
    JavuPlugURLConnection1.removeHandler(getUrlPrefix());
    cache.clear();
  }
  
  
  protected Class findClass(String name)
  throws ClassNotFoundException
  {
    String path= name.replace('.', '/').concat(".class");
      
    for(int i= 0; i<jars.size(); i++)
    {
      JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
      
      Class c= jar.jarFindClass(name, path);
      if(c!=null)
      {
        cache.put(c.getName(), c);
        
        return c;
      }
    }
    throw new ClassNotFoundException(name);
  }
  protected synchronized Class loadClass(String name, boolean resolve)
  throws ClassNotFoundException
  {
    Class c= null;
    c= (Class)cache.get(name);
    if(c==null)
    {
      try { c= findSystemClass(name); }
      catch (ClassNotFoundException e) {}
    }
    if(c==null) c= findClass(name);
    if(resolve) 
    {
      resolveClass(c);
    }
    return c;
  }

  public synchronized InputStream getResourceAsStream(String name)
  {
    if(name.startsWith("/")) name= name.substring(1);
    
    for(int i= 0; i<jars.size(); i++)
    {
      JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
      InputStream is= jar.getResourceAsStream(name);
      if(is!=null) return is;
    }
    return null;
  }
  public URL getResource(String name)
  {
    URL u= getSystemResource(name);
    if(u!=null) return u;

    synchronized(this)
    {
      for(int i= 0; i<jars.size(); i++)
      {
        JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
        u= jar.findResource(name);
        if(u!=null) return u;
      }
      return null;
    }
  }

  ///////////////////////////////////////////////////////////
  
  public JavuPlugJarClassLoader1[] listResourceLoaders(String name)
  {
    Vector v= new Vector();
    synchronized(this)
    {
      for(int i= 0; i<jars.size(); i++)
      {
        JavuPlugJarClassLoader1 jar= (JavuPlugJarClassLoader1)jars.elementAt(i);
        if(jar.getResourceEntry(name)!=null)
        {
          v.addElement(jar);
        }
      }
    }
    JavuPlugJarClassLoader1[] rr= new JavuPlugJarClassLoader1[v.size()];
    v.copyInto(rr);
    return rr;
  }
  public JavuPlugJarClassLoader1[] listPluginLoaders(String key)
  {
    return listResourceLoaders(key+".properties");
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.