On Jul 7 2008, Ted Ross wrote:

[EMAIL PROTECTED] wrote:
> Hello Ted/Anybody,
>
> Could you please correct me about the schema request (AM1S) which I am > sending to broker to get the schema response for particular class?
>
> Could you please let me know what is wrong here. I think schema > request is not healthy. Please guide me here. I am not receiving the > schema response with this schema request
>
> Here is the code snippet of Schema request and Schema response.
> // Code snippet for Schema Request (AM1S)
> ....
>
> p.opcode="AM1S";
> p.sequenceNo=500;
> p.packageName="qpid";
> p.classname="vhost";
>
> message.clear();
> try {
> // encode the opcode
> message.put(p.opcode.getBytes("UTF-8"));
> message.putInt( p.sequenceNo);
> // encode the package name
> encoder.writeStr8(p.packageName);
> message.putShort((byte) p.packageName.length());
> message.put(p.packageName.getBytes("UTF-8"));
> // encode the class name
> encoder.writeStr8(p.classname);
> message.putShort((byte) p.classname.length());
> message.put(p.classname.getBytes("UTF-8"));
> // encode the schema hash
> // *** schema has contents which it got from // byte[] > schemaHash=decoder.readBin128(); something like [EMAIL PROTECTED] ***
>
> encoder.writeBin128(schemaHash);
> message.put((byte) schemaHash.length);
> message.put(schemaHash);
> } catch (UnsupportedEncodingException e) {
> e.printStackTrace();
> }
> ........
> ........
>
> ------
>
> //Start Code snippet Schema Response (AM1s)
>
> String packname = decoder.readStr8();
> System.out.println("Package Name: " + packname);
> String clasnam = decoder.readStr8();
> System.out.println("Class Name: " + clasnam);
> > // get the decoded schema hash
> decoder.readBin128();
> // get the decoded properties contents
> int propCnt = decoder.readUint16();
> System.out.println("Property content:   " + propCnt);
> long statCnt = decoder.readUint16();
> System.out.println("Statistic content:   " + statCnt);
> int methodCnt = decoder.readUint16();
> System.out.println("Method content:   " + methodCnt);
> int eventCnt = decoder.readUint16();
> System.out.println("Event content:   " + eventCnt);
> > for( int i = 0; i < propCnt; i++ )
> {    // decode the MAP
> Map<String,Object> map = decoder.readMap();
> }
> > for( int i = 0; i < statCnt; i++ )
> {
> // decode the MAP
> Map<String,Object> map = decoder.readMap();
> }
> > for( int i = 0; i < methodCnt; i++ )
> {    // decode the MAP
> Map<String,Object> map = decoder.readMap();
> }
> > for( int i = 0; i < eventCnt; i++ )
> {    // decode the MAP
> Map<String,Object> map = decoder.readMap();
> }
>                     ---------
> End of the Code
>
> Thank you.
>
> Best Regards,
> Rahul
>
Rahul,

There's a problem with the encoding of the bin128 for the hash value. If you look at the AMQP 0-10 specification for the proper encoding for a bin128 value, you will see that it is encoded as 16 octets (no length field). Your code prepends a one-byte length which causes the value to be incorrect/unmatched from the viewpoint of the management broker.

In looking at your code fragment, I am unclear as to what "encoder" is and why you use it. In the following section, you invoke "writeStr8" on "encoder" but then you manually encode the string into "message".

    // encode the package name
    encoder.writeStr8(p.packageName);
    message.putShort((byte) p.packageName.length());
    message.put(p.packageName.getBytes("UTF-8"));

Regards,

-Ted




Hello Ted,

encoder is an instance of AbstractEncoder class under org.apache.qpidity.transport.codec.Encoder. And thanks for pointing the duplication.

Yes, you are correct i checked the spec. and it (bin128) is encoded as 16 octets. I added the following method for encoding the 128 bin schema hash with help of Rafael. so you mean this will not help to encode the schema... /* public void writeBin128(byte[] s) { if (s == null) { s = new byte[16]; } else if (s.length != 16) { throw new IllegalArgumentException("" + s); }

put(s);
}
*/

could you please let me know which method can encode this schema or is there any method in AbstractEncoder which can do this OR How can i encode this.

Thanks in advance.

BR,
Rahul

Reply via email to