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 @Override
86 public byte[] getResponseValue()
87 {
88 if ( responseValue == null )
89 {
90 try
91 {
92 responseValue = encodeInternal().array();
93 }
94 catch ( EncoderException e )
95 {
96 LOG.error( I18n.err( I18n.ERR_04164 ), e );
97 throw new RuntimeException( e );
98 }
99 }
100
101 return responseValue;
102 }
103
104
105
106
107
108
109
110 @Override
111 public void setResponseValue( byte[] responseValue )
112 {
113 GracefulDisconnectDecoder decoder = new GracefulDisconnectDecoder();
114
115 try
116 {
117 if ( responseValue != null )
118 {
119 decoder.decode( responseValue );
120 this.responseValue = new byte[responseValue.length];
121 System.arraycopy( responseValue, 0, this.responseValue, 0, responseValue.length );
122 }
123 else
124 {
125 this.responseValue = null;
126 }
127 }
128 catch ( DecoderException e )
129 {
130 LOG.error( I18n.err( I18n.ERR_04172 ), e );
131 }
132 }
133
134
135
136
137
138 @Override
139 public int getDelay()
140 {
141 return gracefulDisconnectResponse.getDelay();
142 }
143
144
145
146
147
148 @Override
149 public void setDelay( int delay )
150 {
151 gracefulDisconnectResponse.setDelay( delay );
152 }
153
154
155
156
157
158 @Override
159 public int getTimeOffline()
160 {
161 return gracefulDisconnectResponse.getTimeOffline();
162 }
163
164
165
166
167
168 @Override
169 public void setTimeOffline( int timeOffline )
170 {
171 gracefulDisconnectResponse.setTimeOffline( timeOffline );
172 }
173
174
175
176
177
178 @Override
179 public Referral getReplicatedContexts()
180 {
181 return gracefulDisconnectResponse.getReplicatedContexts();
182 }
183
184
185
186
187
188 @Override
189 public void addReplicatedContexts( String replicatedContext )
190 {
191 gracefulDisconnectResponse.getReplicatedContexts().addLdapUrl( replicatedContext );
192 }
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207 int computeLengthInternal()
208 {
209 gracefulDisconnectSequenceLength = 0;
210
211 if ( gracefulDisconnectResponse.getTimeOffline() != 0 )
212 {
213 gracefulDisconnectSequenceLength += 1 + 1 + BerValue.getNbBytes( gracefulDisconnectResponse.getTimeOffline() );
214 }
215
216 if ( gracefulDisconnectResponse.getDelay() != 0 )
217 {
218 gracefulDisconnectSequenceLength += 1 + 1 + BerValue.getNbBytes( gracefulDisconnectResponse.getDelay() );
219 }
220
221 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null )
222 && ( !gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().isEmpty() ) )
223 {
224 replicatedContextsLength = 0;
225
226 ldapUrlBytes = new ArrayList<>( gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().size() );
227
228
229 for ( String replicatedContext : gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls() )
230 {
231 byte[] bytes = Strings.getBytesUtf8( replicatedContext );
232 ldapUrlBytes.add( bytes );
233 int ldapUrlLength = bytes.length;
234 replicatedContextsLength += 1 + TLV.getNbBytes( ldapUrlLength ) + ldapUrlLength;
235 }
236
237 gracefulDisconnectSequenceLength += 1 + TLV.getNbBytes( replicatedContextsLength )
238 + replicatedContextsLength;
239 }
240
241 return 1 + TLV.getNbBytes( gracefulDisconnectSequenceLength ) + gracefulDisconnectSequenceLength;
242 }
243
244
245
246
247
248
249
250
251 ByteBuffer encodeInternal() throws EncoderException
252 {
253
254 ByteBuffer bb = ByteBuffer.allocate( computeLengthInternal() );
255
256
257 bb.put( UniversalTag.SEQUENCE.getValue() );
258 bb.put( TLV.getBytes( gracefulDisconnectSequenceLength ) );
259
260 if ( gracefulDisconnectResponse.getTimeOffline() != 0 )
261 {
262 BerValue.encode( bb, gracefulDisconnectResponse.getTimeOffline() );
263 }
264
265 if ( gracefulDisconnectResponse.getDelay() != 0 )
266 {
267 bb.put( ( byte ) GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG );
268 bb.put( ( byte ) TLV.getNbBytes( gracefulDisconnectResponse.getDelay() ) );
269 bb.put( BerValue.getBytes( gracefulDisconnectResponse.getDelay() ) );
270 }
271
272 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null )
273 && ( !gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().isEmpty() ) )
274 {
275 bb.put( UniversalTag.SEQUENCE.getValue() );
276 bb.put( TLV.getBytes( replicatedContextsLength ) );
277
278
279 for ( byte[] replicatedContext : ldapUrlBytes )
280 {
281 BerValue.encode( bb, replicatedContext );
282 }
283 }
284
285 return bb;
286 }
287
288
289
290
291
292 @Override
293 public String toString()
294 {
295 StringBuilder sb = new StringBuilder();
296
297 sb.append( "Graceful Disconnect extended operation" );
298 sb.append( " TimeOffline : " ).append( gracefulDisconnectResponse.getTimeOffline() ).append( '\n' );
299 sb.append( " Delay : " ).append( gracefulDisconnectResponse.getDelay() ).append( '\n' );
300
301 if ( ( gracefulDisconnectResponse.getReplicatedContexts() != null )
302 && ( !gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls().isEmpty() ) )
303 {
304 sb.append( " Replicated contexts :" );
305
306
307 for ( String url : gracefulDisconnectResponse.getReplicatedContexts().getLdapUrls() )
308 {
309 sb.append( "\n " ).append( url );
310 }
311 }
312
313 return sb.toString();
314 }
315 }