1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulDisconnect;
21
22
23 import java.nio.ByteBuffer;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.apache.directory.api.asn1.DecoderException;
28 import org.apache.directory.api.asn1.EncoderException;
29 import org.apache.directory.api.asn1.ber.tlv.BerValue;
30 import org.apache.directory.api.asn1.ber.tlv.TLV;
31 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
32 import org.apache.directory.api.i18n.I18n;
33 import org.apache.directory.api.ldap.codec.api.ExtendedResponseDecorator;
34 import org.apache.directory.api.ldap.codec.api.LdapApiService;
35 import org.apache.directory.api.ldap.extras.extended.gracefulDisconnect.GracefulDisconnectResponse;
36 import org.apache.directory.api.ldap.model.message.Referral;
37 import org.apache.directory.api.util.Strings;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41
42
43
44
45
46
47 public class GracefulDisconnectResponseDecorator extends ExtendedResponseDecorator<GracefulDisconnectResponse>
48 implements GracefulDisconnectResponse
49 {
50
51 private static final Logger LOG = LoggerFactory.getLogger( GracefulDisconnectResponseDecorator.class );
52
53
54 private int gracefulDisconnectSequenceLength;
55
56
57 private int replicatedContextsLength;
58
59
60 private List<byte[]> ldapUrlBytes;
61
62 private GracefulDisconnectResponse gracefulDisconnectResponse;
63
64
65
66
67
68
69
70 public GracefulDisconnectResponseDecorator( LdapApiService codec, GracefulDisconnectResponse decoratedMessage )
71 {
72 super( codec, decoratedMessage );
73 gracefulDisconnectResponse = decoratedMessage;
74 }
75
76
77
78
79
80
81
82
83
84
85 public byte[] getResponseValue()
86 {
87 if ( responseValue == null )
88 {
89 try
90 {
91 responseValue = encodeInternal().array();
92 }
93 catch ( EncoderException e )
94 {
95 LOG.error( I18n.err( I18n.ERR_04164 ), e );
96 throw new RuntimeException( e );
97 }
98 }
99
100 return responseValue;
101 }
102
103
104
105
106
107
108
109 public void setResponseValue( byte[] responseValue )
110 {
111 GracefulDisconnectDecoder decoder = new GracefulDisconnectDecoder();
112
113 try
114 {
115 if ( responseValue != null )
116 {
117 decoder.decode( responseValue );
118 this.responseValue = new byte[responseValue.length];
119 System.arraycopy( responseValue, 0, this.responseValue, 0, responseValue.length );
120 }
121 else
122 {
123 this.responseValue = null;
124 }
125 }
126 catch ( DecoderException e )
127 {
128 LOG.error( I18n.err( I18n.ERR_04172 ), e );
129 }
130 }
131
132
133
134
135
136 public int getDelay()
137 {
138 return gracefulDisconnectResponse.getDelay();
139 }
140
141
142
143
144
145 public void setDelay( int delay )
146 {
147 gracefulDisconnectResponse.setDelay( delay );
148 }
149
150
151
152
153
154 public int getTimeOffline()
155 {
156 return gracefulDisconnectResponse.getTimeOffline();
157 }
158
159
160
161
162
163 public void setTimeOffline( int timeOffline )
164 {
165 gracefulDisconnectResponse.setTimeOffline( timeOffline );
166 }
167
168
169
170
171
172 public Referral getReplicatedContexts()
173 {
174 return gracefulDisconnectResponse.getReplicatedContexts();
175 }
176
177
178
179
180
181 public void addReplicatedContexts( String replicatedContext )
182 {
183 gracefulDisconnectResponse.getReplicatedContexts().addLdapUrl( replicatedContext );
184 }
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 int computeLengthInternal()
200 {
201 gracefulDisconnectSequenceLength = 0;
202
203 if ( gracefulDisconnectResponse.getTimeOffline() != 0 )
204 {
205 gracefulDisconnectSequenceLength += 1 + 1 + BerValue.getNbBytes( gracefulDisconnectResponse.getTimeOffline() );
206 }
207
208 if ( gracefulDisconnectResponse.getDelay() != 0 )
209 {
210 gracefulDisconnectSequenceLength += 1 + 1 + BerValue.getNbBytes( gracefulDisconnectResponse.getDelay() );
211 }
212
213 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null ) &&
214 ( gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().size() != 0 ) )
215 {
216 replicatedContextsLength = 0;
217
218 ldapUrlBytes = new ArrayList<byte[]>( gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().size() );
219
220
221 for ( String replicatedContext : gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls() )
222 {
223 byte[] bytes = Strings.getBytesUtf8( replicatedContext );
224 ldapUrlBytes.add( bytes );
225 int ldapUrlLength = bytes.length;
226 replicatedContextsLength += 1 + TLV.getNbBytes( ldapUrlLength ) + ldapUrlLength;
227 }
228
229 gracefulDisconnectSequenceLength += 1 + TLV.getNbBytes( replicatedContextsLength )
230 + replicatedContextsLength;
231 }
232
233 return 1 + TLV.getNbBytes( gracefulDisconnectSequenceLength ) + gracefulDisconnectSequenceLength;
234 }
235
236
237
238
239
240
241
242
243 ByteBuffer encodeInternal() throws EncoderException
244 {
245
246 ByteBuffer bb = ByteBuffer.allocate( computeLengthInternal() );
247
248
249 bb.put( UniversalTag.SEQUENCE.getValue() );
250 bb.put( TLV.getBytes( gracefulDisconnectSequenceLength ) );
251
252 if ( gracefulDisconnectResponse.getTimeOffline() != 0 )
253 {
254 BerValue.encode( bb, gracefulDisconnectResponse.getTimeOffline() );
255 }
256
257 if ( gracefulDisconnectResponse.getDelay() != 0 )
258 {
259 bb.put( ( byte ) GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG );
260 bb.put( ( byte ) TLV.getNbBytes( gracefulDisconnectResponse.getDelay() ) );
261 bb.put( BerValue.getBytes( gracefulDisconnectResponse.getDelay() ) );
262 }
263
264 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null ) &&
265 ( gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().size() != 0 ) )
266 {
267 bb.put( UniversalTag.SEQUENCE.getValue() );
268 bb.put( TLV.getBytes( replicatedContextsLength ) );
269
270
271 for ( byte[] replicatedContext : ldapUrlBytes )
272 {
273 BerValue.encode( bb, replicatedContext );
274 }
275 }
276
277 return bb;
278 }
279
280
281
282
283
284 public String toString()
285 {
286 StringBuffer sb = new StringBuffer();
287
288 sb.append( "Graceful Disconnect extended operation" );
289 sb.append( " TimeOffline : " ).append( gracefulDisconnectResponse.getTimeOffline() ).append( '\n' );
290 sb.append( " Delay : " ).append( gracefulDisconnectResponse.getDelay() ).append( '\n' );
291
292 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null ) && ( gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().size() != 0 ) )
293 {
294 sb.append( " Replicated contexts :" );
295
296
297 for ( String url : gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls() )
298 {
299 sb.append( "\n " ).append( url );
300 }
301 }
302
303 return sb.toString();
304 }
305 }