You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ri...@apache.org on 2006/12/18 13:41:17 UTC
svn commit: r488251 [1/2] - in
/incubator/qpid/branches/jmsselectors/java/common: ./
src/main/java/org/apache/qpid/ src/main/java/org/apache/qpid/framing/
src/main/java/org/apache/qpid/pool/ src/main/java/org/apache/qpid/protocol/
src/main/java/org/apa...
Author: ritchiem
Date: Mon Dec 18 04:41:15 2006
New Revision: 488251
URL: http://svn.apache.org/viewvc?view=rev&rev=488251
Log:
Trunk Merges
Added:
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/AMQPInvalidClassException.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/AMQPInvalidClassException.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/Content.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/Content.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/pool/
- copied from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/pool/
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/session/
- copied from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/session/
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/session/TestSession.java
- copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/session/TestSession.java
Modified:
incubator/qpid/branches/jmsselectors/java/common/pom.xml
incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java
incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java
incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java
Modified: incubator/qpid/branches/jmsselectors/java/common/pom.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/pom.xml?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/pom.xml (original)
+++ incubator/qpid/branches/jmsselectors/java/common/pom.xml Mon Dec 18 04:41:15 2006
@@ -39,14 +39,14 @@
<spec.stylesheet>${basedir}/src/main/xsl/framing.xsl</spec.stylesheet>
<registry.stylesheet>${basedir}/src/main/xsl/registry.xsl</registry.stylesheet>
<registry.template>${basedir}/src/main/xsl/registry.template</registry.template>
- <generated.path>${project.build.directory}/generated/xsl</generated.path>
+ <generated.path>${project.build.directory}/generated-sources/xsl</generated.path>
<generated.package>org/apache/qpid/framing</generated.package>
<generated.dir>${generated.path}/${generated.package}</generated.dir>
<specs.dir>${topDirectoryLocation}/../specs</specs.dir>
</properties>
<build>
- <plugins>
+ <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
@@ -77,19 +77,6 @@
</plugins>
</build>
- <repositories>
- <repository>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <id>java.net repository</id>
- <name>Maven 1.x Repository</name>
- <url>httsp://maven-repository.dev.java.net/nonav/repository/</url>
- <layout>legacy</layout>
- </repository>
-
-
- </repositories>
<dependencies>
<dependency>
<groupId>log4j</groupId>
@@ -99,18 +86,13 @@
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
</dependency>
- <!-- dependency>
- <groupId>grizzly</groupId>
- <artifactId>grizzly</artifactId>
- <version>1.0.4</version>
- </dependency -->
<dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-jms_1.1_spec</artifactId>
- </dependency>
- <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jms_1.1_spec</artifactId>
</dependency>
</dependencies>
</project>
Modified: incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml (original)
+++ incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml Mon Dec 18 04:41:15 2006
@@ -21,6 +21,8 @@
<project name="Qpid Common Protocol Versions" default="generate">
<property name="saxon.jar" value="lib/saxon/saxon8.jar"/>
+ <!-- temporarily hard-wired XML spec version for build avoidance -->
+ <property name="amqp.xml" value="${specs.dir}/amqp-8.0.xml"/>
<macrodef name="saxon">
<attribute name="out"/>
@@ -61,8 +63,7 @@
flags="s" byline="true"/>
<!-- Create directory; generate from specification file -->
- <mkdir dir="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}"/>
- <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/results.out"
+ <saxon out="${generated.dir}/results.out"
src="${specs.dir}/amqp-@{ver}.xml"
xsl="${spec.stylesheet}">
<arg value="major=${@{ver}.amqp(major)}"/>
@@ -70,14 +71,14 @@
<arg value="registry_name=MainRegistry"/>
</saxon>
<!-- -->
- <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/cluster.out"
+ <saxon out="${generated.dir}/cluster.out"
src="${cluster.asl}"
xsl="${spec.stylesheet}">
<arg value="major=${@{ver}.amqp(major)}"/>
<arg value="minor=${@{ver}.amqp(minor)}"/>
<arg value="registry_name=ClusterRegistry"/>
</saxon>
- <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/registry.out"
+ <saxon out="${generated.dir}/registry.out"
src="${registry.template}"
xsl="${registry.stylesheet}">
<arg value="major=${@{ver}.amqp(major)}"/>
@@ -86,11 +87,10 @@
</sequential>
</macrodef>
-<!-- <uptodate property="generated" targetfile="${generated.dir}/results.out"
- srcfile="${amqp.xml}"/> -->
+ <uptodate property="generated" targetfile="${generated.dir}/results.out"
+ srcfile="${amqp.xml}"/>
-<!-- <target name="generate" unless="generated"> -->
- <target name="generate">
+ <target name="generate" unless="generated">
<mkdir dir="${generated.dir}"/>
<copy file="src/main/versions/ProtocolVersionList.java.tmpl" tofile="${proto_version}"
overwrite="true"/>
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java Mon Dec 18 04:41:15 2006
@@ -24,7 +24,7 @@
public abstract class AMQBody
{
- protected abstract byte getType();
+ protected abstract byte getFrameType();
/**
* Get the size of the body
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java Mon Dec 18 04:41:15 2006
@@ -45,7 +45,7 @@
public void writePayload(ByteBuffer buffer)
{
- buffer.put(bodyFrame.getType());
+ buffer.put(bodyFrame.getFrameType());
// TODO: how does channel get populated
EncodingUtils.writeUnsignedShort(buffer, channel);
EncodingUtils.writeUnsignedInteger(buffer, bodyFrame.getSize());
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java Mon Dec 18 04:41:15 2006
@@ -42,7 +42,7 @@
protected abstract void writeMethodPayload(ByteBuffer buffer);
- protected byte getType()
+ protected byte getFrameType()
{
return TYPE;
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java Mon Dec 18 04:41:15 2006
@@ -57,6 +57,8 @@
private FieldTable _headers;
+ private JMSPropertyFieldTable _jmsHeaders;
+
private byte _deliveryMode;
private byte _priority;
@@ -276,6 +278,7 @@
if ((_propertyFlags & (1 << 13)) > 0)
{
_headers = EncodingUtils.readFieldTable(buffer);
+ setJMSHeaders();
}
if ((_propertyFlags & (1 << 12)) > 0)
{
@@ -358,6 +361,8 @@
if ((_propertyFlags & (1 << 13)) > 0)
{
_headers = EncodingUtils.readFieldTable(buffer);
+ setJMSHeaders();
+
}
_decodedHeaders = true;
}
@@ -446,6 +451,26 @@
clearEncodedForm();
_propertyFlags |= (1 << 13);
_headers = headers;
+ setJMSHeaders();
+ }
+
+ private void setJMSHeaders()
+ {
+ if (_jmsHeaders == null)
+ {
+ _jmsHeaders = new JMSPropertyFieldTable(_headers);
+ }
+ else
+ {
+ _jmsHeaders.setFieldTable(_headers);
+ }
+ }
+
+ public JMSPropertyFieldTable getJMSHeaders()
+ {
+ //This will ensure we have a blank header
+ getHeaders();
+ return _jmsHeaders;
}
public byte getDeliveryMode()
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java Mon Dec 18 04:41:15 2006
@@ -28,7 +28,7 @@
public ByteBuffer payload;
- protected byte getType()
+ protected byte getFrameType()
{
return TYPE;
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java Mon Dec 18 04:41:15 2006
@@ -53,7 +53,7 @@
this.bodySize = bodySize;
}
- protected byte getType()
+ protected byte getFrameType()
{
return TYPE;
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java Mon Dec 18 04:41:15 2006
@@ -98,6 +98,12 @@
}
}
+ public static int encodedContentLength(Content table)
+ {
+ // TODO: New Content class required for AMQP 0-9.
+ return 0;
+ }
+
public static void writeShortStringBytes(ByteBuffer buffer, String s)
{
if (s != null)
@@ -108,9 +114,7 @@
{
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
{
@@ -195,6 +199,12 @@
}
}
+
+ public static long unsignedIntegerLength()
+ {
+ return 4;
+ }
+
public static void writeUnsignedInteger(ByteBuffer buffer, long l)
{
// TODO: Is this comparison safe? Do I need to cast RHS to long?
@@ -227,6 +237,11 @@
}
}
+ public static void writeContentBytes(ByteBuffer buffer, Content content)
+ {
+ // TODO: New Content class required for AMQP 0-9.
+ }
+
public static void writeBooleans(ByteBuffer buffer, boolean[] values)
{
byte packedValue = 0;
@@ -243,6 +258,7 @@
/**
* This is used for writing longstrs.
+ *
* @param buffer
* @param data
*/
@@ -290,6 +306,12 @@
}
}
+ public static Content readContent(ByteBuffer buffer) throws AMQFrameDecodingException
+ {
+ // TODO: New Content class required for AMQP 0-9.
+ return null;
+ }
+
public static String readShortString(ByteBuffer buffer)
{
short length = buffer.getUnsigned();
@@ -321,7 +343,7 @@
long length = buffer.getUnsignedInt();
if (length == 0)
{
- return null;
+ return "";
}
else
{
@@ -363,97 +385,6 @@
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 +457,174 @@
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
+
+ // AMQP_BOOLEAN_PROPERTY_PREFIX
+
+ public static void writeBoolean(ByteBuffer buffer, Boolean aBoolean)
+ {
+ buffer.put((byte) (aBoolean ? 1 : 0));
+ }
+
+ public static Boolean readBoolean(ByteBuffer buffer)
+ {
+ byte packedValue = buffer.get();
+ return (packedValue == 1);
+ }
+
+ public static int encodedBooleanLength()
+ {
+ return 1;
+ }
+
+ // AMQP_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;
+ }
+
+
+ // AMQP_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)
{
- for (int i = 0; i < args.length; i++)
+ buffer.putInt(aInteger);
+ }
+
+ public static Integer readInteger(ByteBuffer buffer)
+ {
+ return buffer.getInt();
+ }
+
+ public static int encodedIntegerLength()
+ {
+ return 4;
+ }
+
+ // AMQP_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
{
- String selector = args[i];
+ byte[] dataBytes = new byte[length];
+ buffer.get(dataBytes, 0, length);
- System.err.println("Parsing <" + selector + ">...");
+ return dataBytes;
+ }
+ }
- try
- {
- System.err.println(createFieldTableFromMessageSelector(selector));
- }
- catch (IllegalArgumentException e)
- {
- System.err.println(e);
- }
+ 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);
}
}
- private static char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+ //CHAR_PROPERTY
+ public static int encodedCharLength()
+ {
+ return encodedByteLength();
+ }
+
+ public static char readChar(ByteBuffer buffer)
+ {
+ //This is valid as we know that the Character is ASCII 0..127
+ return (char) buffer.get();
+ }
+
+ public static void writeChar(ByteBuffer buffer, char character)
+ {
+ //This is valid as we know that the Character is ASCII 0..127
+ writeByte(buffer, (byte) character);
+ }
+
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java Mon Dec 18 04:41:15 2006
@@ -93,4 +93,6 @@
public Object setObject(String string, Object object);
+ public boolean isNullStringValue(String name);
+
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java Mon Dec 18 04:41:15 2006
@@ -34,7 +34,7 @@
return new PropertyFieldTable(byteBuffer, length);
}
- public static PropertyFieldTable newFieldTable(String text)
+ public static FieldTable newFieldTable(String text)
{
return new PropertyFieldTable(text);
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java Mon Dec 18 04:41:15 2006
@@ -27,7 +27,7 @@
public static final byte TYPE = 8;
public static AMQFrame FRAME = new HeartbeatBody().toFrame();
- protected byte getType()
+ protected byte getFrameType()
{
return TYPE;
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java Mon Dec 18 04:41:15 2006
@@ -7,9 +7,9 @@
* 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
@@ -22,6 +22,7 @@
import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;
+import org.apache.qpid.AMQPInvalidClassException;
import java.util.Collection;
import java.util.Enumeration;
@@ -31,32 +32,13 @@
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;
+import java.util.HashMap;
//extends FieldTable
-public class PropertyFieldTable implements FieldTable, Map
+public class PropertyFieldTable implements FieldTable
{
private static final Logger _logger = Logger.getLogger(PropertyFieldTable.class);
-
- public static final char AMQP_DECIMAL_PROPERTY_PREFIX = 'D';
- 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 BOOLEAN_PROPERTY_PREFIX = 'B';
- 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';
-
- //Our custom prefix for encoding across the wire
- private static final char XML_PROPERTY_PREFIX = 'X';
-
private static final String BOOLEAN = "boolean";
private static final String BYTE = "byte";
private static final String BYTES = "bytes";
@@ -66,6 +48,7 @@
private static final String FLOAT = "float";
private static final String DOUBLE = "double";
private static final String STRING = "string";
+ private static final String NULL_STRING = "nullstring";
private static final String CHAR = "char";
private static final String UNKNOWN = "unknown type";
@@ -74,15 +57,67 @@
private static final String BYTES_CLOSE_XML = "</" + BYTES + ">";
private static final String BYTES_OPEN_XML_START = "<" + BYTES;
+ public static enum Prefix
+ {
+ //AMQP FieldTable Wire Types
+ AMQP_DECIMAL_PROPERTY_PREFIX('D'),
+ AMQP_UNSIGNED_SHORT_PROPERTY_PREFIX('S'),
+ AMQP_UNSIGNED_INT_PROPERTY_PREFIX('I'),
+ AMQP_UNSIGNED_LONG_PROPERTY_PREFIX('L'),
+ AMQP_DOUBLE_EXTTENDED_PROPERTY_PREFIX('D'),
+
+ AMQP_TIMESTAMP_PROPERTY_PREFIX('T'),
+ AMQP_BINARY_PROPERTY_PREFIX('x'),
+
+ //Strings
+ AMQP_ASCII_STRING_PROPERTY_PREFIX('c'),
+ AMQP_WIDE_STRING_PROPERTY_PREFIX('C'),
+ AMQP_NULL_STRING_PROPERTY_PREFIX('n'),
+
+ //Java Primative Types
+ AMQP_BOOLEAN_PROPERTY_PREFIX('t'),
+ AMQP_BYTE_PROPERTY_PREFIX('b'),
+ AMQP_ASCII_CHARACTER_PROPERTY_PREFIX('k'),
+ AMQP_SHORT_PROPERTY_PREFIX('s'),
+ AMQP_INT_PROPERTY_PREFIX('i'),
+ AMQP_LONG_PROPERTY_PREFIX('l'),
+ AMQP_FLOAT_PROPERTY_PREFIX('f'),
+ AMQP_DOUBLE_PROPERTY_PREFIX('d');
+
+ private final char _identifier;
+
+ Prefix(char identifier)
+ {
+ _identifier = identifier;
+ //_reverseTypeMap.put(identifier, this);
+ }
+
+ public final char identifier()
+ {
+ return _identifier;
+ }
+
+ }
+
+ public static Map<Character, Prefix> _reverseTypeMap = new HashMap<Character, Prefix>();
+
+ static
+ {
+ for (Prefix p : Prefix.values())
+ {
+ _reverseTypeMap.put(p.identifier(), p);
+ }
+ }
+
private LinkedHashMap<String, Object> _properties;
- private LinkedHashMap<String, String> _propertyNamesTypeMap;
+ private LinkedHashMap<String, Prefix> _propertyNamesTypeMap;
private long _encodedSize = 0;
public PropertyFieldTable()
{
super();
_properties = new LinkedHashMap<String, Object>();
- _propertyNamesTypeMap = new LinkedHashMap<String, String>();
+ _propertyNamesTypeMap = new LinkedHashMap<String, Prefix>();
}
public PropertyFieldTable(String textFormat)
@@ -94,7 +129,8 @@
}
catch (Exception e)
{
- _logger.error("Unable to decode PropertyFieldTable format:" + textFormat, e);
+ _logger.warn("Unable to decode PropertyFieldTable format:" + textFormat, e);
+ throw new IllegalArgumentException("Unable to decode PropertyFieldTable format:" + textFormat);
}
}
@@ -112,17 +148,17 @@
}
// ************ Getters
-
- private Object get(String propertyName, char prefix)
+ private Object get(String propertyName, Prefix prefix)
{
- String type = _propertyNamesTypeMap.get(propertyName);
+ //Retrieve the type associated with this name
+ Prefix type = _propertyNamesTypeMap.get(propertyName);
if (type == null)
{
return null;
}
-
- if (type.equals("" + prefix))
+
+ if (type.equals(prefix))
{
return _properties.get(propertyName);
}
@@ -134,8 +170,8 @@
public Boolean getBoolean(String string)
{
- Object o = get(string, BOOLEAN_PROPERTY_PREFIX);
- if (o != null)
+ Object o = get(string, Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX);
+ if (o != null && o instanceof Boolean)
{
return (Boolean) o;
}
@@ -147,7 +183,7 @@
public Byte getByte(String string)
{
- Object o = get(string, BYTE_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_BYTE_PROPERTY_PREFIX);
if (o != null)
{
return (Byte) o;
@@ -160,7 +196,7 @@
public Short getShort(String string)
{
- Object o = get(string, SHORT_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_SHORT_PROPERTY_PREFIX);
if (o != null)
{
return (Short) o;
@@ -173,7 +209,7 @@
public Integer getInteger(String string)
{
- Object o = get(string, INT_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_INT_PROPERTY_PREFIX);
if (o != null)
{
return (Integer) o;
@@ -186,7 +222,7 @@
public Long getLong(String string)
{
- Object o = get(string, LONG_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_LONG_PROPERTY_PREFIX);
if (o != null)
{
return (Long) o;
@@ -199,7 +235,7 @@
public Float getFloat(String string)
{
- Object o = get(string, FLOAT_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_FLOAT_PROPERTY_PREFIX);
if (o != null)
{
return (Float) o;
@@ -212,7 +248,7 @@
public Double getDouble(String string)
{
- Object o = get(string, DOUBLE_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_DOUBLE_PROPERTY_PREFIX);
if (o != null)
{
return (Double) o;
@@ -225,20 +261,63 @@
public String getString(String string)
{
- Object o = get(string, STRING_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX);
if (o != null)
{
return (String) o;
}
else
{
- return null;
+ o = get(string, Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX);
+ if (o != null)
+ {
+ return (String) o;
+ }
+ else
+ {
+
+ Prefix type = _propertyNamesTypeMap.get(string);
+
+ if (type == null || type.equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX))
+ {
+ return null;
+ }
+ else
+ {
+ switch (type)
+ {
+ case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ case AMQP_BINARY_PROPERTY_PREFIX:
+ return null;
+ default:
+ case AMQP_BYTE_PROPERTY_PREFIX:
+ case AMQP_BOOLEAN_PROPERTY_PREFIX:
+ case AMQP_SHORT_PROPERTY_PREFIX:
+ case AMQP_INT_PROPERTY_PREFIX:
+ case AMQP_LONG_PROPERTY_PREFIX:
+ case AMQP_FLOAT_PROPERTY_PREFIX:
+ case AMQP_DOUBLE_PROPERTY_PREFIX:
+ return String.valueOf(_properties.get(string));
+ case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+ Object value = _properties.get(string);
+ if (value == null)
+ {
+ throw new NullPointerException("null char cannot be converted to String");
+ }
+ else
+ {
+ return String.valueOf(value);
+ }
+ }
+ }
+ }
}
}
public Character getCharacter(String string)
{
- Object o = get(string, CHAR_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX);
if (o != null)
{
return (Character) o;
@@ -251,7 +330,7 @@
public byte[] getBytes(String string)
{
- Object o = get(string, BYTES_PROPERTY_PREFIX);
+ Object o = get(string, Prefix.AMQP_BINARY_PROPERTY_PREFIX);
if (o != null)
{
return (byte[]) o;
@@ -271,47 +350,62 @@
public Object setBoolean(String string, boolean b)
{
- return put(BOOLEAN_PROPERTY_PREFIX + string, b);
+ return put(Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX, string, b);
}
public Object setByte(String string, byte b)
{
- return put(BYTE_PROPERTY_PREFIX + string, b);
+ return put(Prefix.AMQP_BYTE_PROPERTY_PREFIX, string, b);
}
public Object setShort(String string, short i)
{
- return put(SHORT_PROPERTY_PREFIX + string, i);
+ return put(Prefix.AMQP_SHORT_PROPERTY_PREFIX, string, i);
}
public Object setInteger(String string, int i)
{
- return put(INT_PROPERTY_PREFIX + string, i);
+ return put(Prefix.AMQP_INT_PROPERTY_PREFIX, string, i);
}
public Object setLong(String string, long l)
{
- return put(LONG_PROPERTY_PREFIX + string, l);
+ return put(Prefix.AMQP_LONG_PROPERTY_PREFIX, string, l);
}
public Object setFloat(String string, float v)
{
- return put(FLOAT_PROPERTY_PREFIX + string, v);
+ return put(Prefix.AMQP_FLOAT_PROPERTY_PREFIX, string, v);
}
public Object setDouble(String string, double v)
{
- return put(DOUBLE_PROPERTY_PREFIX + string, v);
+ return put(Prefix.AMQP_DOUBLE_PROPERTY_PREFIX, string, v);
}
public Object setString(String string, String string1)
{
- return put(STRING_PROPERTY_PREFIX + string, string1);
+ if (string1 == null)
+ {
+ return put(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX, string, null);
+ }
+ else
+ {
+ //FIXME: determine string encoding and set either WIDE or ASCII string
+// if ()
+ {
+ return put(Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX, string, string1);
+ }
+// else
+// {
+// return put(Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX, string, string1);
+// }
+ }
}
public Object setChar(String string, char c)
{
- return put(CHAR_PROPERTY_PREFIX + string, c);
+ return put(Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX, string, c);
}
public Object setBytes(String string, byte[] bytes)
@@ -321,7 +415,7 @@
public Object setBytes(String string, byte[] bytes, int start, int length)
{
- return put(BYTES_PROPERTY_PREFIX + string, sizeByteArray(bytes, start, length));
+ return put(Prefix.AMQP_BINARY_PROPERTY_PREFIX, string, sizeByteArray(bytes, start, length));
}
private byte[] sizeByteArray(byte[] bytes, int start, int length)
@@ -344,70 +438,53 @@
{
return setBoolean(string, (Boolean) object);
}
- else
+ else if (object instanceof Byte)
{
- if (object instanceof Byte)
- {
- return setByte(string, (Byte) object);
- }
- else
- {
- if (object instanceof Short)
- {
- return setShort(string, (Short) object);
- }
- else
- {
- if (object instanceof Integer)
- {
- return setInteger(string, (Integer) object);
- }
- else
- {
- if (object instanceof Long)
- {
- return setLong(string, (Long) object);
- }
- else
- {
- if (object instanceof Float)
- {
- return setFloat(string, (Float) object);
- }
- else
- {
- if (object instanceof Double)
- {
- return setDouble(string, (Double) object);
- }
- else
- {
- if (object instanceof String)
- {
- return setString(string, (String) object);
- }
- else
- {
- if (object instanceof Character)
- {
- return setChar(string, (Character) object);
- }
- else
- {
- if (object instanceof byte[])
- {
- return setBytes(string, (byte[]) object);
- }
- }
- }
- }
- }
- }
- }
- }
- }
+ return setByte(string, (Byte) object);
+ }
+ else if (object instanceof Short)
+ {
+ return setShort(string, (Short) object);
+ }
+ else if (object instanceof Integer)
+ {
+ return setInteger(string, (Integer) object);
+ }
+ else if (object instanceof Long)
+ {
+ return setLong(string, (Long) object);
+ }
+ else if (object instanceof Float)
+ {
+ return setFloat(string, (Float) object);
+ }
+ else if (object instanceof Double)
+ {
+ return setDouble(string, (Double) object);
+ }
+ else if (object instanceof String)
+ {
+ return setString(string, (String) object);
+ }
+ else if (object instanceof Character)
+ {
+ return setChar(string, (Character) object);
}
- return null;
+ else if (object instanceof byte[])
+ {
+ return setBytes(string, (byte[]) object);
+ }
+
+ throw new AMQPInvalidClassException("Only Primatives objects allowed Object is:" + object.getClass());
+ }
+
+
+ public boolean isNullStringValue(String name)
+ {
+ return _properties.containsKey(name) && (_properties.get(name) == null) &&
+ _propertyNamesTypeMap.get(name).equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX);
+
+
}
// ***** Methods
@@ -430,23 +507,12 @@
public boolean propertyExists(String propertyName)
{
- return _propertyNamesTypeMap.containsKey(propertyName);
+ return itemExists(propertyName);
}
public boolean itemExists(String string)
{
- Iterator keys = _properties.keySet().iterator();
-
- while (keys.hasNext())
- {
- String key = (String) keys.next();
-
- if (key.endsWith(string))
- {
- return true;
- }
- }
- return false;
+ return _properties.containsKey(string);
}
public String toString()
@@ -464,16 +530,9 @@
{
final Map.Entry entry = (Map.Entry) it.next();
final String propertyName = (String) entry.getKey();
- if (propertyName == null)
- {
- buf.append("\nInternal error: Property with NULL key defined");
- }
- else
- {
- buf.append('\n');
- buf.append(valueAsXML(table._propertyNamesTypeMap.get(propertyName) + propertyName, entry.getValue()));
- }
+ buf.append('\n');
+ buf.append(valueAsXML(table._propertyNamesTypeMap.get(propertyName), propertyName, entry.getValue()));
}
buf.append("\n");
buf.append(PROPERTY_FIELD_TABLE_CLOSE_XML);
@@ -481,18 +540,14 @@
return buf.toString();
}
- private static String valueAsXML(String name, Object value)
+ private static String valueAsXML(Prefix type, String propertyName, Object value)
{
- char propertyPrefix = name.charAt(0);
- String propertyName = name.substring(1);
-
-
StringBuffer buf = new StringBuffer();
// Start Tag
- buf.append(propertyXML(name, true));
+ buf.append(propertyXML(type, propertyName, true));
// Value
- if (propertyPrefix == BYTES_PROPERTY_PREFIX)
+ if (type.equals(Prefix.AMQP_BINARY_PROPERTY_PREFIX))
{
//remove '>'
buf.deleteCharAt(buf.length() - 1);
@@ -504,22 +559,19 @@
}
else
{
- buf.append(String.valueOf(value));
+ if (!type.equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX))
+ {
+ buf.append(String.valueOf(value));
+ }
}
-
//End Tag
- buf.append(propertyXML(name, false));
+ buf.append(propertyXML(type, propertyName, false));
return buf.toString();
}
- private Object checkPropertyName(String name)
+ private void checkPropertyName(String propertyName)
{
- String propertyName = name.substring(1);
- char propertyPrefix = name.charAt(0);
-
- Object previous = null;
-
if (propertyName == null)
{
throw new IllegalArgumentException("Property name must not be null");
@@ -529,34 +581,39 @@
throw new IllegalArgumentException("Property name must not be the empty string");
}
- String currentValue = _propertyNamesTypeMap.get(propertyName);
+ checkIdentiferFormat(propertyName);
+ }
- if (currentValue != null)
- {
- previous = _properties.remove(currentValue + propertyName);
- // If we are in effect deleting the value (see comment on null values being deleted
- // below) then we also need to remove the name from the encoding length.
- if (previous == null)
- {
- _encodedSize -= EncodingUtils.encodedShortStringLength(propertyName);
- }
+ protected static void checkIdentiferFormat(String propertyName)
+ {
+// AMQP Spec: 4.2.5.5 Field Tables
+// Guidelines for implementers:
+// * Field names MUST start with a letter, '$' or '#' and may continue with
+// letters, '$' or '#', digits, or underlines, to a maximum length of 128
+// characters.
+// * The server SHOULD validate field names and upon receiving an invalid
+// field name, it SHOULD signal a connection exception with reply code
+// 503 (syntax error). Conformance test: amq_wlp_table_01.
+// * A peer MUST handle duplicate fields by using only the first instance.
- // FIXME: Should be able to short-cut this process if the old and new values are
- // the same object and/or type and size...
- _encodedSize -= getEncodingSize(currentValue + propertyName, previous);
+ // AMQP length limit
+ if (propertyName.length() > 128)
+ {
+ throw new IllegalArgumentException("AMQP limits property names to 128 characters");
}
- _propertyNamesTypeMap.put(propertyName, "" + propertyPrefix);
-
- return previous;
+ // AMQ start character
+ if (!(Character.isLetter(propertyName.charAt(0))
+ || propertyName.charAt(0) == '$'
+ || propertyName.charAt(0) == '#'))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid AMQP start character");
+ }
}
- private static String propertyXML(String name, boolean start)
+ private static String propertyXML(Prefix type, String propertyName, boolean start)
{
- char propertyPrefix = name.charAt(0);
- String propertyName = name.substring(1);
-
StringBuffer buf = new StringBuffer();
if (start)
@@ -568,40 +625,44 @@
buf.append("</");
}
- switch (propertyPrefix)
+ switch (type)
{
- case BOOLEAN_PROPERTY_PREFIX:
+ case AMQP_BOOLEAN_PROPERTY_PREFIX:
buf.append(BOOLEAN);
break;
- case BYTE_PROPERTY_PREFIX:
+ case AMQP_BYTE_PROPERTY_PREFIX:
buf.append(BYTE);
break;
- case BYTES_PROPERTY_PREFIX:
+ case AMQP_BINARY_PROPERTY_PREFIX:
buf.append(BYTES);
break;
- case SHORT_PROPERTY_PREFIX:
+ case AMQP_SHORT_PROPERTY_PREFIX:
buf.append(SHORT);
break;
- case INT_PROPERTY_PREFIX:
+ case AMQP_INT_PROPERTY_PREFIX:
buf.append(INT);
break;
- case LONG_PROPERTY_PREFIX:
+ case AMQP_LONG_PROPERTY_PREFIX:
buf.append(LONG);
break;
- case FLOAT_PROPERTY_PREFIX:
+ case AMQP_FLOAT_PROPERTY_PREFIX:
buf.append(FLOAT);
break;
- case DOUBLE_PROPERTY_PREFIX:
+ case AMQP_DOUBLE_PROPERTY_PREFIX:
buf.append(DOUBLE);
break;
- case STRING_PROPERTY_PREFIX:
+ case AMQP_NULL_STRING_PROPERTY_PREFIX:
+ buf.append(NULL_STRING);
+ break;
+ case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
buf.append(STRING);
break;
- case CHAR_PROPERTY_PREFIX:
+ case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
buf.append(CHAR);
break;
default:
- buf.append(UNKNOWN + " (identifier ").append(propertyPrefix).append(")");
+ buf.append(UNKNOWN + " (identifier ").append(type.identifier()).append(")");
break;
}
@@ -622,9 +683,9 @@
for (int index = 0; index < bytes.length; index++)
{
buf.append("\n");
- buf.append(propertyXML(BYTE_PROPERTY_PREFIX + propertyName + "[" + index + "]", true));
+ buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", true));
buf.append(bytes[index]);
- buf.append(propertyXML(BYTE_PROPERTY_PREFIX + propertyName + "[" + index + "]", false));
+ buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", false));
}
buf.append("\n");
return buf.toString();
@@ -648,16 +709,26 @@
{
StringTokenizer tokenizer = new StringTokenizer(textFormat, "\n");
+ boolean finished = false;
boolean processing = false;
boolean processing_bytes = false;
+ if (!tokenizer.hasMoreTokens())
+ {
+ throw new IllegalArgumentException("XML has no tokens to parse.");
+ }
+
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
- if (token.equals(PROPERTY_FIELD_TABLE_CLOSE_XML)
- || token.equals(BYTES_CLOSE_XML))
+ if (token.equals(PROPERTY_FIELD_TABLE_CLOSE_XML))
+ {
+ processing = false;
+ finished = true;
+ }
+ if (token.equals(BYTES_CLOSE_XML))
{
processing = false;
}
@@ -688,6 +759,12 @@
processing = true;
}
}
+
+ if (!finished)
+ {
+ throw new IllegalArgumentException("XML was not in a valid format.");
+ }
+
}
private void processXMLLine(String xmlline)
@@ -735,6 +812,7 @@
int byteStart = xmlline.indexOf('<', headerEnd);
+ //Don't think this is required.
if (byteStart > 0)
{
while (!xmlline.startsWith(BYTES_CLOSE_XML, byteStart))
@@ -772,8 +850,12 @@
{
setDouble(propertyName, Double.parseDouble(value));
}
- if (type.equals(STRING))
+ if (type.equals(STRING) || type.equals(NULL_STRING))
{
+ if (type.equals(NULL_STRING))
+ {
+ value = null;
+ }
setString(propertyName, value);
}
if (type.equals(CHAR))
@@ -782,7 +864,7 @@
}
if (type.equals(UNKNOWN))
{
- _logger.error("Ignoring unknown property value:" + xmlline);
+ _logger.warn("Ignoring unknown property value:" + xmlline);
}
}
@@ -790,11 +872,11 @@
public void writeToBuffer(ByteBuffer buffer)
{
- final boolean debug = _logger.isDebugEnabled();
+ final boolean trace = _logger.isTraceEnabled();
- if (debug)
+ if (trace)
{
- _logger.debug("FieldTable::writeToBuffer: Writing encoded size of " + _encodedSize + "...");
+ _logger.trace("FieldTable::writeToBuffer: Writing encoded size of " + _encodedSize + "...");
}
EncodingUtils.writeUnsignedInteger(buffer, _encodedSize);
@@ -847,53 +929,57 @@
return setObject(key.toString(), value);
}
- protected Object put(String key, Object value)
+ protected Object put(Prefix type, String propertyName, Object value)
{
- Object previous = checkPropertyName(key);
+ checkPropertyName(propertyName);
+ //remove the previous value
+ Object previous = remove(propertyName);
- String propertyName = key.substring(1);
- char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
- if (value != null)
+ if (_logger.isTraceEnabled())
{
- //Add the size of the propertyName
- _encodedSize += EncodingUtils.encodedShortStringLength(propertyName);
+ int valueSize = 0;
+ if (value != null)
+ {
+ valueSize = getEncodingSize(type, value);
+ }
+ _logger.trace("Put:" + propertyName +
+ " encoding size Now:" + _encodedSize +
+ " name size= " + EncodingUtils.encodedShortStringLength(propertyName) +
+ " value size= " + valueSize);
+ }
- // For now: Setting a null value is the equivalent of deleting it.
- // This is ambiguous in the JMS spec and needs thrashing out and potentially
- // testing against other implementations.
+ //Add the size of the propertyName plus one for the type identifier
+ _encodedSize += EncodingUtils.encodedShortStringLength(propertyName) + 1;
+ if (value != null)
+ {
//Add the size of the content
- _encodedSize += getEncodingSize(key, value);
+ _encodedSize += getEncodingSize(type, value);
}
- _properties.put((String) propertyName, value);
+ //Store new values
+ _propertyNamesTypeMap.put(propertyName, type);
+ _properties.put(propertyName, value);
return previous;
}
public Object remove(Object key)
{
- if (key instanceof String)
- {
- throw new IllegalArgumentException("Property key be a string");
- }
-
- char propertyPrefix = ((String) key).charAt(0);
-
if (_properties.containsKey(key))
{
final Object value = _properties.remove(key);
+ Prefix type = _propertyNamesTypeMap.remove(key);
// plus one for the type
- _encodedSize -= EncodingUtils.encodedShortStringLength(((String) key));
+ _encodedSize -= EncodingUtils.encodedShortStringLength(((String) key)) + 1;
// This check is, for now, unnecessary (we don't store null values).
if (value != null)
{
- _encodedSize -= getEncodingSize(propertyPrefix + (String) key, value);
+ _encodedSize -= getEncodingSize(type, value);
}
-
return value;
}
else
@@ -915,6 +1001,7 @@
public void clear()
{
+ _encodedSize = 0;
_properties.clear();
_propertyNamesTypeMap.clear();
}
@@ -942,6 +1029,7 @@
private void putDataInBuffer(ByteBuffer buffer)
{
+
final Iterator it = _properties.entrySet().iterator();
//If there are values then write out the encoded Size... could check _encodedSize != 0
@@ -954,42 +1042,97 @@
String propertyName = (String) me.getKey();
//The type value
- char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
- //The actual param name skipping type
+ Prefix type = _propertyNamesTypeMap.get(propertyName);
- EncodingUtils.writeShortStringBytes(buffer, propertyName);
Object value = me.getValue();
-
- switch (propertyPrefix)
+ try
{
+ if (_logger.isTraceEnabled())
+ {
+ _logger.trace("Writing Property:" + propertyName +
+ " Type:" + type +
+ " Value:" + value);
+ _logger.trace("Buffer Position:" + buffer.position() +
+ " Remaining:" + buffer.remaining());
+ }
- case STRING_PROPERTY_PREFIX:
- // TODO: look at using proper charset encoder
- buffer.put((byte) STRING_PROPERTY_PREFIX);
- EncodingUtils.writeLongStringBytes(buffer, (String) value);
- break;
+ //Write the actual parameter name
+ EncodingUtils.writeShortStringBytes(buffer, propertyName);
- 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 CHAR_PROPERTY_PREFIX:
- case BYTES_PROPERTY_PREFIX:
- case XML_PROPERTY_PREFIX:
- // Encode as XML
- buffer.put((byte) XML_PROPERTY_PREFIX);
- EncodingUtils.writeLongStringBytes(buffer, valueAsXML(propertyPrefix + propertyName, value));
- break;
- default:
+ switch (type)
{
-
- // Should never get here
- throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
+ case AMQP_BOOLEAN_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeBoolean(buffer, (Boolean) value);
+ break;
+ case AMQP_BYTE_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_BYTE_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeByte(buffer, (Byte) value);
+ break;
+ case AMQP_SHORT_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_SHORT_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeShort(buffer, (Short) value);
+ break;
+ case AMQP_INT_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_INT_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeInteger(buffer, (Integer) value);
+ break;
+ case AMQP_UNSIGNED_INT_PROPERTY_PREFIX: // Currently we don't create these
+ buffer.put((byte) Prefix.AMQP_UNSIGNED_INT_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeUnsignedInteger(buffer, (Long) value);
+ break;
+ case AMQP_LONG_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_LONG_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeLong(buffer, (Long) value);
+ break;
+ case AMQP_FLOAT_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_FLOAT_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeFloat(buffer, (Float) value);
+ break;
+ case AMQP_DOUBLE_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_DOUBLE_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeDouble(buffer, (Double) value);
+ break;
+ case AMQP_NULL_STRING_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX.identifier());
+ break;
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX.identifier());
+ // FIXME: use proper charset encoder
+ EncodingUtils.writeLongStringBytes(buffer, (String) value);
+ break;
+ case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+ //This is a simple ASCII string
+ buffer.put((byte) Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeLongStringBytes(buffer, (String) value);
+ break;
+ case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeChar(buffer, (Character) value);
+ break;
+ case AMQP_BINARY_PROPERTY_PREFIX:
+ buffer.put((byte) Prefix.AMQP_BINARY_PROPERTY_PREFIX.identifier());
+ EncodingUtils.writeBytes(buffer, (byte[]) value);
+ break;
+ default:
+ {
+ // Should never get here
+ throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ if (_logger.isTraceEnabled())
+ {
+ _logger.trace("Exception thrown:" + e);
+ _logger.trace("Writing Property:" + propertyName +
+ " Type:" + type +
+ " Value:" + value);
+ _logger.trace("Buffer Position:" + buffer.position() +
+ " Remaining:" + buffer.remaining());
}
+ throw new RuntimeException(e);
}
}
}
@@ -997,100 +1140,141 @@
public void setFromBuffer(ByteBuffer buffer, long length) throws AMQFrameDecodingException
{
- final boolean debug = _logger.isDebugEnabled();
+ final boolean trace = _logger.isTraceEnabled();
int sizeRead = 0;
while (sizeRead < length)
{
int sizeRemaining = buffer.remaining();
final String key = EncodingUtils.readShortString(buffer);
- // TODO: use proper charset decoder
+
byte iType = buffer.get();
- final char type = (char) iType;
- Object value = null;
+
+ Character mapKey = new Character((char) iType);
+ Prefix type = _reverseTypeMap.get(mapKey);
+
+ if (type == null)
+ {
+ String msg = "Field '" + key + "' - unsupported field table type: " + type + ".";
+ //some extra trace information...
+ msg += " (" + iType + "), length=" + length + ", sizeRead=" + sizeRead + ", sizeRemaining=" + sizeRemaining;
+ throw new AMQFrameDecodingException(msg);
+ }
+ Object value;
switch (type)
{
- case STRING_PROPERTY_PREFIX:
+ case AMQP_BOOLEAN_PROPERTY_PREFIX:
+ value = EncodingUtils.readBoolean(buffer);
+ break;
+ case AMQP_BYTE_PROPERTY_PREFIX:
+ value = EncodingUtils.readByte(buffer);
+ break;
+ case AMQP_SHORT_PROPERTY_PREFIX:
+ value = EncodingUtils.readShort(buffer);
+ break;
+ case AMQP_INT_PROPERTY_PREFIX:
+ value = EncodingUtils.readInteger(buffer);
+ break;
+ case AMQP_UNSIGNED_INT_PROPERTY_PREFIX:// This will only fit in a long
+ //Change this type for java lookups
+ type = Prefix.AMQP_LONG_PROPERTY_PREFIX;
+ case AMQP_LONG_PROPERTY_PREFIX:
+ value = EncodingUtils.readLong(buffer);
+ break;
+ case AMQP_FLOAT_PROPERTY_PREFIX:
+ value = EncodingUtils.readFloat(buffer);
+ break;
+ case AMQP_DOUBLE_PROPERTY_PREFIX:
+ value = EncodingUtils.readDouble(buffer);
+ break;
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ // FIXME: use proper charset encoder
+ case AMQP_ASCII_STRING_PROPERTY_PREFIX:
value = EncodingUtils.readLongString(buffer);
break;
- 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 CHAR_PROPERTY_PREFIX:
- case BYTES_PROPERTY_PREFIX:
- case XML_PROPERTY_PREFIX:
- processXMLLine(EncodingUtils.readLongString(buffer));
+ case AMQP_NULL_STRING_PROPERTY_PREFIX:
+ value = null;
+ break;
+ case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+ value = EncodingUtils.readChar((buffer));
+ break;
+ case AMQP_BINARY_PROPERTY_PREFIX:
+ value = EncodingUtils.readBytes(buffer);
break;
default:
- String msg = "Field '" + key + "' - unsupported field table type: " + type + ".";
- //some extra debug information...
- msg += " (" + iType + "), length=" + length + ", sizeRead=" + sizeRead + ", sizeRemaining=" + sizeRemaining;
+ String msg = "Internal error, the following type identifier is not handled: " + type;
throw new AMQFrameDecodingException(msg);
}
sizeRead += (sizeRemaining - buffer.remaining());
- if (debug)
+ if (trace)
{
- _logger.debug("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + type + "', key '" + key + "', value '" + value + "' (now read " + sizeRead + " of " + length + " encoded bytes)...");
+ _logger.trace("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + type + "', key '" + key + "', value '" + value + "' (now read " + sizeRead + " of " + length + " encoded bytes)...");
}
- if (type != XML_PROPERTY_PREFIX)
- {
- setObject(key, value);
- }
+ put(type, key, value);
}
- if (debug)
+ if (trace)
{
- _logger.debug("FieldTable::FieldTable(buffer," + length + "): Done.");
+ _logger.trace("FieldTable::FieldTable(buffer," + length + "): Done.");
}
}
-
/**
- * @param name the property name with type prefix
+ * @param type the type to calucluate encoding for
* @param value the property value
* @return integer
*/
- private static int getEncodingSize(String name, Object value)
+ private static int getEncodingSize(Prefix type, Object value)
{
- int encodingSize;
+ int encodingSize = 0;
- char propertyPrefix = name.charAt(0);
-
- switch (propertyPrefix)
+ switch (type)
{
- // 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:
- case BYTE_PROPERTY_PREFIX:
- case SHORT_PROPERTY_PREFIX:
- case FLOAT_PROPERTY_PREFIX:
- case DOUBLE_PROPERTY_PREFIX:
- case CHAR_PROPERTY_PREFIX:
- case BYTES_PROPERTY_PREFIX:
- case XML_PROPERTY_PREFIX:
- encodingSize = 1 + EncodingUtils.encodedLongStringLength(valueAsXML(name, value));
+ case AMQP_BOOLEAN_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedBooleanLength();
+ break;
+ case AMQP_BYTE_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedByteLength();
+ break;
+ case AMQP_SHORT_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedShortLength();
+ break;
+ case AMQP_INT_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedIntegerLength();
+ break;
+ case AMQP_LONG_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedLongLength();
+ break;
+ case AMQP_FLOAT_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedFloatLength();
+ break;
+ case AMQP_DOUBLE_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedDoubleLength();
+ break;
+ case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+ // FIXME: use proper charset encoder
+ case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedLongStringLength((String) value);
+ break;
+// This is not required as this method is never called if the value is null
+// case AMQP_NULL_STRING_PROPERTY_PREFIX:
+// // There is no need for additional size beyond the prefix
+// break;
+ case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+ encodingSize = EncodingUtils.encodedCharLength();
+ break;
+ case AMQP_BINARY_PROPERTY_PREFIX:
+ encodingSize = 1 + ((byte[]) value).length;
break;
default:
- //encodingSize = 1 + EncodingUtils.encodedLongStringLength(String.valueOf(value));
- // We are using XML String encoding
throw new IllegalArgumentException("Unsupported type in field table: " + value.getClass());
}
-// the extra byte for the type indicator is calculated in the name
+ // the extra byte for the type indicator is calculated in the name
return encodingSize;
}
-
-
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java Mon Dec 18 04:41:15 2006
@@ -109,6 +109,6 @@
public String toString()
{
- return "Event: type " + type + ", data: " + data;
+ return "Event: type " + type + ", data: " + data;
}
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java Mon Dec 18 04:41:15 2006
@@ -58,7 +58,10 @@
Job job = getJobForSession(session);
job.acquire(); //prevents this job being removed from _jobs
job.add(event);
- if (job.activate())
+
+ //Additional checks on pool to check that it hasn't shutdown.
+ // The alternative is to catch the RejectedExecutionException that will result from executing on a shutdown pool
+ if (job.activate() && _poolReference.getPool() != null && !_poolReference.getPool().isShutdown())
{
_poolReference.getPool().execute(job);
}
@@ -100,7 +103,9 @@
}
else
{
- if (job.activate())
+ // ritchiem : 2006-12-13 Do we need to perform the additional checks here?
+ // Can the pool be shutdown at this point?
+ if (job.activate() && _poolReference.getPool() != null && !_poolReference.getPool().isShutdown())
{
_poolReference.getPool().execute(job);
}
@@ -184,3 +189,4 @@
_poolReference.releaseExecutorService();
}
}
+
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java Mon Dec 18 04:41:15 2006
@@ -55,7 +55,7 @@
{
return _name;
}
-
+
public static final AMQConstant FRAME_MIN_SIZE = new AMQConstant(4096, "frame min size", true);
public static final AMQConstant FRAME_END = new AMQConstant(206, "frame end", true);
@@ -73,6 +73,8 @@
public static final AMQConstant CONTEXT_IN_USE = new AMQConstant(320, "context in use", true);
public static final AMQConstant CONTEXT_UNKNOWN = new AMQConstant(321, "context unknown", true);
+
+ public static final AMQConstant INVALID_SELECTOR = new AMQConstant(322, "selector invalid", true);
public static final AMQConstant INVALID_PATH = new AMQConstant(402, "invalid path", true);
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java Mon Dec 18 04:41:15 2006
@@ -64,9 +64,9 @@
if (valueIndex + 1 < options.length())
{
if (options.charAt(valueIndex + 1) == DEFAULT_OPTION_SEPERATOR ||
- options.charAt(valueIndex + 1) == ALTERNATIVE_OPTION_SEPARATOR ||
- options.charAt(valueIndex + 1) == BROKER_SEPARATOR ||
- options.charAt(valueIndex + 1) == '\'')
+ options.charAt(valueIndex + 1) == ALTERNATIVE_OPTION_SEPARATOR ||
+ options.charAt(valueIndex + 1) == BROKER_SEPARATOR ||
+ options.charAt(valueIndex + 1) == '\'')
{
nestedQuotes--;
// System.out.println(
@@ -119,7 +119,7 @@
else
{
parseError(sepIndex, "Unterminated option. Possible illegal option separator:'" +
- options.charAt(sepIndex) + "'", options);
+ options.charAt(sepIndex) + "'", options);
}
}
Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java Mon Dec 18 04:41:15 2006
@@ -62,12 +62,12 @@
if (getIndex() > -1)
{
- if (_length > 1)
+ if (_length != -1)
{
sb.append(" between indicies ");
sb.append(getIndex());
sb.append(" and ");
- sb.append(getIndex() + _length);
+ sb.append(_length);
}
else
{