summaryrefslogtreecommitdiff
path: root/java/common/src/main
diff options
context:
space:
mode:
authorMartin Ritchie <ritchiem@apache.org>2006-12-07 15:43:53 +0000
committerMartin Ritchie <ritchiem@apache.org>2006-12-07 15:43:53 +0000
commit9ae15d264484139b849c3313b334039fd54c8b14 (patch)
tree60193351e050bba307873770c15db84f0a4f1dcc /java/common/src/main
parent6ac17dd83396f3ef010419ec273aa01612246725 (diff)
downloadqpid-python-9ae15d264484139b849c3313b334039fd54c8b14.tar.gz
QPID-9
BasicContentHeaderPropertiesTest.java & PropertyFieldTableTest.java updated to use EncodingUtils.java to calculate expected Sizes. PropertyFieldTable.java - Updated to use wider range of encoded values, Rather than very wasteful XML encoding. EncodingUtils.java - updated to centralise the new encodings. added target to ignore on eclipse-plugin folder git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@483503 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/common/src/main')
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java255
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java132
2 files changed, 255 insertions, 132 deletions
diff --git a/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java b/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
index 97fb434e1c..65589a0cb9 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
@@ -108,9 +108,7 @@ public class EncodingUtils
{
encodedString[i] = (byte) cha[i];
}
- // TODO: check length fits in an unsigned byte
- writeUnsignedByte(buffer, (short) encodedString.length);
- buffer.put(encodedString);
+ writeBytes(buffer,encodedString);
}
else
{
@@ -243,6 +241,7 @@ public class EncodingUtils
/**
* This is used for writing longstrs.
+ *
* @param buffer
* @param data
*/
@@ -363,97 +362,6 @@ public class EncodingUtils
return buffer.getUnsignedInt();
}
- // Will barf with a NPE on a null input. Not sure whether it should return null or
- // an empty field-table (which would be slower - perhaps unnecessarily).
- //
- // Some sample input and the result output:
- //
- // Input: "a=1" "a=2 c=3" "a=3 c=4 d" "a='four' b='five'" "a=bad"
- //
- // Parsing <a=1>...
- // {a=1}
- // Parsing <a=2 c=3>...
- // {a=2, c=3}
- // Parsing <a=3 c=4 d>...
- // {a=3, c=4, d=null}
- // Parsing <a='four' b='five'>...
- // {a=four, b=five}
- // Parsing <a=bad>...
- // java.lang.IllegalArgumentException: a: Invalid integer in <bad> from <a=bad>.
- //
- public static FieldTable createFieldTableFromMessageSelector(String selector)
- {
- boolean debug = _logger.isDebugEnabled();
-
- // TODO: Doesn't support embedded quotes properly.
- String[] expressions = selector.split(" +");
-
- FieldTable result = FieldTableFactory.newFieldTable();
-
- for (int i = 0; i < expressions.length; i++)
- {
- String expr = expressions[i];
-
- if (debug)
- {
- _logger.debug("Expression = <" + expr + ">");
- }
-
- int equals = expr.indexOf('=');
-
- if (equals < 0)
- {
- // Existence check
- result.put("S" + expr.trim(), null);
- }
- else
- {
- String key = expr.substring(0, equals).trim();
- String value = expr.substring(equals + 1).trim();
-
- if (debug)
- {
- _logger.debug("Key = <" + key + ">, Value = <" + value + ">");
- }
-
- if (value.charAt(0) == '\'')
- {
- if (value.charAt(value.length() - 1) != '\'')
- {
- throw new IllegalArgumentException(key + ": Missing quote in <" + value + "> from <" + selector + ">.");
- }
- else
- {
- value = value.substring(1, value.length() - 1);
-
- result.put("S" + key, value);
- }
- }
- else
- {
- try
- {
- int intValue = Integer.parseInt(value);
-
- result.put("i" + key, value);
- }
- catch (NumberFormatException e)
- {
- throw new IllegalArgumentException(key + ": Invalid integer in <" + value + "> from <" + selector + ">.");
-
- }
- }
- }
- }
-
- if (debug)
- {
- _logger.debug("Field-table created from <" + selector + "> is <" + result + ">");
- }
-
- return (result);
-
- }
static byte[] hexToByteArray(String id)
{
@@ -526,24 +434,155 @@ public class EncodingUtils
return (new String(convertToHexCharArray(from)));
}
- public static void main(String[] args)
+ private static char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+ //**** new methods
+
+ // BOOLEAN_PROPERTY_PREFIX
+
+ public static void writeBoolean(ByteBuffer buffer, Boolean aBoolean)
{
- for (int i = 0; i < args.length; i++)
- {
- String selector = args[i];
+ buffer.put((byte) (aBoolean ? 1 : 0));
+ }
+
+ public static Boolean readBoolean(ByteBuffer buffer)
+ {
+ byte packedValue = buffer.get();
+ return (packedValue == 1);
+ }
- System.err.println("Parsing <" + selector + ">...");
+ public static int encodedBooleanLength()
+ {
+ return 1;
+ }
- try
- {
- System.err.println(createFieldTableFromMessageSelector(selector));
- }
- catch (IllegalArgumentException e)
- {
- System.err.println(e);
- }
+ // BYTE_PROPERTY_PREFIX
+ public static void writeByte(ByteBuffer buffer, Byte aByte)
+ {
+ buffer.put(aByte);
+ }
+
+ public static Byte readByte(ByteBuffer buffer)
+ {
+ return buffer.get();
+ }
+
+ public static int encodedByteLength()
+ {
+ return 1;
+ }
+
+
+ // SHORT_PROPERTY_PREFIX
+ public static void writeShort(ByteBuffer buffer, Short aShort)
+ {
+ buffer.putShort(aShort);
+ }
+
+ public static Short readShort(ByteBuffer buffer)
+ {
+ return buffer.getShort();
+ }
+
+ public static int encodedShortLength()
+ {
+ return 2;
+ }
+
+ // INTEGER_PROPERTY_PREFIX
+ public static void writeInteger(ByteBuffer buffer, Integer aInteger)
+ {
+ buffer.putInt(aInteger);
+ }
+
+ public static Integer readInteger(ByteBuffer buffer)
+ {
+ return buffer.getInt();
+ }
+
+ public static int encodedIntegerLength()
+ {
+ return 4;
+ }
+
+ // LONG_PROPERTY_PREFIX
+ public static void writeLong(ByteBuffer buffer, Long aLong)
+ {
+ buffer.putLong(aLong);
+ }
+
+ public static Long readLong(ByteBuffer buffer)
+ {
+ return buffer.getLong();
+ }
+
+ public static int encodedLongLength()
+ {
+ return 8;
+ }
+
+ // Float_PROPERTY_PREFIX
+ public static void writeFloat(ByteBuffer buffer, Float aFloat)
+ {
+ buffer.putFloat(aFloat);
+ }
+
+ public static Float readFloat(ByteBuffer buffer)
+ {
+ return buffer.getFloat();
+ }
+
+ public static int encodedFloatLength()
+ {
+ return 4;
+ }
+
+
+ // Double_PROPERTY_PREFIX
+ public static void writeDouble(ByteBuffer buffer, Double aDouble)
+ {
+ buffer.putDouble(aDouble);
+ }
+
+ public static Double readDouble(ByteBuffer buffer)
+ {
+ return buffer.getDouble();
+ }
+
+ public static int encodedDoubleLength()
+ {
+ return 8;
+ }
+
+
+ public static byte[] readBytes(ByteBuffer buffer)
+ {
+ short length = buffer.getUnsigned();
+ if (length == 0)
+ {
+ return null;
+ }
+ else
+ {
+ byte[] dataBytes = new byte[length];
+ buffer.get(dataBytes, 0, length);
+
+ return dataBytes;
}
}
- private static char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+ public static void writeBytes(ByteBuffer buffer, byte[] data)
+ {
+ if (data != null)
+ {
+ // TODO: check length fits in an unsigned byte
+ writeUnsignedByte(buffer, (short) data.length);
+ buffer.put(data);
+ }
+ else
+ {
+ // really writing out unsigned byte
+ buffer.put((byte) 0);
+ }
+ }
}
diff --git a/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java b/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
index 36558011ac..214af64be4 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
@@ -42,17 +42,21 @@ public class PropertyFieldTable implements FieldTable, Map
public static final char AMQP_UNSIGNEDINT_PROPERTY_PREFIX = 'I';
public static final char AMQP_TIMESTAMP_PROPERTY_PREFIX = 'T';
public static final char AMQP_STRING_PROPERTY_PREFIX = 'S';
+ public static final char AMQP_ASCII_STRING_PROPERTY_PREFIX = 'c';
+ public static final char AMQP_WIDE_STRING_PROPERTY_PREFIX = 'C';
+ public static final char AMQP_BINARY_PROPERTY_PREFIX = 'x';
- public static final char BOOLEAN_PROPERTY_PREFIX = 'B';
+ public static final char BOOLEAN_PROPERTY_PREFIX = 't';
public static final char BYTE_PROPERTY_PREFIX = 'b';
public static final char SHORT_PROPERTY_PREFIX = 's';
public static final char INT_PROPERTY_PREFIX = 'i';
public static final char LONG_PROPERTY_PREFIX = 'l';
public static final char FLOAT_PROPERTY_PREFIX = 'f';
public static final char DOUBLE_PROPERTY_PREFIX = 'd';
+
public static final char STRING_PROPERTY_PREFIX = AMQP_STRING_PROPERTY_PREFIX;
- public static final char CHAR_PROPERTY_PREFIX = 'c';
- public static final char BYTES_PROPERTY_PREFIX = 'y';
+ public static final char CHAR_PROPERTY_PREFIX = AMQP_ASCII_STRING_PROPERTY_PREFIX;
+ public static final char BYTES_PROPERTY_PREFIX = AMQP_BINARY_PROPERTY_PREFIX;
//Our custom prefix for encoding across the wire
private static final char XML_PROPERTY_PREFIX = 'X';
@@ -121,7 +125,7 @@ public class PropertyFieldTable implements FieldTable, Map
{
return null;
}
-
+
if (type.equals("" + prefix))
{
return _properties.get(propertyName);
@@ -963,22 +967,59 @@ public class PropertyFieldTable implements FieldTable, Map
switch (propertyPrefix)
{
+ case BOOLEAN_PROPERTY_PREFIX:
+ buffer.put((byte) BOOLEAN_PROPERTY_PREFIX);
+ EncodingUtils.writeBoolean(buffer, (Boolean) value);
+ break;
+ case BYTE_PROPERTY_PREFIX:
+ buffer.put((byte) BYTE_PROPERTY_PREFIX);
+ EncodingUtils.writeByte(buffer, (Byte) value);
+ break;
+ case SHORT_PROPERTY_PREFIX:
+ buffer.put((byte) SHORT_PROPERTY_PREFIX);
+ EncodingUtils.writeShort(buffer, (Short) value);
+ break;
+ case INT_PROPERTY_PREFIX:
+ buffer.put((byte) INT_PROPERTY_PREFIX);
+ EncodingUtils.writeInteger(buffer, (Integer) value);
+ break;
+ case AMQP_UNSIGNEDINT_PROPERTY_PREFIX: // Currently we don't create these
+ buffer.put((byte) AMQP_UNSIGNEDINT_PROPERTY_PREFIX);
+ EncodingUtils.writeUnsignedInteger(buffer, (Long) value);
+ break;
+ case LONG_PROPERTY_PREFIX:
+ buffer.put((byte) LONG_PROPERTY_PREFIX);
+ EncodingUtils.writeLong(buffer, (Long) value);
+ break;
+ case FLOAT_PROPERTY_PREFIX:
+ buffer.put((byte) FLOAT_PROPERTY_PREFIX);
+ EncodingUtils.writeFloat(buffer, (Float) value);
+ break;
+ case DOUBLE_PROPERTY_PREFIX:
+ buffer.put((byte) DOUBLE_PROPERTY_PREFIX);
+ EncodingUtils.writeDouble(buffer, (Double) value);
+ break;
+
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ //case AMQP_STRING_PROPERTY_PREFIX:
case STRING_PROPERTY_PREFIX:
// TODO: look at using proper charset encoder
buffer.put((byte) STRING_PROPERTY_PREFIX);
EncodingUtils.writeLongStringBytes(buffer, (String) value);
break;
- case AMQP_UNSIGNEDINT_PROPERTY_PREFIX:
- case LONG_PROPERTY_PREFIX:
- case INT_PROPERTY_PREFIX:
- case BOOLEAN_PROPERTY_PREFIX:
- case BYTE_PROPERTY_PREFIX:
- case SHORT_PROPERTY_PREFIX:
- case FLOAT_PROPERTY_PREFIX:
- case DOUBLE_PROPERTY_PREFIX:
+ //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
case CHAR_PROPERTY_PREFIX:
+ // TODO: look at using proper charset encoder
+ buffer.put((byte) CHAR_PROPERTY_PREFIX);
+ EncodingUtils.writeShortStringBytes(buffer, "" + (Character) value);
+ break;
+
case BYTES_PROPERTY_PREFIX:
+ buffer.put((byte) BYTES_PROPERTY_PREFIX);
+ EncodingUtils.writeBytes(buffer, (byte[]) value);
+ break;
+
case XML_PROPERTY_PREFIX:
// Encode as XML
buffer.put((byte) XML_PROPERTY_PREFIX);
@@ -986,7 +1027,6 @@ public class PropertyFieldTable implements FieldTable, Map
break;
default:
{
-
// Should never get here
throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
}
@@ -1011,18 +1051,42 @@ public class PropertyFieldTable implements FieldTable, Map
switch (type)
{
- case STRING_PROPERTY_PREFIX:
- value = EncodingUtils.readLongString(buffer);
- break;
- case LONG_PROPERTY_PREFIX:
- case INT_PROPERTY_PREFIX:
case BOOLEAN_PROPERTY_PREFIX:
+ value = EncodingUtils.readBoolean(buffer);
+ break;
case BYTE_PROPERTY_PREFIX:
+ value = EncodingUtils.readByte(buffer);
+ break;
case SHORT_PROPERTY_PREFIX:
+ value = EncodingUtils.readShort(buffer);
+ break;
+ case INT_PROPERTY_PREFIX:
+ value = EncodingUtils.readInteger(buffer);
+ break;
+ case AMQP_UNSIGNEDINT_PROPERTY_PREFIX:// This will only fit in a long
+ case LONG_PROPERTY_PREFIX:
+ value = EncodingUtils.readLong(buffer);
+ break;
case FLOAT_PROPERTY_PREFIX:
+ value = EncodingUtils.readFloat(buffer);
+ break;
case DOUBLE_PROPERTY_PREFIX:
+ value = EncodingUtils.readDouble(buffer);
+ break;
+
+ // TODO: use proper charset decoder
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ //case AMQP_STRING_PROPERTY_PREFIX:
+ case STRING_PROPERTY_PREFIX:
+ value = EncodingUtils.readLongString(buffer);
+ break;
+ //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
case CHAR_PROPERTY_PREFIX:
+ value = EncodingUtils.readShortString(buffer).charAt(0);
+ break;
case BYTES_PROPERTY_PREFIX:
+ value = EncodingUtils.readBytes(buffer);
+ break;
case XML_PROPERTY_PREFIX:
processXMLLine(EncodingUtils.readLongString(buffer));
break;
@@ -1066,19 +1130,39 @@ public class PropertyFieldTable implements FieldTable, Map
switch (propertyPrefix)
{
- // the extra byte if for the type indicator that is written out
- case STRING_PROPERTY_PREFIX:
- encodingSize = 1 + EncodingUtils.encodedLongStringLength((String) value);
- break;
- case LONG_PROPERTY_PREFIX:
- case INT_PROPERTY_PREFIX:
case BOOLEAN_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedBooleanLength();
+ break;
case BYTE_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedByteLength();
+ break;
case SHORT_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedShortLength();
+ break;
+ case INT_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedIntegerLength();
+ break;
+ case LONG_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedLongLength();
+ break;
case FLOAT_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedFloatLength();
+ break;
case DOUBLE_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedDoubleLength();
+ break;
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ //case AMQP_STRING_PROPERTY_PREFIX:
+ case STRING_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedLongStringLength((String) value);
+ break;
+ //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
case CHAR_PROPERTY_PREFIX:
+ encodingSize = 1 + EncodingUtils.encodedShortStringLength("" + (Character) value);
+ break;
case BYTES_PROPERTY_PREFIX:
+ encodingSize = 1 + ((byte[]) value).length;
+ break;
case XML_PROPERTY_PREFIX:
encodingSize = 1 + EncodingUtils.encodedLongStringLength(valueAsXML(name, value));
break;