1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.mitosis.service.protocol.codec;
21
22
23 import java.nio.charset.CharacterCodingException;
24 import java.nio.charset.Charset;
25 import java.nio.charset.CharsetDecoder;
26
27 import org.apache.directory.mitosis.common.CSNVector;
28 import org.apache.directory.mitosis.common.DefaultCSN;
29 import org.apache.directory.mitosis.service.protocol.Constants;
30 import org.apache.directory.mitosis.service.protocol.message.BaseMessage;
31 import org.apache.directory.mitosis.service.protocol.message.BeginLogEntriesAckMessage;
32 import org.apache.directory.server.schema.registries.Registries;
33 import org.apache.mina.common.ByteBuffer;
34 import org.apache.mina.common.IoSession;
35 import org.apache.mina.filter.codec.ProtocolDecoderException;
36 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
37
38
39 public class BeginLogEntriesAckMessageDecoder extends ResponseMessageDecoder
40 {
41 private final CharsetDecoder utf8decoder;
42
43
44 public BeginLogEntriesAckMessageDecoder()
45 {
46 super( Constants.GET_UPDATE_VECTOR_ACK, 0, 3072 );
47 utf8decoder = Charset.forName( "UTF-8" ).newDecoder();
48 }
49
50
51 protected BaseMessage decodeBody( Registries registries, int sequence, int bodyLength, int responseCode, ByteBuffer in ) throws Exception
52 {
53 if ( responseCode != Constants.OK )
54 {
55 return new BeginLogEntriesAckMessage( sequence, responseCode, null, null );
56 }
57
58 CSNVector purgeVector = new CSNVector();
59 CSNVector updateVector = new CSNVector();
60 BeginLogEntriesAckMessage m = new BeginLogEntriesAckMessage( sequence, responseCode, purgeVector, updateVector );
61 readCSNVector( in, purgeVector );
62 readCSNVector( in, updateVector );
63
64 return m;
65 }
66
67
68 private void readCSNVector( ByteBuffer in, CSNVector updateVector ) throws Exception
69 {
70 int nReplicas = in.getInt();
71
72 if ( nReplicas < 0 )
73 {
74 throw new ProtocolDecoderException( "Wrong nReplicas: " + nReplicas );
75 }
76
77 for ( ; nReplicas > 0; nReplicas-- )
78 {
79 String replicaId;
80
81 try
82 {
83 replicaId = in.getString( utf8decoder );
84 }
85 catch ( CharacterCodingException e )
86 {
87 throw new ProtocolDecoderException( "Invalid replicaId", e );
88 }
89
90 updateVector.setCSN( new DefaultCSN( in.getLong(), replicaId, in.getInt() ) );
91 }
92 }
93
94
95 public void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception
96 {
97 }
98 }