private static ClientProtocol createReorderingProxy(final ClientProtocol cp, final ReorderBlocks lrb, final Configuration conf) { return (ClientProtocol) Proxy.newProxyInstance (cp.getClass().getClassLoader(), new Class[]{ClientProtocol.class, Closeable.class}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { Object res = method.invoke(cp, args); if (res != null && args != null && args.length == 3 && "getBlockLocations".equals(method.getName()) && res instanceof LocatedBlocks && args[0] instanceof String && args[0] != null) { lrb.reorderBlocks(conf, (LocatedBlocks) res, (String) args[0]); } return res; } catch (InvocationTargetException ite) { // We will have this for all the exception, checked on not, sent // by any layer, including the functional exception Throwable cause = ite.getCause(); if (cause == null){ throw new RuntimeException( "Proxy invocation failed and getCause is null", ite); } if (cause instanceof UndeclaredThrowableException) { Throwable causeCause = cause.getCause(); if (causeCause == null) { throw new RuntimeException("UndeclaredThrowableException had null cause!"); } cause = cause.getCause(); } throw cause; } } }); }