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.controls.syncrepl_impl;
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.Grammar;
26 import org.apache.directory.api.asn1.ber.grammar.GrammarAction;
27 import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
28 import org.apache.directory.api.asn1.ber.tlv.BerValue;
29 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoder;
30 import org.apache.directory.api.asn1.ber.tlv.IntegerDecoderException;
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.extras.controls.syncrepl.syncState.SyncStateTypeEnum;
34 import org.apache.directory.api.util.Strings;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public final class SyncStateValueGrammar extends AbstractGrammar<SyncStateValueContainer>
59 {
60
61 static final Logger LOG = LoggerFactory.getLogger( SyncStateValueGrammar.class );
62
63
64 private static Grammar<SyncStateValueContainer> instance = new SyncStateValueGrammar();
65
66
67
68
69
70 @SuppressWarnings("unchecked")
71 private SyncStateValueGrammar()
72 {
73 setName( SyncStateValueGrammar.class.getName() );
74
75
76 super.transitions = new GrammarTransition[SyncStateValueStatesEnum.LAST_SYNC_STATE_VALUE_STATE.ordinal()][256];
77
78
79
80
81
82
83
84
85 super.transitions[SyncStateValueStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = new GrammarTransition<SyncStateValueContainer>(
86 SyncStateValueStatesEnum.START_STATE, SyncStateValueStatesEnum.SYNC_STATE_VALUE_SEQUENCE_STATE,
87 UniversalTag.SEQUENCE.getValue(), null );
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 super.transitions[SyncStateValueStatesEnum.SYNC_STATE_VALUE_SEQUENCE_STATE.ordinal()][UniversalTag.ENUMERATED
103 .getValue()] = new GrammarTransition<SyncStateValueContainer>(
104 SyncStateValueStatesEnum.SYNC_STATE_VALUE_SEQUENCE_STATE,
105 SyncStateValueStatesEnum.SYNC_TYPE_STATE, UniversalTag.ENUMERATED.getValue(),
106 new GrammarAction<SyncStateValueContainer>( "Set SyncStateValueControl state type" )
107 {
108 public void action( SyncStateValueContainer container ) throws DecoderException
109 {
110 BerValue value = container.getCurrentTLV().getValue();
111
112 try
113 {
114
115 int syncStateType = IntegerDecoder.parse( value, SyncStateTypeEnum.PRESENT.getValue(),
116 SyncStateTypeEnum.MODDN.getValue() );
117
118 SyncStateTypeEnum syncStateTypeEnum = SyncStateTypeEnum.getSyncStateType( syncStateType );
119
120 if ( LOG.isDebugEnabled() )
121 {
122 LOG.debug( I18n.msg( I18n.MSG_08105_SYNC_STATE_TYPE, syncStateTypeEnum ) );
123 }
124
125 container.getSyncStateValue().setSyncStateType( syncStateTypeEnum );
126
127
128 container.setGrammarEndAllowed( false );
129 }
130 catch ( IntegerDecoderException ide )
131 {
132 String msg = I18n.err( I18n.ERR_08102_SYNC_STATE_VALUE_MODE_DECODING_FAILED );
133 LOG.error( msg, ide );
134 throw new DecoderException( msg, ide );
135 }
136 }
137 } );
138
139
140
141
142
143
144
145
146
147
148 super.transitions[SyncStateValueStatesEnum.SYNC_TYPE_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] = new GrammarTransition<SyncStateValueContainer>(
149 SyncStateValueStatesEnum.SYNC_TYPE_STATE, SyncStateValueStatesEnum.SYNC_UUID_STATE,
150 UniversalTag.OCTET_STRING.getValue(),
151 new GrammarAction<SyncStateValueContainer>( "Set SyncStateValueControl entryUUID" )
152 {
153 public void action( SyncStateValueContainer container )
154 {
155 BerValue value = container.getCurrentTLV().getValue();
156
157 byte[] entryUUID = value.getData();
158
159 if ( LOG.isDebugEnabled() )
160 {
161 LOG.debug( I18n.msg( I18n.MSG_08106_ENTRY_UUID, Strings.dumpBytes( entryUUID ) ) );
162 }
163
164 container.getSyncStateValue().setEntryUUID( entryUUID );
165
166
167 container.setGrammarEndAllowed( true );
168 }
169 } );
170
171
172
173
174
175
176
177
178
179
180 super.transitions[SyncStateValueStatesEnum.SYNC_UUID_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] = new GrammarTransition<SyncStateValueContainer>(
181 SyncStateValueStatesEnum.SYNC_UUID_STATE, SyncStateValueStatesEnum.COOKIE_STATE,
182 UniversalTag.OCTET_STRING.getValue(),
183 new GrammarAction<SyncStateValueContainer>( "Set SyncStateValueControl cookie value" )
184 {
185 public void action( SyncStateValueContainer container )
186 {
187 BerValue value = container.getCurrentTLV().getValue();
188
189 byte[] cookie = value.getData();
190
191 if ( LOG.isDebugEnabled() )
192 {
193 LOG.debug( I18n.msg( I18n.MSG_08000_COOKIE, Strings.dumpBytes( cookie ) ) );
194 }
195
196 container.getSyncStateValue().setCookie( cookie );
197
198
199 container.setGrammarEndAllowed( true );
200 }
201 } );
202 }
203
204
205
206
207
208
209
210 public static Grammar<SyncStateValueContainer> getInstance()
211 {
212 return instance;
213 }
214 }