package org.jacorb.notification.filter;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1999-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
import java.lang.reflect.Field;
import org.omg.CORBA.Any;
import org.omg.CORBA.TCKind;
import org.omg.CORBA.TypeCodePackage.BadKind;
import org.omg.CORBA.TypeCodePackage.Bounds;
/**
* @author Alphonse Bendt
*/
public class EvaluationResult
{
public static final EvaluationResult BOOL_TRUE;
public static final EvaluationResult BOOL_FALSE;
// //////////////////////////////////////
static
{
EvaluationResult _r = new EvaluationResult();
_r.setBool(true);
BOOL_TRUE = wrapImmutable(_r);
_r = new EvaluationResult();
_r.setBool(false);
BOOL_FALSE = wrapImmutable(_r);
}
// //////////////////////////////////////
private int typeCode_;
private Object value_;
private Any any_;
// //////////////////////////////////////
protected Object getValue()
{
return value_;
}
private Object setValue(Object value)
{
Object _old = value_;
value_ = value;
return _old;
}
public boolean isLongLong()
{
return typeCode_ == TCKind._tk_longlong;
}
public boolean isDouble()
{
return typeCode_ == TCKind._tk_double;
}
public boolean isFloat()
{
return typeCode_ == TCKind._tk_float;
}
public boolean isLong()
{
return typeCode_ == TCKind._tk_long;
}
public boolean isString()
{
return typeCode_ == TCKind._tk_string;
}
public void setString(String s)
{
setValue(s);
typeCode_ = TCKind._tk_string;
}
public void setFloat(float f)
{
setFloat(new Double(f));
}
public void setFloat(double d)
{
setFloat(new Double(d));
}
public void setFloat(Double d)
{
setValue(d);
typeCode_ = TCKind._tk_float;
}
public void setLongLong(long l)
{
setLongLong(new Double(l));
}
public void setLongLong(Double d)
{
setValue(d);
typeCode_ = TCKind._tk_longlong;
}
public void setLong(int l)
{
setLong(new Double(l));
}
public void setLong(Double d)
{
setValue(d);
typeCode_ = TCKind._tk_long;
}
public void setDouble(Double d)
{
setValue(d);
typeCode_ = TCKind._tk_double;
}
public void setDouble(double d)
{
setDouble(new Double(d));
}
public String getString() throws DynamicTypeException
{
try
{
return (String) getValue();
} catch (ClassCastException c)
{
throw newDynamicTypeException("String");
}
}
private DynamicTypeException newDynamicTypeException(String type)
{
return new DynamicTypeException("could not convert value: " + getValue() + " to " + type);
}
private static DynamicTypeException newDynamicTypeException(String operand,
EvaluationResult left, EvaluationResult right)
{
return new DynamicTypeException("failed to " + operand + ": incompatible operands " + left
+ " and " + right);
}
public long getLongLong() throws DynamicTypeException
{
if (getValue() == null)
{
return any_.extract_longlong();
}
try
{
return ((Double) getValue()).longValue();
} catch (ClassCastException e)
{
// ignored. will retry
}
try
{
return ((Boolean) getValue()).booleanValue() ? 1l : 0;
} catch (ClassCastException e)
{
// ignored. will retry
}
try
{
String _s = (String) getValue();
if (_s.length() == 1)
{
return _s.charAt(0);
}
} catch (ClassCastException e)
{
// ignored. will throw error
}
throw newDynamicTypeException("LongLong");
}
public int getLong() throws DynamicTypeException
{
if (getValue() != null)
{
try
{
return ((Double) getValue()).intValue();
} catch (ClassCastException e)
{
// ignored. will retry
}
try
{
return ((Boolean) getValue()).booleanValue() ? 1 : 0;
} catch (ClassCastException e)
{
// ignored. will retry
}
try
{
String _s = (String) getValue();
if (_s.length() == 1)
{
return _s.charAt(0);
}
} catch (ClassCastException e)
{
// ignored. will throw error
}
}
else
{
return any_.extract_long();
}
throw newDynamicTypeException("Long");
}
public double getDouble() throws DynamicTypeException
{
try
{
return ((Double) getValue()).doubleValue();
} catch (ClassCastException e)
{
// ignored. will retry.
}
try
{
return ((Boolean) getValue()).booleanValue() ? 1d : 0;
} catch (ClassCastException e)
{
// ignored. will retry.
}
try
{
String _s = (String) getValue();
if (_s.length() == 1)
{
return _s.charAt(0);
}
} catch (ClassCastException e)
{
// ignored. will throw error
}
throw newDynamicTypeException("Double");
}
public float getFloat() throws DynamicTypeException
{
try
{
return ((Double) getValue()).floatValue();
}
catch (ClassCastException e)
{
// ignored. will retry.
}
try
{
return ((Boolean) getValue()).booleanValue() ? 1f : 0;
}
catch (ClassCastException e)
{
// ignored. will retry.
}
try
{
String _str = (String) getValue();
if (_str.length() == 1)
{
return _str.charAt(0);
}
}
catch (ClassCastException e)
{
// ignored. will throw error
}
throw newDynamicTypeException("Float");
}
public boolean getBool() throws DynamicTypeException
{
try
{
return ((Boolean) getValue()).booleanValue();
}
catch (ClassCastException c)
{
// ignored. will throw error
}
throw newDynamicTypeException("Boolean");
}
public void setBool(boolean value)
{
setValue(Boolean.valueOf(value));
typeCode_ = TCKind._tk_boolean;
}
public Any getAny()
{
return any_;
}
public void addAny(Any any)
{
any_ = any;
}
public void setAny(Any any)
{
addAny(any);
typeCode_ = any.type().kind().value();
}
private static String typeCodeToName(int x)
{
try
{
Field[] _fields = TCKind.class.getDeclaredFields();
return _fields[x].getName();
}
catch (Exception e)
{
return "unknown: " + x;
}
}
public String toString()
{
StringBuffer _buffer = new StringBuffer("{");
_buffer.append(getValue());
_buffer.append(";TC=");
_buffer.append(typeCodeToName(typeCode_));
_buffer.append(";any=");
_buffer.append(any_);
_buffer.append("}");
return _buffer.toString();
}
public boolean equals(Object o)
{
if (o instanceof EvaluationResult)
{
return (((EvaluationResult) o).getValue().equals(getValue()));
}
return super.equals(o);
}
public int hashCode()
{
return getValue().hashCode();
}
public int compareTo(EvaluationResult other) throws DynamicTypeException, EvaluationException
{
final int _result;
if (getValue() == null && any_ != null && other.getValue() instanceof String)
{
try
{
String _left = any_.type().member_name(0);
_result = _left.compareTo(other.getString());
} catch (BadKind e)
{
throw new EvaluationException(e);
} catch (Bounds e)
{
throw new EvaluationException(e);
}
}
else if (isString() || other.isString())
{
_result = getString().compareTo(other.getString());
}
else if (isFloat() || other.isFloat())
{
float _l = getFloat();
float _r = other.getFloat();
_result = Float.compare(_l, _r);
}
else if (isLongLong() || other.isLongLong())
{
long _l = getLongLong();
long _r = other.getLongLong();
_result = (_l<_r ? -1 : (_l==_r ? 0 : 1));
}
else
{
int _l = this.getLong();
int _r = other.getLong();
_result = _l - _r;
}
return _result;
}
public static EvaluationResult wrapImmutable(EvaluationResult e)
{
return new ImmutableEvaluationResultWrapper(e);
}
public static EvaluationResult plus(EvaluationResult left, EvaluationResult right)
throws DynamicTypeException
{
final EvaluationResult _res = new EvaluationResult();
if (left.isDouble() || right.isDouble())
{
_res.setDouble(left.getDouble() + right.getDouble());
}
else if (left.isFloat() || right.isFloat())
{
_res.setFloat(left.getDouble() + right.getDouble());
}
else if (left.isLongLong() || right.isLongLong())
{
_res.setLongLong(left.getLongLong() + right.getLongLong());
}
else if (left.isLong() || right.isLong())
{
_res.setLong(left.getLong() + right.getLong());
}
else
{
throw newDynamicTypeException("add", left, right);
}
return _res;
}
public static EvaluationResult minus(EvaluationResult left, EvaluationResult right)
throws DynamicTypeException
{
final EvaluationResult _res = new EvaluationResult();
if (left.isDouble() || right.isDouble())
{
_res.setDouble(left.getDouble() - right.getDouble());
}
else if (left.isFloat() || right.isFloat())
{
_res.setFloat(left.getDouble() - right.getDouble());
}
else if (left.isLongLong() || right.isLongLong())
{
_res.setLongLong(left.getLongLong() - right.getLongLong());
}
else if (left.isLong() || right.isLong())
{
_res.setLong(left.getLong() - right.getLong());
}
else
{
throw newDynamicTypeException("subtract", left, right);
}
return _res;
}
static public EvaluationResult unaryMinus(EvaluationResult r) throws DynamicTypeException
{
final EvaluationResult _ret = new EvaluationResult();
if (r.isFloat())
{
_ret.setFloat(-r.getFloat());
}
else
{ // (r.isFloat()) {
_ret.setDouble(-r.getDouble());
}
return _ret;
}
static public EvaluationResult div(EvaluationResult left, EvaluationResult right)
throws DynamicTypeException
{
final EvaluationResult _res = new EvaluationResult();
if (left.isDouble() || right.isDouble())
{
_res.setDouble(left.getDouble() / right.getDouble());
}
else if (left.isFloat() || right.isFloat())
{
_res.setFloat(left.getDouble() / right.getDouble());
}
else if (left.isLongLong() || right.isLongLong())
{
_res.setLongLong(left.getLongLong() / right.getLongLong());
}
else if (left.isLong() || right.isLong())
{
_res.setLong(left.getLong() / right.getLong());
}
else
{
throw newDynamicTypeException("divide", left, right);
}
return _res;
}
static public EvaluationResult mult(EvaluationResult left, EvaluationResult right)
throws DynamicTypeException
{
final EvaluationResult _res = new EvaluationResult();
if (left.isDouble() || right.isDouble())
{
_res.setDouble(left.getDouble() * right.getDouble());
}
else if (left.isFloat() || right.isFloat())
{
_res.setFloat(left.getDouble() * right.getDouble());
}
else if (left.isLongLong() || right.isLongLong())
{
_res.setLongLong(left.getLongLong() * right.getLongLong());
}
else if (left.isLong() || right.isLong())
{
_res.setLong(left.getLong() * right.getLong());
}
else
{
throw newDynamicTypeException("multiply", left, right);
}
return _res;
}
public static EvaluationResult fromAny(Any any)
{
if (any == null)
{
return null;
}
final EvaluationResult result;
switch (any.type().kind().value()) {
case TCKind._tk_any:
result = fromAny(any.extract_any());
break;
default:
result = new EvaluationResult();
extractIntoEvaluationResult(result, any);
}
return result;
}
private static void extractIntoEvaluationResult(EvaluationResult result, Any any)
{
switch (any.type().kind().value()) {
case TCKind._tk_boolean:
result.setBool(any.extract_boolean());
break;
case TCKind._tk_string:
result.setString(any.extract_string());
break;
case TCKind._tk_long:
result.setLong(any.extract_long());
break;
case TCKind._tk_short:
result.setLong(any.extract_short());
break;
case TCKind._tk_ulonglong:
result.setLongLong(any.extract_ulonglong());
break;
case TCKind._tk_float:
result.setFloat(any.extract_float());
break;
case TCKind._tk_double:
result.setDouble(any.extract_double());
break;
default:
result.setAny(any);
break;
}
}
}
class ImmutableEvaluationResultWrapper extends EvaluationResult
{
private final EvaluationResult delegate_;
// //////////////////////////////////////
ImmutableEvaluationResultWrapper(EvaluationResult delegate)
{
delegate_ = delegate;
}
// //////////////////////////////////////
public Object getValue()
{
return delegate_.getValue();
}
public float getFloat() throws DynamicTypeException
{
return delegate_.getFloat();
}
public boolean equals(Object object)
{
return delegate_.equals(object);
}
public int hashCode()
{
return delegate_.hashCode();
}
public String toString()
{
return delegate_.toString();
}
public String getString() throws DynamicTypeException
{
return delegate_.getString();
}
public boolean isString()
{
return delegate_.isString();
}
public boolean isLong()
{
return delegate_.isLong();
}
public boolean isFloat()
{
return delegate_.isFloat();
}
public boolean isDouble()
{
return delegate_.isDouble();
}
public boolean getBool() throws DynamicTypeException
{
return delegate_.getBool();
}
public Any getAny()
{
return delegate_.getAny();
}
public void setString(String s)
{
unsupported();
}
public void setFloat(float f)
{
unsupported();
}
public void setFloat(Double d)
{
unsupported();
}
public void setInt(int i)
{
unsupported();
}
public void setInt(Double i)
{
unsupported();
}
public void setBool(boolean b)
{
unsupported();
}
public void addAny(Any a)
{
unsupported();
}
private static void unsupported()
{
throw new UnsupportedOperationException();
}
}
class DynamicTypeException extends EvaluationException
{
private static final long serialVersionUID = 1L;
public DynamicTypeException()
{
super();
}
public DynamicTypeException(String msg)
{
super(msg);
}
}