/**
 * COPYRIGHT & LICENSE
 *
 * This code is Copyright (c) 2006 BEA Systems, inc. It is provided free, as-is and without any warranties for the purpose of
 * inclusion in Objenesis or any other open source project with a FSF approved license, as long as this notice is not
 * removed. There are no limitations on modifying or repackaging the code apart from this. 
 *
 * BEA does not guarantee that the code works, and provides no support for it. Use at your own risk.
 *
 * Originally developed by Leonardo Mesquita. Copyright notice added by Henrik Ståhl, BEA JRockit Product Manager.
 *  
 */
package org.objenesis.instantiator.jrockit;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import org.objenesis.ObjenesisException;
import org.objenesis.instantiator.ObjectInstantiator;

/**
 * Instantiates a class by making a call to internal JRockit private methods. It is only supposed to
 * work on JRockit 7.0 JVMs, which are compatible with Java API 1.3.1. This instantiator will not
 * call any constructors.
 * 
 * @author Leonardo Mesquita
 * @see org.objenesis.instantiator.ObjectInstantiator
 */
public class JRockit131Instantiator implements ObjectInstantiator {

   private Constructor mungedConstructor;

   private static Method newConstructorForSerializationMethod;

   private static void initialize() {
      if(newConstructorForSerializationMethod == null) {
         Class cl;
         try {
            cl = Class.forName("COM.jrockit.reflect.MemberAccess");
            newConstructorForSerializationMethod = cl.getDeclaredMethod(
               "newConstructorForSerialization", new Class[] {Constructor.class, Class.class});
            newConstructorForSerializationMethod.setAccessible(true);
         }
         catch(RuntimeException e) {
            throw new ObjenesisException(e);
         }
         catch(ClassNotFoundException e) {
            throw new ObjenesisException(e);
         }
         catch(NoSuchMethodException e) {
            throw new ObjenesisException(e);
         }
      }
   }

   public JRockit131Instantiator(Class type) {
      initialize();

      if(newConstructorForSerializationMethod != null) {

         Constructor javaLangObjectConstructor;

         try {
            javaLangObjectConstructor = Object.class.getConstructor((Class[]) null);
         }
         catch(NoSuchMethodException e) {
            throw new Error("Cannot find constructor for java.lang.Object!");
         }

         try {
            mungedConstructor = (Constructor) newConstructorForSerializationMethod.invoke(null,
               new Object[] {javaLangObjectConstructor, type});
         }
         catch(Exception e) {
        	 throw new ObjenesisException(e);
         }
      }

   }

   public Object newInstance() {
      try {
         return mungedConstructor.newInstance((Object[]) null);
      }
      catch(Exception e) {
         throw new ObjenesisException(e);
      }
   }
}
