package org.omg.CORBA; import org.omg.CORBA.MARSHAL; import org.omg.CORBA.TypeCode; import org.omg.CORBA.TypeCodePackage.BadKind; /** * Holder class for fixed point types. */ public class FixedHolder implements org.omg.CORBA.portable.Streamable { public java.math.BigDecimal value; public FixedHolder(){} public FixedHolder(java.math.BigDecimal o) { value = o; } public TypeCode _type() { String s = value.toString(); short digits =0; short scale = 0; if ( s.startsWith("-") ) { s = s.substring(1); } if ( ! s.startsWith("0.") ) { for( int i = 0; i < s.length(); i++ ) { if ( s.charAt(i) == '.' ) { break; } digits++; } } int decimal = s.indexOf('.'); if ( decimal != -1 ) { s = s.substring( decimal + 1 ); for( int i = 0; i < s.length(); i++ ) { digits++; scale++; } } return ORB.init().create_fixed_tc( digits, scale ); } /** * @deprecated use another method to read the fixed e.g.{@link org.omg.CORBA.portable.InputStream#read_fixed(short, short)} */ public void _read(org.omg.CORBA.portable.InputStream in) { // unable to read // because when the fixed is read off the stream, the // BigDecimal can't be reconstructed to the original digits and scale without explicitly // passing in the digits and scale (Java-to-IDL: 1.21.4.1). // application and/or ORB code should use other means to read the fixed. throw new NO_IMPLEMENT(); } public void _write(org.omg.CORBA.portable.OutputStream out) { if (value == null) { throw new MARSHAL("value may not be null"); } TypeCode typeCode = _type(); try { out.write_fixed(value, typeCode.fixed_digits(), typeCode.fixed_scale()); } catch (BadKind e) { throw new RuntimeException("should never happen", e); } } }