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