Java 类org.apache.hadoop.io.Closeable 实例源码

项目:c5    文件:HFileSystem.java   
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;
              }
            }
          });
}