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.codec.controls.search.pagedSearch;
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.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 public final class PagedResultsGrammar extends AbstractGrammar<PagedResultsContainer>
52 {
53
54 static final Logger LOG = LoggerFactory.getLogger( PagedResultsGrammar.class );
55
56
57 static final boolean IS_DEBUG = LOG.isDebugEnabled();
58
59
60 private static Grammar<?> instance = new PagedResultsGrammar();
61
62
63
64
65
66 @SuppressWarnings("unchecked")
67 private PagedResultsGrammar()
68 {
69 setName( PagedResultsGrammar.class.getName() );
70
71
72 super.transitions = new GrammarTransition[PagedResultsStates.LAST_PAGED_SEARCH_STATE.ordinal()][256];
73
74
75
76
77
78
79
80
81 super.transitions[PagedResultsStates.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
82 new GrammarTransition<PagedResultsContainer>( PagedResultsStates.START_STATE,
83 PagedResultsStates.PAGED_SEARCH_SEQUENCE_STATE,
84 UniversalTag.SEQUENCE.getValue(), null );
85
86
87
88
89
90
91
92
93
94
95 super.transitions[PagedResultsStates.PAGED_SEARCH_SEQUENCE_STATE.ordinal()][UniversalTag.INTEGER.getValue()] =
96 new GrammarTransition<PagedResultsContainer>( PagedResultsStates.PAGED_SEARCH_SEQUENCE_STATE,
97 PagedResultsStates.SIZE_STATE,
98 UniversalTag.INTEGER.getValue(),
99 new GrammarAction<PagedResultsContainer>( "Set PagedSearchControl size" )
100 {
101 public void action( PagedResultsContainer container ) throws DecoderException
102 {
103 BerValue value = container.getCurrentTLV().getValue();
104
105 try
106 {
107
108 int size = IntegerDecoder.parse( value, Integer.MIN_VALUE, Integer.MAX_VALUE );
109
110
111
112 if ( size < 0 )
113 {
114 size = Integer.MAX_VALUE;
115 }
116
117 if ( IS_DEBUG )
118 {
119 LOG.debug( "size = " + size );
120 }
121
122 container.getDecorator().setSize( size );
123 }
124 catch ( IntegerDecoderException ide )
125 {
126 String msg = I18n.err( I18n.ERR_04050 );
127 LOG.error( msg, ide );
128 throw new DecoderException( msg, ide );
129 }
130 }
131 } );
132
133
134
135
136
137
138
139
140
141
142 super.transitions[PagedResultsStates.SIZE_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] =
143 new GrammarTransition<PagedResultsContainer>( PagedResultsStates.SIZE_STATE,
144 PagedResultsStates.COOKIE_STATE, UniversalTag.OCTET_STRING.getValue(),
145 new GrammarAction<PagedResultsContainer>( "Set PagedSearchControl cookie" )
146 {
147 public void action( PagedResultsContainer container ) throws DecoderException
148 {
149 BerValue value = container.getCurrentTLV().getValue();
150
151 if ( container.getCurrentTLV().getLength() == 0 )
152 {
153 container.getDecorator().setCookie( Strings.EMPTY_BYTES );
154 }
155 else
156 {
157 container.getDecorator().setCookie( value.getData() );
158 }
159
160
161 container.setGrammarEndAllowed( true );
162 }
163 } );
164 }
165
166
167
168
169
170
171
172 public static Grammar<?> getInstance()
173 {
174 return instance;
175 }
176 }