/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.binding.corba.types; import javax.xml.namespace.QName; import org.apache.cxf.binding.corba.CorbaStreamable; import org.omg.CORBA.Any; import org.omg.CORBA.TCKind; import org.omg.CORBA.TypeCode; public class CorbaPrimitiveHandler extends CorbaObjectHandler { private static final int UNSIGNED_MAX = 256; private Object value; private String valueAsString; private boolean objectSet; private Any any; public CorbaPrimitiveHandler(QName primName, QName primIdlType, TypeCode primTC, Object primType) { super(primName, primIdlType, primTC, primType); } public Object getValue() { return value; } public Any getAny() { return any; } public void setIntoAny(Any val, CorbaStreamable stream, boolean output) { any = val; if (stream != null) { val.insert_Streamable(stream); } if (output && value != null) { switch (this.typeCode.kind().value()) { case TCKind._tk_boolean: any.insert_boolean((Boolean)value); break; case TCKind._tk_char: any.insert_char(((Character)value).charValue()); break; case TCKind._tk_wchar: any.insert_wchar(((Character)value).charValue()); break; case TCKind._tk_octet: any.insert_octet(((Byte)value).byteValue()); break; case TCKind._tk_short: any.insert_short(((Short)value).shortValue()); break; case TCKind._tk_ushort: any.insert_ushort((short)((Integer)value).intValue()); break; case TCKind._tk_long: any.insert_long(((Integer)value).intValue()); break; case TCKind._tk_longlong: any.insert_longlong(((Long)value).longValue()); break; case TCKind._tk_ulong: any.insert_ulong((int)((Long)value).longValue()); break; case TCKind._tk_ulonglong: any.insert_ulonglong(((java.math.BigInteger)value).longValue()); break; case TCKind._tk_float: any.insert_float((Float)value); break; case TCKind._tk_double: any.insert_double((Double)value); break; case TCKind._tk_string: any.insert_string((String)value); break; case TCKind._tk_wstring: any.insert_wstring((String)value); break; default: // Default: assume that whatever stored the data will also know how to convert it into what // it needs. } } } public void setValue(Object obj) { objectSet = true; value = obj; if (any != null && value != null) { setIntoAny(any, null, true); } } public String getDataFromValue() { if (!objectSet && any != null) { return getDataFromAny(); } if (valueAsString != null) { return valueAsString; } String data = ""; switch (this.typeCode.kind().value()) { case TCKind._tk_boolean: data = ((Boolean)value).toString(); break; case TCKind._tk_char: char charValue = ((Character)value).charValue(); // outside the normal range it will -256 data = Byte.toString((byte)(charValue > Byte.MAX_VALUE ? charValue - UNSIGNED_MAX : charValue)); break; case TCKind._tk_wchar: data = ((Character)value).toString(); break; case TCKind._tk_octet: data = ((Byte)value).toString(); break; case TCKind._tk_short: data = ((Short)value).toString(); break; case TCKind._tk_ushort: data = ((Integer)value).toString(); break; case TCKind._tk_long: data = ((Integer)value).toString(); break; case TCKind._tk_longlong: data = ((Long)value).toString(); break; case TCKind._tk_ulong: data = ((Long)value).toString(); break; case TCKind._tk_ulonglong: data = ((java.math.BigInteger)value).toString(); break; case TCKind._tk_float: if (((Float)value).equals(Float.NEGATIVE_INFINITY)) { data = "-INF"; } else if (((Float)value).equals(Float.POSITIVE_INFINITY)) { data = "INF"; } else { data = ((Float)value).toString(); } break; case TCKind._tk_double: if (((Double)value).equals(Double.NEGATIVE_INFINITY)) { data = "-INF"; } else if (((Double)value).equals(Double.POSITIVE_INFINITY)) { data = "INF"; } else { data = ((Double)value).toString(); } break; case TCKind._tk_string: case TCKind._tk_wstring: data = (String)value; break; default: // Default: assume that whatever stored the data will also know how to convert it into what // it needs. data = value.toString(); } valueAsString = data; return data; } public void setValueFromData(String data) { Object obj = null; switch (typeCode.kind().value()) { case TCKind._tk_boolean: obj = Boolean.valueOf(data); break; case TCKind._tk_char: // A char is mapped to a byte, we need it as a character Byte byteValue = Byte.valueOf(data); // for values < 0 + 256 // This means that we can directly write out the chars in the normal // range 0-127 even when using UTF-8 obj = Character.valueOf((char)(byteValue.byteValue() < 0 ? byteValue.byteValue() + UNSIGNED_MAX : byteValue.byteValue())); break; case TCKind._tk_wchar: // A wide char is mapped to a string, we need it as a character obj = Character.valueOf(data.charAt(0)); break; case TCKind._tk_octet: obj = Short.valueOf(data).byteValue(); break; case TCKind._tk_short: obj = Short.valueOf(data); break; case TCKind._tk_ushort: obj = Integer.valueOf(data); break; case TCKind._tk_long: obj = Integer.valueOf(data); break; case TCKind._tk_longlong: obj = Long.valueOf(data); break; case TCKind._tk_ulong: obj = Long.valueOf(data); break; case TCKind._tk_ulonglong: obj = new java.math.BigInteger(data); break; case TCKind._tk_float: if ("INF".equals(data)) { obj = Float.POSITIVE_INFINITY; } else if ("-INF".equals(data)) { obj = Float.NEGATIVE_INFINITY; } else { obj = Float.valueOf(data); } break; case TCKind._tk_double: if ("INF".equals(data)) { obj = Double.POSITIVE_INFINITY; } else if ("-INF".equals(data)) { obj = Double.NEGATIVE_INFINITY; } else { obj = Double.valueOf(data); } break; case TCKind._tk_string: case TCKind._tk_wstring: obj = data; break; default: // Default: just store the data we were given. We'll expect that whatever stored the data // will also know how to convert it into what it needs. obj = data; } setValue(obj); } public String getDataFromAny() { String data = ""; if (valueAsString != null) { return valueAsString; } switch (this.typeCode.kind().value()) { case TCKind._tk_boolean: data = any.extract_boolean() ? "true" : "false"; break; case TCKind._tk_char: char charValue = any.extract_char(); // outside the normal range it will -256 data = Byte.toString((byte)(charValue > Byte.MAX_VALUE ? charValue - UNSIGNED_MAX : charValue)); break; case TCKind._tk_wchar: data = Character.toString(any.extract_wchar()); break; case TCKind._tk_octet: data = Byte.toString(any.extract_octet()); break; case TCKind._tk_short: data = Short.toString(any.extract_short()); break; case TCKind._tk_ushort: data = Integer.toString(any.extract_ushort()); break; case TCKind._tk_long: data = Integer.toString(any.extract_long()); break; case TCKind._tk_longlong: data = Long.toString(any.extract_longlong()); break; case TCKind._tk_ulong: { long l = any.extract_ulong(); data = Long.toString(l & 0xFFFFFFFFL); break; } case TCKind._tk_ulonglong: data = java.math.BigInteger.valueOf(any.extract_ulonglong()).toString(); break; case TCKind._tk_float: Float f = any.extract_float(); if (f.equals(Float.NEGATIVE_INFINITY)) { data = "-INF"; } else if (f.equals(Float.POSITIVE_INFINITY)) { data = "INF"; } else { data = f.toString(); } break; case TCKind._tk_double: Double d = any.extract_double(); if (d.equals(Double.NEGATIVE_INFINITY)) { data = "-INF"; } else if (d.equals(Double.POSITIVE_INFINITY)) { data = "INF"; } else { data = d.toString(); } break; case TCKind._tk_string: data = any.extract_string(); break; case TCKind._tk_wstring: data = any.extract_wstring(); break; default: //should not get here throw new RuntimeException("Unknown tc: " + this.typeCode); } valueAsString = data; return data; } public void clear() { value = null; objectSet = false; valueAsString = null; } }