home *** CD-ROM | disk | FTP | other *** search
Wrap
package sun.misc; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedActionException; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.Vector; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.jar.Attributes.Name; import java.util.zip.ZipFile; public class ExtensionDependency { private static Vector providers; static final boolean DEBUG = false; public static synchronized void addExtensionInstallationProvider(ExtensionInstallationProvider var0) { if (providers == null) { providers = new Vector(); } providers.add(var0); } public static synchronized void removeExtensionInstallationProvider(ExtensionInstallationProvider var0) { providers.remove(var0); } public static synchronized boolean checkExtensionsDependencies(JarFile var0) { if (providers == null) { return true; } else { try { ExtensionDependency var1 = new ExtensionDependency(); return var1.checkExtensions(var0); } catch (ExtensionInstallationException var2) { debug(((Throwable)var2).getMessage()); return false; } } } protected boolean checkExtensions(JarFile var1) throws ExtensionInstallationException { Manifest var2; try { var2 = var1.getManifest(); } catch (IOException var9) { return false; } if (var2 == null) { return true; } else { boolean var3 = true; Attributes var4 = var2.getMainAttributes(); if (var4 != null) { String var5 = var4.getValue(Name.EXTENSION_LIST); if (var5 != null) { StringTokenizer var6 = new StringTokenizer(var5); while(var6.hasMoreTokens()) { String var7 = var6.nextToken(); debug("The file " + ((ZipFile)var1).getName() + " appears to depend on " + var7); String var8 = var7 + "-" + Name.EXTENSION_NAME.toString(); if (var4.getValue(var8) == null) { debug("The jar file " + ((ZipFile)var1).getName() + " appers to depend on " + var7 + " but does not define the " + var8 + " attribute in its manifest "); } else if (!this.checkExtension(var7, var4)) { debug("Failed installing " + var7); var3 = false; } } } else { debug("No dependencies for " + ((ZipFile)var1).getName()); } } return var3; } } protected boolean checkExtension(String var1, Attributes var2) throws ExtensionInstallationException { debug("Checking extension " + var1); if (this.checkExtensionAgainstInstalled(var1, var2)) { return true; } else { debug("Extension not currently installed "); ExtensionInfo var3 = new ExtensionInfo(var1, var2); return this.installExtension(var3, (ExtensionInfo)null); } } boolean checkExtensionAgainstInstalled(String var1, Attributes var2) throws ExtensionInstallationException { File[] var3; try { var3 = this.getInstalledExtensions(); } catch (IOException var9) { this.debugException(var9); return false; } for(int var4 = 0; var4 < var3.length; ++var4) { try { if (this.checkExtensionAgainst(var1, var2, var3[var4])) { return true; } } catch (FileNotFoundException var7) { this.debugException(var7); } catch (IOException var8) { this.debugException(var8); } } return false; } protected boolean checkExtensionAgainst(String var1, Attributes var2, File var3) throws IOException, FileNotFoundException, ExtensionInstallationException { debug("Checking extension " + var1 + " against " + var3.getName()); Manifest var4; try { var4 = (Manifest)AccessController.doPrivileged(new 1(this, var3)); } catch (PrivilegedActionException var9) { if (var9.getException() instanceof FileNotFoundException) { throw (FileNotFoundException)var9.getException(); } throw (IOException)var9.getException(); } ExtensionInfo var5 = new ExtensionInfo(var1, var2); debug("Requested Extension : " + var5); int var6 = 4; Object var7 = null; if (var4 != null) { Attributes var8 = var4.getMainAttributes(); if (var8 != null) { ExtensionInfo var11 = new ExtensionInfo((String)null, var8); debug("Extension Installed " + var11); var6 = var11.isCompatibleWith(var5); switch (var6) { case 0: debug("Extensions are compatible"); return true; case 4: debug("Extensions are incompatible"); return false; default: debug("Extensions require an upgrade or vendor switch"); return this.installExtension(var5, var11); } } } return true; } protected boolean installExtension(ExtensionInfo var1, ExtensionInfo var2) throws ExtensionInstallationException { Vector var4 = providers; Vector var3; synchronized(var4) { var3 = (Vector)providers.clone(); } Enumeration var5 = var3.elements(); while(var5.hasMoreElements()) { ExtensionInstallationProvider var6 = (ExtensionInstallationProvider)var5.nextElement(); if (var6 != null && var6.installExtension(var1, var2)) { System.out.println("Installation successful"); Launcher.ExtClassLoader var7 = (Launcher.ExtClassLoader)Launcher.getLauncher().getClassLoader().getParent(); this.addNewExtensionsToClassLoader(var7); return true; } } return false; } private static File[] getExtDirs() { String var0 = System.getProperty("java.ext.dirs"); File[] var1; if (var0 != null) { StringTokenizer var2 = new StringTokenizer(var0, File.pathSeparator); int var3 = var2.countTokens(); var1 = new File[var3]; for(int var4 = 0; var4 < var3; ++var4) { var1[var4] = new File(var2.nextToken()); } } else { var1 = new File[0]; } return var1; } private static File[] getExtFiles(File[] var0) throws IOException { Vector var1 = new Vector(); for(int var2 = 0; var2 < var0.length; ++var2) { String[] var3 = var0[var2].list(); if (var3 != null) { for(int var4 = 0; var4 < var3.length; ++var4) { File var5 = new File(var0[var2], var3[var4]); var1.add(var5); } } } File[] var6 = new File[var1.size()]; var1.copyInto(var6); return var6; } private File[] getInstalledExtensions() throws IOException { return (File[])AccessController.doPrivileged(new 2(this)); } private Boolean addNewExtensionsToClassLoader(Launcher.ExtClassLoader var1) { try { File[] var2 = this.getInstalledExtensions(); for(int var3 = 0; var3 < var2.length; ++var3) { File var4 = var2[var3]; URL var5 = (URL)AccessController.doPrivileged(new 3(this, var4)); if (var5 != null) { URL[] var6 = ((URLClassLoader)var1).getURLs(); boolean var7 = false; for(int var8 = 0; var8 < var6.length; ++var8) { debug("URL[" + var8 + "] is " + var6[var8] + " looking for " + var5); if (var6[var8].toString().compareToIgnoreCase(var5.toString()) == 0) { var7 = true; debug("Found !"); } } if (!var7) { debug("Not Found ! adding to the classloader " + var5); var1.addExtURL(var5); } } } } catch (MalformedURLException var9) { ((Throwable)var9).printStackTrace(); } catch (IOException var10) { ((Throwable)var10).printStackTrace(); } return Boolean.TRUE; } private static void debug(String var0) { } private void debugException(Throwable var1) { } // $FF: synthetic method static File[] access$000() { return getExtDirs(); } // $FF: synthetic method static File[] access$100(File[] var0) throws IOException { return getExtFiles(var0); } // $FF: synthetic method static void access$200(String var0) { debug(var0); } // $FF: synthetic method static void access$300(ExtensionDependency var0, Throwable var1) { var0.debugException(var1); } }