in proton-j/src/main/java/org/apache/qpid/proton/codec/ArrayType.java [105:193]
private static TypeEncoding<?> calculateEncoder(final Object[] val, final EncoderImpl encoder)
{
if(val.length == 0)
{
AMQPType underlyingType = encoder.getTypeFromClass(val.getClass().getComponentType());
return underlyingType.getCanonicalEncoding();
}
else
{
AMQPType underlyingType = encoder.getTypeFromClass(val.getClass().getComponentType());
boolean checkTypes = false;
if(val[0].getClass().isArray() && val[0].getClass().getComponentType().isPrimitive())
{
Class componentType = val[0].getClass().getComponentType();
if(componentType == Boolean.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((boolean[])val[0]);
}
else if(componentType == Byte.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((byte[])val[0]);
}
else if(componentType == Short.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((short[])val[0]);
}
else if(componentType == Integer.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((int[])val[0]);
}
else if(componentType == Long.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((long[])val[0]);
}
else if(componentType == Float.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((float[])val[0]);
}
else if(componentType == Double.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((double[])val[0]);
}
else if(componentType == Character.TYPE)
{
return ((ArrayType)underlyingType).getEncoding((char[])val[0]);
}
else
{
throw new IllegalArgumentException("Cannot encode arrays of type " + componentType.getName());
}
}
else
{
if(underlyingType == null)
{
checkTypes = true;
underlyingType = encoder.getType(val[0]);
}
TypeEncoding underlyingEncoding = underlyingType.getEncoding(val[0]);
TypeEncoding canonicalEncoding = underlyingType.getCanonicalEncoding();
for(int i = 0; i < val.length && (checkTypes || underlyingEncoding != canonicalEncoding); i++)
{
if(checkTypes && encoder.getType(val[i]) != underlyingType)
{
throw new IllegalArgumentException("Non matching types " + underlyingType + " and " + encoder
.getType(val[i]) + " in array");
}
TypeEncoding elementEncoding = underlyingType.getEncoding(val[i]);
if(elementEncoding != underlyingEncoding && !underlyingEncoding.encodesSuperset(elementEncoding))
{
if(elementEncoding.encodesSuperset(underlyingEncoding))
{
underlyingEncoding = elementEncoding;
}
else
{
underlyingEncoding = canonicalEncoding;
}
}
}
return underlyingEncoding;
}
}
}