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.gracefulShutdown;
21
22
23 import org.apache.directory.api.asn1.DecoderException;
24 import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
25 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
26 import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
27 import org.apache.directory.api.asn1.ber.tlv.BerValue;
28 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoder;
29 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoderException;
30 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
31 import org.apache.directory.api.i18n.I18n;
32 import org.apache.directory.api.ldap.extras.extended.ads_impl.gracefulDisconnect.GracefulActionConstants;
33 import org.apache.directory.api.util.Strings;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public final class GracefulShutdownRequestGrammar extends AbstractGrammar<GracefulShutdownRequestContainer>
53 {
54
55 static final Logger LOG = LoggerFactory.getLogger( GracefulShutdownRequestGrammar.class );
56
57
58 private static GracefulShutdownRequestGrammar instance = new GracefulShutdownRequestGrammar();
59
60
61
62
63
64 @SuppressWarnings("unchecked")
65 private GracefulShutdownRequestGrammar()
66 {
67 setName( GracefulShutdownRequestGrammar.class.getName() );
68
69
70 super.transitions = new GrammarTransition[GracefulShutdownStatesEnum.LAST_GRACEFUL_SHUTDOWN_STATE.ordinal()][256];
71
72
73
74
75
76
77
78
79
80 super.transitions[GracefulShutdownStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
81 new GrammarTransition<GracefulShutdownRequestContainer>( GracefulShutdownStatesEnum.START_STATE,
82 GracefulShutdownStatesEnum.GRACEFUL_SHUTDOWN_SEQUENCE_STATE,
83 UniversalTag.SEQUENCE.getValue(),
84 new GrammarAction<GracefulShutdownRequestContainer>( "Init Graceful Shutdown" )
85 {
86 public void action( GracefulShutdownRequestContainer container ) throws DecoderException
87 {
88
89 if ( container.getCurrentTLV().getLength() == 0 )
90 {
91 container.setGrammarEndAllowed( true );
92 }
93 }
94 } );
95
96
97
98
99
100
101
102
103
104
105
106 super.transitions[GracefulShutdownStatesEnum.GRACEFUL_SHUTDOWN_SEQUENCE_STATE.ordinal()][UniversalTag.INTEGER
107 .getValue()] =
108 new GrammarTransition<GracefulShutdownRequestContainer>(
109 GracefulShutdownStatesEnum.GRACEFUL_SHUTDOWN_SEQUENCE_STATE,
110 GracefulShutdownStatesEnum.TIME_OFFLINE_STATE,
111 UniversalTag.INTEGER.getValue(),
112 new GrammarAction<GracefulShutdownRequestContainer>( "Set Graceful Shutdown time offline" )
113 {
114 public void action( GracefulShutdownRequestContainer container ) throws DecoderException
115 {
116 BerValue value = container.getCurrentTLV().getValue();
117
118 try
119 {
120 int timeOffline = IntegerDecoder.parse( value, 0, 720 );
121
122 if ( LOG.isDebugEnabled() )
123 {
124 LOG.debug( I18n.msg( I18n.MSG_08216_TIME_OFFLINE, timeOffline ) );
125 }
126
127 container.getGracefulShutdownRequest().setTimeOffline( timeOffline );
128 container.setGrammarEndAllowed( true );
129 }
130 catch ( IntegerDecoderException ide )
131 {
132 String msg = I18n.err( I18n.ERR_08206_TIME_OFFLINE_DECODING_FAILED, Strings.dumpBytes( value.getData() ) );
133 LOG.error( msg );
134 throw new DecoderException( msg, ide );
135 }
136 }
137 } );
138
139
140
141
142
143
144
145
146
147
148
149 super.transitions[GracefulShutdownStatesEnum.TIME_OFFLINE_STATE.ordinal()][GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG] =
150 new GrammarTransition<GracefulShutdownRequestContainer>( GracefulShutdownStatesEnum.TIME_OFFLINE_STATE,
151 GracefulShutdownStatesEnum.DELAY_STATE,
152 GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG,
153
154 new GrammarAction<GracefulShutdownRequestContainer>( "Set Graceful Shutdown Delay" )
155 {
156 public void action( GracefulShutdownRequestContainer container ) throws DecoderException
157 {
158 BerValue value = container.getCurrentTLV().getValue();
159
160 try
161 {
162 int delay = IntegerDecoder.parse( value, 0, 86400 );
163
164 if ( LOG.isDebugEnabled() )
165 {
166 LOG.debug( I18n.msg( I18n.MSG_08204_DELAY, delay ) );
167 }
168
169 container.getGracefulShutdownRequest().setDelay( delay );
170 container.setGrammarEndAllowed( true );
171 }
172 catch ( IntegerDecoderException ide )
173 {
174 String msg = I18n.err( I18n.ERR_08205_CANNOT_DECODE_DELAY, Strings.dumpBytes( value.getData() ) );
175 LOG.error( msg );
176 throw new DecoderException( msg, ide );
177 }
178 }
179 } );
180
181
182
183
184
185
186
187
188
189
190
191 super.transitions[GracefulShutdownStatesEnum.GRACEFUL_SHUTDOWN_SEQUENCE_STATE.ordinal()][GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG] =
192 new GrammarTransition<GracefulShutdownRequestContainer>(
193 GracefulShutdownStatesEnum.GRACEFUL_SHUTDOWN_SEQUENCE_STATE,
194 GracefulShutdownStatesEnum.DELAY_STATE,
195 GracefulActionConstants.GRACEFUL_ACTION_DELAY_TAG,
196
197 new GrammarAction<GracefulShutdownRequestContainer>( "Set Graceful Shutdown Delay" )
198 {
199 public void action( GracefulShutdownRequestContainer container ) throws DecoderException
200 {
201 GracefulShutdownRequestContainer gracefulShutdownContainer = container;
202 BerValue value = gracefulShutdownContainer.getCurrentTLV().getValue();
203
204 try
205 {
206 int delay = IntegerDecoder.parse( value, 0, 86400 );
207
208 if ( LOG.isDebugEnabled() )
209 {
210 LOG.debug( I18n.msg( I18n.MSG_08204_DELAY, delay ) );
211 }
212
213 gracefulShutdownContainer.getGracefulShutdownRequest().setDelay( delay );
214 gracefulShutdownContainer.setGrammarEndAllowed( true );
215 }
216 catch ( IntegerDecoderException ide )
217 {
218 String msg = I18n.err( I18n.ERR_08205_CANNOT_DECODE_DELAY, Strings.dumpBytes( value.getData() ) );
219 LOG.error( msg );
220 throw new DecoderException( msg, ide );
221 }
222 }
223 } );
224 }
225
226
227
228
229
230
231
232 public static GracefulShutdownRequestGrammar getInstance()
233 {
234 return instance;
235 }
236 }