/*
 * Copyright 2011,2012 Metamarkets Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.metamx.common;

import com.google.common.base.Throwables;
import sun.nio.ch.FileChannelImpl;

import java.lang.reflect.Method;
import java.nio.MappedByteBuffer;

/**
 */
public class ByteBufferUtils
{
  private static final Method unmap;

  static {
    try {
      Method unmapMethod = FileChannelImpl.class.getDeclaredMethod("unmap", MappedByteBuffer.class);
      unmapMethod.setAccessible(true);
      unmap = unmapMethod;
    }
    catch (Exception e) {
      throw new UOE(e, "Exception thrown while trying to find unmap method on MappedByteBuffer, this method must exist in your VM in order for this to work");
    }
  }

  public static void unmap(MappedByteBuffer buffer)
  {
    try {
      unmap.invoke(null, buffer);
    }
    catch (Exception e) {
      throw Throwables.propagate(e);
    }
  }
}

@@ -679,43 +679,60 @@
 es;%0A
+%0A
 import 
-sun.nio.ch.FileChannelImpl;%0A
+java.lang.reflect.InvocationTargetException;
 %0Aimp
@@ -761,16 +761,44 @@
 Method;%0A
+import java.nio.ByteBuffer;%0A
 import j
@@ -907,75 +907,211 @@
 %0A%0A  
-static %7B%0A    try %7B%0A      Method unmapMethod = FileChannelImpl.class
+private static final Method getCleaner;%0A  private static final Method clean;%0A%0A%0A  static %7B%0A    try %7B%0A      Method unmapMethod = Class.forName(%22sun.nio.ch.FileChannelImpl%22)%0A                                
 .get
@@ -1353,16 +1353,44 @@
 Buffer, 
+%22%0A                       + %22
 this met
@@ -1455,16 +1455,854 @@
  %7D%0A  %7D%0A%0A
+  static %7B%0A    try %7B%0A      getCleaner = Class.forName(%22java.nio.DirectByteBuffer%22).getDeclaredMethod(%22cleaner%22);%0A      getCleaner.setAccessible(true);%0A      clean = Class.forName(%22sun.misc.Cleaner%22).getDeclaredMethod(%22clean%22);%0A      clean.setAccessible(true);%0A    %7D catch(ClassNotFoundException %7C NoSuchMethodException e) %7B%0A      throw new UOE(%22Exception thrown while trying to access ByteBuffer clean method.%22);%0A    %7D%0A  %7D%0A%0A  /**%0A   * Releases memory held by the given direct ByteBuffer%0A   *%0A   * @param buffer buffer to free%0A   */%0A  public static void free(ByteBuffer buffer) %7B%0A    try %7B%0A      clean.invoke(getCleaner.invoke(buffer));%0A    %7D catch(IllegalAccessException %7C InvocationTargetException e) %7B%0A      throw Throwables.propagate(e);%0A    %7D%0A  %7D%0A%0A%0A  /**%0A   * Un-maps the given memory mapped file%0A   *%0A   * @param buffer buffer%0A   */%0A
   public

add helper method to free direct buffers