diff options
| author | Martin Ritchie <ritchiem@apache.org> | 2007-01-16 15:16:39 +0000 |
|---|---|---|
| committer | Martin Ritchie <ritchiem@apache.org> | 2007-01-16 15:16:39 +0000 |
| commit | 47ac1646674d11de0002613a71cf4588a8c8af7a (patch) | |
| tree | 01576819aa1708192771e91f2b0c3cbdfd406de3 /qpid/java/common/src | |
| parent | a6b4188b807dce93ee1a54958bd92de4142a6d48 (diff) | |
| download | qpid-python-47ac1646674d11de0002613a71cf4588a8c8af7a.tar.gz | |
Patched up to Persistence changes so performance benchmarks can be created before and after persistence changes.
Revision: 494092
Author: kpvdr
Date: 15:22:05, 08 January 2007
Message:
Fixed: [QPID-253] Existing classpath breaks codegen; [QPID-254] Build failure does not prevent timestamp from being generated. Also moved all required properties into ant build file, allowing the generation to be completed independently of Maven from the common directory.
----
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/Main.java
Modified : /incubator/qpid/trunk/qpid/java/common/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/common/protocol-version.xml
Revision: 494042
Author: rgreig
Date: 12:21:18, 08 January 2007
Message:
QPID-252 : Reduce unnecessary object creation
----
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/transport/VmPipeTransportConnection.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/pool/Event.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/pool/ReadWriteThreadModel.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java
Revision: 494018
Author: bhupendrab
Date: 10:42:21, 08 January 2007
Message:
----
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
Revision: 493060
Author: marnie
Date: 16:05:34, 05 January 2007
Message:
----
Added : /incubator/qpid/trunk/qpid/java/client/example/bin
Added : /incubator/qpid/trunk/qpid/java/client/example/bin/set_classpath.bat
Added : /incubator/qpid/trunk/qpid/java/client/example/bin/set_classpath.sh
Revision: 492956
Author: bhupendrab
Date: 10:09:14, 05 January 2007
Message:
QPID-213
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/bin/qpidmc.sh
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
Revision: 492902
Author: vinoski
Date: 05:09:49, 05 January 2007
Message:
moved some distribution files
moved some files around underneath the distribution directory, and changed
some assemblies to pick them up
----
Deleted : /incubator/qpid/trunk/qpid/java/LICENSE.txt
Deleted : /incubator/qpid/trunk/qpid/java/NOTICE.txt
Deleted : /incubator/qpid/trunk/qpid/java/README.txt
Modified : /incubator/qpid/trunk/qpid/java/distribution/src/main/assembly/bin.xml
Modified : /incubator/qpid/trunk/qpid/java/distribution/src/main/assembly/client-bin.xml
Modified : /incubator/qpid/trunk/qpid/java/distribution/src/main/assembly/src.xml
Added : /incubator/qpid/trunk/qpid/java/distribution/src/main/release/LICENSE.txt(Copy from path: /incubator/qpid/trunk/qpid/java/LICENSE.txt, Revision, 489214
Added : /incubator/qpid/trunk/qpid/java/distribution/src/main/release/NOTICE.txt(Copy from path: /incubator/qpid/trunk/qpid/java/NOTICE.txt, Revision, 489214
Added : /incubator/qpid/trunk/qpid/java/distribution/src/main/release/README.txt(Copy from path: /incubator/qpid/trunk/qpid/java/README.txt, Revision, 489214
Revision: 492756
Author: kpvdr
Date: 21:30:39, 04 January 2007
Message:
Fixed C++ client sending protocol version 0-0 over the wire. Minor fixes and tidy-up in related code.
----
Modified : /incubator/qpid/trunk/qpid/cpp/lib/common/Makefile.am
Deleted : /incubator/qpid/trunk/qpid/cpp/lib/common/framing/AMQP_HighestVersion.h
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/Main.java
Deleted : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_HighestVersion.cpp.tmpl
Added : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_HighestVersion.h.tmpl(Copy from path: /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_HighestVersion.cpp.tmpl, Revision, 491906
Modified : /incubator/qpid/trunk/qpid/gentools/templ.java/MethodBodyClass.tmpl
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java
Revision: 492718
Author: rhs
Date: 20:23:26, 04 January 2007
Message:
QPID-248 Modified field table types to not conflict with the officially specified definitions. Also reorganized type definitions to clearly distinguish between official and extended types and reenabled the AmqPlain authentication mechanism. This change allows the python interop test suite to run.
----
Modified : /incubator/qpid/trunk/qpid/java/broker/etc/config.xml
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQType.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypeMap.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
Revision: 492514
Author: bhupendrab
Date: 10:52:06, 04 January 2007
Message:
QPID-213
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Constants.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ManagedAttributeModel.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/AttributesTabControl.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTypeTabControl.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java
Revision: 492280
Author: kpvdr
Date: 20:15:19, 03 January 2007
Message:
Added ability for code generator to omit elements from the XML specification
----
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpClass.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpConstantSet.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpDomainMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpDomainVersionMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpField.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpFieldMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpMethod.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpMethodMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpModel.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpVersion.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpVersionSet.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/Generator.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/NodeAware.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/Utils.java
Revision: 492184
Author: bhupendrab
Date: 15:38:03, 03 January 2007
Message:
QPID-213
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/Refresh.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXServerRegistry.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTypeTabControl.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/ViewUtility.java
Revision: 491839
Author: kpvdr
Date: 16:31:39, 02 January 2007
Message:
Removed check run check from ant build file.
----
Modified : /incubator/qpid/trunk/qpid/gentools/build.xml
Revision: 491801
Author: kpvdr
Date: 14:41:18, 02 January 2007
Message:
Added ant build file for the generator with compile (default) and clean targets.
----
Added : /incubator/qpid/trunk/qpid/gentools/build.xml
Revision: 491879
Author: kpvdr
Date: 18:19:58, 02 January 2007
Message:
Added automatic build of generator; added dependency check on source XML files that prevents generation if not needed
----
Modified : /incubator/qpid/trunk/qpid/java/common/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/common/protocol-version.xml
Revision: 491673
Author: rgreig
Date: 23:02:01, 01 January 2007
Message:
QPID-233 : Patch from Rob Godfrey - fix to lock.unlock() bug
----
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConcurrentSelectorDeliveryManager.java
Revision: 491577
Author: rgreig
Date: 14:30:31, 01 January 2007
Message:
QPID-232 Added the service request/reply test
----
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/serviceProvidingClient.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/serviceRequestingClient.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/ServiceProvidingClient.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/ServiceRequestingClient.java
Revision: 491120
Author: rgreig
Date: 22:12:44, 29 December 2006
Message:
Reduced logging level to debug to avoid performance sapping output
----
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConcurrentSelectorDeliveryManager.java
Revision: 491072
Author: rgreig
Date: 18:37:34, 29 December 2006
Message:
QPID-232 Created a simple module and added the topic test
----
Added : /incubator/qpid/trunk/qpid/java/perftests
Added : /incubator/qpid/trunk/qpid/java/perftests/bin
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/run_many.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/setupclasspath.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/topicListener.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/bin/topicPublisher.sh
Added : /incubator/qpid/trunk/qpid/java/perftests/pom.xml
Added : /incubator/qpid/trunk/qpid/java/perftests/src
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/Connector.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/topic
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Config.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java
Added : /incubator/qpid/trunk/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java
Revision: 491031
Author: bhupendrab
Date: 15:47:42, 29 December 2006
Message:
QPID-213
----
Added : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTypeTabControl.java
Revision: 491029
Author: bhupendrab
Date: 15:38:05, 29 December 2006
Message:
QPID-213
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Constants.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXServerRegistry.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
Revision: 490985
Author: bhupendrab
Date: 11:55:15, 29 December 2006
Message:
test queue and exchange names changed.
----
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
Revision: 490872
Author: vinoski
Date: 23:42:59, 28 December 2006
Message:
apply patch for QPID-231
----
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/QueueSenderAdapter.java
Revision: 490734
Author: bhupendrab
Date: 15:07:56, 28 December 2006
Message:
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java
Revision: 490709
Author: bhupendrab
Date: 12:04:46, 28 December 2006
Message:
QPID-188
Unit tests added
----
Added : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
Revision: 490708
Author: bhupendrab
Date: 12:02:26, 28 December 2006
Message:
MBean created as a separate class
----
Added : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
Revision: 490605
Author: vinoski
Date: 23:52:36, 27 December 2006
Message:
add snapshot repository for distribution
----
Modified : /incubator/qpid/trunk/qpid/java/pom.xml
Revision: 490505
Author: bhupendrab
Date: 14:10:05, 27 December 2006
Message:
QPID-213
improving the management GUI look and feel
----
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/AttributesTabControl.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/OperationTabControl.java
Modified : /incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/ViewUtility.java
Revision: 490373
Author: rgreig
Date: 21:10:20, 26 December 2006
Message:
QPID-227 Renamed version.properties to qpidversion.properties due to clash with a dependency also using version.properties. Also improved robustness where properties file does not contain expected properties.
----
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java
Modified : /incubator/qpid/trunk/qpid/java/pom.xml
Revision: 489804
Author: rgreig
Date: 23:55:13, 22 December 2006
Message:
QPID-229 Fixed spurious import in test class
----
Modified : /incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/message/JMSDestinationTest.java
Revision: 489754
Author: rgreig
Date: 20:46:54, 22 December 2006
Message:
QPID-229 : Patch supplied by Rob Godfrey - Change implementation of FieldTable
----
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
Revision: 489748
Author: rgreig
Date: 20:32:43, 22 December 2006
Message:
QPID-229 : Patch supplied by Rob Godfrey - Change implementation of FieldTable
----
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/message/StreamMessageTest.java
Added : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQType.java
Added : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypeMap.java
Added : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypedValue.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java
Deleted : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java
Revision: 489715
Author: kpvdr
Date: 18:26:40, 22 December 2006
Message:
File tidy-up for AMQP version code: Removed old XSLT files; moved cluster.asl into spec directory; renamed spec files to better reflect version notation; updated java, c++ and python files to reference new names.
----
Modified : /incubator/qpid/trunk/qpid/cpp/gen/Makefile.am
Modified : /incubator/qpid/trunk/qpid/java/common/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/common/protocol-version.xml
Deleted : /incubator/qpid/trunk/qpid/java/common/src/main/versions
Deleted : /incubator/qpid/trunk/qpid/java/common/src/main/xsl
Modified : /incubator/qpid/trunk/qpid/python/amqp-doc
Modified : /incubator/qpid/trunk/qpid/python/qpid/testlib.py
Deleted : /incubator/qpid/trunk/qpid/specs/amqp-8.0.xml
Added : /incubator/qpid/trunk/qpid/specs/amqp.0-8.xml(Copy from path: /incubator/qpid/trunk/qpid/specs/amqp-8.0.xml, Revision, 489705
Added : /incubator/qpid/trunk/qpid/specs/amqp.0-9.xml
Added : /incubator/qpid/trunk/qpid/specs/cluster.0-8.xml(Copy from path: /incubator/qpid/trunk/qpid/java/common/src/main/xsl/cluster.asl, Revision, 489705
Added : /incubator/qpid/trunk/qpid/specs/cluster.0-9.xml
Revision: 489704
Author: kpvdr
Date: 17:43:09, 22 December 2006
Message:
Additional changes to support new Java AMQP version code, some C++ tidy-up as well.
----
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/AmqpFieldMap.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/CppGenerator.java
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/JavaGenerator.java
Modified : /incubator/qpid/trunk/qpid/gentools/templ.java/MethodBodyClass.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.java/MethodRegistryClass.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.java/PropertyContentHeaderClass.tmpl
Revision: 489691
Author: kpvdr
Date: 17:00:28, 22 December 2006
Message:
AMQP version using new generator - Part 1. In these changes, all places where version-specific info is required, it has been hard-wired to major=8, minor=0. The next phase of changes will connect the version info to that obtained from ProtocolInitiation for the current session.
----
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/RequiredDeliveryException.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/BasicCancelMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/BasicConsumeMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/BasicPublishMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/BasicQosHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ChannelCloseHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ChannelFlowHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ChannelOpenHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionCloseMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionSecureOkMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionStartOkMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeBoundHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeleteHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/TxCommitHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/TxRollbackHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/TxSelectHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQPFastProtocolHandler.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQMessage.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SubscriptionImpl.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ChannelCloseMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionSecureMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionStartMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionTuneMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/cluster/DefaultGroupManager.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/cluster/handler/RemoteConsumeHandler.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/cluster/replay/ConsumerCounts.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/cluster/replay/RecordingMethodHandlerFactory.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/cluster/replay/ReplayStore.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/queue/ClusteredQueue.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/main/java/org/apache/qpid/server/queue/PrivateQueue.java
Modified : /incubator/qpid/trunk/qpid/java/cluster/src/test/java/org/apache/qpid/server/cluster/BrokerTest.java
Modified : /incubator/qpid/trunk/qpid/java/common/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/common/protocol-version.xml
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQDataBlockDecoder.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBodyFactory.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderProperties.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/xsl/cluster.asl
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/queue/AckTest.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/queue/MessageTestHelper.java
Revision: 489644
Author: rgreig
Date: 13:06:45, 22 December 2006
Message:
----
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesMessage.java
Added : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/AbstractBytesTypedMessage.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSStreamMessage.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java
Revision: 489403
Author: bhupendrab
Date: 16:47:01, 21 December 2006
Message:
QPID-227
----
Modified : /incubator/qpid/trunk/qpid/java/broker/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/client/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/QpidConnectionMetaData.java
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionStartMethodHandler.java
Modified : /incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java
Modified : /incubator/qpid/trunk/qpid/java/pom.xml
Revision: 489331
Author: bhupendrab
Date: 11:33:49, 21 December 2006
Message:
QPID-188
test updated
----
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
Revision: 489330
Author: bhupendrab
Date: 11:32:58, 21 December 2006
Message:
QPID-188
Unit test for AMQProtocolSession mbean updated and closeChannel() method removed from mbean because it didn't seem to be a required feature for management console.
----
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSession.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
Modified : /incubator/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ManagedConnection.java
Modified : /incubator/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
Revision: 489215
Author: vinoski
Date: 22:46:12, 20 December 2006
Message:
add clover support, fix logging level variables
Added support for the clover plugin to the top-level pom, and eliminated
redundant amqj.logging.level variables from module poms.
----
Modified : /incubator/qpid/trunk/qpid/java/broker/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/client/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/pom.xml
Modified : /incubator/qpid/trunk/qpid/java/systests/pom.xml
Revision: 489214
Author: cctrieloff
Date: 22:36:18, 20 December 2006
Message:
Multi version support part 2.
----
Modified : /incubator/qpid/trunk/qpid/gentools/build
Modified : /incubator/qpid/trunk/qpid/gentools/src/org/apache/qpid/gentools/CppGenerator.java
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_ClientOperations.h.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_ClientProxy.cpp.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_ClientProxy.h.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/AMQP_ServerProxy.h.tmpl
Modified : /incubator/qpid/trunk/qpid/gentools/templ.cpp/MethodBodyClass.h.tmpl
Revision: 489204
Author: rhs
Date: 21:47:54, 20 December 2006
Message:
conf file for jpackage
----
Added : /incubator/qpid/trunk/qpid/java/broker/etc/qpid-server.conf.jpp
Revision: 489140
Author: ritchiem
Date: 17:04:33, 20 December 2006
Message:
QPID-225
Applied Patch for queue browsing with client acknowledgement
----
Modified : /incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/perftesting@496725 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/common/src')
37 files changed, 1707 insertions, 2839 deletions
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java b/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java index 4d604f8c0b..2ead0a03e6 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/AMQChannelException.java @@ -27,23 +27,30 @@ public class AMQChannelException extends AMQException { private final int _classId; private final int _methodId; + /* AMQP version for which exception ocurred */ + private final byte major; + private final byte minor; - public AMQChannelException(int errorCode, String msg, int classId, int methodId, Throwable t) + public AMQChannelException(int errorCode, String msg, int classId, int methodId, byte major, byte minor, Throwable t) { super(errorCode, msg, t); _classId = classId; _methodId = methodId; + this.major = major; + this.minor = minor; } - public AMQChannelException(int errorCode, String msg, int classId, int methodId) + public AMQChannelException(int errorCode, String msg, int classId, int methodId, byte major, byte minor) { super(errorCode, msg); _classId = classId; _methodId = methodId; + this.major = major; + this.minor = minor; } public AMQFrame getCloseFrame(int channel) { - return ChannelCloseBody.createAMQFrame(channel, getErrorCode(), getMessage(), _classId, _methodId); + return ChannelCloseBody.createAMQFrame(channel, major, minor, _classId, _methodId, getErrorCode(), getMessage()); } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java index 3a96821e93..f4f764db1b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/common/QpidProperties.java @@ -20,27 +20,99 @@ */ package org.apache.qpid.common; +import org.apache.log4j.Logger; + +import java.util.Properties; +import java.util.Map; +import java.io.IOException; +import java.io.InputStream; + public class QpidProperties { + private static final Logger _logger = Logger.getLogger(QpidProperties.class); + + public static final String VERSION_RESOURCE = "qpidversion.properties"; + + public static final String PRODUCT_NAME_PROPERTY = "qpid.name"; + public static final String RELEASE_VERSION_PROPERTY = "qpid.version"; + public static final String BUILD_VERSION_PROPERTY = "qpid.svnversion"; + + private static final String DEFAULT = "unknown"; + private static String productName = DEFAULT; + private static String releaseVersion = DEFAULT; + private static String buildVersion = DEFAULT; + + /** Loads the values from the version properties file. */ static { - //load values from property file. + Properties props = new Properties(); + + try + { + InputStream propertyStream = QpidProperties.class.getClassLoader().getResourceAsStream(VERSION_RESOURCE); + if (propertyStream == null) + { + _logger.warn("Unable to find resource " + VERSION_RESOURCE + " from classloader"); + } + else + { + props.load(propertyStream); + + if (_logger.isDebugEnabled()) + { + _logger.debug("Dumping QpidProperties"); + for (Map.Entry<Object,Object> entry : props.entrySet()) + { + _logger.debug("Property: " + entry.getKey() + " Value: "+ entry.getValue()); + } + _logger.debug("End of property dump"); + } + + productName = readPropertyValue(props, PRODUCT_NAME_PROPERTY); + releaseVersion = readPropertyValue(props, RELEASE_VERSION_PROPERTY); + buildVersion = readPropertyValue(props, BUILD_VERSION_PROPERTY); + } + } + catch (IOException e) + { + // Log a warning about this and leave the values initialized to unknown. + _logger.error("Could not load version.properties resource: " + e, e); + } } public static String getProductName() { - return "Qpid"; + return productName; } - public static String getReleaseVerision() + public static String getReleaseVersion() { - return "1.0"; + return releaseVersion; } + public static String getBuildVersion() + { + return buildVersion; + } + + public static String getVersionString() + { + return getProductName() + " - " + getReleaseVersion() + " build: " + getBuildVersion(); + } + + private static String readPropertyValue(Properties props, String propertyName) + { + String retVal = (String) props.get(propertyName); + if (retVal == null) + { + retVal = DEFAULT; + } + return retVal; + } - public static String getBuildVerision() + public static void main(String[] args) { - return "1"; + System.out.println(getVersionString()); } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java index d829144b11..36287d2923 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java @@ -34,5 +34,6 @@ public abstract class AMQBody protected abstract void writePayload(ByteBuffer buffer); - protected abstract void populateFromBuffer(ByteBuffer buffer, long size) throws AMQFrameDecodingException; + protected abstract void populateFromBuffer(ByteBuffer buffer, long size) + throws AMQFrameDecodingException, AMQProtocolVersionException; } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQDataBlockDecoder.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQDataBlockDecoder.java index 438bfa8d82..2a999fe130 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQDataBlockDecoder.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQDataBlockDecoder.java @@ -81,7 +81,7 @@ public class AMQDataBlockDecoder } protected Object createAndPopulateFrame(ByteBuffer in) - throws AMQFrameDecodingException + throws AMQFrameDecodingException, AMQProtocolVersionException { final byte type = in.get(); if (!isSupportedFrameType(type)) diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java index e75f37d623..6af691fbe8 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java @@ -62,7 +62,7 @@ public class AMQFrame extends AMQDataBlock implements EncodableAMQDataBlock * @throws AMQFrameDecodingException */ public void populateFromBuffer(ByteBuffer buffer, int channel, long bodySize, BodyFactory bodyFactory) - throws AMQFrameDecodingException + throws AMQFrameDecodingException, AMQProtocolVersionException { this.channel = channel; bodyFrame = bodyFactory.createBody(buffer); diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java index 6659b4ff8f..5ccc900b2c 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java @@ -26,6 +26,20 @@ import org.apache.qpid.AMQChannelException; public abstract class AMQMethodBody extends AMQBody { public static final byte TYPE = 1; + + /** + * AMQP version + */ + protected byte major; + protected byte minor; + public byte getMajor() { return major; } + public byte getMinor() { return minor; } + + public AMQMethodBody(byte major, byte minor) + { + this.major = major; + this.minor = minor; + } /** unsigned short */ protected abstract int getBodySize(); @@ -80,11 +94,11 @@ public abstract class AMQMethodBody extends AMQBody */ public AMQChannelException getChannelException(int code, String message) { - return new AMQChannelException(code, message, getClazz(), getMethod()); + return new AMQChannelException(code, message, getClazz(), getMethod(), major, minor); } public AMQChannelException getChannelException(int code, String message, Throwable cause) { - return new AMQChannelException(code, message, getClazz(), getMethod(), cause); + return new AMQChannelException(code, message, getClazz(), getMethod(), major, minor, cause); } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBodyFactory.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBodyFactory.java index 107af67dc7..da0909d32f 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBodyFactory.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBodyFactory.java @@ -41,6 +41,11 @@ public class AMQMethodBodyFactory implements BodyFactory public AMQBody createBody(ByteBuffer in) throws AMQFrameDecodingException { - return MethodBodyDecoderRegistry.get(in.getUnsignedShort(), in.getUnsignedShort()); + // AMQP version change: MethodBodyDecoderRegistry is obsolete, since all the XML + // segments generated together are now handled by MainRegistry. The Cluster class, + // if generated together with amqp.xml is a part of MainRegistry. + // TODO: Connect with version acquired from ProtocolInitiation class. + return MainRegistry.get((short)in.getUnsignedShort(), (short)in.getUnsignedShort(), + (byte)8, (byte)0); } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQType.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQType.java new file mode 100644 index 0000000000..ad07634554 --- /dev/null +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQType.java @@ -0,0 +1,662 @@ +/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.framing;
+
+import org.apache.mina.common.ByteBuffer;
+
+public enum AMQType
+{
+
+
+ //AMQP FieldTable Wire Types
+
+ LONG_STRING('S')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedLongStringLength((String) value);
+ }
+
+
+ public String toNativeValue(Object value)
+ {
+ if (value != null)
+ {
+ return value.toString();
+ }
+ else
+ {
+ throw new NullPointerException("Cannot convert: null to String.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeLongStringBytes(buffer, (String) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readLongString(buffer);
+ }
+
+ },
+
+ INTEGER('I')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+ },
+
+ DECIMAL('D')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public Object toNativeValue(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+ },
+
+ TIMESTAMP('T')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+ },
+
+ FIELD_TABLE('F')
+ {
+ public int getEncodingSize(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ // TODO : fixme
+ throw new UnsupportedOperationException();
+ }
+ },
+
+ VOID('V')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return 0;
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ if (value == null)
+ {
+ return null;
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to null String.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return null;
+ }
+ },
+
+ // Extended types
+
+ BINARY('x')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return 1 + (value == null ? 0 : ((byte[]) value).length);
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ if((value instanceof byte[]) || (value == null))
+ {
+ return value;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Value: " + value + " (" + value.getClass().getName() +
+ ") cannot be converted to byte[]");
+ }
+ }
+
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeBytes(buffer, (byte[]) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readBytes(buffer);
+ }
+
+ },
+
+ ASCII_STRING('c')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedLongStringLength((String) value);
+ }
+
+
+ public String toNativeValue(Object value)
+ {
+ if (value != null)
+ {
+ return value.toString();
+ }
+ else
+ {
+ throw new NullPointerException("Cannot convert: null to String.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeLongStringBytes(buffer, (String) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readLongString(buffer);
+ }
+
+ },
+
+ WIDE_STRING('C')
+ {
+ public int getEncodingSize(Object value)
+ {
+ // FIXME: use proper charset encoder
+ return EncodingUtils.encodedLongStringLength((String) value);
+ }
+
+
+ public String toNativeValue(Object value)
+ {
+ if (value != null)
+ {
+ return value.toString();
+ }
+ else
+ {
+ throw new NullPointerException("Cannot convert: null to String.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeLongStringBytes(buffer, (String) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readLongString(buffer);
+ }
+ },
+
+ BOOLEAN('t')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedBooleanLength();
+ }
+
+
+ public Object toNativeValue(Object value)
+ {
+ if (value instanceof Boolean)
+ {
+ return (Boolean) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to boolean.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeBoolean(buffer, (Boolean) value);
+ }
+
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readBoolean(buffer);
+ }
+ },
+
+ ASCII_CHARACTER('k')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedCharLength();
+ }
+
+
+ public Character toNativeValue(Object value)
+ {
+ if (value instanceof Character)
+ {
+ return (Character) value;
+ }
+ else if (value == null)
+ {
+ throw new NullPointerException("Cannot convert null into char");
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to char.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeChar(buffer, (Character) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readChar(buffer);
+ }
+
+ },
+
+ BYTE('b')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedByteLength();
+ }
+
+
+ public Byte toNativeValue(Object value)
+ {
+ if (value instanceof Byte)
+ {
+ return (Byte) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to byte.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeByte(buffer, (Byte) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readByte(buffer);
+ }
+ },
+
+ SHORT('s')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedShortLength();
+ }
+
+
+ public Short toNativeValue(Object value)
+ {
+ if (value instanceof Short)
+ {
+ return (Short) value;
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String)value);
+ }
+
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to short.");
+ }
+
+
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeShort(buffer, (Short) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readShort(buffer);
+ }
+ },
+
+ INT('i')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedIntegerLength();
+ }
+
+ public Integer toNativeValue(Object value)
+ {
+ if (value instanceof Integer)
+ {
+ return (Integer) value;
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to int.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeInteger(buffer, (Integer) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readInteger(buffer);
+ }
+ },
+
+ LONG('l')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedLongLength();
+ }
+
+ public Object toNativeValue(Object value)
+ {
+ if(value instanceof Long)
+ {
+ return (Long) value;
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to long.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeLong(buffer, (Long) value);
+ }
+
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readLong(buffer);
+ }
+ },
+
+ FLOAT('f')
+ {
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedFloatLength();
+ }
+
+
+ public Float toNativeValue(Object value)
+ {
+ if (value instanceof Float)
+ {
+ return (Float) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to float.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeFloat(buffer, (Float) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readFloat(buffer);
+ }
+ },
+
+ DOUBLE('d')
+ {
+
+ public int getEncodingSize(Object value)
+ {
+ return EncodingUtils.encodedDoubleLength();
+ }
+
+
+ public Double toNativeValue(Object value)
+ {
+ if (value instanceof Double)
+ {
+ return (Double) value;
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String)value);
+ }
+ else
+ {
+ throw new NumberFormatException("Cannot convert: " + value + "(" +
+ value.getClass().getName() + ") to double.");
+ }
+ }
+
+ public void writeValueImpl(Object value, ByteBuffer buffer)
+ {
+ EncodingUtils.writeDouble(buffer, (Double) value);
+ }
+
+ public Object readValueFromBuffer(ByteBuffer buffer)
+ {
+ return EncodingUtils.readDouble(buffer);
+ }
+ };
+
+ private final byte _identifier;
+
+ AMQType(char identifier)
+ {
+ _identifier = (byte) identifier;
+ }
+
+ public final byte identifier()
+ {
+ return _identifier;
+ }
+
+
+ public abstract int getEncodingSize(Object value);
+
+ public abstract Object toNativeValue(Object value);
+
+ public AMQTypedValue asTypedValue(Object value)
+ {
+ return new AMQTypedValue(this, toNativeValue(value));
+ }
+
+ public void writeToBuffer(Object value, ByteBuffer buffer)
+ {
+ buffer.put((byte)identifier());
+ writeValueImpl(value, buffer);
+ }
+
+ abstract void writeValueImpl(Object value, ByteBuffer buffer);
+
+ abstract Object readValueFromBuffer(ByteBuffer buffer);
+}
diff --git a/qpid/java/common/src/main/versions/ProtocolVersionList.java.tmpl b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypeMap.java index f0e202dac9..5ac7f8827b 100644 --- a/qpid/java/common/src/main/versions/ProtocolVersionList.java.tmpl +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypeMap.java @@ -1,40 +1,48 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * 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 - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -/** - * This class is autogenerated, do not modify. - */ - -package org.apache.qpid.framing; - -/** - * NOTE: Don't remove the line containing the token VER or VER1 - these are - * markers for code generation. - */ - -public interface ProtocolVersionList -{ - public final int PROTOCOL_MAJOR = 0; - public final int PROTOCOL_MINOR = 1; - public final byte pv[][] = { - // !VER1! - }; -} +/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.framing;
+
+import java.util.Map;
+import java.util.HashMap;
+
+public class AMQTypeMap
+{
+ public static Map<Byte, AMQType> _reverseTypeMap = new HashMap<Byte, AMQType>();
+
+ static
+ {
+ for(AMQType type : AMQType.values())
+ {
+ _reverseTypeMap.put(type.identifier(), type);
+ }
+ }
+
+ public static AMQType getType(Byte identifier)
+ {
+ AMQType result = _reverseTypeMap.get(identifier);
+ if (result == null) {
+ throw new IllegalArgumentException
+ ("no such type code: " + Integer.toHexString(identifier.intValue()));
+ }
+ return result;
+ }
+
+}
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypedValue.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypedValue.java new file mode 100644 index 0000000000..b29c23c2a2 --- /dev/null +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQTypedValue.java @@ -0,0 +1,54 @@ +package org.apache.qpid.framing;
+
+import org.apache.mina.common.ByteBuffer;
+
+public class AMQTypedValue
+{
+ private final AMQType _type;
+ private final Object _value;
+
+
+ public AMQTypedValue(AMQType type, Object value)
+ {
+ if(type == null)
+ {
+ throw new NullPointerException("Cannot create a typed value with null type");
+ }
+ _type = type;
+ _value = type.toNativeValue(value);
+ }
+
+ private AMQTypedValue(AMQType type, ByteBuffer buffer)
+ {
+ _type = type;
+ _value = type.readValueFromBuffer( buffer );
+ }
+
+
+ public AMQType getType()
+ {
+ return _type;
+ }
+
+ public Object getValue()
+ {
+ return _value;
+ }
+
+
+ public void writeToBuffer(ByteBuffer buffer)
+ {
+ _type.writeToBuffer(_value,buffer);
+ }
+
+ public int getEncodingSize()
+ {
+ return _type.getEncodingSize(_value);
+ }
+
+ public static AMQTypedValue readFromBuffer(ByteBuffer buffer)
+ {
+ AMQType type = AMQTypeMap.getType(buffer.get());
+ return new AMQTypedValue(type, buffer);
+ }
+}
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java index 61837f65cc..fc80d93f82 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java @@ -245,7 +245,7 @@ public class BasicContentHeaderProperties implements ContentHeaderProperties } public void populatePropertiesFromBuffer(ByteBuffer buffer, int propertyFlags, int size) - throws AMQFrameDecodingException + throws AMQFrameDecodingException, AMQProtocolVersionException { _propertyFlags = propertyFlags; diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java index a59869b1d8..4ee36ee831 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java @@ -58,7 +58,8 @@ public class ContentHeaderBody extends AMQBody return TYPE; } - protected void populateFromBuffer(ByteBuffer buffer, long size) throws AMQFrameDecodingException + protected void populateFromBuffer(ByteBuffer buffer, long size) + throws AMQFrameDecodingException, AMQProtocolVersionException { classId = buffer.getUnsignedShort(); weight = buffer.getUnsignedShort(); @@ -75,7 +76,8 @@ public class ContentHeaderBody extends AMQBody * @return * @throws AMQFrameDecodingException */ - public static ContentHeaderBody createFromBuffer(ByteBuffer buffer, long size) throws AMQFrameDecodingException + public static ContentHeaderBody createFromBuffer(ByteBuffer buffer, long size) + throws AMQFrameDecodingException, AMQProtocolVersionException { ContentHeaderBody body = new ContentHeaderBody(); body.populateFromBuffer(buffer, size); diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderProperties.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderProperties.java index 561d7852fd..88bdefca88 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderProperties.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderProperties.java @@ -41,7 +41,7 @@ public interface ContentHeaderProperties * @throws AMQFrameDecodingException when the buffer does not contain valid data */ void populatePropertiesFromBuffer(ByteBuffer buffer, int propertyFlags, int size) - throws AMQFrameDecodingException; + throws AMQFrameDecodingException, AMQProtocolVersionException; /** * @return the size of the encoded property list in bytes. diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java index cec413cb9d..cfcc5db857 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderPropertiesFactory.java @@ -37,16 +37,19 @@ public class ContentHeaderPropertiesFactory public ContentHeaderProperties createContentHeaderProperties(int classId, int propertyFlags, ByteBuffer buffer, int size) - throws AMQFrameDecodingException + throws AMQFrameDecodingException, AMQProtocolVersionException { ContentHeaderProperties properties; - switch (classId) + // AMQP version change: "Hardwired" version to major=8, minor=0 + // TODO: Change so that the actual version is obtained from + // the ProtocolInitiation object for this session. + if (classId == BasicConsumeBody.getClazz((byte)8, (byte)0)) { - case BasicConsumeBody.CLASS_ID: - properties = new BasicContentHeaderProperties(); - break; - default: - throw new AMQFrameDecodingException("Unsupport content header class id: " + classId); + properties = new BasicContentHeaderProperties(); + } + else + { + throw new AMQFrameDecodingException("Unsupport content header class id: " + classId); } properties.populatePropertiesFromBuffer(buffer, propertyFlags, size); return properties; diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java index 46dff9ffa8..ebda2c5d2b 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java @@ -88,12 +88,12 @@ public class EncodingUtils { if (table == null) { - // size is encoded as 4 octets + // length is encoded as 4 octets return 4; } else { - // size of the table plus 4 octets for the size + // length of the table plus 4 octets for the length return (int) table.getEncodedSize() + 4; } } @@ -104,6 +104,7 @@ public class EncodingUtils return 0; } + public static void writeShortStringBytes(ByteBuffer buffer, String s) { if (s != null) @@ -448,7 +449,7 @@ public class EncodingUtils byte[] from = new byte[size]; // Is this not the same. - //bb.get(from, 0, size); + //bb.get(from, 0, length); for (int i = 0; i < size; i++) { from[i] = bb.get(i); diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java index 193c7adf1c..3c18683609 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java @@ -1,98 +1,612 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * 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 + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * 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 * - * 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 - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. + * 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 + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. * - * */ package org.apache.qpid.framing; +import org.apache.log4j.Logger; import org.apache.mina.common.ByteBuffer; +import org.apache.qpid.AMQPInvalidClassException; -import java.util.Map; -import java.util.Enumeration; +import java.util.*; -public interface FieldTable extends Map +//extends FieldTable +public class FieldTable { - void writeToBuffer(ByteBuffer buffer); - - void setFromBuffer(ByteBuffer buffer, long length) throws AMQFrameDecodingException; - - byte[] getDataAsBytes(); - - public long getEncodedSize(); - - Object put(Object key, Object value); - - Object remove(Object key); - - - public Enumeration getPropertyNames(); - - public boolean propertyExists(String propertyName); - - //Getters - - public Boolean getBoolean(String string); - - public Byte getByte(String string); - - public Short getShort(String string); - - public Integer getInteger(String string); - - public Long getLong(String string); - - public Float getFloat(String string); - - public Double getDouble(String string); - - public String getString(String string); - - public Character getCharacter(String string); - - public byte[] getBytes(String string); - - public Object getObject(String string); - - // Setters - public Object setBoolean(String string, boolean b); - - public Object setByte(String string, byte b); - - public Object setShort(String string, short i); - - public Object setInteger(String string, int i); - - public Object setLong(String string, long l); - - public Object setFloat(String string, float v); - - public Object setDouble(String string, double v); - - public Object setString(String string, String string1); - - public Object setChar(String string, char c); - - public Object setBytes(String string, byte[] bytes); - - public Object setBytes(String string, byte[] bytes, int start, int length); - - public Object setObject(String string, Object object); - - public boolean isNullStringValue(String name); + private static final Logger _logger = Logger.getLogger(FieldTable.class); + + private LinkedHashMap<String, AMQTypedValue> _properties; + + public FieldTable() + { + super(); + _properties = new LinkedHashMap<String, AMQTypedValue>(); + + } + + + + /** + * Construct a new field table. + * + * @param buffer the buffer from which to read data. The length byte must be read already + * @param length the length of the field table. Must be > 0. + * @throws AMQFrameDecodingException if there is an error decoding the table + */ + public FieldTable(ByteBuffer buffer, long length) throws AMQFrameDecodingException + { + this(); + setFromBuffer(buffer, length); + } + + + + public Boolean getBoolean(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.BOOLEAN)) + { + return (Boolean) value.getValue(); + } + else + { + return null; + } + } + + public Byte getByte(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.BYTE)) + { + return (Byte) value.getValue(); + } + else + { + return null; + } + } + + public Short getShort(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.SHORT)) + { + return (Short) value.getValue(); + } + else + { + return null; + } + } + + public Integer getInteger(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.INT)) + { + return (Integer) value.getValue(); + } + else + { + return null; + } + } + + public Long getLong(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.LONG)) + { + return (Long) value.getValue(); + } + else + { + return null; + } + } + + public Float getFloat(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.FLOAT)) + { + return (Float) value.getValue(); + } + else + { + return null; + } + } + + public Double getDouble(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.DOUBLE)) + { + return (Double) value.getValue(); + } + else + { + return null; + } + } + + public String getString(String string) + { + AMQTypedValue value = _properties.get(string); + if ((value != null) && ((value.getType() == AMQType.WIDE_STRING) || + (value.getType() == AMQType.ASCII_STRING))) + { + return (String) value.getValue(); + } + + else if ((value != null) && (value.getValue() != null) && !(value.getValue() instanceof byte[])) + { + return String.valueOf(value.getValue()); + } + else + { + return null; + } + + } + + public Character getCharacter(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.ASCII_CHARACTER)) + { + return (Character) value.getValue(); + } + else + { + return null; + } + } + + public byte[] getBytes(String string) + { + AMQTypedValue value = _properties.get(string); + if (value != null && (value.getType() == AMQType.BINARY)) + { + return (byte[]) value.getValue(); + } + else + { + return null; + } + } + + public Object getObject(String string) + { + AMQTypedValue value = _properties.get(string); + if(value != null) + { + return value.getValue(); + } + else + { + return value; + } + + } + + // ************ Setters + + public Object setBoolean(String string, boolean b) + { + checkPropertyName(string); + return _properties.put(string, AMQType.BOOLEAN.asTypedValue(b)); + } + + public Object setByte(String string, byte b) + { + checkPropertyName(string); + return _properties.put(string, AMQType.BYTE.asTypedValue(b)); + } + + public Object setShort(String string, short i) + { + checkPropertyName(string); + return _properties.put(string, AMQType.SHORT.asTypedValue(i)); + } + + public Object setInteger(String string, int i) + { + checkPropertyName(string); + return _properties.put(string, AMQType.INT.asTypedValue(i)); + } + + public Object setLong(String string, long l) + { + checkPropertyName(string); + return _properties.put(string, AMQType.LONG.asTypedValue(l)); + } + + public Object setFloat(String string, float v) + { + checkPropertyName(string); + return _properties.put(string, AMQType.FLOAT.asTypedValue(v)); + } + + public Object setDouble(String string, double v) + { + checkPropertyName(string); + return _properties.put(string, AMQType.DOUBLE.asTypedValue(v)); + } + + public Object setString(String string, String value) + { + checkPropertyName(string); + if (value == null) + { + return _properties.put(string, AMQType.VOID.asTypedValue(null)); + } + else + { + //FIXME: determine string encoding and set either WIDE or ASCII string +// if () + { + return _properties.put(string, AMQType.WIDE_STRING.asTypedValue(value)); + } +// else +// { +// return _properties.put(string, AMQType.ASCII_STRING.asTypedValue(value)); +// } + } + } + + public Object setChar(String string, char c) + { + checkPropertyName(string); + return _properties.put(string, AMQType.ASCII_CHARACTER.asTypedValue(c)); + } + + public Object setBytes(String string, byte[] bytes) + { + checkPropertyName(string); + return _properties.put(string, AMQType.BINARY.asTypedValue(bytes)); + } + + public Object setBytes(String string, byte[] bytes, int start, int length) + { + checkPropertyName(string); + byte[] newBytes = new byte[length]; + System.arraycopy(bytes,start,newBytes,0,length); + return setBytes(string, bytes); + } + + + public Object setObject(String string, Object object) + { + if (object instanceof Boolean) + { + return setBoolean(string, (Boolean) object); + } + else 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); + } + + throw new AMQPInvalidClassException("Only Primatives objects allowed Object is:" + object.getClass()); + } + + + public boolean isNullStringValue(String name) + { + AMQTypedValue value = _properties.get(name); + return (value != null) && (value.getType() == AMQType.VOID); + } + + // ***** Methods + + public Enumeration getPropertyNames() + { + return Collections.enumeration(_properties.keySet()); + } + + public boolean propertyExists(String propertyName) + { + return itemExists(propertyName); + } + + public boolean itemExists(String string) + { + return _properties.containsKey(string); + } + + public String toString() + { + return _properties.toString(); + } + + + + private void checkPropertyName(String propertyName) + { + if (propertyName == null) + { + throw new IllegalArgumentException("Property name must not be null"); + } + else if ("".equals(propertyName)) + { + throw new IllegalArgumentException("Property name must not be the empty string"); + } + + checkIdentiferFormat(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. + + + // AMQP length limit + if (propertyName.length() > 128) + { + throw new IllegalArgumentException("AMQP limits property names to 128 characters"); + } + + // AMQ start character + if (!(Character.isLetter(propertyName.charAt(0)) + || propertyName.charAt(0) == '$' + || propertyName.charAt(0) == '#' + || propertyName.charAt(0) == '_')) // Not official AMQP added for JMS. + { + throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid AMQP start character"); + } + } + + + // ************************* Byte Buffer Processing + + public void writeToBuffer(ByteBuffer buffer) + { + final boolean trace = _logger.isTraceEnabled(); + + if (trace) + { + _logger.trace("FieldTable::writeToBuffer: Writing encoded length of " + getEncodedSize() + "..."); + } + + EncodingUtils.writeUnsignedInteger(buffer, getEncodedSize()); + + putDataInBuffer(buffer); + } + + public byte[] getDataAsBytes() + { + final int encodedSize = (int) getEncodedSize(); + final ByteBuffer buffer = ByteBuffer.allocate(encodedSize); // FIXME XXX: Is cast a problem? + + putDataInBuffer(buffer); + + final byte[] result = new byte[encodedSize]; + buffer.flip(); + buffer.get(result); + buffer.release(); + return result; + } + + public long getEncodedSize() + { + int encodedSize = 0; + for(Map.Entry<String,AMQTypedValue> e : _properties.entrySet()) + { + encodedSize += EncodingUtils.encodedShortStringLength(e.getKey()); + encodedSize++; // the byte for the encoding Type + encodedSize += e.getValue().getEncodingSize(); + + } + return encodedSize; + } + + public void addAll(FieldTable fieldTable) + { + _properties.putAll(fieldTable._properties); + } + + + public static interface FieldTableElementProcessor + { + public boolean processElement(String propertyName, AMQTypedValue value); + public Object getResult(); + } + + public Object processOverElements(FieldTableElementProcessor processor) + { + for(Map.Entry<String,AMQTypedValue> e : _properties.entrySet()) + { + boolean result = processor.processElement(e.getKey(), e.getValue()); + if(!result) + { + break; + } + } + return processor.getResult(); + } + + + public int size() + { + return _properties.size(); + } + + public boolean isEmpty() + { + return _properties.isEmpty(); + } + + public boolean containsKey(String key) + { + return _properties.containsKey(key); + } + + public Set<String> keys() + { + return _properties.keySet(); + } + + + public Object get(Object key) + { + + return getObject((String)key); + } + + + public Object put(Object key, Object value) + { + return setObject(key.toString(), value); + } + + + public Object remove(String key) + { + AMQTypedValue value = _properties.remove(key); + return value == null ? null : value.getValue(); + } + + + + public void clear() + { + _properties.clear(); + } + + public Set keySet() + { + return _properties.keySet(); + } + + private void putDataInBuffer(ByteBuffer buffer) + { + + final Iterator<Map.Entry<String,AMQTypedValue>> it = _properties.entrySet().iterator(); + + //If there are values then write out the encoded Size... could check _encodedSize != 0 + // write out the total length, which we have kept up to date as data is added + + + while (it.hasNext()) + { + final Map.Entry<String,AMQTypedValue> me = it.next(); + try + { + if (_logger.isTraceEnabled()) + { + _logger.trace("Writing Property:" + me.getKey() + + " Type:" + me.getValue().getType() + + " Value:" + me.getValue().getValue()); + _logger.trace("Buffer Position:" + buffer.position() + + " Remaining:" + buffer.remaining()); + } + + + + //Write the actual parameter name + EncodingUtils.writeShortStringBytes(buffer, me.getKey()); + me.getValue().writeToBuffer(buffer); + } + catch (Exception e) + { + if (_logger.isTraceEnabled()) + { + _logger.trace("Exception thrown:" + e); + _logger.trace("Writing Property:" + me.getKey() + + " Type:" + me.getValue().getType() + + " Value:" + me.getValue().getValue()); + _logger.trace("Buffer Position:" + buffer.position() + + " Remaining:" + buffer.remaining()); + } + throw new RuntimeException(e); + } + } + } + + + public void setFromBuffer(ByteBuffer buffer, long length) throws AMQFrameDecodingException + { + final boolean trace = _logger.isTraceEnabled(); + + int sizeRead = 0; + while (sizeRead < length) + { + int sizeRemaining = buffer.remaining(); + final String key = EncodingUtils.readShortString(buffer); + AMQTypedValue value = AMQTypedValue.readFromBuffer(buffer); + sizeRead += (sizeRemaining - buffer.remaining()); + + if (trace) + { + _logger.trace("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + value.getType() + "', key '" + key + "', value '" + value.getValue() + "' (now read " + sizeRead + " of " + length + " encoded bytes)..."); + } + + _properties.put(key,value); + } + + if (trace) + { + _logger.trace("FieldTable::FieldTable(buffer," + length + "): Done."); + } + } } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java index b1fcd8a20b..e9d75137ef 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java @@ -26,16 +26,13 @@ public class FieldTableFactory { public static FieldTable newFieldTable() { - return new PropertyFieldTable(); + return new FieldTable(); } public static FieldTable newFieldTable(ByteBuffer byteBuffer, long length) throws AMQFrameDecodingException { - return new PropertyFieldTable(byteBuffer, length); + return new FieldTable(byteBuffer, length); } - public static FieldTable newFieldTable(String text) - { - return new PropertyFieldTable(text); - } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java index 142a689a01..d78034cf2f 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java @@ -32,29 +32,11 @@ public class JMSPropertyFieldTable { private FieldTable _fieldtable; - public JMSPropertyFieldTable() - { - _fieldtable = new PropertyFieldTable(); - } - public JMSPropertyFieldTable(FieldTable table) { _fieldtable = table; } - public JMSPropertyFieldTable(ByteBuffer buffer, long length) throws JMSException - { - try - { - _fieldtable = new PropertyFieldTable(buffer, length); - } - catch (AMQFrameDecodingException e) - { - JMSException error = new JMSException(e.getMessage()); - error.setLinkedException(e); - throw error; - } - } private void checkPropertyName(String propertyName) { diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java deleted file mode 100644 index 4b8f56e4e8..0000000000 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java +++ /dev/null @@ -1,1281 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * 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 - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.qpid.framing; - -import org.apache.log4j.Logger; -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.AMQPInvalidClassException; - -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.Vector; -import java.util.HashMap; - -//extends FieldTable -public class PropertyFieldTable implements FieldTable -{ - private static final Logger _logger = Logger.getLogger(PropertyFieldTable.class); - - private static final String BOOLEAN = "boolean"; - private static final String BYTE = "byte"; - private static final String BYTES = "bytes"; - private static final String SHORT = "short"; - private static final String INT = "int"; - private static final String LONG = "long"; - 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"; - - private static final String PROPERTY_FIELD_TABLE_CLOSE_XML = "</PropertyFieldTable>"; - private static final String PROPERTY_FIELD_TABLE_OPEN_XML = "<PropertyFieldTable>"; - 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, Prefix> _propertyNamesTypeMap; - private long _encodedSize = 0; - - public PropertyFieldTable() - { - super(); - _properties = new LinkedHashMap<String, Object>(); - _propertyNamesTypeMap = new LinkedHashMap<String, Prefix>(); - } - - public PropertyFieldTable(String textFormat) - { - this(); - try - { - parsePropertyFieldTable(textFormat); - } - catch (Exception e) - { - _logger.warn("Unable to decode PropertyFieldTable format:" + textFormat); - throw new IllegalArgumentException("Unable to decode PropertyFieldTable format:" + textFormat); - } - } - - /** - * Construct a new field table. - * - * @param buffer the buffer from which to read data. The length byte must be read already - * @param length the length of the field table. Must be > 0. - * @throws AMQFrameDecodingException if there is an error decoding the table - */ - public PropertyFieldTable(ByteBuffer buffer, long length) throws AMQFrameDecodingException - { - this(); - setFromBuffer(buffer, length); - } - - // ************ Getters - private Object get(String propertyName, Prefix prefix) - { - //Retrieve the type associated with this name - Prefix type = _propertyNamesTypeMap.get(propertyName); - - if (type == null) - { - return null; - } - - if (type.equals(prefix)) - { - return _properties.get(propertyName); - } - else - { - return null; - } - } - - public Boolean getBoolean(String string) - { - Object o = get(string, Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX); - if (o != null && o instanceof Boolean) - { - return (Boolean) o; - } - else - { - return null; - } - } - - public Byte getByte(String string) - { - Object o = get(string, Prefix.AMQP_BYTE_PROPERTY_PREFIX); - if (o != null) - { - return (Byte) o; - } - else - { - return null; - } - } - - public Short getShort(String string) - { - Object o = get(string, Prefix.AMQP_SHORT_PROPERTY_PREFIX); - if (o != null) - { - return (Short) o; - } - else - { - return null; - } - } - - public Integer getInteger(String string) - { - Object o = get(string, Prefix.AMQP_INT_PROPERTY_PREFIX); - if (o != null) - { - return (Integer) o; - } - else - { - return null; - } - } - - public Long getLong(String string) - { - Object o = get(string, Prefix.AMQP_LONG_PROPERTY_PREFIX); - if (o != null) - { - return (Long) o; - } - else - { - return null; - } - } - - public Float getFloat(String string) - { - Object o = get(string, Prefix.AMQP_FLOAT_PROPERTY_PREFIX); - if (o != null) - { - return (Float) o; - } - else - { - return null; - } - } - - public Double getDouble(String string) - { - Object o = get(string, Prefix.AMQP_DOUBLE_PROPERTY_PREFIX); - if (o != null) - { - return (Double) o; - } - else - { - return null; - } - } - - public String getString(String string) - { - Object o = get(string, Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX); - if (o != null) - { - return (String) o; - } - else - { - 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, Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX); - if (o != null) - { - return (Character) o; - } - else - { - return null; - } - } - - public byte[] getBytes(String string) - { - Object o = get(string, Prefix.AMQP_BINARY_PROPERTY_PREFIX); - if (o != null) - { - return (byte[]) o; - } - else - { - return null; - } - } - - public Object getObject(String string) - { - return _properties.get(string); - } - - // ************ Setters - - public Object setBoolean(String string, boolean b) - { - return put(Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX, string, b); - } - - public Object setByte(String string, byte b) - { - return put(Prefix.AMQP_BYTE_PROPERTY_PREFIX, string, b); - } - - public Object setShort(String string, short i) - { - return put(Prefix.AMQP_SHORT_PROPERTY_PREFIX, string, i); - } - - public Object setInteger(String string, int i) - { - return put(Prefix.AMQP_INT_PROPERTY_PREFIX, string, i); - } - - public Object setLong(String string, long l) - { - return put(Prefix.AMQP_LONG_PROPERTY_PREFIX, string, l); - } - - public Object setFloat(String string, float v) - { - return put(Prefix.AMQP_FLOAT_PROPERTY_PREFIX, string, v); - } - - public Object setDouble(String string, double v) - { - return put(Prefix.AMQP_DOUBLE_PROPERTY_PREFIX, string, v); - } - - public Object setString(String string, 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(Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX, string, c); - } - - public Object setBytes(String string, byte[] bytes) - { - return setBytes(string, bytes, 0, bytes.length); - } - - public Object setBytes(String string, byte[] bytes, int start, int length) - { - return put(Prefix.AMQP_BINARY_PROPERTY_PREFIX, string, sizeByteArray(bytes, start, length)); - } - - private byte[] sizeByteArray(byte[] bytes, int start, int length) - { - byte[] resized = new byte[length]; - int newIndex = 0; - for (int oldIndex = start; oldIndex < length; oldIndex++) - { - resized[newIndex] = bytes[oldIndex]; - newIndex++; - } - - return resized; - } - - - public Object setObject(String string, Object object) - { - if (object instanceof Boolean) - { - return setBoolean(string, (Boolean) object); - } - else 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); - } - - 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 - - public Enumeration getPropertyNames() - { - Vector<String> names = new Vector<String>(); - - Iterator keys = _properties.keySet().iterator(); - - while (keys.hasNext()) - { - String key = (String) keys.next(); - - names.add(key); - } - - return names.elements(); - } - - public boolean propertyExists(String propertyName) - { - return itemExists(propertyName); - } - - public boolean itemExists(String string) - { - return _properties.containsKey(string); - } - - public String toString() - { - return valueOf(this); - } - - public static String valueOf(PropertyFieldTable table) - { - StringBuffer buf = new StringBuffer(PROPERTY_FIELD_TABLE_OPEN_XML); - - final Iterator it = table._properties.entrySet().iterator(); - - while (it.hasNext()) - { - final Map.Entry entry = (Map.Entry) it.next(); - final String propertyName = (String) entry.getKey(); - - buf.append('\n'); - buf.append(valueAsXML(table._propertyNamesTypeMap.get(propertyName), propertyName, entry.getValue())); - } - buf.append("\n"); - buf.append(PROPERTY_FIELD_TABLE_CLOSE_XML); - - return buf.toString(); - } - - private static String valueAsXML(Prefix type, String propertyName, Object value) - { - StringBuffer buf = new StringBuffer(); - // Start Tag - buf.append(propertyXML(type, propertyName, true)); - - // Value - if (type.equals(Prefix.AMQP_BINARY_PROPERTY_PREFIX)) - { - //remove '>' - buf.deleteCharAt(buf.length() - 1); - - byte[] bytes = (byte[]) value; - buf.append(" length='").append(bytes.length).append("'>"); - - buf.append(byteArrayToXML(propertyName, bytes)); - } - else - { - if (!type.equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX)) - { - buf.append(String.valueOf(value)); - } - } - //End Tag - buf.append(propertyXML(type, propertyName, false)); - - return buf.toString(); - } - - private void checkPropertyName(String propertyName) - { - if (propertyName == null) - { - throw new IllegalArgumentException("Property name must not be null"); - } - else if ("".equals(propertyName)) - { - throw new IllegalArgumentException("Property name must not be the empty string"); - } - - checkIdentiferFormat(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. - - // AMQP length limit - if (propertyName.length() > 128) - { - throw new IllegalArgumentException("AMQP limits property names to 128 characters"); - } - - // AMQ start character - if (!(Character.isLetter(propertyName.charAt(0)) - || propertyName.charAt(0) == '$' - || propertyName.charAt(0) == '#' - || propertyName.charAt(0) == '_')) // Not official AMQP added for JMS. - { - throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid AMQP start character"); - } - } - - private static String propertyXML(Prefix type, String propertyName, boolean start) - { - StringBuffer buf = new StringBuffer(); - - if (start) - { - buf.append("<"); - } - else - { - buf.append("</"); - } - - switch (type) - { - case AMQP_BOOLEAN_PROPERTY_PREFIX: - buf.append(BOOLEAN); - break; - case AMQP_BYTE_PROPERTY_PREFIX: - buf.append(BYTE); - break; - case AMQP_BINARY_PROPERTY_PREFIX: - buf.append(BYTES); - break; - case AMQP_SHORT_PROPERTY_PREFIX: - buf.append(SHORT); - break; - case AMQP_INT_PROPERTY_PREFIX: - buf.append(INT); - break; - case AMQP_LONG_PROPERTY_PREFIX: - buf.append(LONG); - break; - case AMQP_FLOAT_PROPERTY_PREFIX: - buf.append(FLOAT); - break; - case AMQP_DOUBLE_PROPERTY_PREFIX: - buf.append(DOUBLE); - break; - 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 AMQP_ASCII_CHARACTER_PROPERTY_PREFIX: - buf.append(CHAR); - break; - default: - buf.append(UNKNOWN + " (identifier ").append(type.identifier()).append(")"); - break; - } - - if (start) - { - buf.append(" name='").append(propertyName).append("'"); - } - - buf.append(">"); - - return buf.toString(); - } - - private static String byteArrayToXML(String propertyName, byte[] bytes) - { - StringBuffer buf = new StringBuffer(); - - for (int index = 0; index < bytes.length; index++) - { - buf.append("\n"); - buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", true)); - buf.append(bytes[index]); - buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", false)); - } - buf.append("\n"); - return buf.toString(); - } - - private void processBytesXMLLine(String xmlline) - { - String propertyName = xmlline.substring(xmlline.indexOf('\'') + 1, - xmlline.indexOf('\'', xmlline.indexOf('\'') + 1)); - String value = xmlline.substring(xmlline.indexOf(">") + 1, - xmlline.indexOf("</")); - - Integer index = Integer.parseInt(propertyName.substring(propertyName.lastIndexOf("[") + 1, - propertyName.lastIndexOf("]"))); - propertyName = propertyName.substring(0, propertyName.lastIndexOf("[")); - - getBytes(propertyName)[index] = Byte.parseByte(value); - } - - private void parsePropertyFieldTable(String textFormat) - { - 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)) - { - processing = false; - finished = true; - } - if (token.equals(BYTES_CLOSE_XML)) - { - processing = false; - } - - if (token.equals(BYTES_CLOSE_XML)) - { - processing_bytes = false; - } - - if (processing) - { - processXMLLine(token); - } - else if (processing_bytes) - { - processBytesXMLLine(token); - } - - if (token.startsWith(BYTES_OPEN_XML_START)) - { - processing_bytes = true; - processing = false; - } - - if (token.equals(PROPERTY_FIELD_TABLE_OPEN_XML) || - token.equals(BYTES_CLOSE_XML)) - { - processing = true; - } - } - - if (!finished) - { - throw new IllegalArgumentException("XML was not in a valid format."); - } - - } - - private void processXMLLine(String xmlline) - { - // <<type> name='<property>'><value></<type>> - // <string name='message' >Message 99</string > - - String type = xmlline.substring(1, xmlline.indexOf(" ")); - - String propertyName = xmlline.substring(xmlline.indexOf('\'') + 1, - xmlline.indexOf('\'', xmlline.indexOf('\'') + 1)); - - String value = ""; - - if (!type.equals(BYTES)) - { - value = xmlline.substring(xmlline.indexOf(">") + 1, - xmlline.indexOf("</")); - } - - if (type.equals(BOOLEAN)) - { - setBoolean(propertyName, Boolean.parseBoolean(value)); - } - if (type.equals(BYTE)) - { - setByte(propertyName, Byte.parseByte(value)); - } - if (type.equals(BYTES)) - { - int headerEnd = xmlline.indexOf('>'); - String bytesHeader = xmlline.substring(0, headerEnd); - - //Extract length value - Integer length = Integer.parseInt(bytesHeader.substring( - bytesHeader.lastIndexOf("=") + 2 - , bytesHeader.lastIndexOf("'"))); - - - byte[] bytes = new byte[length]; - setBytes(propertyName, bytes); - - //Check if the line contains all the byte values - // This is needed as the XMLLine sent across the wire is the bytes value - - int byteStart = xmlline.indexOf('<', headerEnd); - - //Don't think this is required. - if (byteStart > 0) - { - while (!xmlline.startsWith(BYTES_CLOSE_XML, byteStart)) - { - //This should be the next byte line - int bytePrefixEnd = xmlline.indexOf('>', byteStart) + 1; - int byteEnd = xmlline.indexOf('>', bytePrefixEnd) + 1; - - String byteline = xmlline.substring(byteStart, byteEnd); - - processBytesXMLLine(byteline); - - byteStart = xmlline.indexOf('<', byteEnd); - } - } - - } - if (type.equals(SHORT)) - { - setShort(propertyName, Short.parseShort(value)); - } - if (type.equals(INT)) - { - setInteger(propertyName, Integer.parseInt(value)); - } - if (type.equals(LONG)) - { - setLong(propertyName, Long.parseLong(value)); - } - if (type.equals(FLOAT)) - { - setFloat(propertyName, Float.parseFloat(value)); - } - if (type.equals(DOUBLE)) - { - setDouble(propertyName, Double.parseDouble(value)); - } - if (type.equals(STRING) || type.equals(NULL_STRING)) - { - if (type.equals(NULL_STRING)) - { - value = null; - } - setString(propertyName, value); - } - if (type.equals(CHAR)) - { - setChar(propertyName, value.charAt(0)); - } - if (type.equals(UNKNOWN)) - { - _logger.warn("Ignoring unknown property value:" + xmlline); - } - } - - // ************************* Byte Buffer Processing - - public void writeToBuffer(ByteBuffer buffer) - { - final boolean trace = _logger.isTraceEnabled(); - - if (trace) - { - _logger.trace("FieldTable::writeToBuffer: Writing encoded size of " + _encodedSize + "..."); - } - - EncodingUtils.writeUnsignedInteger(buffer, _encodedSize); - - putDataInBuffer(buffer); - } - - public byte[] getDataAsBytes() - { - final ByteBuffer buffer = ByteBuffer.allocate((int) _encodedSize); // FIXME XXX: Is cast a problem? - - putDataInBuffer(buffer); - - final byte[] result = new byte[(int) _encodedSize]; - buffer.flip(); - buffer.get(result); - buffer.release(); - return result; - } - - - public int size() - { - return _properties.size(); - } - - public boolean isEmpty() - { - return _properties.isEmpty(); - } - - public boolean containsKey(Object key) - { - return _properties.containsKey(key); - } - - public boolean containsValue(Object value) - { - return _properties.containsValue(value); - } - - public Object get(Object key) - { - return _properties.get(key); - } - - - public Object put(Object key, Object value) - { - return setObject(key.toString(), value); - } - - protected Object put(Prefix type, String propertyName, Object value) - { - checkPropertyName(propertyName); - - //remove the previous value - Object previous = remove(propertyName); - - - if (_logger.isTraceEnabled()) - { - 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); - } - - //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(type, value); - } - - //Store new values - _propertyNamesTypeMap.put(propertyName, type); - _properties.put(propertyName, value); - - return previous; - } - - public Object remove(Object key) - { - 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)) + 1; - - // This check is, for now, unnecessary (we don't store null values). - if (value != null) - { - _encodedSize -= getEncodingSize(type, value); - } - return value; - } - else - { - return null; - } - } - - public void putAll(Map t) - { - Iterator it = t.keySet().iterator(); - - while (it.hasNext()) - { - Object key = it.next(); - put(key, t.get(key)); - } - } - - public void clear() - { - _encodedSize = 0; - _properties.clear(); - _propertyNamesTypeMap.clear(); - } - - public Set keySet() - { - return _properties.keySet(); - } - - public Collection values() - { - return _properties.values(); - } - - public Set entrySet() - { - return _properties.entrySet(); - } - - public long getEncodedSize() - { - return _encodedSize; - } - - - 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 - // write out the total length, which we have kept up to date as data is added - - - while (it.hasNext()) - { - Map.Entry me = (Map.Entry) it.next(); - String propertyName = (String) me.getKey(); - - //The type value - Prefix type = _propertyNamesTypeMap.get(propertyName); - - Object value = me.getValue(); - try - { - if (_logger.isTraceEnabled()) - { - _logger.trace("Writing Property:" + propertyName + - " Type:" + type + - " Value:" + value); - _logger.trace("Buffer Position:" + buffer.position() + - " Remaining:" + buffer.remaining()); - } - - //Write the actual parameter name - EncodingUtils.writeShortStringBytes(buffer, propertyName); - - switch (type) - { - 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); - } - } - } - - - public void setFromBuffer(ByteBuffer buffer, long length) throws AMQFrameDecodingException - { - final boolean trace = _logger.isTraceEnabled(); - - int sizeRead = 0; - while (sizeRead < length) - { - int sizeRemaining = buffer.remaining(); - final String key = EncodingUtils.readShortString(buffer); - - byte iType = buffer.get(); - - 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 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 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 = "Internal error, the following type identifier is not handled: " + type; - throw new AMQFrameDecodingException(msg); - } - - sizeRead += (sizeRemaining - buffer.remaining()); - - if (trace) - { - _logger.trace("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + type + "', key '" + key + "', value '" + value + "' (now read " + sizeRead + " of " + length + " encoded bytes)..."); - } - - put(type, key, value); - } - - if (trace) - { - _logger.trace("FieldTable::FieldTable(buffer," + length + "): Done."); - } - } - - /** - * @param type the type to calucluate encoding for - * @param value the property value - * @return integer - */ - private static int getEncodingSize(Prefix type, Object value) - { - int encodingSize = 0; - - switch (type) - { - 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: - throw new IllegalArgumentException("Unsupported type in field table: " + value.getClass()); - } - - // the extra byte for the type indicator is calculated in the name - return encodingSize; - } -} diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java index f0d5489527..f2d1a70cdc 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ProtocolInitiation.java @@ -146,18 +146,6 @@ public class ProtocolInitiation extends AMQDataBlock implements EncodableAMQData throw new AMQProtocolInstanceException("Protocol instance " + CURRENT_PROTOCOL_INSTANCE + " was expected; received " + protocolInstance); } - /* - if (protocolMajor != CURRENT_PROTOCOL_VERSION_MAJOR) - { - throw new AMQProtocolVersionException("Protocol major version " + CURRENT_PROTOCOL_VERSION_MAJOR + - " was expected; received " + protocolMajor); - } - if (protocolMinor != CURRENT_PROTOCOL_VERSION_MINOR) - { - throw new AMQProtocolVersionException("Protocol minor version " + CURRENT_PROTOCOL_VERSION_MINOR + - " was expected; received " + protocolMinor); - } - */ /* Look through list of available protocol versions */ boolean found = false; diff --git a/qpid/java/common/src/main/java/org/apache/qpid/pool/Event.java b/qpid/java/common/src/main/java/org/apache/qpid/pool/Event.java index 7364b9293a..43ff8f6a19 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/pool/Event.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/pool/Event.java @@ -25,90 +25,66 @@ import org.apache.mina.common.IoFilter; import org.apache.mina.common.IoSession; import org.apache.mina.common.IdleStatus; -/** - * Represents an operation on IoFilter. - */ -enum EventType -{ - OPENED, CLOSED, READ, WRITE, WRITTEN, RECEIVED, SENT, IDLE, EXCEPTION -} -class Event +abstract public class Event { - private static final Logger _log = Logger.getLogger(Event.class); - - private final EventType type; - private final IoFilter.NextFilter nextFilter; - private final Object data; - - public Event(IoFilter.NextFilter nextFilter, EventType type, Object data) - { - this.type = type; - this.nextFilter = nextFilter; - this.data = data; - if (type == EventType.EXCEPTION) - { - _log.error("Exception event constructed: " + data, (Throwable) data); - } - } - public Object getData() + public Event() { - return data; } - public IoFilter.NextFilter getNextFilter() - { - return nextFilter; - } + abstract public void process(IoSession session); - public EventType getType() + public static final class ReceivedEvent extends Event { - return type; - } + private final Object _data; - void process(IoSession session) - { - if (_log.isDebugEnabled()) - { - _log.debug("Processing " + this); - } - if (type == EventType.RECEIVED) - { - nextFilter.messageReceived(session, data); - //ByteBufferUtil.releaseIfPossible( data ); - } - else if (type == EventType.SENT) + private final IoFilter.NextFilter _nextFilter; + + public ReceivedEvent(final IoFilter.NextFilter nextFilter, final Object data) { - nextFilter.messageSent(session, data); - //ByteBufferUtil.releaseIfPossible( data ); + super(); + _nextFilter = nextFilter; + _data = data; } - else if (type == EventType.EXCEPTION) + + public void process(IoSession session) { - nextFilter.exceptionCaught(session, (Throwable) data); + _nextFilter.messageReceived(session, _data); } - else if (type == EventType.IDLE) + + public IoFilter.NextFilter getNextFilter() { - nextFilter.sessionIdle(session, (IdleStatus) data); + return _nextFilter; } - else if (type == EventType.OPENED) + } + + + public static final class WriteEvent extends Event + { + private final IoFilter.WriteRequest _data; + private final IoFilter.NextFilter _nextFilter; + + public WriteEvent(final IoFilter.NextFilter nextFilter, final IoFilter.WriteRequest data) { - nextFilter.sessionOpened(session); + super(); + _nextFilter = nextFilter; + _data = data; } - else if (type == EventType.WRITE) + + + public void process(IoSession session) { - nextFilter.filterWrite(session, (IoFilter.WriteRequest) data); + _nextFilter.filterWrite(session, _data); } - else if (type == EventType.CLOSED) + + public IoFilter.NextFilter getNextFilter() { - nextFilter.sessionClosed(session); + return _nextFilter; } } - public String toString() - { - return "Event: type " + type + ", data: " + data; - } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java b/qpid/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java index 38cfa68c78..c0026c1f36 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java @@ -25,51 +25,39 @@ import org.apache.mina.common.IdleStatus; import org.apache.mina.common.IoFilterAdapter; import org.apache.mina.common.IoSession; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; +import java.util.EnumSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class PoolingFilter extends IoFilterAdapter implements Job.JobCompletionHandler { private static final Logger _logger = Logger.getLogger(PoolingFilter.class); - public static final Set<EventType> READ_EVENTS = new HashSet<EventType>(Arrays.asList(EventType.RECEIVED)); - public static final Set<EventType> WRITE_EVENTS = new HashSet<EventType>(Arrays.asList(EventType.WRITE)); private final ConcurrentMap<IoSession, Job> _jobs = new ConcurrentHashMap<IoSession, Job>(); private final ReferenceCountingExecutorService _poolReference; - private final Set<EventType> _asyncTypes; private final String _name; private final int _maxEvents = Integer.getInteger("amqj.server.read_write_pool.max_events", 10); - public PoolingFilter(ReferenceCountingExecutorService refCountingPool, Set<EventType> asyncTypes, String name) + public PoolingFilter(ReferenceCountingExecutorService refCountingPool, String name) { _poolReference = refCountingPool; - _asyncTypes = asyncTypes; _name = name; } - private void fireEvent(IoSession session, Event event) + void fireAsynchEvent(IoSession session, Event event) { - if (_asyncTypes.contains(event.getType())) - { - Job job = getJobForSession(session); - job.acquire(); //prevents this job being removed from _jobs - job.add(event); + Job job = getJobForSession(session); + job.acquire(); //prevents this job being removed from _jobs + job.add(event); - //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); - } - } - else + //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()) { - event.process(session); + _poolReference.getPool().execute(job); } + } private Job getJobForSession(IoSession session) @@ -114,45 +102,44 @@ public class PoolingFilter extends IoFilterAdapter implements Job.JobCompletionH //IoFilter methods that are processed by threads on the pool - public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception + public void sessionOpened(final NextFilter nextFilter, final IoSession session) throws Exception { - fireEvent(session, new Event(nextFilter, EventType.OPENED, null)); + nextFilter.sessionOpened(session); } - public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception + public void sessionClosed(final NextFilter nextFilter, final IoSession session) throws Exception { - fireEvent(session, new Event(nextFilter, EventType.CLOSED, null)); + nextFilter.sessionClosed(session); } - public void sessionIdle(NextFilter nextFilter, IoSession session, - IdleStatus status) throws Exception + public void sessionIdle(final NextFilter nextFilter, final IoSession session, + final IdleStatus status) throws Exception { - fireEvent(session, new Event(nextFilter, EventType.IDLE, status)); + nextFilter.sessionIdle(session, status); } - public void exceptionCaught(NextFilter nextFilter, IoSession session, - Throwable cause) throws Exception + public void exceptionCaught(final NextFilter nextFilter, final IoSession session, + final Throwable cause) throws Exception { - fireEvent(session, new Event(nextFilter, EventType.EXCEPTION, cause)); + nextFilter.exceptionCaught(session,cause); } - public void messageReceived(NextFilter nextFilter, IoSession session, - Object message) throws Exception + public void messageReceived(final NextFilter nextFilter, final IoSession session, + final Object message) throws Exception { - //ByteBufferUtil.acquireIfPossible( message ); - fireEvent(session, new Event(nextFilter, EventType.RECEIVED, message)); + nextFilter.messageReceived(session,message); } - public void messageSent(NextFilter nextFilter, IoSession session, - Object message) throws Exception + public void messageSent(final NextFilter nextFilter, final IoSession session, + final Object message) throws Exception { - //ByteBufferUtil.acquireIfPossible( message ); - fireEvent(session, new Event(nextFilter, EventType.SENT, message)); + nextFilter.messageSent(session, message); } - public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception + public void filterWrite(final NextFilter nextFilter, final IoSession session, + final WriteRequest writeRequest) throws Exception { - fireEvent(session, new Event(nextFilter, EventType.WRITE, writeRequest)); + nextFilter.filterWrite(session, writeRequest); } //IoFilter methods that are processed on current thread (NOT on pooled thread) @@ -188,5 +175,52 @@ public class PoolingFilter extends IoFilterAdapter implements Job.JobCompletionH // when the reference count gets to zero we release the executor service _poolReference.releaseExecutorService(); } + + public static class AsynchReadPoolingFilter extends PoolingFilter + { + + public AsynchReadPoolingFilter(ReferenceCountingExecutorService refCountingPool, String name) + { + super(refCountingPool, name); + } + + public void messageReceived(final NextFilter nextFilter, final IoSession session, + final Object message) throws Exception + { + + fireAsynchEvent(session, new Event.ReceivedEvent(nextFilter, message)); + } + + + } + + public static class AsynchWritePoolingFilter extends PoolingFilter + { + + public AsynchWritePoolingFilter(ReferenceCountingExecutorService refCountingPool, String name) + { + super(refCountingPool, name); + } + + + public void filterWrite(final NextFilter nextFilter, final IoSession session, + final WriteRequest writeRequest) throws Exception + { + fireAsynchEvent(session, new Event.WriteEvent(nextFilter, writeRequest)); + } + + } + + public static PoolingFilter createAynschReadPoolingFilter(ReferenceCountingExecutorService refCountingPool,String name) + { + return new AsynchReadPoolingFilter(refCountingPool,name); + } + + + public static PoolingFilter createAynschWritePoolingFilter(ReferenceCountingExecutorService refCountingPool,String name) + { + return new AsynchWritePoolingFilter(refCountingPool,name); + } + } diff --git a/qpid/java/common/src/main/java/org/apache/qpid/pool/ReadWriteThreadModel.java b/qpid/java/common/src/main/java/org/apache/qpid/pool/ReadWriteThreadModel.java index d4dbf1309a..84b72bb0dc 100644 --- a/qpid/java/common/src/main/java/org/apache/qpid/pool/ReadWriteThreadModel.java +++ b/qpid/java/common/src/main/java/org/apache/qpid/pool/ReadWriteThreadModel.java @@ -29,11 +29,8 @@ public class ReadWriteThreadModel implements ThreadModel public void buildFilterChain(IoFilterChain chain) throws Exception { ReferenceCountingExecutorService executor = ReferenceCountingExecutorService.getInstance(); - PoolingFilter asyncRead = new PoolingFilter(executor, PoolingFilter.READ_EVENTS, - "AsynchronousReadFilter"); - PoolingFilter asyncWrite = new PoolingFilter(executor, PoolingFilter.WRITE_EVENTS, - "AsynchronousWriteFilter"); - + PoolingFilter asyncRead = PoolingFilter.createAynschReadPoolingFilter(executor, "AsynchronousReadFilter"); + PoolingFilter asyncWrite = PoolingFilter.createAynschWritePoolingFilter(executor, "AsynchronousWriteFilter"); chain.addFirst("AsynchronousReadFilter", new ReferenceCountingIoFilter(asyncRead)); chain.addLast("AsynchronousWriteFilter", new ReferenceCountingIoFilter(asyncWrite)); } diff --git a/qpid/java/common/src/main/xsl/cluster.asl b/qpid/java/common/src/main/xsl/cluster.asl deleted file mode 100644 index 40ca937904..0000000000 --- a/qpid/java/common/src/main/xsl/cluster.asl +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0"?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> - -<amqp major="8" minor="0" port="5672" comment="AMQ protocol 0.80"> - -<class name = "cluster" index = "101"> - -<doc> - An extension that allows brokers to communicate in order to - provide a clustered service to clients. -</doc> - -<method name = "join"> - <field name = "broker" type = "shortstr" /> -</method> - -<method name = "membership"> - <field name = "members" type = "longstr" /> -</method> - -<method name = "synch"> -</method> - -<method name = "leave"> - <field name = "broker" type = "shortstr" /> -</method> - -<method name = "suspect"> - <field name = "broker" type = "shortstr" /> -</method> - -<method name = "ping"> - <field name = "broker" type = "shortstr" /> - <field name = "load" type = "long" /> - <field name = "response required" type = "bit" /> -</method> - -</class> - -</amqp> diff --git a/qpid/java/common/src/main/xsl/framing.xsl b/qpid/java/common/src/main/xsl/framing.xsl deleted file mode 100644 index b8ae20aaf5..0000000000 --- a/qpid/java/common/src/main/xsl/framing.xsl +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<xsl:import href="prepare1.xsl"/> -<xsl:import href="prepare2.xsl"/> -<xsl:import href="prepare3.xsl"/> -<xsl:import href="java.xsl"/> - -<xsl:output indent="yes"/> -<xsl:output method="text" indent="yes" name="textFormat"/> - -<xsl:template match="/"> - <xsl:variable name="prepare1"> - <xsl:apply-templates mode="prepare1" select="."/> - </xsl:variable> - - <xsl:variable name="prepare2"> - <xsl:apply-templates mode="prepare2" select="$prepare1"/> - </xsl:variable> - - <xsl:variable name="model"> - <xsl:apply-templates mode="prepare3" select="$prepare2"/> - </xsl:variable> - - <xsl:apply-templates mode="generate-multi" select="$model"/> - <xsl:apply-templates mode="list-registry" select="$model"/> - - <!-- dump out the intermediary files for debugging --> - <!-- - <xsl:result-document href="prepare1.out"> - <xsl:copy-of select="$prepare1"/> - </xsl:result-document> - - <xsl:result-document href="prepare2.out"> - <xsl:copy-of select="$prepare2"/> - </xsl:result-document> - - <xsl:result-document href="model.out"> - <xsl:copy-of select="$model"/> - </xsl:result-document> - --> -</xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/java.xsl b/qpid/java/common/src/main/xsl/java.xsl deleted file mode 100644 index 948415fc18..0000000000 --- a/qpid/java/common/src/main/xsl/java.xsl +++ /dev/null @@ -1,248 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<!-- this class contains the templates for generating java source code for a given framing model --> -<xsl:import href="utils.xsl"/> -<xsl:output method="text" indent="yes" name="textFormat"/> - -<xsl:param name="major"/> -<xsl:param name="minor"/> -<xsl:param name="registry_name"/> -<xsl:param name="version_list_name"/> - -<xsl:template match="/"> - <xsl:apply-templates mode="generate-multi" select="frames"/> - <xsl:apply-templates mode="generate-registry" select="frames"/> -</xsl:template> - -<!-- processes all frames outputting the classes in a single stream --> -<!-- (useful for debugging etc) --> -<xsl:template match="frame" mode="generate-single"> - <xsl:call-template name="generate-class"> - <xsl:with-param name="f" select="."/> - </xsl:call-template> -</xsl:template> - -<!-- generates seperate file for each class/frame --> -<xsl:template match="frame" mode="generate-multi"> - <xsl:variable name="uri" select="concat(@name, '.java')"/> - wrote <xsl:value-of select="$uri"/> - <xsl:result-document href="{$uri}" format="textFormat"> - <xsl:call-template name="generate-class"> - <xsl:with-param name="f" select="."/> - </xsl:call-template> - </xsl:result-document> -</xsl:template> - -<!-- main class generation template --> -<xsl:template name="generate-class"> - <xsl:param name="f"/> - <xsl:value-of select="amq:copyright()"/> -<!-- package org.apache.qpid.framing_<xsl:value-of select="$major"/>_<xsl:value-of select="$minor"/>; --> -package org.apache.qpid.framing; - -import org.apache.mina.common.ByteBuffer; -import org.apache.qpid.framing.AMQFrame; -import org.apache.qpid.framing.AMQFrameDecodingException; -import org.apache.qpid.framing.AMQMethodBody; -import org.apache.qpid.framing.EncodableAMQDataBlock; - -/** - * This class is autogenerated, do not modify. [From <xsl:value-of select="$f/parent::frames/@protocol"/>] - */ -public class <xsl:value-of select="$f/@name"/> extends AMQMethodBody implements EncodableAMQDataBlock -{ - public static final int CLASS_ID = <xsl:value-of select="$f/@class-id"/>; - public static final int METHOD_ID = <xsl:value-of select="$f/@method-id"/>; - - <xsl:for-each select="$f/field"> - <xsl:text>public </xsl:text><xsl:value-of select="@java-type"/> - <xsl:text> </xsl:text> - <xsl:value-of select="@name"/>; - </xsl:for-each> - - protected int getClazz() - { - return <xsl:value-of select="$f/@class-id"/>; - } - - protected int getMethod() - { - return <xsl:value-of select="$f/@method-id"/>; - } - - protected int getBodySize() - { - <xsl:choose> - <xsl:when test="$f/field"> - return - <xsl:for-each select="$f/field"> - <xsl:if test="position() != 1">+ - </xsl:if> - <xsl:value-of select="amq:field-length(.)"/> - </xsl:for-each> - ; - </xsl:when> - <xsl:otherwise>return 0;</xsl:otherwise> - </xsl:choose> - } - - protected void writeMethodPayload(ByteBuffer buffer) - { - <xsl:for-each select="$f/field"> - <xsl:if test="@type != 'bit'"> - <xsl:value-of select="amq:encoder(.)"/>; - </xsl:if> - <xsl:if test="@type = 'bit' and @boolean-index = 1"> - <xsl:text>EncodingUtils.writeBooleans(buffer, new boolean[]{</xsl:text> - <xsl:value-of select="$f/field[@type='bit']/@name" separator=", "/>}); - </xsl:if> - </xsl:for-each> - } - - public void populateMethodBodyFromBuffer(ByteBuffer buffer) throws AMQFrameDecodingException - { - <xsl:for-each select="$f/field"> - <xsl:value-of select="amq:decoder(.)"/>; - </xsl:for-each> - } - - public String toString() - { - StringBuffer buf = new StringBuffer(super.toString()); - <xsl:for-each select="$f/field"> - <xsl:text>buf.append(" </xsl:text><xsl:value-of select="@name"/>: ").append(<xsl:value-of select="@name"/>); - </xsl:for-each> - return buf.toString(); - } - - public static AMQFrame createAMQFrame(int channelId<xsl:if test="$f/field">, </xsl:if><xsl:value-of select="$f/field/concat(@java-type, ' ', @name)" separator=", "/>) - { - <xsl:value-of select="@name"/> body = new <xsl:value-of select="@name"/>(); - <xsl:for-each select="$f/field"> - <xsl:value-of select="concat('body.', @name, ' = ', @name)"/>; - </xsl:for-each> - AMQFrame frame = new AMQFrame(); - frame.channel = channelId; - frame.bodyFrame = body; - return frame; - } -} -</xsl:template> - -<xsl:template match="/" mode="generate-registry"> - <xsl:text>Matching root for registry mode!</xsl:text> - <xsl:value-of select="."/> - <xsl:apply-templates select="frames" mode="generate-registry"/> -</xsl:template> - -<xsl:template match="registries" mode="generate-registry"> -Wrote MethodBodyDecoderRegistry.java - <xsl:result-document href="MethodBodyDecoderRegistry.java" format="textFormat"> - <xsl:value-of select="amq:copyright()"/> -<!-- package org.apache.qpid.framing_<xsl:value-of select="$major"/>_<xsl:value-of select="$minor"/>; --> -package org.apache.qpid.framing; - -import java.util.Map; -import java.util.HashMap; -import org.apache.log4j.Logger; -import org.apache.qpid.AMQException; -import org.apache.qpid.framing.AMQFrameDecodingException; -import org.apache.qpid.framing.AMQMethodBody; - -/** - * This class is autogenerated, do not modify. - */ -public final class MethodBodyDecoderRegistry -{ - private static final Logger _log = Logger.getLogger(MethodBodyDecoderRegistry.class); - - private static final Map _classMethodProductToMethodBodyMap = new HashMap(); - - static - { - <xsl:for-each select="registry"> - <xsl:value-of select="concat(@name, '.register(_classMethodProductToMethodBodyMap)')"/>; - </xsl:for-each> - } - - public static AMQMethodBody get(int clazz, int method) throws AMQFrameDecodingException - { - Class bodyClass = (Class) _classMethodProductToMethodBodyMap.get(new Integer(clazz * 1000 + method)); - if (bodyClass != null) - { - try - { - return (AMQMethodBody) bodyClass.newInstance(); - } - catch (Exception e) - { - throw new AMQFrameDecodingException(_log, - "Unable to instantiate body class for class " + clazz + " and method " + method + ": " + e, e); - } - } - else - { - throw new AMQFrameDecodingException(_log, - "Unable to find a suitable decoder for class " + clazz + " and method " + method); - } - } -} -</xsl:result-document> -</xsl:template> - -<xsl:template match="frames" mode="list-registry"> - <xsl:if test="$registry_name"> - - <xsl:variable name="file" select="concat($registry_name, '.java')"/> - wrote <xsl:value-of select="$file"/> - <xsl:result-document href="{$file}" format="textFormat"> - <xsl:value-of select="amq:copyright()"/> -<!-- package org.apache.qpid.framing_<xsl:value-of select="$major"/>_<xsl:value-of select="$minor"/>; --> -package org.apache.qpid.framing; - -import java.util.Map; - -/** - * This class is autogenerated, do not modify. [From <xsl:value-of select="@protocol"/>] - */ -class <xsl:value-of select="$registry_name"/> -{ - static void register(Map map) - { - <xsl:for-each select="frame"> - <xsl:text>map.put(new Integer(</xsl:text> - <xsl:value-of select="@class-id"/> - <xsl:text> * 1000 + </xsl:text> - <xsl:value-of select="@method-id"/> - <xsl:text>), </xsl:text> - <xsl:value-of select="concat(@name, '.class')"/>); - </xsl:for-each> - } -} - </xsl:result-document> - - </xsl:if> -</xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/prepare1.xsl b/qpid/java/common/src/main/xsl/prepare1.xsl deleted file mode 100644 index 03e1fa7634..0000000000 --- a/qpid/java/common/src/main/xsl/prepare1.xsl +++ /dev/null @@ -1,114 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<xsl:import href="utils.xsl"/> - -<xsl:output indent="yes"/> -<xsl:param name="asl_base"/> - -<!-- pre-process, phase 1 --> - -<xsl:template match="/"> - <xsl:apply-templates select="protocol" mode="prepare1"/> -</xsl:template> - -<xsl:template match="amqp" mode="prepare1"> - <frames> - <xsl:attribute name="protocol"> - <xsl:value-of select="@comment"/> - <xsl:text> (</xsl:text> - <xsl:text>major=</xsl:text><xsl:value-of select="@major"/> - <xsl:text>, minor=</xsl:text><xsl:value-of select="@minor"/> - <xsl:text>)</xsl:text> - </xsl:attribute> - <xsl:attribute name="major"> - <xsl:value-of select="@major"/> - </xsl:attribute> - <xsl:attribute name="minor"> - <xsl:value-of select="@minor"/> - </xsl:attribute> - <xsl:apply-templates mode="prepare1" select="inherit"/> - <xsl:apply-templates mode="prepare1" select="include"/> - <xsl:apply-templates mode="prepare1" select="domain"/> - <xsl:apply-templates mode="prepare1" select="class"/> - </frames> -</xsl:template> - -<xsl:template match="include" mode="prepare1"> - <xsl:if test="@filename != 'asl_constants.asl'"> - <!-- skip asl_constants.asl, we don't need it and it is not well formed so causes error warnings --> - <xsl:apply-templates select="document(@filename)" mode="prepare1"/> - </xsl:if> -</xsl:template> - -<xsl:template match="inherit" mode="prepare1"> - <xsl:variable name="ibase" select="concat('file:///', $asl_base, '/', @name, '.asl')"/> - <xsl:choose> - <xsl:when test="document($ibase)"> - <xsl:apply-templates select="document($ibase)" mode="prepare1"/> - </xsl:when> - <xsl:otherwise> - <xsl:message> - Could not inherit from <xsl:value-of select="$ibase"/>; file not found. - </xsl:message> - </xsl:otherwise> - </xsl:choose> -</xsl:template> - -<xsl:template match="class[@index]" mode="prepare1"> - <xsl:apply-templates select="method" mode="prepare1"/> -</xsl:template> - -<xsl:template match="method" mode="prepare1"> - <xsl:if test="parent::class[@index]"><!-- there is a template class that has no index, which we want to skip --> - <frame> - <xsl:attribute name="name"><xsl:value-of select="amq:class-name(parent::class/@name, @name)"/></xsl:attribute> - <xsl:attribute name="class-id"><xsl:value-of select="parent::class/@index"/></xsl:attribute> - <xsl:if test="@index"> - <xsl:attribute name="method-id"><xsl:value-of select="@index"/></xsl:attribute> - </xsl:if> - <xsl:if test="not(@index)"> - <xsl:attribute name="method-id"><xsl:number count="method"/></xsl:attribute> - </xsl:if> - - <xsl:apply-templates select="field" mode="prepare1"/> - </frame> - </xsl:if> -</xsl:template> - -<xsl:template match="domain" mode="prepare1"> - <domain> - <name><xsl:value-of select="@name"/></name> - <type><xsl:value-of select="@type"/></type> - </domain> -</xsl:template> - -<xsl:template match="field" mode="prepare1"> - <field> - <xsl:copy-of select="@name"/> - <xsl:copy-of select="@type"/> - <xsl:copy-of select="@domain"/> - </field> -</xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/prepare2.xsl b/qpid/java/common/src/main/xsl/prepare2.xsl deleted file mode 100644 index 14f4f33841..0000000000 --- a/qpid/java/common/src/main/xsl/prepare2.xsl +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<xsl:import href="utils.xsl"/> - -<xsl:output indent="yes"/> - -<!-- pre-process, phase 2 --> - -<xsl:key name="domain-lookup" match="domain" use="name"/> - -<xsl:template match="/"> - <xsl:apply-templates mode="prepare2" select="frames"/> -</xsl:template> - -<xsl:template match="field[@domain]" mode="prepare2"> - <field> - <xsl:variable name="t1" select="key('domain-lookup', @domain)/type"/> - <xsl:attribute name="name"><xsl:value-of select="amq:field-name(@name)"/></xsl:attribute> - <xsl:attribute name="type"><xsl:value-of select="$t1"/></xsl:attribute> - </field> -</xsl:template> - -<xsl:template match="field[@type]" mode="prepare2"> - <field> - <xsl:attribute name="name"><xsl:value-of select="amq:field-name(@name)"/></xsl:attribute> - <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> - </field> -</xsl:template> - -<xsl:template match="frames" mode="prepare2"> - <frames> - <xsl:copy-of select="@protocol"/> - <xsl:copy-of select="@major"/> - <xsl:copy-of select="@minor"/> - <xsl:apply-templates mode="prepare2"/> - </frames> -</xsl:template> - -<xsl:template match="frame" mode="prepare2"> - <xsl:element name="{name()}"> - <xsl:copy-of select="@*"/> - <xsl:apply-templates mode="prepare2" select="field"/> - </xsl:element> -</xsl:template> - -<xsl:template match="domain" mode="prepare2"></xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/prepare3.xsl b/qpid/java/common/src/main/xsl/prepare3.xsl deleted file mode 100644 index f8cf0c8932..0000000000 --- a/qpid/java/common/src/main/xsl/prepare3.xsl +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<xsl:import href="utils.xsl"/> - -<xsl:output indent="yes"/> - -<!-- final preparation of the model --> - -<xsl:template match="/"> - <xsl:apply-templates mode="prepare3"/> -</xsl:template> - -<xsl:template match="frames" mode="prepare3"> - <frames> - <xsl:copy-of select="@protocol"/> - <xsl:copy-of select="@major"/> - <xsl:copy-of select="@minor"/> - <xsl:apply-templates mode="prepare3"/> - </frames> -</xsl:template> - -<xsl:template match="frame" mode="prepare3"> - <xsl:element name="frame"> - <xsl:copy-of select="@*"/> - <xsl:if test="field[@type='bit']"><xsl:attribute name="has-bit-field">true</xsl:attribute></xsl:if> - <xsl:apply-templates mode="prepare3"/> - </xsl:element> -</xsl:template> - - -<xsl:template match="field" mode="prepare3"> - <field> - <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute> - <!-- ensure the field name is processed to be a valid java name --> - <xsl:attribute name="name"><xsl:value-of select="amq:field-name(@name)"/></xsl:attribute> - <!-- add some attributes to make code generation easier --> - <xsl:attribute name="java-type"><xsl:value-of select="amq:java-type(@type)"/></xsl:attribute> - <xsl:if test="@type='bit'"> - <xsl:attribute name="boolean-index"><xsl:number count="field[@type='bit']"/></xsl:attribute> - </xsl:if> - </field> -</xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/readme.txt b/qpid/java/common/src/main/xsl/readme.txt deleted file mode 100644 index b373055df9..0000000000 --- a/qpid/java/common/src/main/xsl/readme.txt +++ /dev/null @@ -1,52 +0,0 @@ -This directory contains the xsl stylesheets used to generate the code from the -AMQP protocol specification. They require an XSLT2.0 processor, currently -Saxon 8 is used. - -The generation process is controlled by the framing.xsl stylesheet. This performs -several phases of transformation, using the other stylesheets. The transformation -in each phase is defined in a separate file, and these are designed to also allow -then to be run individually. - -The generation takes the amq.asl as input, it also requires that the path to the -directory where the base asl definitions reside (those definitions that the main -amq.asl defintion inherits from) be passed in via a paramter called asl_base. - -The files involved are as follows: - - framing.xsl The control file for the entire generation process - - prepare1.xsl Resolves the separate files that make up the protocol - definition, building a single tree containing all the - information as a set of 'frame' elements, each of which - has attributes for its name, and ids for the class and - method it refers to and contains zero or more field - elements. - - A method id is generated based on the order of the - method elements within the class elements in the original - specification. The class id is taken from the enclosing - class element. - - prepare2.xsl Resolves domains into their corresponding types. (This is - much easier when all the information is in a single tree, - hence the separate frame). - - prepare3.xsl Converts names into valid java names and augments the - tree to include information that makes the subsequent - generation phase simpler e.g. the index of boolean - fields as several boolean flags are combined into a - single byte. (This is easier once the domains have been - resolved, hence the separate phase). - - java.xsl Generates java classes for each frame, and a registry of - all the frames to a 'magic' number generated from their - class and method id. - - utils.xsl Contains some utility methods for e.g. producing valid - java names. - -For debugging the framing.xsl can output the intermediary files. This can be -enabled by uncommenting the relevant lines (a comment explaining this is -provided inline). - -
\ No newline at end of file diff --git a/qpid/java/common/src/main/xsl/registry.template b/qpid/java/common/src/main/xsl/registry.template deleted file mode 100644 index 87c5afcb7b..0000000000 --- a/qpid/java/common/src/main/xsl/registry.template +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<registries> - <registry name="MainRegistry"/> - <registry name="ClusterRegistry"/> -</registries> diff --git a/qpid/java/common/src/main/xsl/registry.xsl b/qpid/java/common/src/main/xsl/registry.xsl deleted file mode 100644 index c70dbe21a5..0000000000 --- a/qpid/java/common/src/main/xsl/registry.xsl +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<xsl:import href="java.xsl"/> - -<xsl:output method="text" indent="yes" name="textFormat"/> - -<xsl:template match="/"> - <xsl:apply-templates mode="generate-registry" select="registries"/> -</xsl:template> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/main/xsl/utils.xsl b/qpid/java/common/src/main/xsl/utils.xsl deleted file mode 100644 index 95e15c6e38..0000000000 --- a/qpid/java/common/src/main/xsl/utils.xsl +++ /dev/null @@ -1,207 +0,0 @@ -<?xml version='1.0'?> -<!-- - - - - Licensed to the Apache Software Foundation (ASF) under one - - or more contributor license agreements. See the NOTICE file - - distributed with this work for additional information - - regarding copyright ownership. The ASF licenses this file - - 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 - - KIND, either express or implied. See the License for the - - specific language governing permissions and limitations - - under the License. - - - --> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:amq="http://amq.org"> - -<!-- This file contains functions that are used in the generation of the java classes for framing --> - -<!-- create copyright notice for generated files --> -<xsl:function name="amq:copyright">/** -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* 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 -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*/ -</xsl:function> - -<!-- retrieve the java type of a given amq type --> -<xsl:function name="amq:java-type"> - <xsl:param name="t"/> - <xsl:choose> - <xsl:when test="$t='char'">char</xsl:when> - <xsl:when test="$t='octet'">short</xsl:when> - <xsl:when test="$t='short'">int</xsl:when> - <xsl:when test="$t='shortstr'">String</xsl:when> - <xsl:when test="$t='longstr'">byte[]</xsl:when> - <xsl:when test="$t='bit'">boolean</xsl:when> - <xsl:when test="$t='long'">long</xsl:when> - <xsl:when test="$t='longlong'">long</xsl:when> - <xsl:when test="$t='table'">FieldTable</xsl:when> - <xsl:otherwise>Object /*WARNING: undefined type*/</xsl:otherwise> - </xsl:choose> -</xsl:function> - -<!-- retrieve the code to get the field size of a given amq type --> -<xsl:function name="amq:field-length"> - <xsl:param name="f"/> - <xsl:choose> - <xsl:when test="$f/@type='bit' and $f/@boolean-index=1"> - <xsl:value-of select="concat('1 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='bit' and $f/@boolean-index > 1"> - <xsl:value-of select="concat('0 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='char'"> - <xsl:value-of select="concat('1 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='octet'"> - <xsl:value-of select="concat('1 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='short'"> - <xsl:value-of select="concat('2 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='long'"> - <xsl:value-of select="concat('4 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='longlong'"> - <xsl:value-of select="concat('8 /*', $f/@name, '*/')"/> - </xsl:when> - <xsl:when test="$f/@type='shortstr'"> - <xsl:value-of select="concat('EncodingUtils.encodedShortStringLength(', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='longstr'"> - <xsl:value-of select="concat('4 + (', $f/@name, ' == null ? 0 : ', $f/@name, '.length)')"/> - </xsl:when> - <xsl:when test="$f/@type='table'"> - <xsl:value-of select="concat('EncodingUtils.encodedFieldTableLength(', $f/@name, ')')"/> - </xsl:when> - <xsl:otherwise><xsl:text>/* WARNING: COULD NOT DETERMINE FIELD SIZE */</xsl:text></xsl:otherwise> - </xsl:choose> -</xsl:function> - -<!-- retrieve the code to encode a field of a given amq type --> -<!-- Note: - This method will not provide an encoder for a bit field. - Bit fields should be encoded together separately. --> - -<xsl:function name="amq:encoder"> - <xsl:param name="f"/> - <xsl:choose> - <xsl:when test="$f/@type='char'"> - <xsl:value-of select="concat('EncodingUtils.writeChar(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='octet'"> - <xsl:value-of select="concat('EncodingUtils.writeUnsignedByte(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='short'"> - <xsl:value-of select="concat('EncodingUtils.writeUnsignedShort(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='long'"> - <xsl:value-of select="concat('EncodingUtils.writeUnsignedInteger(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='longlong'"> - <xsl:value-of select="concat('buffer.putLong(', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='shortstr'"> - <xsl:value-of select="concat('EncodingUtils.writeShortStringBytes(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='longstr'"> - <xsl:value-of select="concat('EncodingUtils.writeLongstr(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:when test="$f/@type='table'"> - <xsl:value-of select="concat('EncodingUtils.writeFieldTableBytes(buffer, ', $f/@name, ')')"/> - </xsl:when> - <xsl:otherwise><xsl:text>/* WARNING: COULD NOT DETERMINE ENCODER */</xsl:text></xsl:otherwise> - </xsl:choose> -</xsl:function> - -<!-- retrieve the code to decode a field of a given amq type --> -<xsl:function name="amq:decoder"> - <xsl:param name="f"/> - <xsl:choose> - <xsl:when test="$f/@type='bit'"> - <xsl:if test="$f/@boolean-index = 1"> - <xsl:text>boolean[] bools = EncodingUtils.readBooleans(buffer);</xsl:text> - </xsl:if> - <xsl:value-of select="concat($f/@name, ' = bools[', $f/@boolean-index - 1 , ']')"/> - </xsl:when> - <xsl:when test="$f/@type='char'"> - <xsl:value-of select="concat($f/@name, ' = buffer.getChar()')"/> - </xsl:when> - <xsl:when test="$f/@type='octet'"> - <xsl:value-of select="concat($f/@name, ' = buffer.getUnsigned()')"/> - </xsl:when> - <xsl:when test="$f/@type='short'"> - <xsl:value-of select="concat($f/@name, ' = buffer.getUnsignedShort()')"/> - </xsl:when> - <xsl:when test="$f/@type='long'"> - <xsl:value-of select="concat($f/@name, ' = buffer.getUnsignedInt()')"/> - </xsl:when> - <xsl:when test="$f/@type='longlong'"> - <xsl:value-of select="concat($f/@name, ' = buffer.getLong()')"/> - </xsl:when> - <xsl:when test="$f/@type='shortstr'"> - <xsl:value-of select="concat($f/@name, ' = EncodingUtils.readShortString(buffer)')"/> - </xsl:when> - <xsl:when test="$f/@type='longstr'"> - <xsl:value-of select="concat($f/@name, ' = EncodingUtils.readLongstr(buffer)')"/> - </xsl:when> - <xsl:when test="$f/@type='table'"> - <xsl:value-of select="concat($f/@name, ' = EncodingUtils.readFieldTable(buffer)')"/> - </xsl:when> - <xsl:otherwise><xsl:text>/* WARNING: COULD NOT DETERMINE DECODER */</xsl:text></xsl:otherwise> - </xsl:choose> -</xsl:function> - -<!-- create the class name for a frame, based on class and method (passed in) --> -<xsl:function name="amq:class-name"> - <xsl:param name="class"/> - <xsl:param name="method"/> - <xsl:value-of select="concat(amq:upper-first($class),amq:upper-first(amq:field-name($method)), 'Body')"/> -</xsl:function> - -<!-- get a valid field name, processing spaces and '-'s where appropriate --> -<xsl:function name="amq:field-name"> - <xsl:param name="name"/> - <xsl:choose> - <xsl:when test="contains($name, ' ')"> - <xsl:value-of select="concat(substring-before($name, ' '), amq:upper-first(substring-after($name, ' ')))"/> - </xsl:when> - <xsl:when test="contains($name, '-')"> - <xsl:value-of select="concat(substring-before($name, '-'), amq:upper-first(substring-after($name, '-')))"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$name"/> - </xsl:otherwise> - </xsl:choose> -</xsl:function> - -<!-- convert the first character of the input to upper-case --> -<xsl:function name="amq:upper-first"> - <xsl:param name="in"/> - <xsl:value-of select="concat(upper-case(substring($in, 1, 1)), substring($in, 2))"/> -</xsl:function> - -</xsl:stylesheet> diff --git a/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java b/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java index 66dd1b10ef..ffbdf730a9 100644 --- a/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java +++ b/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java @@ -31,7 +31,7 @@ public class BasicContentHeaderPropertiesTest extends TestCase { BasicContentHeaderProperties _testProperties; - PropertyFieldTable _testTable; + FieldTable _testTable; String _testString = "This is a test string"; int _testint = 666; @@ -45,11 +45,9 @@ public class BasicContentHeaderPropertiesTest extends TestCase public void setUp() { - HashMap _testMap = new HashMap(10); - _testMap.put("TestString", _testString); - _testMap.put("Testint", _testint); - _testTable = new PropertyFieldTable(); - _testTable.putAll(_testMap); + _testTable = new FieldTable(); + _testTable.setString("TestString", _testString); + _testTable.setInteger("Testint", _testint); _testProperties = new BasicContentHeaderProperties(); _testProperties.setHeaders(_testTable); } @@ -57,7 +55,7 @@ public class BasicContentHeaderPropertiesTest extends TestCase public void testGetPropertyListSize() { //needs a better test but at least we're exercising the code ! - // FT size is encoded in an int + // FT length is encoded in an int int expectedSize = EncodingUtils.encodedIntegerLength(); expectedSize += EncodingUtils.encodedShortStringLength("TestInt"); diff --git a/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java b/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java index 9cad31766b..94c97ef808 100644 --- a/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java +++ b/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java @@ -51,7 +51,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testReplacement() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); //Set a boolean value table1.setBoolean("value", true); @@ -73,7 +73,7 @@ public class JMSPropertyFieldTableTest extends TestCase public void testRemoval() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); //Set a boolean value table1.setBoolean("value", true); @@ -99,7 +99,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testBoolean() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setBoolean("value", true); Assert.assertTrue(table1.propertyExists("value")); @@ -184,7 +184,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value will return false @@ -197,7 +197,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testByte() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setByte("value", Byte.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -243,7 +243,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -266,7 +266,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testShort() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setShort("value", Short.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -323,7 +323,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -345,7 +345,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testDouble() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setDouble("value", Double.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -414,7 +414,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -437,7 +437,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testFloat() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setFloat("value", Float.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -500,7 +500,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -522,7 +522,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testInt() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setInteger("value", Integer.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -586,7 +586,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -608,7 +608,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testLong() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setLong("value", Long.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -679,7 +679,7 @@ public class JMSPropertyFieldTableTest extends TestCase //but after a remove it doesn't Assert.assertFalse(table1.propertyExists("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value @@ -700,7 +700,7 @@ public class JMSPropertyFieldTableTest extends TestCase * Calls all methods that can be used to check the table is empty * - getEncodedSize * - isEmpty - * - size + * - length * * @param table to check is empty */ @@ -716,7 +716,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testString() throws JMSException { - JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table1 = new JMSPropertyFieldTable(new FieldTable()); table1.setString("value", "Hello"); Assert.assertTrue(table1.propertyExists("value")); @@ -799,7 +799,7 @@ public class JMSPropertyFieldTableTest extends TestCase public void testValues() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); table.setBoolean("bool", true); table.setDouble("double", Double.MAX_VALUE); table.setFloat("float", Float.MAX_VALUE); @@ -842,7 +842,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameasNull() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); try { @@ -862,7 +862,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameasEmptyString() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); try { @@ -882,7 +882,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNamehasMaxLength() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); StringBuffer longPropertyName = new StringBuffer(129); @@ -910,7 +910,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameStartCharacterIsLetter() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); //Try a name that starts with a number try @@ -931,7 +931,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameContainsInvalidCharacter() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); //Try a name that starts with a number try @@ -953,7 +953,7 @@ public class JMSPropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameIsInvalid() throws JMSException { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); //Try a name that starts with a number try @@ -995,7 +995,7 @@ public class JMSPropertyFieldTableTest extends TestCase public void testSets() { - JMSPropertyFieldTable table = new JMSPropertyFieldTable(); + JMSPropertyFieldTable table = new JMSPropertyFieldTable(new FieldTable()); table.put("n1", "1"); table.put("n2", "2"); diff --git a/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java b/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java index 5256c62054..c259d3ee8a 100644 --- a/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java +++ b/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java @@ -37,39 +37,23 @@ public class PropertyFieldTableTest extends TestCase private static final Logger _logger = Logger.getLogger(PropertyFieldTableTest.class); - /** - * Test that modifying a byte[] after setting property doesn't change property - */ - public void testByteModification() - { - PropertyFieldTable table = new PropertyFieldTable(); - byte[] bytes = {99, 98, 97, 96, 95}; - table.setBytes("bytes", bytes); - bytes[0] = 1; - bytes[1] = 2; - bytes[2] = 3; - bytes[3] = 4; - bytes[4] = 5; - - assertBytesNotEqual(bytes, table.getBytes("bytes")); - } /** * Test that setting a similar named value replaces any previous value set on that name */ public void testReplacement() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); //Set a boolean value table1.setBoolean("value", true); - //Check size of table is correct (<Value length> + <type> + <Boolean length>) + //Check length of table is correct (<Value length> + <type> + <Boolean length>) int size = EncodingUtils.encodedShortStringLength("value") + 1 + EncodingUtils.encodedBooleanLength(); Assert.assertEquals(size, table1.getEncodedSize()); // reset value to an integer table1.setInteger("value", Integer.MAX_VALUE); - // Check the size has changed accordingly (<Value length> + <type> + <Integer length>) + // Check the length has changed accordingly (<Value length> + <type> + <Integer length>) size = EncodingUtils.encodedShortStringLength("value") + 1 + EncodingUtils.encodedIntegerLength(); Assert.assertEquals(size, table1.getEncodedSize()); @@ -86,7 +70,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testBoolean() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setBoolean("value", true); Assert.assertTrue(table1.propertyExists("value")); @@ -107,19 +91,9 @@ public class PropertyFieldTableTest extends TestCase //except value as a string Assert.assertEquals("true", table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX, "value", null); - - // Should be able to get the null back - Assert.assertEquals(null, table1.getBoolean("value")); - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); - //but after a remove it doesn't - Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -132,7 +106,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testByte() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setByte("value", Byte.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -151,20 +125,8 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Byte.MAX_VALUE, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_BYTE_PROPERTY_PREFIX, "value", null); - - // Should be able to get the null back - Assert.assertEquals(null, table1.getByte("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); - //but after a remove it doesn't - Assert.assertFalse(table1.containsKey("value")); - - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -177,7 +139,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testShort() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setShort("value", Short.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -196,20 +158,8 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Short.MAX_VALUE, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_SHORT_PROPERTY_PREFIX, "value", null); - - // Should be able to get the null back - Assert.assertEquals(null, table1.getShort("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); - //but after a remove it doesn't - Assert.assertFalse(table1.containsKey("value")); - - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -223,7 +173,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testChar() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setChar("value", 'c'); Assert.assertTrue(table1.propertyExists("value")); @@ -242,26 +192,9 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("c", table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX, "value", null); - - try - { - table1.getString("value"); - fail("Should throw NullPointerException"); - } - catch (NullPointerException npe) - { - //Normal Path - } - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); - //but after a remove it doesn't - Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -275,7 +208,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testDouble() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setDouble("value", Double.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -293,20 +226,11 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Double.MAX_VALUE, table1.getString("value")); - - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_DOUBLE_PROPERTY_PREFIX, "value", null); - - Assert.assertEquals(null, table1.getDouble("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); //but after a remove it doesn't Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -320,7 +244,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testFloat() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setFloat("value", Float.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -339,19 +263,12 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Float.MAX_VALUE, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_FLOAT_PROPERTY_PREFIX, "value", null); - - Assert.assertEquals(null, table1.getFloat("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); table1.remove("value"); //but after a remove it doesn't Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -365,7 +282,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testInt() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setInteger("value", Integer.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -384,19 +301,12 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Integer.MAX_VALUE, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_INT_PROPERTY_PREFIX, "value", null); - - Assert.assertEquals(null, table1.getInteger("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); table1.remove("value"); //but after a remove it doesn't Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -410,7 +320,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testLong() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setLong("value", Long.MAX_VALUE); Assert.assertTrue(table1.propertyExists("value")); @@ -429,19 +339,12 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it. Assert.assertEquals("" + Long.MAX_VALUE, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_LONG_PROPERTY_PREFIX, "value", null); - - Assert.assertEquals(null, table1.getLong("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); table1.remove("value"); //but after a remove it doesn't Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -457,7 +360,7 @@ public class PropertyFieldTableTest extends TestCase { byte[] bytes = {99, 98, 97, 96, 95}; - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setBytes("value", bytes); Assert.assertTrue(table1.propertyExists("value")); @@ -476,19 +379,11 @@ public class PropertyFieldTableTest extends TestCase //... and a the string value of it is null Assert.assertEquals(null, table1.getString("value")); - //Try setting a null value and read it back - table1.put(PropertyFieldTable.Prefix.AMQP_BINARY_PROPERTY_PREFIX, "value", null); - - Assert.assertEquals(null, table1.getBytes("value")); - - //but still contains the value - Assert.assertTrue(table1.containsKey("value")); - table1.remove("value"); //but after a remove it doesn't Assert.assertFalse(table1.containsKey("value")); - // Table should now have zero size for encoding + // Table should now have zero length for encoding checkEmpty(table1); //Looking up an invalid value returns null @@ -499,19 +394,17 @@ public class PropertyFieldTableTest extends TestCase * Calls all methods that can be used to check the table is empty * - getEncodedSize * - isEmpty - * - size + * - length * * @param table to check is empty */ - private void checkEmpty(PropertyFieldTable table) + private void checkEmpty(FieldTable table) { Assert.assertEquals(0, table.getEncodedSize()); Assert.assertTrue(table.isEmpty()); Assert.assertEquals(0, table.size()); Assert.assertEquals(0, table.keySet().size()); - Assert.assertEquals(0, table.values().size()); - Assert.assertEquals(0, table.entrySet().size()); } @@ -521,7 +414,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testString() { - PropertyFieldTable table1 = new PropertyFieldTable(); + FieldTable table1 = new FieldTable(); table1.setString("value", "Hello"); Assert.assertTrue(table1.propertyExists("value")); @@ -562,79 +455,11 @@ public class PropertyFieldTableTest extends TestCase } - /** - * Test that the generated XML can be used to create a field table with the same values. - */ - public void testValidXML() - { - PropertyFieldTable table1 = new PropertyFieldTable(); - table1.setBoolean("bool", true); - table1.setByte("byte", Byte.MAX_VALUE); - byte[] bytes = {99, 98, 97, 96, 95}; - table1.setBytes("bytes", bytes); - table1.setChar("char", 'c'); - table1.setDouble("double", Double.MAX_VALUE); - table1.setFloat("float", Float.MAX_VALUE); - table1.setInteger("int", Integer.MAX_VALUE); - table1.setLong("long", Long.MAX_VALUE); - table1.setShort("short", Short.MAX_VALUE); - table1.setString("string", "Hello"); - table1.setString("null-string", null); - - table1.setObject("object-bool", true); - table1.setObject("object-byte", Byte.MAX_VALUE); - table1.setObject("object-bytes", bytes); - table1.setObject("object-char", 'c'); - table1.setObject("object-double", Double.MAX_VALUE); - table1.setObject("object-float", Float.MAX_VALUE); - table1.setObject("object-int", Integer.MAX_VALUE); - table1.setObject("object-long", Long.MAX_VALUE); - table1.setObject("object-short", Short.MAX_VALUE); - table1.setObject("object-string", "Hello"); - - Assert.assertEquals(21, table1.size()); - - String table1XML = table1.toString(); - - PropertyFieldTable table2 = new PropertyFieldTable(table1XML); - - Assert.assertEquals(table1XML, table2.toString()); - - //Check that when bytes is written out as a string with no new line between items that it is read in ok. - - } - - /** - * Test that invalid input throws the correct Exception - */ - public void testInvalidXML() - { - try - { - _logger.warn("Testing Invalid XML expecting IllegalArgumentException"); - new PropertyFieldTable("Rubbish"); - fail("IllegalArgumentException expected"); - } - catch (IllegalArgumentException iae) - { - //normal path - } - try - { - _logger.warn("Testing Invalid XML expecting IllegalArgumentException"); - new PropertyFieldTable(""); - fail("IllegalArgumentException expected"); - } - catch (IllegalArgumentException iae) - { - //normal path - } - } - + public void testKeyEnumeration() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); table.setLong("one", 1L); table.setLong("two", 2L); table.setLong("three", 3L); @@ -652,7 +477,7 @@ public class PropertyFieldTableTest extends TestCase public void testValues() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); table.setBoolean("bool", true); table.setByte("byte", Byte.MAX_VALUE); byte[] bytes = {99, 98, 97, 96, 95}; @@ -707,7 +532,7 @@ public class PropertyFieldTableTest extends TestCase { byte[] bytes = {99, 98, 97, 96, 95}; - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); table.setBoolean("bool", true); table.setByte("byte", Byte.MAX_VALUE); @@ -732,7 +557,7 @@ public class PropertyFieldTableTest extends TestCase try { - PropertyFieldTable table2 = new PropertyFieldTable(buffer, length); + FieldTable table2 = new FieldTable(buffer, length); Assert.assertEquals((Boolean) true, table2.getBoolean("bool")); Assert.assertEquals((Byte) Byte.MAX_VALUE, table2.getByte("byte")); @@ -756,7 +581,7 @@ public class PropertyFieldTableTest extends TestCase public void testEncodingSize() { - PropertyFieldTable result = new PropertyFieldTable(); + FieldTable result = new FieldTable(); int size = 0; result.setBoolean("boolean", true); @@ -847,31 +672,31 @@ public class PropertyFieldTableTest extends TestCase // public void testEncodingSize1() // { // PropertyFieldTable table = new PropertyFieldTable(); -// int size = 0; +// int length = 0; // result.put("one", 1L); -// size = EncodingUtils.encodedShortStringLength("one"); -// size += 1 + EncodingUtils.encodedLongLength(); -// assertEquals(size, result.getEncodedSize()); +// length = EncodingUtils.encodedShortStringLength("one"); +// length += 1 + EncodingUtils.encodedLongLength(); +// assertEquals(length, result.getEncodedSize()); // // result.put("two", 2L); -// size += EncodingUtils.encodedShortStringLength("two"); -// size += 1 + EncodingUtils.encodedLongLength(); -// assertEquals(size, result.getEncodedSize()); +// length += EncodingUtils.encodedShortStringLength("two"); +// length += 1 + EncodingUtils.encodedLongLength(); +// assertEquals(length, result.getEncodedSize()); // // result.put("three", 3L); -// size += EncodingUtils.encodedShortStringLength("three"); -// size += 1 + EncodingUtils.encodedLongLength(); -// assertEquals(size, result.getEncodedSize()); +// length += EncodingUtils.encodedShortStringLength("three"); +// length += 1 + EncodingUtils.encodedLongLength(); +// assertEquals(length, result.getEncodedSize()); // // result.put("four", 4L); -// size += EncodingUtils.encodedShortStringLength("four"); -// size += 1 + EncodingUtils.encodedLongLength(); -// assertEquals(size, result.getEncodedSize()); +// length += EncodingUtils.encodedShortStringLength("four"); +// length += 1 + EncodingUtils.encodedLongLength(); +// assertEquals(length, result.getEncodedSize()); // // result.put("five", 5L); -// size += EncodingUtils.encodedShortStringLength("five"); -// size += 1 + EncodingUtils.encodedLongLength(); -// assertEquals(size, result.getEncodedSize()); +// length += EncodingUtils.encodedShortStringLength("five"); +// length += 1 + EncodingUtils.encodedLongLength(); +// assertEquals(length, result.getEncodedSize()); // // //fixme should perhaps be expanded to incorporate all types. // @@ -907,7 +732,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testSetObject() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); //Try setting a non primative object @@ -920,7 +745,7 @@ public class PropertyFieldTableTest extends TestCase { //normal path } - // so size should be zero + // so length should be zero Assert.assertEquals(0, table.getEncodedSize()); } @@ -929,7 +754,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameasNull() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); try { @@ -940,7 +765,7 @@ public class PropertyFieldTableTest extends TestCase { //normal path } - // so size should be zero + // so length should be zero Assert.assertEquals(0, table.getEncodedSize()); } @@ -950,7 +775,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameasEmptyString() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); try { @@ -961,7 +786,7 @@ public class PropertyFieldTableTest extends TestCase { //normal path } - // so size should be zero + // so length should be zero Assert.assertEquals(0, table.getEncodedSize()); } @@ -971,7 +796,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testCheckPropertyNamehasMaxLength() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); StringBuffer longPropertyName = new StringBuffer(129); @@ -989,7 +814,7 @@ public class PropertyFieldTableTest extends TestCase { //normal path } - // so size should be zero + // so length should be zero Assert.assertEquals(0, table.getEncodedSize()); } @@ -999,7 +824,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameStartCharacterIsLetter() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); //Try a name that starts with a number try @@ -1011,7 +836,7 @@ public class PropertyFieldTableTest extends TestCase { //normal path } - // so size should be zero + // so length should be zero Assert.assertEquals(0, table.getEncodedSize()); } @@ -1021,7 +846,7 @@ public class PropertyFieldTableTest extends TestCase */ public void testCheckPropertyNameStartCharacterIsHashorDollar() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); //Try a name that starts with a number try @@ -1041,12 +866,10 @@ public class PropertyFieldTableTest extends TestCase */ public void testContents() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); table.put("StringProperty", "String"); - Assert.assertTrue(table.containsValue("String")); - Assert.assertEquals("String", table.get("StringProperty")); //Test Clear @@ -1062,7 +885,7 @@ public class PropertyFieldTableTest extends TestCase public void testSets() { - PropertyFieldTable table = new PropertyFieldTable(); + FieldTable table = new FieldTable(); table.put("n1", "1"); table.put("n2", "2"); @@ -1075,64 +898,10 @@ public class PropertyFieldTableTest extends TestCase Assert.assertFalse(iterator.hasNext()); - iterator = table.values().iterator(); - Assert.assertEquals("1", iterator.next()); - Assert.assertEquals("2", iterator.next()); - Assert.assertEquals("3", iterator.next()); - Assert.assertFalse(iterator.hasNext()); - - - iterator = table.entrySet().iterator(); - Map.Entry entry = (Map.Entry) iterator.next(); - Assert.assertEquals("n1", entry.getKey()); - Assert.assertEquals("1", entry.getValue()); - entry = (Map.Entry) iterator.next(); - Assert.assertEquals("n2", entry.getKey()); - Assert.assertEquals("2", entry.getValue()); - entry = (Map.Entry) iterator.next(); - Assert.assertEquals("n3", entry.getKey()); - Assert.assertEquals("3", entry.getValue()); - Assert.assertFalse(iterator.hasNext()); - } - /** - * Test that all the values are preserved after a putAll - */ - public void testPutAll() - { - Map map = new HashMap(); - - map.put("char", 'c'); - map.put("double", Double.MAX_VALUE); - map.put("float", Float.MAX_VALUE); - map.put("int", Integer.MAX_VALUE); - map.put("long", Long.MAX_VALUE); - map.put("short", Short.MAX_VALUE); - - PropertyFieldTable table = new PropertyFieldTable(); - - table.putAll(map); - - Assert.assertEquals(6, table.size()); - - Assert.assertTrue(table.containsKey("char")); - Assert.assertEquals('c', (char) table.getCharacter("char")); - Assert.assertTrue(table.containsKey("double")); - Assert.assertEquals(Double.MAX_VALUE, table.getDouble("double")); - Assert.assertTrue(table.containsKey("float")); - Assert.assertEquals(Float.MAX_VALUE, table.getFloat("float")); - Assert.assertTrue(table.containsKey("int")); - Assert.assertEquals(Integer.MAX_VALUE, (int) table.getInteger("int")); - Assert.assertTrue(table.containsKey("long")); - Assert.assertEquals(Long.MAX_VALUE, (long) table.getLong("long")); - Assert.assertTrue(table.containsKey("short")); - Assert.assertEquals(Short.MAX_VALUE, (short) table.getShort("short")); - Assert.assertEquals(Short.MAX_VALUE, (short) table.getShort("short")); - } - private void assertBytesEqual(byte[] expected, byte[] actual) { diff --git a/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java b/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java index 972a935257..9a5208662b 100644 --- a/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java +++ b/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java @@ -39,7 +39,7 @@ public class PoolingFilterTest extends TestCase //Create Pool _executorService = ReferenceCountingExecutorService.getInstance(); _executorService.acquireExecutorService(); - _pool = new PoolingFilter(_executorService, PoolingFilter.WRITE_EVENTS, + _pool = PoolingFilter.createAynschWritePoolingFilter(_executorService, "AsynchronousWriteFilter"); } |
