001 /* 002 * The FML Forge Mod Loader suite. 003 * Copyright (C) 2012 cpw 004 * 005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free 006 * Software Foundation; either version 2.1 of the License, or any later version. 007 * 008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 010 * 011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 013 */ 014 package cpw.mods.fml.common; 015 016 import java.io.File; 017 import java.net.MalformedURLException; 018 import java.net.URISyntaxException; 019 import java.net.URL; 020 import java.net.URLClassLoader; 021 import java.util.List; 022 import java.util.logging.Level; 023 024 import com.google.common.collect.ImmutableList; 025 026 import cpw.mods.fml.common.asm.ASMTransformer; 027 import cpw.mods.fml.common.asm.transformers.AccessTransformer; 028 import cpw.mods.fml.common.modloader.BaseModProxy; 029 import cpw.mods.fml.relauncher.RelaunchClassLoader; 030 031 /** 032 * A simple delegating class loader used to load mods into the system 033 * 034 * 035 * @author cpw 036 * 037 */ 038 public class ModClassLoader extends URLClassLoader 039 { 040 private static final List<String> STANDARD_LIBRARIES = ImmutableList.of("jinput.jar", "lwjgl.jar", "lwjgl_util.jar"); 041 private RelaunchClassLoader mainClassLoader; 042 043 public ModClassLoader(ClassLoader parent) { 044 super(new URL[0], null); 045 this.mainClassLoader = (RelaunchClassLoader)parent; 046 } 047 048 public void addFile(File modFile) throws MalformedURLException 049 { 050 URL url = modFile.toURI().toURL(); 051 mainClassLoader.addURL(url); 052 } 053 054 @Override 055 public Class<?> loadClass(String name) throws ClassNotFoundException 056 { 057 return mainClassLoader.loadClass(name); 058 } 059 060 public File[] getParentSources() { 061 List<URL> urls=mainClassLoader.getSources(); 062 File[] sources=new File[urls.size()]; 063 try 064 { 065 for (int i = 0; i<urls.size(); i++) 066 { 067 sources[i]=new File(urls.get(i).toURI()); 068 } 069 return sources; 070 } 071 catch (URISyntaxException e) 072 { 073 FMLLog.log(Level.SEVERE, "Unable to process our input to locate the minecraft code", e); 074 throw new LoaderException(e); 075 } 076 } 077 078 public List<String> getDefaultLibraries() 079 { 080 return STANDARD_LIBRARIES; 081 } 082 083 public Class<? extends BaseModProxy> loadBaseModClass(String modClazzName) throws Exception 084 { 085 AccessTransformer transformer = (AccessTransformer)mainClassLoader.getTransformers().get(0); 086 transformer.ensurePublicAccessFor(modClazzName); 087 return (Class<? extends BaseModProxy>) Class.forName(modClazzName, true, this); 088 } 089 }