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.endTransaction.controls;
21
22 import org.apache.directory.api.asn1.DecoderException;
23 import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
24 import org.apache.directory.api.asn1.ber.grammar.Grammar;
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.TLV;
28 import org.apache.directory.api.i18n.I18n;
29 import org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction.controls.actions.AddControl;
30 import org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction.controls.actions.StoreControlCriticality;
31 import org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction.controls.actions.StoreControlValue;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import static org.apache.directory.api.asn1.ber.tlv.UniversalTag.BOOLEAN;
36 import static org.apache.directory.api.asn1.ber.tlv.UniversalTag.OCTET_STRING;
37 import static org.apache.directory.api.asn1.ber.tlv.UniversalTag.SEQUENCE;
38
39
40
41
42
43
44 public class ControlsGrammar extends AbstractGrammar<ControlsContainer>
45 {
46
47 private static final Logger LOG = LoggerFactory.getLogger( ControlsGrammar.class );
48
49
50 private static Grammar<ControlsContainer> instance = new ControlsGrammar();
51
52
53
54
55
56 @SuppressWarnings("unchecked")
57 public ControlsGrammar()
58 {
59 setName( ControlsGrammar.class.getName() );
60
61
62 super.transitions = new GrammarTransition[ControlsStates.LAST_STATE.ordinal()][256];
63
64
65
66
67
68
69
70
71
72 super.transitions[ControlsStates.START_STATE.ordinal()][SEQUENCE.getValue()] =
73 new GrammarTransition<ControlsContainer>(
74 ControlsStates.START_STATE,
75 ControlsStates.CONTROL_SEQUENCE_STATE,
76 SEQUENCE,
77 new GrammarAction<ControlsContainer>( "Init Control" )
78 {
79 public void action( ControlsContainer container ) throws DecoderException
80 {
81 TLV tlv = container.getCurrentTLV();
82 int expectedLength = tlv.getLength();
83
84
85 if ( expectedLength == 0 )
86 {
87 String msg = I18n.err( I18n.ERR_08213_NULL_CONTROL_LENGTH );
88 LOG.error( msg );
89
90
91 throw new DecoderException( msg );
92 }
93 }
94 } );
95
96
97
98
99
100
101
102
103
104
105 super.transitions[ControlsStates.CONTROL_SEQUENCE_STATE.ordinal()][OCTET_STRING.getValue()] =
106 new GrammarTransition<ControlsContainer>(
107 ControlsStates.CONTROL_SEQUENCE_STATE,
108 ControlsStates.CONTROL_TYPE_STATE,
109 OCTET_STRING,
110 new AddControl() );
111
112
113
114
115
116
117
118
119
120
121
122 super.transitions[ControlsStates.CONTROL_TYPE_STATE.ordinal()][BOOLEAN.getValue()] =
123 new GrammarTransition<ControlsContainer>(
124 ControlsStates.CONTROL_TYPE_STATE,
125 ControlsStates.CONTROL_CRITICALITY_STATE,
126 BOOLEAN,
127 new StoreControlCriticality() );
128
129
130
131
132
133
134
135
136
137
138
139 super.transitions[ControlsStates.CONTROL_TYPE_STATE.ordinal()][OCTET_STRING.getValue()] =
140 new GrammarTransition<ControlsContainer>(
141 ControlsStates.CONTROL_TYPE_STATE,
142 ControlsStates.CONTROL_VALUE_STATE,
143 OCTET_STRING,
144 new StoreControlValue() );
145
146
147
148
149
150
151
152
153
154 super.transitions[ControlsStates.CONTROL_TYPE_STATE.ordinal()][SEQUENCE.getValue()] =
155 new GrammarTransition<ControlsContainer>(
156 ControlsStates.CONTROL_TYPE_STATE,
157 ControlsStates.CONTROL_SEQUENCE_STATE,
158 SEQUENCE );
159
160
161
162
163
164
165
166
167
168
169
170 super.transitions[ControlsStates.CONTROL_CRITICALITY_STATE.ordinal()][OCTET_STRING.getValue()] =
171 new GrammarTransition<ControlsContainer>(
172 ControlsStates.CONTROL_CRITICALITY_STATE,
173 ControlsStates.CONTROL_VALUE_STATE,
174 OCTET_STRING,
175 new StoreControlValue() );
176
177
178
179
180
181
182
183
184
185
186 super.transitions[ControlsStates.CONTROL_CRITICALITY_STATE.ordinal()][SEQUENCE.getValue()] =
187 new GrammarTransition<ControlsContainer>(
188 ControlsStates.CONTROL_CRITICALITY_STATE,
189 ControlsStates.CONTROL_SEQUENCE_STATE,
190 SEQUENCE );
191
192
193
194
195
196
197
198
199 super.transitions[ControlsStates.CONTROL_VALUE_STATE.ordinal()][SEQUENCE.getValue()] =
200 new GrammarTransition<ControlsContainer>(
201 ControlsStates.CONTROL_VALUE_STATE,
202 ControlsStates.CONTROL_SEQUENCE_STATE,
203 SEQUENCE );
204 }
205
206
207
208
209
210
211
212 public static Grammar<ControlsContainer> getInstance()
213 {
214 return instance;
215 }
216 }