    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    }