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    try (URLClassLoader cl = new URLClassLoader(urls, classLoader)) {
026      String resource = className.replace('.', '/') + ".class";
027      URL url = cl.getResource(resource);
028      if (url == null) {
029        return null;
030      }
031
032      try (InputStream is = UrlHelper.openNoCache(url)) {
033        return InputStreamTransform.readBytes(is);
034
035      } catch (IOException e) {
036        throw new RuntimeException("IOException reading bytes for " + className, e);
037      }
038    } catch (IOException e) {
039      throw new RuntimeException("Error closing URLClassLoader for " + className, e);
040    }
041  }
042
043}