2222import java .util .List ;
2323import java .util .Map ;
2424import java .util .stream .Collectors ;
25+ import java .util .regex .Matcher ;
26+ import java .util .regex .Pattern ;
2527
2628import javax .servlet .http .HttpServletRequest ;
2729
3133import org .jetbrains .annotations .NotNull ;
3234
3335public class ListQuery {
36+ private static final Pattern PAGE_CLAUSE_PATTERN = Pattern .compile ("(?i)\\ bpage\\ s+(\\ d+)\\ b" );
37+
3438 boolean allContent ;
3539 Long max ;
3640 Long page ;
@@ -53,6 +57,14 @@ public void setMax(Long max) {
5357 this .max = max ;
5458 }
5559
60+ public Long getPage () {
61+ return page ;
62+ }
63+
64+ public void setPage (Long page ) {
65+ this .page = page ;
66+ }
67+
5668 public void setSearch (Map <String , String > search ) {
5769 this .search = search ;
5870 }
@@ -108,50 +120,33 @@ public static ListQuery fromRequest(HttpServletRequest request) {
108120 query .setFollow (follow );
109121 Map <String , String > searchItems = getSearchMap (request .getParameter ("search" ));
110122 if (!searchItems .isEmpty ()) {
111- try {
112- query .setMax (Long .parseLong (searchItems .get ("page" )));
113- } catch (NumberFormatException e ) {
114- // Ignore invalid page and keep default null value.
123+ String pageValue = searchItems .get ("page" );
124+ if (StringUtils .isNotBlank (pageValue )) {
125+ try {
126+ query .setPage (Long .parseLong (pageValue ));
127+ } catch (NumberFormatException e ) {
128+ // Ignore invalid page and keep default null value.
129+ }
115130 }
116131 query .setSearch (searchItems );
117132 }
118133
119134 return query ;
120135 }
121136
122- // Parse search clause. Only keep items which use simple '=' operator, and ignore others. For example:
123- // name=myvm and status=up --> {name=myvm, status=up}
124- // name=myvm and status!=down --> {name=myvm} (ignore status!=down because it uses '!=' operator)
137+ // Parse search clause. For now, only extract the oVirt paging clause.
138+ // Examples:
139+ // page 3 --> {page=3}
140+ // sortby name page 2 --> {page=2}
125141 @ NotNull
126142 private static Map <String , String > getSearchMap (String searchClause ) {
127143 Map <String , String > searchItems = new LinkedHashMap <>();
128144 if (StringUtils .isBlank (searchClause )) {
129145 return searchItems ;
130146 }
131- String [] terms = searchClause .trim ().split ("(?i)\\ s+and\\ s+" );
132- for (String term : terms ) {
133- if (term == null ) {
134- continue ;
135- }
136- String trimmedTerm = term .trim ();
137- if (trimmedTerm .isEmpty ()) {
138- continue ;
139- }
140-
141- int eqIdx = trimmedTerm .indexOf ('=' );
142- if (eqIdx <= 0 || eqIdx != trimmedTerm .lastIndexOf ('=' )) {
143- continue ;
144- }
145- char prev = trimmedTerm .charAt (eqIdx - 1 );
146- if (prev == '!' || prev == '<' || prev == '>' ) {
147- continue ;
148- }
149-
150- String key = trimmedTerm .substring (0 , eqIdx ).trim ();
151- String value = trimmedTerm .substring (eqIdx + 1 ).trim ();
152- if (!key .isEmpty () && !value .isEmpty ()) {
153- searchItems .put (key , value );
154- }
147+ Matcher matcher = PAGE_CLAUSE_PATTERN .matcher (searchClause );
148+ if (matcher .find ()) {
149+ searchItems .put ("page" , matcher .group (1 ));
155150 }
156151 return searchItems ;
157152 }
0 commit comments