summaryrefslogtreecommitdiff
path: root/gnu/CORBA/DynAn/gnuDynFixed.java
diff options
context:
space:
mode:
authorAudrius Meskauskas <audriusa@Bioinformatics.org>2005-08-07 17:17:43 +0000
committerAudrius Meskauskas <audriusa@Bioinformatics.org>2005-08-07 17:17:43 +0000
commit36718ba08db6631df8ab9fb801d408ca98ad4420 (patch)
treec9cb9c49dec15340bfd8b82569e0a0661028484e /gnu/CORBA/DynAn/gnuDynFixed.java
parent1cc804f90d5adc0a5d5e31e21646ef45e9214ae2 (diff)
downloadclasspath-36718ba08db6631df8ab9fb801d408ca98ad4420.tar.gz
2005-08-03 Audrius Meskauskas <AudriusA@Bioinformatics.org>
* gnu/CORBA/CDR/noHeaderInput.java, gnu/CORBA/gnuValueHolder.java, gnu/CORBA/DynAn/gnuDynAny.java, gnu/CORBA/DynAn/gnuDynArray.java, gnu/CORBA/DynAn/gnuDynSequence.java, gnu/CORBA/DynAn/gnuDynValueBox.java, gnu/CORBA/DynAn/abstractRecord.java, gnu/CORBA/DynAn/gnuDynAnyFactory.java, gnu/CORBA/DynAn/gnuDynValue.java, gnu/CORBA/DynAn/gnuDynStruct.java, gnu/CORBA/DynAn/anyDivideable.java, gnu/CORBA/DynAn/anyUndivideable.java, gnu/CORBA/DynAn/gnuDynEnum.java, gnu/CORBA/DynAn/abstractDynAny.java, gnu/CORBA/DynAn/gnuDynFixed.java, gnu/CORBA/DynAn/valueChangedListener.java, gnu/CORBA/DynAn/gnuDynUnion.java: New files. * org/omg/DynamicAny/DynUnionOperations.java, org/omg/DynamicAny/DynAnyOperations.java, org/omg/DynamicAny/DynAnyFactoryOperations.java, org/omg/DynamicAny/DynValueBox.java, org/omg/DynamicAny/DynValueCommon.java, org/omg/DynamicAny/DynAnyFactoryHelper.java, gnu/CORBA/typeNamer.java, gnu/CORBA/fixedTypeCode.java, gnu/CORBA/CDR/Vio.java, gnu/CORBA/CDR/cdrInput.java, gnu/CORBA/CDR/cdrOutput.java, gnu/CORBA/holderFactory.java, gnu/CORBA/universalHolder.java, gnu/CORBA/Poa/ORB_1_4.java, gnu/CORBA/Restricted_ORB.java, gnu/CORBA/gnuAny.java, org/omg/CORBA/TypeCode.java org/omg/CORBA/Any.java, org/omg/CORBA/ORB.java, org/omg/CORBA/ObjectHelper.java, org/omg/CORBA/ObjectHolder.java, org/omg/CORBA_2_3/portable/InputStream.java, org/omg/CORBA_2_3/portable/OutputStream.java, gnu/CORBA/DynAn/NameValuePairHolder.java: Rewritten.
Diffstat (limited to 'gnu/CORBA/DynAn/gnuDynFixed.java')
-rw-r--r--gnu/CORBA/DynAn/gnuDynFixed.java257
1 files changed, 257 insertions, 0 deletions
diff --git a/gnu/CORBA/DynAn/gnuDynFixed.java b/gnu/CORBA/DynAn/gnuDynFixed.java
new file mode 100644
index 000000000..13ec24e6c
--- /dev/null
+++ b/gnu/CORBA/DynAn/gnuDynFixed.java
@@ -0,0 +1,257 @@
+/* gnuDynFixed.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.CORBA.DynAn;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.BAD_OPERATION;
+import org.omg.CORBA.BAD_PARAM;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.TypeCodePackage.*;
+import org.omg.DynamicAny.DynAny;
+import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
+import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
+import org.omg.DynamicAny.DynFixed;
+import org.omg.DynamicAny.DynFixedOperations;
+
+import java.math.BigDecimal;
+
+/**
+ * Implements DynAny, holding CORBA <code>fixed</code>. This class is derived
+ * from gnuDynEnm to avoid repetetive inclusion of unused DynAny methods.
+ *
+ * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
+ */
+public class gnuDynFixed
+ extends anyUndivideable
+ implements DynFixed
+{
+ /**
+ * Use serialVersionUID for interoperability.
+ */
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The default value, assigned in the new instance.
+ */
+ static final BigDecimal ZERO = new BigDecimal("0.0");
+
+ /**
+ * The content of the dyn fixed, wrapped in this DynAny.
+ */
+ BigDecimal value;
+
+ /**
+ * The number of digits after the decimal point.
+ */
+ final int scale;
+
+ /**
+ * The number of digits.
+ */
+ final int digits;
+
+ /**
+ * Create a new instance of the dyn fixed.
+ */
+ public gnuDynFixed(TypeCode oType, TypeCode aType, gnuDynAnyFactory aFactory,
+ ORB anOrb
+ )
+ {
+ super(oType, aType, aFactory, anOrb);
+ try
+ {
+ digits = final_type.fixed_digits();
+ scale = final_type.fixed_scale();
+ }
+ catch (Exception e)
+ {
+ throw new BAD_PARAM("Not a fixed");
+ }
+ value = ZERO;
+ }
+
+ /**
+ * Clone the current instance.
+ */
+ public gnuDynFixed(gnuDynFixed from)
+ {
+ super(from.official_type, from.final_type, from.factory, from.orb);
+ digits = from.digits;
+ scale = from.scale;
+ value = from.value;
+ }
+
+ /**
+ * Get the value of the wrapped dyn fixed, as string.
+ */
+ public String get_value()
+ {
+ return value.toString();
+ }
+
+ /**
+ * Set the value.
+ */
+ public boolean set_value(String fixed_value)
+ throws TypeMismatch, InvalidValue
+ {
+ // Count the digits till decimal point.
+ int digs = 0;
+ char c;
+ boolean leading0 = true;
+ Digs:
+ for (int i = 0; i < fixed_value.length(); i++)
+ {
+ c = fixed_value.charAt(i);
+ if (Character.isDigit(c))
+ {
+ if (!(c == '0' && leading0))
+ digs++;
+ if (c != '0')
+ leading0 = false;
+ }
+ else if (c == '.')
+ break Digs;
+ }
+ if (digs > (digits - scale))
+ throw new InvalidValue("Too many digits: " + digs + " for " + digits +
+ "." + scale
+ );
+
+ try
+ {
+ value = new BigDecimal(fixed_value);
+ }
+ catch (NumberFormatException ex)
+ {
+ if (fixed_value.trim().length() == 0)
+ throw new InvalidValue("Empty string passed");
+
+ TypeMismatch inva =
+ new TypeMismatch("Not a number: '" + fixed_value + "'");
+ inva.initCause(ex);
+ throw inva;
+ }
+
+ valueChanged();
+ return value.scale() <= scale;
+ }
+
+ /**
+ * Assign the value from another BigDecimal.
+ */
+ public void assign(DynAny from)
+ throws TypeMismatch
+ {
+ checkType(official_type, from.type());
+
+ if (from instanceof gnuDynFixed)
+ {
+ gnuDynFixed other = (gnuDynFixed) from;
+ value = other.value;
+ }
+ else if (from instanceof DynFixedOperations)
+ {
+ value = new BigDecimal(((DynFixedOperations) from).get_value());
+ }
+ else
+ throw new TypeMismatch("Not a DynFixed");
+ valueChanged();
+ }
+
+ /**
+ * Create a copy.
+ */
+ public DynAny copy()
+ {
+ return new gnuDynFixed(this);
+ }
+
+ /**
+ * Compare for equality.
+ */
+ public boolean equal(DynAny other)
+ {
+ if (other instanceof gnuDynFixed)
+ {
+ // Normally, this code would be executed.
+ return value.equals(((gnuDynFixed) other).value);
+ }
+ if (other instanceof DynFixedOperations)
+ {
+ // This may be involved when mixing implementations.
+ return ((DynFixedOperations) other).get_value().equals(get_value());
+ }
+ else
+ return false;
+ }
+
+ /**
+ * Set the value from Any (must hold <code>fixed</code> with the matching
+ * typecode.).
+ */
+ public void from_any(Any an_any)
+ throws TypeMismatch, InvalidValue
+ {
+ try
+ {
+ checkType(official_type, an_any.type());
+
+ value = an_any.extract_fixed();
+ valueChanged();
+ }
+ catch (BAD_OPERATION e)
+ {
+ InvalidValue t = new InvalidValue();
+ t.initCause(e);
+ throw t;
+ }
+ }
+
+ /**
+ * Create and return Any, holding this DynFixed value.
+ */
+ public Any to_any()
+ {
+ Any g = createAny();
+ g.insert_fixed(value, official_type);
+ return g;
+ }
+} \ No newline at end of file