diff options
| author | Martin Ritchie <ritchiem@apache.org> | 2006-12-07 15:43:53 +0000 |
|---|---|---|
| committer | Martin Ritchie <ritchiem@apache.org> | 2006-12-07 15:43:53 +0000 |
| commit | 9ae15d264484139b849c3313b334039fd54c8b14 (patch) | |
| tree | 60193351e050bba307873770c15db84f0a4f1dcc /java/common/src/main | |
| parent | 6ac17dd83396f3ef010419ec273aa01612246725 (diff) | |
| download | qpid-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.java | 255 | ||||
| -rw-r--r-- | java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java | 132 |
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; |
