Frames | No Frames |
1: /* IDLTypeHelper.java -- 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: package gnu.CORBA.CDR; 40: 41: import gnu.CORBA.Minor; 42: 43: import org.omg.CORBA.MARSHAL; 44: import org.omg.CORBA.portable.BoxedValueHelper; 45: import org.omg.CORBA.portable.InputStream; 46: import org.omg.CORBA.portable.OutputStream; 47: 48: import java.io.Serializable; 49: import java.lang.reflect.Method; 50: import java.lang.reflect.Modifier; 51: 52: /** 53: * Handles case when the CORBA IDL type with the known helper is wrapped into 54: * Value type. 55: * 56: * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org) 57: */ 58: public class IDLTypeHelper 59: implements BoxedValueHelper 60: { 61: /** 62: * A helper class. 63: */ 64: protected Class helper; 65: 66: /** 67: * Argument values for Helper.id(). 68: */ 69: static final Object[] ARGS_ID_V = new Object[0]; 70: 71: /** 72: * Argument types for Helper.id()). 73: */ 74: static final Class[] ARGS_ID = new Class[0]; 75: 76: /** 77: * Argument types for Helper.read. 78: */ 79: static final Class[] ARGS_READ = new Class[] { org.omg.CORBA.portable.InputStream.class }; 80: 81: /** 82: * Create an IDLTypeHelper that works via given helper class. 83: */ 84: public IDLTypeHelper(Class a_helperClass) 85: { 86: helper = a_helperClass; 87: } 88: 89: /** 90: * Get the Id, returned by this helper (use reflection). 91: */ 92: public String get_id() 93: { 94: try 95: { 96: Method m = helper.getMethod("id", ARGS_ID); 97: return (String) m.invoke(null, ARGS_ID_V); 98: } 99: catch (Exception ex) 100: { 101: MARSHAL m = new MARSHAL(msg() + " id()"); 102: m.minor = Minor.Boxed; 103: m.initCause(ex); 104: throw m; 105: } 106: } 107: 108: /** 109: * Read an instance from the stream. 110: */ 111: public Serializable read_value(InputStream input) 112: { 113: try 114: { 115: Method m = helper.getMethod("read", ARGS_READ); 116: return (Serializable) m.invoke(null, new Object[] { input }); 117: } 118: catch (Exception ex) 119: { 120: MARSHAL m = new MARSHAL(msg() + " read(..)"); 121: m.minor = Minor.Boxed; 122: m.initCause(ex); 123: throw m; 124: } 125: } 126: 127: /** 128: * Write the instance to the stream. 129: */ 130: public void write_value(OutputStream output, Serializable value) 131: { 132: try 133: { 134: Method[] m = helper.getMethods(); 135: 136: for (int i = 0; i < m.length; i++) 137: { 138: if (m[i].getName().equals("write") 139: && ((m[i].getModifiers() & Modifier.STATIC) != 0)) 140: { 141: Class[] p = m[i].getParameterTypes(); 142: 143: if (p.length == 2 && OutputStream.class.isAssignableFrom(p[0]) 144: && p[1].isAssignableFrom(value.getClass())) 145: { 146: m[i].invoke(null, new Object[] { output, value }); 147: return; 148: } 149: } 150: } 151: } 152: catch (Exception ex) 153: { 154: MARSHAL m = new MARSHAL(msg() + " write(..)"); 155: m.minor = Minor.Boxed; 156: m.initCause(ex); 157: throw m; 158: } 159: } 160: 161: /** 162: * Create the start of message for exceptions. 163: */ 164: String msg() 165: { 166: return "Failed calling " + helper.getName() + " method: "; 167: } 168: 169: }