in repl/src/main/scala/org/apache/livy/repl/PythonInterpreter.scala [174:214]
private def getPythonProxy(commandPart: String, gateway: Gateway): Any = {
val proxyString = commandPart.substring(1, commandPart.length)
val parts = proxyString.split(";")
val length: Int = parts.length
val interfaces = ArrayBuffer.fill[Class[_]](length - 1){ null }
if (length < 2) {
throw new Py4JException("Invalid Python Proxy.")
}
else {
var proxy: Int = 1
while (proxy < length) {
try {
interfaces(proxy - 1) = Class.forName(parts(proxy))
if (!interfaces(proxy - 1).isInterface) {
throw new Py4JException("This class " + parts(proxy) +
" is not an interface and cannot be used as a Python Proxy.")
}
} catch {
case exception: ClassNotFoundException => {
throw new Py4JException("Invalid interface name: " + parts(proxy))
}
}
proxy += 1
}
val pythonProxyHandler = try {
classOf[PythonProxyHandler].getConstructor(classOf[String], classOf[Gateway])
.newInstance(parts(0), gateway)
} catch {
case NonFatal(e) =>
val cbClient = gateway.getClass().getMethod("getCallbackClient").invoke(gateway)
val cbClass = Class.forName("py4j.CallbackClient")
classOf[PythonProxyHandler]
.getConstructor(classOf[String], cbClass, classOf[Gateway])
.newInstance(parts(0), cbClient, gateway)
}
Proxy.newProxyInstance(Thread.currentThread.getContextClassLoader,
interfaces.toArray, pythonProxyHandler.asInstanceOf[PythonProxyHandler])
}
}