001package io.ebean.enhance.entity;
002
003import io.ebean.enhance.common.ClassBytesReader;
004import io.ebean.enhance.common.InputStreamTransform;
005import io.ebean.enhance.common.UrlHelper;
006
007import java.io.IOException;
008import java.io.InputStream;
009import java.net.URL;
010import java.net.URLClassLoader;
011
012/**
013 * Implementation of ClassBytesReader based on URLClassLoader.
014 */
015public class ClassPathClassBytesReader implements ClassBytesReader {
016
017  private final URL[] urls;
018
019  public ClassPathClassBytesReader(URL[] urls) {
020    this.urls = urls == null ? new URL[0] : urls;
021  }
022
023  @Override
024  public byte[] getClassBytes(String className, ClassLoader classLoader) {
025
026    try (URLClassLoader cl = new URLClassLoader(urls, classLoader)) {
027      String resource = className.replace('.', '/') + ".class";
028      URL url = cl.getResource(resource);
029      if (url == null) {
030        return null;
031      }
032
033      try (InputStream is = UrlHelper.openNoCache(url)) {
034        return InputStreamTransform.readBytes(is);
035
036      } catch (IOException e) {
037        throw new RuntimeException("IOException reading bytes for " + className, e);
038      }
039    } catch (IOException e) {
040      throw new RuntimeException("Error closing URLClassLoader for " + className, e);
041    }
042  }
043
044}