/* * This code is distributed under The GNU Lesser General Public License (LGPLv3) * Please visit GNU site for LGPLv3 http://www.gnu.org/copyleft/lesser.html * * Copyright Denis Pavlov 2009 * Web: http://www.genericdtoassembler.org * SVN: https://svn.code.sf.net/p/geda-genericdto/code/trunk/ * SVN (mirror): http://geda-genericdto.googlecode.com/svn/trunk/ */ package com.inspiresoftware.lib.dto.geda.assembler.extension.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * ClassLoader that loads classes from specified directory. * * @author denispavlov * */ public class FileClassLoader extends ByteClassLoader { private static final Logger LOG = LoggerFactory.getLogger(FileClassLoader.class); private final BaseDirectoryProvider directoryProvider; /** * @param parent parent class loader * @param directoryProvider directory provider for this class loader */ public FileClassLoader(final ClassLoader parent, final BaseDirectoryProvider directoryProvider) { super(parent); this.directoryProvider = directoryProvider; } /** {@inheritDoc} */ @Override public Class< ? > loadClass(final String name) throws ClassNotFoundException { try { return getParent().loadClass(name); } catch (ClassNotFoundException exp) { // it's ok - need to load this one } final String baseDir = this.directoryProvider.getBaseDir(name); final String readerSimpleName = name.substring(name.lastIndexOf('.') + 1); final String filename = baseDir + readerSimpleName + ".class"; try { final File file = new File(filename); file.deleteOnExit(); if (LOG.isDebugEnabled()) { LOG.debug("Trying to read class file: {}", file.getAbsolutePath()); } final FileInputStream fis = new FileInputStream(file); byte[] clazz = new byte[(int) file.length()]; fis.read(clazz); if (LOG.isDebugEnabled()) { LOG.debug("Successfully loaded class file: {}", file.getAbsolutePath()); } return loadClass(name, clazz); } catch (FileNotFoundException e) { throw new ClassNotFoundException("No class: " + name + " located at " + filename, e); } catch (IOException ioe) { throw new ClassNotFoundException("Unable to read: " + name + " located at " + filename, ioe); } } }