1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.mavibot.btree;
21
22
23 import java.io.IOException;
24 import java.nio.ByteBuffer;
25
26 import org.apache.directory.mavibot.btree.exception.SerializerCreationException;
27 import org.apache.directory.mavibot.btree.serializer.AbstractElementSerializer;
28 import org.apache.directory.mavibot.btree.serializer.BufferHandler;
29 import org.apache.directory.mavibot.btree.serializer.ByteArraySerializer;
30 import org.apache.directory.mavibot.btree.serializer.IntSerializer;
31 import org.apache.directory.mavibot.btree.serializer.LongSerializer;
32 import org.apache.directory.mavibot.btree.serializer.StringSerializer;
33 import org.apache.directory.mavibot.btree.util.Strings;
34
35
36
37
38
39
40
41
42
43 {
44
45
46
47
48 {
49 super( new NameRevisionComparator() );
50 }
51
52
53
54
55
56
57
58
59
60 {
61 return deserialize( in, 0 );
62 }
63
64
65
66
67
68
69
70
71
72
73 {
74
75 if ( ( in == null ) || ( in.length < 12 + start ) )
76 {
77 throw new SerializerCreationException( "Cannot extract a NameRevision from a buffer with not enough bytes" );
78 }
79
80 long revision = LongSerializer.deserialize( in, start );
81 String name = StringSerializer.deserialize( in, 8 + start );
82
83 NameRevision revisionName = new NameRevision( name, revision );
84
85 return revisionName;
86 }
87
88
89
90
91
92
93
94
95 public NameRevision fromBytes( byte[] in )
96 {
97 return deserialize( in, 0 );
98 }
99
100
101
102
103
104
105
106
107
108 public NameRevision fromBytes( byte[] in, int start )
109 {
110
111 if ( ( in == null ) || ( in.length < 12 + start ) )
112 {
113 throw new SerializerCreationException( "Cannot extract a NameRevision from a buffer with not enough bytes" );
114 }
115
116 long revision = LongSerializer.deserialize( in, start );
117 String name = StringSerializer.deserialize( in, 8 + start );
118
119 NameRevision revisionName = new NameRevision( name, revision );
120
121 return revisionName;
122 }
123
124
125
126
127
128 @Override
129 public byte[] serialize( NameRevision revisionName )
130 {
131 if ( revisionName == null )
132 {
133 throw new SerializerCreationException( "The revisionName instance should not be null " );
134 }
135
136 byte[] result = null;
137
138 if ( revisionName.getName() != null )
139 {
140 byte[] stringBytes = Strings.getBytesUtf8( revisionName.getName() );
141 int stringLen = stringBytes.length;
142 result = new byte[8 + 4 + stringBytes.length];
143 LongSerializer.serialize( result, 0, revisionName.getRevision() );
144
145 if ( stringLen > 0 )
146 {
147 ByteArraySerializer.serialize( result, 8, stringBytes );
148 }
149 }
150 else
151 {
152 result = new byte[8 + 4];
153 LongSerializer.serialize( result, 0, revisionName.getRevision() );
154 StringSerializer.serialize( result, 8, null );
155 }
156
157 return result;
158 }
159
160
161
162
163
164
165
166
167
168
169
170 {
171 if ( revisionName.getName() != null )
172 {
173 byte[] stringBytes = Strings.getBytesUtf8( revisionName.getName() );
174 int stringLen = stringBytes.length;
175 LongSerializer.serialize( buffer, start, revisionName.getRevision() );
176 IntSerializer.serialize( buffer, 8 + start, stringLen );
177 ByteArraySerializer.serialize( buffer, 12 + start, stringBytes );
178 }
179 else
180 {
181 LongSerializer.serialize( buffer, start, revisionName.getRevision() );
182 StringSerializer.serialize( buffer, 8, null );
183 }
184
185 return buffer;
186 }
187
188
189
190
191
192 @Override
193 public NameRevision deserialize( BufferHandler bufferHandler ) throws IOException
194 {
195 byte[] revisionBytes = bufferHandler.read( 8 );
196 long revision = LongSerializer.deserialize( revisionBytes );
197
198 byte[] lengthBytes = bufferHandler.read( 4 );
199
200 int len = IntSerializer.deserialize( lengthBytes );
201
202 switch ( len )
203 {
204 case 0:
205 return new NameRevision( "", revision );
206
207 case -1:
208 return new NameRevision( null, revision );
209
210 default:
211 byte[] nameBytes = bufferHandler.read( len );
212
213 return new NameRevision( Strings.utf8ToString( nameBytes ), revision );
214 }
215 }
216
217
218
219
220
221 @Override
222 public NameRevision deserialize( ByteBuffer buffer ) throws IOException
223 {
224
225 long revision = buffer.getLong();
226
227
228 int len = buffer.getInt();
229
230 switch ( len )
231 {
232 case 0:
233 return new NameRevision( "", revision );
234
235 case -1:
236 return new NameRevision( null, revision );
237
238 default:
239 byte[] nameBytes = new byte[len];
240 buffer.get( nameBytes );
241
242 return new NameRevision( Strings.utf8ToString( nameBytes ), revision );
243 }
244 }
245 }