Source for gnu.CORBA.CDR.VMVio

   1: /* VMVio.java -- Native operations, required by value IO.
   2:  Copyright (C) 2005 Free Software Foundation, Inc.
   3: 
   4:  This file is part of GNU Classpath.
   5: 
   6:  GNU Classpath is free software; you can redistribute it and/or modify
   7:  it under the terms of the GNU General Public License as published by
   8:  the Free Software Foundation; either version 2, or (at your option)
   9:  any later version.
  10: 
  11:  GNU Classpath is distributed in the hope that it will be useful, but
  12:  WITHOUT ANY WARRANTY; without even the implied warranty of
  13:  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14:  General Public License for more details.
  15: 
  16:  You should have received a copy of the GNU General Public License
  17:  along with GNU Classpath; see the file COPYING.  If not, write to the
  18:  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19:  02110-1301 USA.
  20: 
  21:  Linking this library statically or dynamically with other modules is
  22:  making a combined work based on this library.  Thus, the terms and
  23:  conditions of the GNU General Public License cover the whole
  24:  combination.
  25: 
  26:  As a special exception, the copyright holders of this library give you
  27:  permission to link this library with independent modules to produce an
  28:  executable, regardless of the license terms of these independent
  29:  modules, and to copy and distribute the resulting executable under
  30:  terms of your choice, provided that you also meet, for each linked
  31:  independent module, the terms and conditions of the license of that
  32:  module.  An independent module is a module which is not derived from
  33:  or based on this library.  If you modify this library, you may extend
  34:  this exception to your version of the library, but you are not
  35:  obligated to do so.  If you do not wish to do so, delete this
  36:  exception statement from your version. */
  37: 
  38: /**
  39:  * This is a temporary replacement for the native call that would allocate
  40:  * objects without public constructors. The replacement only allocates
  41:  * objects with public parameterless constructor and objects with public
  42:  * constructor taking string (like some Throwables).
  43:  *
  44:  * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
  45:  *
  46:  * TODO FIXME replace by native call like in VMObjectInputStream.
  47:  * Required modification of Classpath the build system.
  48:  */
  49: 
  50: 
  51: package gnu.CORBA.CDR;
  52: 
  53: import java.lang.reflect.Constructor;
  54: 
  55: public class VMVio
  56: {
  57:   /**
  58:    * Allocates a new Object of type clazz but without running the default
  59:    * constructor on it. It then calls the given constructor on it. The given
  60:    * constructor method comes from the constr_clazz which is a super class of
  61:    * the given clazz.
  62:    */
  63:   public static Object allocateObject(Class clazz, Class constr_clazz,
  64:     Constructor constructor)
  65:     throws InstantiationException
  66:   {
  67:     try
  68:       {
  69:         Constructor c = clazz.getConstructor(new Class[0]);
  70:         c.setAccessible(true);
  71:         return c.newInstance(new Object[0]);
  72:       }
  73:     catch (Exception ex)
  74:       {
  75:         try
  76:           {
  77:             Constructor c = clazz.getConstructor(new Class[] { String.class });
  78:             return c.newInstance(new Object[] { "" });
  79:           }
  80:         catch (Exception ex2)
  81:           {
  82:             Constructor c[] = clazz.getConstructors();
  83: 
  84:             for (int i = 0; i < c.length; i++)
  85:               {
  86:                 try
  87:                   {
  88:                     c[i].setAccessible(true);
  89:                     Class[] args = c[i].getParameterTypes();
  90:                     return c[i].newInstance(new Object[args.length]);
  91:                   }
  92:                 catch (Exception ex3)
  93:                   {
  94:                     // Try another one.
  95:                   }
  96:               }
  97:           }
  98:         throw new InstantiationException(clazz.getName());
  99:       }
 100:   }
 101: }