AMQ-656: Applying patch_060518.zip. Moving scripts (under gram) to activemq-core.

git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@409828 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nathan Christopher Mittler 2006-05-27 13:57:41 +00:00
parent 14fda24c87
commit a3b0e8ad7f
24 changed files with 422 additions and 701 deletions

View File

@ -29,7 +29,7 @@ public abstract class OpenWireCppClassesScript extends OpenWireClassesScript {
public Object run() {
filePostFix = getFilePostFix();
if (destDir == null) {
destDir = new File("../openwire-cpp/src/command");
destDir = new File("../openwire-cpp/src/main/cpp/activemq/command");
}
return super.run();
}
@ -52,13 +52,13 @@ public abstract class OpenWireCppClassesScript extends OpenWireClassesScript {
else if( name.equals("DataStructure[]") )
name = "IDataStructure[]" ;
return "ap<" + name.substring(0, name.length()-2) + ">";
return "array<" + name.substring(0, name.length()-2) + ">";
}
else if (name.equals("Throwable") || name.equals("Exception")) {
return "p<BrokerError>";
}
else if (name.equals("ByteSequence")) {
return "char*";
return "array<char>";
}
else if (name.equals("boolean")) {
return "bool";
@ -84,6 +84,126 @@ public abstract class OpenWireCppClassesScript extends OpenWireClassesScript {
* Converts the Java type to a C++ default value
*/
public String toCppDefaultValue(JClass type) {
return "0";
String name = type.getSimpleName();
if ( name.equals("boolean") ) {
return "false";
}
else if (!type.isPrimitiveType()) {
return "NULL";
}
else {
return "0";
}
}
/**
* Converts the Java type to the name of the C++ marshal method
* to be used
*/
public String toMarshalMethodName(JClass type) {
String name = type.getSimpleName();
if (name.equals("String")) {
return "marshalString";
}
else if (type.isArrayType()) {
if ( type.getArrayComponentType().isPrimitiveType() && name.equals("byte[]") )
return "marshalByteArray" ;
else
return "marshalObjectArray" ;
}
else if ( name.equals("ByteSequence") ) {
return "marshalByteArray";
}
else if (name.equals("short") ) {
return "marshalShort";
}
else if (name.equals("int") ) {
return "marshalInt";
}
else if (name.equals("long") ) {
return "marshalLong";
}
else if (name.equals("byte")) {
return "marshalByte";
}
else if (name.equals("double")) {
return "marshalDouble";
}
else if (name.equals("float")) {
return "marshalFloat";
}
else if (name.equals("boolean")) {
return "marshalBoolean";
}
else if( !type.isPrimitiveType() ) {
return "marshalObject" ;
}
else {
return name ;
}
}
/**
* Converts the Java type to the name of the C++ unmarshal method
* to be used
*/
public String toUnmarshalMethodName(JClass type) {
String name = type.getSimpleName();
if (name.equals("String")) {
return "unmarshalString";
}
else if (type.isArrayType()) {
if ( type.getArrayComponentType().isPrimitiveType() && name.equals("byte[]") )
return "unmarshalByteArray" ;
else
return "unmarshalObjectArray" ;
}
else if ( name.equals("ByteSequence") ) {
return "unmarshalByteArray";
}
else if (name.equals("short") ) {
return "unmarshalShort";
}
else if (name.equals("int") ) {
return "unmarshalInt";
}
else if (name.equals("long") ) {
return "unmarshalLong";
}
else if (name.equals("byte")) {
return "unmarshalByte";
}
else if (name.equals("double")) {
return "unmarshalDouble";
}
else if (name.equals("float")) {
return "unmarshalFloat";
}
else if (name.equals("boolean")) {
return "unmarshalBoolean";
}
else if( !type.isPrimitiveType() ) {
return "unmarshalObject" ;
}
else {
return name ;
}
}
/**
* Converts the Java type to a C++ pointer cast
*/
public String toUnmarshalCast(JClass type) {
String name = toCppType(type) ;
if( name.startsWith("p<") )
return "p_cast<" + name.substring(2) ;
else if( name.startsWith("array<") &&
(type.isArrayType() && !type.getArrayComponentType().isPrimitiveType()) &&
!type.getSimpleName().equals("ByteSequence") )
return "array_cast<" + name.substring(6) ;
else
return "" ;
}
}

View File

@ -1,92 +1,125 @@
/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.
*/
import org.apache.activemq.openwire.tool.OpenWireCppClassesScript
/**
* Generates the C++ commands for the Open Wire Format
*
* @version $Revision$
*/
class GenerateCppClasses extends OpenWireCppClassesScript {
void generateFile(PrintWriter out) {
out << """/*
* Copyright 2006 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed 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.
*/
#include "command/${className}.hpp"
using namespace apache::activemq::client::command;
/*
*
* Marshalling code for Open Wire Format for ${className}
*
*
* NOTE!: This file is autogenerated - do not modify!
* if you need to make a change, please see the Groovy scripts in the
* activemq-core module
*
*/
${className}::${className}()
{"""
for (property in properties) {
def value = toCppDefaultValue(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
this->${parameterName} = ${value} ;"""
}
out << """
}
${className}::~${className}()
{
}
"""
for (property in properties) {
def type = toCppType(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
${type} ${className}::get${propertyName}()
{
return ${parameterName} ;
}
void ${className}::set${propertyName}(${type} ${parameterName})
{
this->${parameterName} = ${parameterName} ;
}
"""
}
}
}
/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.
*/
import org.apache.activemq.openwire.tool.OpenWireCppClassesScript
/**
* Generates the C++ commands for the Open Wire Format
*
* @version $Revision$
*/
class GenerateCppClasses extends OpenWireCppClassesScript {
void generateFile(PrintWriter out) {
out << """/*
* Copyright 2006 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed 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.
*/
#include "activemq/command/${className}.hpp"
using namespace apache::activemq::command;
/*
*
* Command and marshalling code for OpenWire format for ${className}
*
*
* NOTE!: This file is autogenerated - do not modify!
* if you need to make a change, please see the Groovy scripts in the
* activemq-core module
*
*/
${className}::${className}()
{"""
for (property in properties) {
def value = toCppDefaultValue(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
this->${parameterName} = ${value} ;"""
}
out << """
}
${className}::~${className}()
{
}
unsigned char ${className}::getDataStructureType()
{
return ${className}::TYPE ;
}
"""
for (property in properties) {
def type = toCppType(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
${type} ${className}::get${propertyName}()
{
return ${parameterName} ;
}
void ${className}::set${propertyName}(${type} ${parameterName})
{
this->${parameterName} = ${parameterName} ;
}
"""
}
out << """
int ${className}::marshal(p<IMarshaller> marshaller, int mode, p<IOutputStream> ostream) throw (IOException)
{
int size = 0 ;
size += ${baseClass}::marshal(marshaller, mode, ostream) ; """
for (property in properties) {
def marshalMethod = toMarshalMethodName(property.type)
def propertyName = decapitalize(property.simpleName)
out << """
size += marshaller->${marshalMethod}(${propertyName}, mode, ostream) ; """
}
out << """
return size ;
}
void ${className}::unmarshal(p<IMarshaller> marshaller, int mode, p<IInputStream> istream) throw (IOException)
{
${baseClass}::unmarshal(marshaller, mode, istream) ; """
for (property in properties) {
def cast = toUnmarshalCast(property.type)
def unmarshalMethod = toUnmarshalMethodName(property.type)
def propertyName = decapitalize(property.simpleName)
out << """
${propertyName} = ${cast}(marshaller->${unmarshalMethod}(mode, istream)) ; """
}
out << """
}
"""
}
}

View File

@ -40,17 +40,17 @@ class GenerateCppHeaders extends OpenWireCppHeadersScript {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ${className}_hpp_
#define ${className}_hpp_
#ifndef ActiveMQ_${className}_hpp_
#define ActiveMQ_${className}_hpp_
// Turn off warning message for ignored exception specification
#ifdef _MSC_VER
#pragma warning( disable : 4290 )
#endif
#include <string>
"""
if( baseClass.equals("BrokerError") )
out << """#include "${baseClass}.hpp"
"""
else
out << """#include "command/${baseClass}.hpp"
out << """#include "activemq/command/${baseClass}.hpp"
"""
for (property in properties)
{
@ -65,38 +65,42 @@ for (property in properties)
if( arrayType.isPrimitiveType() )
continue ;
}
if( includeName.startsWith("ap<") )
includeName = includeName.substring(3, includeName.length()-1) ;
if( includeName.startsWith("array<") )
includeName = includeName.substring(6, includeName.length()-1) ;
else if( includeName.startsWith("p<") )
includeName = includeName.substring(2, includeName.length()-1)
if( includeName.equals("BrokerError") )
out << """#include "${includeName}.hpp"
if( includeName.equals("IDataStructure") )
out << """#include "activemq/${includeName}.hpp"
"""
else
out << """#include "command/${includeName}.hpp"
out << """#include "activemq/command/${includeName}.hpp"
"""
}
}
out << """
#include "util/ifr/ap.hpp"
#include "util/ifr/p.hpp"
#include "activemq/protocol/IMarshaller.hpp"
#include "ppr/io/IOutputStream.hpp"
#include "ppr/io/IInputStream.hpp"
#include "ppr/io/IOException.hpp"
#include "ppr/util/ifr/array"
#include "ppr/util/ifr/p"
namespace apache
{
namespace activemq
{
namespace client
namespace command
{
namespace command
{
using namespace ifr;
using namespace std;
using namespace apache::activemq::client;
using namespace ifr;
using namespace std;
using namespace apache::activemq;
using namespace apache::activemq::protocol;
using namespace apache::ppr::io;
/*
*
* Marshalling code for Open Wire Format for ${className}
* Command and marshalling code for OpenWire format for ${className}
*
*
* NOTE!: This file is autogenerated - do not modify!
@ -106,7 +110,7 @@ namespace apache
*/
class ${className} : public ${baseClass}
{
private:
protected:
"""
for (property in properties) {
def type = toCppType(property.type)
@ -116,13 +120,13 @@ private:
}
out << """
public:
const static int TYPE = ${getOpenWireOpCode(jclass)};
const static unsigned char TYPE = ${getOpenWireOpCode(jclass)};
public:
${className}() ;
virtual ~${className}() ;
virtual int getCommandType() ;
virtual unsigned char getDataStructureType() ;
"""
for (property in properties) {
def type = toCppType(property.type)
@ -134,16 +138,16 @@ public:
"""
}
out << """
virtual int marshal(p<IMarshaller> marshaller, int mode, p<IOutputStream> ostream) throw (IOException) ;
virtual void unmarshal(p<IMarshaller> marshaller, int mode, p<IInputStream> istream) throw (IOException) ;
} ;
/* namespace */
}
}
}
}
#endif /*${className}_hpp_*/
#endif /*ActiveMQ_${className}_hpp_*/
"""
}
}
}

View File

@ -105,8 +105,8 @@
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="src"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
AdditionalIncludeDirectories="src\main\cpp"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0400"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
ProgramDataBaseFileName="$(IntDir)\amqlib.pdb"
@ -1098,6 +1098,10 @@
RelativePath=".\src\main\cpp\ppr\io\encoding\CharsetEncoderRegistry.hpp"
>
</File>
<File
RelativePath=".\src\main\cpp\ppr\io\encoding\CharsetEncodingException.hpp"
>
</File>
<File
RelativePath=".\src\main\cpp\ppr\io\encoding\ICharsetEncoder.hpp"
>

View File

@ -119,10 +119,10 @@
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\src"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
AdditionalIncludeDirectories="src\main\cpp"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0400"
RuntimeLibrary="2"
UsePrecompiledHeader="2"
UsePrecompiledHeader="0"
ProgramDataBaseFileName="$(IntDir)\test.pdb"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
@ -139,8 +139,9 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="wsock32.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
GenerateDebugInformation="false"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"

View File

@ -1,209 +0,0 @@
/*
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.activemq.openwire.tool;
import org.codehaus.jam.JClass;
import java.io.File;
/**
*
* @version $Revision: 379824 $
*/
public abstract class OpenWireCppClassesScript extends OpenWireClassesScript {
public Object run() {
filePostFix = getFilePostFix();
if (destDir == null) {
destDir = new File("../openwire-cpp/src/main/cpp/activemq/command");
}
return super.run();
}
protected String getFilePostFix() {
return ".cpp";
}
/**
* Converts the Java type to a C++ type name
*/
public String toCppType(JClass type) {
String name = type.getSimpleName();
if (name.equals("String")) {
return "p<string>";
}
else if (type.isArrayType()) {
if( name.equals("byte[]") )
name = "char[]" ;
else if( name.equals("DataStructure[]") )
name = "IDataStructure[]" ;
return "array<" + name.substring(0, name.length()-2) + ">";
}
else if (name.equals("Throwable") || name.equals("Exception")) {
return "p<BrokerError>";
}
else if (name.equals("ByteSequence")) {
return "array<char>";
}
else if (name.equals("boolean")) {
return "bool";
}
else if (name.equals("long")) {
return "long long";
}
else if (name.equals("byte")) {
return "char";
}
else if( name.equals("Command") || name.equals("DataStructure") ) {
return "p<I" + name + ">" ;
}
else if( !type.isPrimitiveType() ) {
return "p<" + name + ">" ;
}
else {
return name ;
}
}
/**
* Converts the Java type to a C++ default value
*/
public String toCppDefaultValue(JClass type) {
String name = type.getSimpleName();
if ( name.equals("boolean") ) {
return "false";
}
else if (!type.isPrimitiveType()) {
return "NULL";
}
else {
return "0";
}
}
/**
* Converts the Java type to the name of the C++ marshal method
* to be used
*/
public String toMarshalMethodName(JClass type) {
String name = type.getSimpleName();
if (name.equals("String")) {
return "marshalString";
}
else if (type.isArrayType()) {
if ( type.getArrayComponentType().isPrimitiveType() && name.equals("byte[]") )
return "marshalByteArray" ;
else
return "marshalObjectArray" ;
}
else if ( name.equals("ByteSequence") ) {
return "marshalByteArray";
}
else if (name.equals("short") ) {
return "marshalShort";
}
else if (name.equals("int") ) {
return "marshalInt";
}
else if (name.equals("long") ) {
return "marshalLong";
}
else if (name.equals("byte")) {
return "marshalByte";
}
else if (name.equals("double")) {
return "marshalDouble";
}
else if (name.equals("float")) {
return "marshalFloat";
}
else if (name.equals("boolean")) {
return "marshalBoolean";
}
else if( !type.isPrimitiveType() ) {
return "marshalObject" ;
}
else {
return name ;
}
}
/**
* Converts the Java type to the name of the C++ unmarshal method
* to be used
*/
public String toUnmarshalMethodName(JClass type) {
String name = type.getSimpleName();
if (name.equals("String")) {
return "unmarshalString";
}
else if (type.isArrayType()) {
if ( type.getArrayComponentType().isPrimitiveType() && name.equals("byte[]") )
return "unmarshalByteArray" ;
else
return "unmarshalObjectArray" ;
}
else if ( name.equals("ByteSequence") ) {
return "unmarshalByteArray";
}
else if (name.equals("short") ) {
return "unmarshalShort";
}
else if (name.equals("int") ) {
return "unmarshalInt";
}
else if (name.equals("long") ) {
return "unmarshalLong";
}
else if (name.equals("byte")) {
return "unmarshalByte";
}
else if (name.equals("double")) {
return "unmarshalDouble";
}
else if (name.equals("float")) {
return "unmarshalFloat";
}
else if (name.equals("boolean")) {
return "unmarshalBoolean";
}
else if( !type.isPrimitiveType() ) {
return "unmarshalObject" ;
}
else {
return name ;
}
}
/**
* Converts the Java type to a C++ pointer cast
*/
public String toUnmarshalCast(JClass type) {
String name = toCppType(type) ;
if( name.startsWith("p<") )
return "p_cast<" + name.substring(2) ;
else if( name.startsWith("array<") &&
(type.isArrayType() && !type.getArrayComponentType().isPrimitiveType()) &&
!type.getSimpleName().equals("ByteSequence") )
return "array_cast<" + name.substring(6) ;
else
return "" ;
}
}

View File

@ -1,30 +0,0 @@
/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.activemq.openwire.tool;
/**
*
* @version $Revision: 379734 $
*/
public abstract class OpenWireCppHeadersScript extends OpenWireCppClassesScript {
protected String getFilePostFix() {
return ".hpp";
}
}

View File

@ -1,125 +0,0 @@
/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.
*/
import org.apache.activemq.openwire.tool.OpenWireCppClassesScript
/**
* Generates the C++ commands for the Open Wire Format
*
* @version $Revision$
*/
class GenerateCppClasses extends OpenWireCppClassesScript {
void generateFile(PrintWriter out) {
out << """/*
* Copyright 2006 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed 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.
*/
#include "activemq/command/${className}.hpp"
using namespace apache::activemq::command;
/*
*
* Command and marshalling code for OpenWire format for ${className}
*
*
* NOTE!: This file is autogenerated - do not modify!
* if you need to make a change, please see the Groovy scripts in the
* activemq-core module
*
*/
${className}::${className}()
{"""
for (property in properties) {
def value = toCppDefaultValue(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
this->${parameterName} = ${value} ;"""
}
out << """
}
${className}::~${className}()
{
}
unsigned char ${className}::getDataStructureType()
{
return ${className}::TYPE ;
}
"""
for (property in properties) {
def type = toCppType(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
${type} ${className}::get${propertyName}()
{
return ${parameterName} ;
}
void ${className}::set${propertyName}(${type} ${parameterName})
{
this->${parameterName} = ${parameterName} ;
}
"""
}
out << """
int ${className}::marshal(p<IMarshaller> marshaller, int mode, p<IOutputStream> ostream) throw (IOException)
{
int size = 0 ;
size += ${baseClass}::marshal(marshaller, mode, ostream) ; """
for (property in properties) {
def marshalMethod = toMarshalMethodName(property.type)
def propertyName = decapitalize(property.simpleName)
out << """
size += marshaller->${marshalMethod}(${propertyName}, mode, ostream) ; """
}
out << """
return size ;
}
void ${className}::unmarshal(p<IMarshaller> marshaller, int mode, p<IInputStream> istream) throw (IOException)
{
${baseClass}::unmarshal(marshaller, mode, istream) ; """
for (property in properties) {
def cast = toUnmarshalCast(property.type)
def unmarshalMethod = toUnmarshalMethodName(property.type)
def propertyName = decapitalize(property.simpleName)
out << """
${propertyName} = ${cast}(marshaller->${unmarshalMethod}(mode, istream)) ; """
}
out << """
}
"""
}
}

View File

@ -1,153 +0,0 @@
/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
* Licensed 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.
*/
import org.apache.activemq.openwire.tool.OpenWireCppHeadersScript
/**
* Generates the C++ commands for the Open Wire Format
*
* @version $Revision$
*/
class GenerateCppHeaders extends OpenWireCppHeadersScript {
void generateFile(PrintWriter out) {
out << """/*
* Copyright 2006 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed 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.
*/
#ifndef ActiveMQ_${className}_hpp_
#define ActiveMQ_${className}_hpp_
// Turn off warning message for ignored exception specification
#ifdef _MSC_VER
#pragma warning( disable : 4290 )
#endif
#include <string>
"""
out << """#include "activemq/command/${baseClass}.hpp"
"""
for (property in properties)
{
if( !property.type.isPrimitiveType() &&
property.type.simpleName != "String" &&
property.type.simpleName != "ByteSequence" )
{
def includeName = toCppType(property.type)
if( property.type.isArrayType() )
{
def arrayType = property.type.arrayComponentType ;
if( arrayType.isPrimitiveType() )
continue ;
}
if( includeName.startsWith("array<") )
includeName = includeName.substring(6, includeName.length()-1) ;
else if( includeName.startsWith("p<") )
includeName = includeName.substring(2, includeName.length()-1)
if( includeName.equals("IDataStructure") )
out << """#include "activemq/${includeName}.hpp"
"""
else
out << """#include "activemq/command/${includeName}.hpp"
"""
}
}
out << """
#include "activemq/protocol/IMarshaller.hpp"
#include "ppr/io/IOutputStream.hpp"
#include "ppr/io/IInputStream.hpp"
#include "ppr/io/IOException.hpp"
#include "ppr/util/ifr/array"
#include "ppr/util/ifr/p"
namespace apache
{
namespace activemq
{
namespace command
{
using namespace ifr;
using namespace std;
using namespace apache::activemq;
using namespace apache::activemq::protocol;
using namespace apache::ppr::io;
/*
*
* Command and marshalling code for OpenWire format for ${className}
*
*
* NOTE!: This file is autogenerated - do not modify!
* if you need to make a change, please see the Groovy scripts in the
* activemq-core module
*
*/
class ${className} : public ${baseClass}
{
protected:
"""
for (property in properties) {
def type = toCppType(property.type)
def name = decapitalize(property.simpleName)
out << """ $type $name ;
"""
}
out << """
public:
const static unsigned char TYPE = ${getOpenWireOpCode(jclass)};
public:
${className}() ;
virtual ~${className}() ;
virtual unsigned char getDataStructureType() ;
"""
for (property in properties) {
def type = toCppType(property.type)
def propertyName = property.simpleName
def parameterName = decapitalize(propertyName)
out << """
virtual ${type} get${propertyName}() ;
virtual void set${propertyName}(${type} ${parameterName}) ;
"""
}
out << """
virtual int marshal(p<IMarshaller> marshaller, int mode, p<IOutputStream> ostream) throw (IOException) ;
virtual void unmarshal(p<IMarshaller> marshaller, int mode, p<IInputStream> istream) throw (IOException) ;
} ;
/* namespace */
}
}
}
#endif /*ActiveMQ_${className}_hpp_*/
"""
}
}

View File

@ -248,8 +248,7 @@ void MessageConsumer::doClientAcknowledge(p<ActiveMQMessage> message)
void MessageConsumer::doAcknowledge(p<Message> message)
{
p<MessageAck> ack = createMessageAck(message) ;
//cout << "Sending Ack: " << ack->getAckType() << endl ;
session->getConnection()->syncRequest(ack) ;
session->getConnection()->oneway(ack) ;
}
/*

View File

@ -32,8 +32,9 @@ using namespace apache::activemq::protocol::openwire;
*/
OpenWireMarshaller::OpenWireMarshaller(p<WireFormatInfo> formatInfo)
{
this->formatInfo = formatInfo ;
this->encoder = CharsetEncoderRegistry::getEncoder() ;
this->formatInfo = formatInfo ;
this->encoder = CharsetEncoderRegistry::getEncoder() ;
this->useTightEncoding = formatInfo->getTightEncodingEnabled() ;
}
// --- Operation methods --------------------------------------------
@ -46,7 +47,7 @@ int OpenWireMarshaller::marshalBoolean(bool value, int mode, p<IOutputStream> os
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeBoolean(value) ;
@ -68,7 +69,7 @@ int OpenWireMarshaller::marshalByte(char value, int mode, p<IOutputStream> ostre
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeByte(value) ;
@ -90,7 +91,7 @@ int OpenWireMarshaller::marshalShort(short value, int mode, p<IOutputStream> ost
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeShort(value) ;
@ -112,7 +113,7 @@ int OpenWireMarshaller::marshalInt(int value, int mode, p<IOutputStream> ostream
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeInt(value) ;
@ -134,7 +135,7 @@ int OpenWireMarshaller::marshalLong(long long value, int mode, p<IOutputStream>
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeLong(value) ;
@ -156,7 +157,7 @@ int OpenWireMarshaller::marshalFloat(float value, int mode, p<IOutputStream> ost
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeFloat(value) ;
@ -178,7 +179,7 @@ int OpenWireMarshaller::marshalDouble(double value, int mode, p<IOutputStream> o
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
dos->writeDouble(value) ;
@ -200,7 +201,7 @@ int OpenWireMarshaller::marshalString(p<string> value, int mode, p<IOutputStream
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( mode == IMarshaller::MARSHAL_WRITE )
{
@ -235,7 +236,7 @@ int OpenWireMarshaller::marshalObject(p<IDataStructure> object, int mode, p<IOut
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
int size = 0 ;
@ -278,7 +279,7 @@ int OpenWireMarshaller::marshalObjectArray(array<IDataStructure> objects, int mo
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
int size = 0 ;
@ -323,7 +324,7 @@ int OpenWireMarshaller::marshalByteArray(array<char> values, int mode, p<IOutput
// Assert that supplied output stream is a data output stream
p<DataOutputStream> dos = checkOutputStream(ostream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
int size = 0 ;
@ -367,7 +368,7 @@ int OpenWireMarshaller::marshalByteArray(array<char> values, int mode, p<IOutput
*/
int OpenWireMarshaller::marshalMap(p<PropertyMap> object, int mode, p<IOutputStream> ostream) throw(IOException)
{
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
int size = 0 ;
@ -541,7 +542,7 @@ bool OpenWireMarshaller::unmarshalBoolean(int mode, p<IInputStream> istream) thr
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readBoolean() ;
}
@ -560,7 +561,7 @@ char OpenWireMarshaller::unmarshalByte(int mode, p<IInputStream> istream) throw(
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readByte() ;
}
@ -578,7 +579,7 @@ short OpenWireMarshaller::unmarshalShort(int mode, p<IInputStream> istream) thro
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readShort() ;
}
@ -597,7 +598,7 @@ int OpenWireMarshaller::unmarshalInt(int mode, p<IInputStream> istream) throw(IO
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readInt() ;
}
@ -616,7 +617,7 @@ long long OpenWireMarshaller::unmarshalLong(int mode, p<IInputStream> istream) t
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readLong() ;
}
@ -635,7 +636,7 @@ float OpenWireMarshaller::unmarshalFloat(int mode, p<IInputStream> istream) thro
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readFloat() ;
}
@ -654,7 +655,7 @@ double OpenWireMarshaller::unmarshalDouble(int mode, p<IInputStream> istream) th
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
return dis->readFloat() ;
}
@ -673,7 +674,7 @@ p<string> OpenWireMarshaller::unmarshalString(int mode, p<IInputStream> istream)
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
if( dis->readBoolean() )
return dis->readString() ;
@ -695,7 +696,7 @@ p<IDataStructure> OpenWireMarshaller::unmarshalObject(int mode, p<IInputStream>
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
// Null marker
if( !dis->readBoolean() )
@ -728,7 +729,7 @@ array<IDataStructure> OpenWireMarshaller::unmarshalObjectArray(int mode, p<IInpu
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
// Null marker
if( !dis->readBoolean() )
@ -766,7 +767,7 @@ array<char> OpenWireMarshaller::unmarshalByteArray(int mode, p<IInputStream> ist
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
// Null marker
if( !dis->readBoolean() )
@ -801,7 +802,7 @@ p<PropertyMap> OpenWireMarshaller::unmarshalMap(int mode, p<IInputStream> istrea
// Assert that supplied input stream is a data input stream
p<DataInputStream> dis = checkInputStream(istream) ;
if( !formatInfo->getTightEncodingEnabled() )
if( !useTightEncoding )
{
// Get size of map
int size = dis->readInt() ;

View File

@ -62,6 +62,7 @@ class OpenWireMarshaller : public IMarshaller
private:
p<WireFormatInfo> formatInfo ;
p<ICharsetEncoder> encoder ;
bool useTightEncoding ;
public:
// Primitive types

View File

@ -43,6 +43,9 @@ OpenWireProtocol::OpenWireProtocol()
wireFormatInfo->setSizePrefixDisabled(false) ;
wireFormatInfo->setTightEncodingEnabled(false) ;
// Use variable instead of map lookup for performance reason
this->sizePrefixDisabled = wireFormatInfo->getSizePrefixDisabled() ;
// Create wire marshaller
wireMarshaller = new OpenWireMarshaller(wireFormatInfo) ;
}
@ -87,7 +90,7 @@ void OpenWireProtocol::marshal(p<IDataStructure> object, p<IOutputStream> ostrea
unsigned char dataType = object->getDataStructureType() ;
// Calculate size to be marshalled if configured
if( !wireFormatInfo->getSizePrefixDisabled() )
if( !sizePrefixDisabled )
{
size = 1 ; // data structure type
size += object->marshal(wireMarshaller, IMarshaller::MARSHAL_SIZE, ostream) ;
@ -102,7 +105,7 @@ void OpenWireProtocol::marshal(p<IDataStructure> object, p<IOutputStream> ostrea
else // ...NULL object
{
// Calculate size to be marshalled if configured
if( !wireFormatInfo->getSizePrefixDisabled() )
if( !sizePrefixDisabled )
{
// Calculate size to be marshalled
size = 1 ; // data structure type
@ -125,7 +128,7 @@ p<IDataStructure> OpenWireProtocol::unmarshal(p<IInputStream> istream) throw(IOE
int size = 0 ;
// Read packet size if configured
if( !wireFormatInfo->getSizePrefixDisabled() )
if( !sizePrefixDisabled )
size = dis->readInt() ;
// First byte is the data structure type

View File

@ -57,6 +57,7 @@ class OpenWireProtocol : public IProtocol
private:
p<OpenWireMarshaller> wireMarshaller ;
p<WireFormatInfo> wireFormatInfo ;
bool sizePrefixDisabled ;
static const char NULL_TYPE ;
static const int PROTOCOL_VERSION ;

View File

@ -33,11 +33,11 @@ FutureResponse::FutureResponse()
p<Response> FutureResponse::getResponse()
{
// Wait for response to arrive
LOCKED_SCOPE (mutex);
while ( response == NULL )
LOCKED_SCOPE (mutex) ;
if ( response == NULL )
{
LOCKED_SCOPE_UNLOCK;
semaphore->wait(maxWait); // BUG: Why have a max wait when what you do is just to wait again and again? //dafah
semaphore->wait();
LOCKED_SCOPE_RELOCK;
}
return response ;

View File

@ -197,7 +197,14 @@ p<string> DataInputStream::readString() throw(IOException)
// Decode string if charset encoder has been configured
if( encoder != NULL )
value = encoder->decode(value) ;
{
try {
value = encoder->decode(value) ;
}
catch( CharsetEncodingException &cee ) {
throw new IOException( cee.what() ) ;
}
}
}
else // ...empty string
value = new string("") ;

View File

@ -20,6 +20,7 @@
#include "ppr/io/IInputStream.hpp"
#include "ppr/io/encoding/ICharsetEncoder.hpp"
#include "ppr/io/encoding/CharsetEncoderRegistry.hpp"
#include "ppr/io/encoding/CharsetEncodingException.hpp"
#include "ppr/util/Endian.hpp"
#include "ppr/util/ifr/p"

View File

@ -184,7 +184,14 @@ int DataOutputStream::writeString(p<string> value) throw(IOException)
// Encode string if an charset encoder has been configured
if( encoder != NULL )
data = encoder->encode(value, &length) ;
{
try {
data = encoder->encode(value, &length) ;
}
catch( CharsetEncodingException &cee ) {
throw IOException( cee.what() ) ;
}
}
else
data = value ;

View File

@ -20,6 +20,7 @@
#include "ppr/io/IOutputStream.hpp"
#include "ppr/io/encoding/ICharsetEncoder.hpp"
#include "ppr/io/encoding/CharsetEncoderRegistry.hpp"
#include "ppr/io/encoding/CharsetEncodingException.hpp"
#include "ppr/util/Endian.hpp"
#include "ppr/util/ifr/p"

View File

@ -76,7 +76,7 @@ int AsciiToUTF8Encoder::length(p<string> str)
/*
* Encodes given string from ASCII into modified UTF-8.
*/
p<string> AsciiToUTF8Encoder::encode(p<string> str, int *enclen)
p<string> AsciiToUTF8Encoder::encode(p<string> str, int *enclen) throw (CharsetEncodingException)
{
// Assert parameter
if( str == NULL )
@ -125,7 +125,7 @@ p<string> AsciiToUTF8Encoder::encode(p<string> str, int *enclen)
/*
* Decodes given string from modified UTF-8 into ASCII.
*/
p<string> AsciiToUTF8Encoder::decode(p<string> str)
p<string> AsciiToUTF8Encoder::decode(p<string> str) throw (CharsetEncodingException)
{
// Assert argument
if( str == NULL || str->length() == 0 )
@ -159,28 +159,28 @@ p<string> AsciiToUTF8Encoder::decode(p<string> str)
i += 2 ;
if( i > length )
throw exception() ;
throw CharsetEncodingException("Missing character in double pair") ;
ch2 = (*str)[i - 1] ;
if( (ch2 & 0xC0) != 0x80 )
throw exception() ;
throw CharsetEncodingException("Invalid second character in double byte pair") ;
decstr->append( 1, (char)(((ch & 0x1F) << 6) | (ch2 & 0x3F)) ) ;
break ;
case 14: // Triple bytes char, 1110xxxx 10xxxxxx 10xxxxxx
i += 3 ;
if( i > length )
throw exception() ;
throw CharsetEncodingException("Missing character in triple set") ;
ch2 = (*str)[i - 2] ;
ch3 = (*str)[i - 1] ;
if( ((ch2 & 0xC0) != 0x80) || ((ch3 & 0xC0) != 0x80) )
throw exception();
throw CharsetEncodingException("Invalid second and/or third character in triple set") ;
decstr->append( 1, (char)(((ch & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | ((ch3 & 0x3F) << 0)) ) ;
break ;
default: // Unsupported, 10xxxxxx 1111xxxx
throw exception() ;
throw CharsetEncodingException("Unsupported type flag") ;
}
}
return decstr ;

View File

@ -20,6 +20,7 @@
#include <string>
#include <ppr/io/ByteArrayOutputStream.hpp>
#include <ppr/io/encoding/ICharsetEncoder.hpp>
#include <ppr/io/encoding/CharsetEncodingException.hpp>
#include <ppr/util/ifr/array>
#include <ppr/util/ifr/p>
@ -50,8 +51,8 @@ public:
virtual ~AsciiToUTF8Encoder() ;
virtual int length(p<string> str) ;
virtual p<string> encode(p<string> str, int *enclen) ;
virtual p<string> decode(p<string> str) ;
virtual p<string> encode(p<string> str, int *enclen) throw (CharsetEncodingException) ;
virtual p<string> decode(p<string> str) throw (CharsetEncodingException) ;
} ;
/* namespace */

View File

@ -0,0 +1,45 @@
/*
* Copyright 2006 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed 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.
*/
#ifndef Ppr_CharsetEncodingException_hpp_
#define Ppr_CharsetEncodingException_hpp_
#include "ppr/TraceException.hpp"
namespace apache
{
namespace ppr
{
/*
* Signals that a character encoding or decoding error has occurred.
*/
class CharsetEncodingException : public TraceException
{
public:
CharsetEncodingException() : TraceException()
{ /* no-op */ } ;
CharsetEncodingException(const char *const& msg) : TraceException(msg)
{ /* no-op */ } ;
CharsetEncodingException(const char* fileName, int lineNo, const char* msg) : TraceException(msg)
{ /* no-op */ } ;
} ;
/* namespace */
}
}
#endif /*Ppr_CharsetEncodingException_hpp_*/

View File

@ -18,6 +18,7 @@
#define Ppr_ICharsetEncoder_hpp_
#include <string>
#include <ppr/io/encoding/CharsetEncodingException.hpp>
#include "ppr/util/ifr/array"
#include "ppr/util/ifr/p"
@ -39,8 +40,8 @@ namespace apache
struct ICharsetEncoder : Interface
{
virtual int length(p<string> str) = 0 ;
virtual p<string> encode(p<string> str, int *enclen) = 0 ;
virtual p<string> decode(p<string> str) = 0 ;
virtual p<string> encode(p<string> str, int *enclen) throw (CharsetEncodingException) = 0 ;
virtual p<string> decode(p<string> str) throw (CharsetEncodingException) = 0 ;
} ;
/* namespace */

View File

@ -56,11 +56,10 @@ void TestSynchQueue::execute() throw (exception)
// Connect to queue
queue = session->getQueue("FOO.BAR") ;
// Create a consumer and producer
consumer = session->createConsumer(queue) ;
producer = session->createProducer(queue) ;
producer->setPersistent(true) ;
// Create a message
reqMessage = session->createTextMessage("Hello World!") ;
@ -78,17 +77,26 @@ void TestSynchQueue::execute() throw (exception)
throw TraceException("Received a null message") ;
else
{
p<string> str ;
props = rspMessage->getProperties() ;
item = (*props)["someHeader"] ;
// Verify message
if( rspMessage->getJMSCorrelationID()->compare("abc") != 0 )
str = rspMessage->getJMSCorrelationID() ;
if( str == NULL || str->compare("abc") != 0 )
throw TraceException("Returned message has invalid correlation ID") ;
if( rspMessage->getJMSXGroupID()->compare("cheese") != 0 )
str = rspMessage->getJMSXGroupID() ;
if( str == NULL || str->compare("cheese") != 0 )
throw TraceException("Returned message has invalid group ID") ;
if( rspMessage->getText()->compare("Hello World!") != 0 )
str = rspMessage->getText() ;
if( str == NULL || str->compare("Hello World!") != 0 )
throw TraceException("Returned message has altered body text") ;
if( item.getString()->compare("James") != 0 )
str = item.getString() ;
if( str == NULL || str->compare("James") != 0 )
throw TraceException("Returned message has invalid properties") ;
}
}