View Javadoc
1   /*
2    * Copyright 2012-2025 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.app.web.base;
17  
18  import static org.codelibs.core.stream.StreamUtil.stream;
19  
20  import java.util.HashMap;
21  import java.util.Locale;
22  import java.util.Map;
23  
24  import org.codelibs.core.lang.StringUtil;
25  import org.codelibs.fess.entity.FacetInfo;
26  import org.codelibs.fess.entity.GeoInfo;
27  import org.codelibs.fess.entity.HighlightInfo;
28  import org.codelibs.fess.entity.SearchRequestParams;
29  import org.codelibs.fess.mylasta.direction.FessConfig;
30  import org.codelibs.fess.util.ComponentUtil;
31  import org.lastaflute.web.util.LaRequestUtil;
32  import org.lastaflute.web.validation.theme.conversion.ValidateTypeFailure;
33  
34  import jakarta.validation.constraints.Size;
35  
36  /**
37   * Base search form class that extends SearchRequestParams.
38   * Provides form fields and methods for handling search requests in the web interface.
39   * Contains validation constraints and convenience methods for parameter processing.
40   */
41  public class SearchForm extends SearchRequestParams {
42  
43      /**
44       * Map of additional search fields with their values.
45       */
46      public Map<String, String[]> fields = new HashMap<>();
47  
48      /**
49       * Map of advanced search conditions.
50       */
51      public Map<String, String[]> as = new HashMap<>();
52  
53      /**
54       * The main search query string.
55       */
56      @Size(max = 1000)
57      public String q;
58  
59      /**
60       * The sort parameter for search results.
61       */
62      @Size(max = 1000)
63      public String sort;
64  
65      /**
66       * The number of search results to return per page.
67       */
68      @ValidateTypeFailure
69      public Integer num;
70  
71      /**
72       * Array of language codes to filter search results.
73       */
74      public String[] lang;
75  
76      /**
77       * Array of additional query strings to exclude from search.
78       */
79      public String[] ex_q;
80  
81      /**
82       * The starting position for search results pagination.
83       */
84      @ValidateTypeFailure
85      public Integer start;
86  
87      /**
88       * The offset for search results.
89       */
90      @ValidateTypeFailure
91      public Integer offset;
92  
93      /**
94       * The page number for pagination.
95       */
96      @ValidateTypeFailure
97      public Integer pn;
98  
99      /**
100      * Similar document hash for finding related documents.
101      */
102     @Size(max = 1000)
103     public String sdh;
104 
105     /**
106      * Parameter to control tracking of total hits in search results.
107      */
108     @Size(max = 100)
109     public String track_total_hits;
110 
111     /**
112      * Default constructor for SearchForm.
113      */
114     public SearchForm() {
115         super();
116     }
117 
118     // advance
119 
120     @Override
121     public int getStartPosition() {
122         if (start == null) {
123             start = ComponentUtil.getFessConfig().getPagingSearchPageStartAsInteger();
124         }
125         return start;
126     }
127 
128     @Override
129     public int getOffset() {
130         if (offset == null) {
131             offset = 0;
132         }
133         return offset;
134     }
135 
136     @Override
137     public int getPageSize() {
138         final FessConfig fessConfig = ComponentUtil.getFessConfig();
139         if (num == null) {
140             num = fessConfig.getPagingSearchPageSizeAsInteger();
141         } else {
142             try {
143                 if (num.intValue() > fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue() || num.intValue() <= 0) {
144                     num = fessConfig.getPagingSearchPageMaxSizeAsInteger();
145                 }
146             } catch (final NumberFormatException e) {
147                 num = fessConfig.getPagingSearchPageSizeAsInteger();
148             }
149         }
150         return num;
151     }
152 
153     @Override
154     public String getQuery() {
155         return q;
156     }
157 
158     @Override
159     public String[] getExtraQueries() {
160         return stream(ex_q).get(stream -> stream.filter(StringUtil::isNotBlank).distinct().toArray(n -> new String[n]));
161     }
162 
163     @Override
164     public Map<String, String[]> getFields() {
165         return fields;
166     }
167 
168     @Override
169     public String[] getLanguages() {
170         return stream(lang).get(stream -> stream.filter(StringUtil::isNotBlank).distinct().toArray(n -> new String[n]));
171     }
172 
173     @Override
174     public GeoInfo getGeoInfo() {
175         return LaRequestUtil.getOptionalRequest()
176                 .map(this::createGeoInfo)
177                 .orElseGet(() -> ComponentUtil.getQueryHelper().getDefaultGeoInfo());
178     }
179 
180     @Override
181     public FacetInfo getFacetInfo() {
182         return ComponentUtil.getQueryHelper().getDefaultFacetInfo();
183     }
184 
185     @Override
186     public HighlightInfo getHighlightInfo() {
187         return ComponentUtil.getViewHelper().createHighlightInfo();
188     }
189 
190     @Override
191     public String getSort() {
192         return sort;
193     }
194 
195     @Override
196     public Object getAttribute(final String name) {
197         return LaRequestUtil.getOptionalRequest().map(req -> req.getAttribute(name)).orElse(null);
198     }
199 
200     @Override
201     public Locale getLocale() {
202         return ComponentUtil.getRequestManager().getUserLocale();
203     }
204 
205     @Override
206     public SearchRequestType getType() {
207         return SearchRequestType.SEARCH;
208     }
209 
210     @Override
211     public String getSimilarDocHash() {
212         return sdh;
213     }
214 
215     @Override
216     public Map<String, String[]> getConditions() {
217         return as;
218     }
219 
220     @Override
221     public String getTrackTotalHits() {
222         return track_total_hits;
223     }
224 
225 }