001package org.kuali.ole.docstore.common.search;
002
003
004import org.apache.log4j.Logger;
005import org.kuali.ole.docstore.common.document.content.enums.DocType;
006
007import java.io.ByteArrayInputStream;
008import java.io.StringWriter;
009import java.util.*;
010import javax.xml.bind.JAXBContext;
011import javax.xml.bind.JAXBElement;
012import javax.xml.bind.Marshaller;
013import javax.xml.bind.Unmarshaller;
014import javax.xml.bind.annotation.*;
015import javax.xml.transform.stream.StreamSource;
016
017
018/**
019 * <p>Java class for searchParams complex type.
020 * <p/>
021 * <p>The following schema fragment specifies the expected content contained within this class.
022 * <p/>
023 * <pre>
024 * &lt;complexType name="searchParams">
025 *   &lt;complexContent>
026 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
027 *       &lt;sequence>
028 *         &lt;element name="pageSize" type="{http://www.w3.org/2001/XMLSchema}int"/>
029 *         &lt;element name="searchConditions" type="{}searchCondition" maxOccurs="unbounded" minOccurs="0"/>
030 *         &lt;element name="searchResultFields" type="{}searchResultField" maxOccurs="unbounded" minOccurs="0"/>
031 *         &lt;element name="sortConditions" type="{}sortCondition" maxOccurs="unbounded" minOccurs="0"/>
032 *         &lt;element name="startIndex" type="{http://www.w3.org/2001/XMLSchema}int"/>
033 *       &lt;/sequence>
034 *     &lt;/restriction>
035 *   &lt;/complexContent>
036 * &lt;/complexType>
037 * </pre>
038 */
039@XmlAccessorType(XmlAccessType.FIELD)
040@XmlType(name = "searchParams", propOrder = {
041        "pageSize",
042        "searchConditions",
043        "facetConditions",
044        "searchResultFields",
045        "sortConditions",
046        "facetFields",
047        "startIndex",
048        "facetLimit",
049        "facetPrefix",
050        "facetSort",
051        "facetOffset"
052})
053
054@XmlRootElement
055public class SearchParams {
056
057    private static final Logger LOG = Logger.getLogger(SearchParams.class);
058    protected int pageSize = 0;
059    @XmlElementWrapper(name = "facetConditions")
060    @XmlElement(name = "facetCondition")
061    protected List<FacetCondition> facetConditions;
062    @XmlElementWrapper(name = "searchConditions")
063    @XmlElement(name = "searchCondition")
064    protected List<SearchCondition> searchConditions=new ArrayList<SearchCondition>();
065    @XmlElementWrapper(name = "searchResultFields")
066    @XmlElement(name = "searchResultField")
067    protected List<SearchResultField> searchResultFields;
068    @XmlElementWrapper(name = "sortConditions")
069    @XmlElement(name = "sortCondition")
070    protected List<SortCondition> sortConditions;
071    protected TreeSet<String> facetFields;
072    protected int startIndex = 0;
073    protected int facetLimit =0;
074    protected String facetPrefix;
075    protected String facetSort = "count";
076    protected int facetOffset = 0;
077
078    public int getFacetLimit() {
079        return facetLimit;
080    }
081
082    public SearchParams() {
083
084    }
085
086
087
088    public void setFacetLimit(int facetLimit) {
089        this.facetLimit = facetLimit;
090    }
091
092    /**
093     * Gets the value of the facetCondtions property.
094     * <p/>
095     * <p/>
096     * This accessor method returns a reference to the live list,
097     * not a snapshot. Therefore any modification you make to the
098     * returned list will be present inside the JAXB object.
099     * This is why there is not a <CODE>set</CODE> method for the facetCondtions property.
100     * <p/>
101     * <p/>
102     * For example, to add a new item, do as follows:
103     * <pre>
104     *    getFacetCondtions().add(newItem);
105     * </pre>
106     * <p/>
107     * <p/>
108     * <p/>
109     * Objects of the following type(s) are allowed in the list
110     * {@link FacetCondition}
111     */
112    public List<FacetCondition> getFacetConditions() {
113        if (facetConditions == null) {
114            facetConditions = new ArrayList<FacetCondition>();
115        }
116        return this.facetConditions;
117    }
118
119    /**
120     * Gets the value of the pageSize property.
121     */
122    public int getPageSize() {
123        return pageSize;
124    }
125
126    /**
127     * Sets the value of the pageSize property.
128     */
129    public void setPageSize(int value) {
130        this.pageSize = value;
131    }
132
133    /**
134     * Gets the value of the searchConditions property.
135     * <p/>
136     * <p/>
137     * This accessor method returns a reference to the live list,
138     * not a snapshot. Therefore any modification you make to the
139     * returned list will be present inside the JAXB object.
140     * This is why there is not a <CODE>set</CODE> method for the searchConditions property.
141     * <p/>
142     * <p/>
143     * For example, to add a new item, do as follows:
144     * <pre>
145     *    getSearchConditions().add(newItem);
146     * </pre>
147     * <p/>
148     * <p/>
149     * <p/>
150     * Objects of the following type(s) are allowed in the list
151     * {@link SearchCondition }
152     */
153    public List<SearchCondition> getSearchConditions() {
154        if (searchConditions == null) {
155            searchConditions = new ArrayList<SearchCondition>();
156        }
157        return this.searchConditions;
158    }
159
160    /**
161     * Gets the value of the searchResultFields property.
162     * <p/>
163     * <p/>
164     * This accessor method returns a reference to the live list,
165     * not a snapshot. Therefore any modification you make to the
166     * returned list will be present inside the JAXB object.
167     * This is why there is not a <CODE>set</CODE> method for the searchResultFields property.
168     * <p/>
169     * <p/>
170     * For example, to add a new item, do as follows:
171     * <pre>
172     *    getSearchResultFields().add(newItem);
173     * </pre>
174     * <p/>
175     * <p/>
176     * <p/>
177     * Objects of the following type(s) are allowed in the list
178     * {@link SearchResultField }
179     */
180    public List<SearchResultField> getSearchResultFields() {
181        if (searchResultFields == null) {
182            searchResultFields = new ArrayList<SearchResultField>();
183        }
184        return this.searchResultFields;
185    }
186
187    /**
188     * Gets the value of the sortConditions property.
189     * <p/>
190     * <p/>
191     * This accessor method returns a reference to the live list,
192     * not a snapshot. Therefore any modification you make to the
193     * returned list will be present inside the JAXB object.
194     * This is why there is not a <CODE>set</CODE> method for the sortConditions property.
195     * <p/>
196     * <p/>
197     * For example, to add a new item, do as follows:
198     * <pre>
199     *    getSortConditions().add(newItem);
200     * </pre>
201     * <p/>
202     * <p/>
203     * <p/>
204     * Objects of the following type(s) are allowed in the list
205     * {@link SortCondition }
206     */
207    public List<SortCondition> getSortConditions() {
208        if (sortConditions == null) {
209            sortConditions = new ArrayList<SortCondition>();
210        }
211        return this.sortConditions;
212    }
213
214    public TreeSet<String> getFacetFields() {
215        if(facetFields == null) {
216            facetFields = new TreeSet<>();
217        }
218        return facetFields;
219    }
220
221    /**
222     * Gets the value of the startIndex property.
223     */
224    public int getStartIndex() {
225        return startIndex;
226    }
227
228    /**
229     * Sets the value of the startIndex property.
230     */
231    public void setStartIndex(int value) {
232        this.startIndex = value;
233    }
234
235    public String getFacetPrefix() {
236        return facetPrefix;
237    }
238
239    public void setFacetPrefix(String facetPrefix) {
240        this.facetPrefix = facetPrefix;
241    }
242
243    public String getFacetSort() {
244        return facetSort;
245    }
246
247    public void setFacetSort(String facetSort) {
248        this.facetSort = facetSort;
249    }
250
251    public int getFacetOffset() {
252        return facetOffset;
253    }
254
255    public void setFacetOffset(int facetOffset) {
256        this.facetOffset = facetOffset;
257    }
258
259    public SearchCondition buildSearchCondition(String searchScope, SearchField searchField, String operator) {
260        SearchCondition searchCondition = new SearchCondition();
261        searchCondition.setSearchScope(searchScope);
262        searchCondition.setSearchField(searchField);
263        searchCondition.setOperator(operator);
264        return searchCondition;
265    }
266
267    public SearchField buildSearchField(String docType, String fieldName, String fieldValue) {
268        SearchField searchField = new SearchField();
269        searchField.setDocType(docType);
270        searchField.setFieldName(fieldName);
271        searchField.setFieldValue(fieldValue);
272        return searchField;
273    }
274
275    public SortCondition buildSortCondition(String sortField, String sortOrder) {
276        SortCondition sortCondition = new SortCondition();
277        sortCondition.setSortOrder(sortOrder);
278        sortCondition.setSortField(sortField);
279        return sortCondition;
280    }
281
282    public SearchResultField buildSearchResultField(String docType, String fieldName) {
283        SearchResultField searchResultField = new SearchResultField();
284        searchResultField.setDocType(docType);
285        searchResultField.setFieldName(fieldName);
286        return searchResultField;
287    }
288
289    public String serialize(Object object) {
290        String result = null;
291        StringWriter sw = new StringWriter();
292        SearchParams searchParams = (SearchParams) object;
293        try {
294            JAXBContext jaxbContext = JAXBContext.newInstance(SearchParams.class);
295            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
296            jaxbMarshaller.marshal(searchParams, sw);
297            result = sw.toString();
298        } catch (Exception e) {
299            LOG.error("Exception ", e);
300        }
301        return result;
302    }
303
304    public Object deserialize(String content) {
305
306        JAXBElement<SearchParams> SearchParamsElement = null;
307        try {
308            JAXBContext jaxbContext = JAXBContext.newInstance(SearchParams.class);
309            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
310            ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes("UTF-8"));
311            SearchParamsElement = jaxbUnmarshaller.unmarshal(new StreamSource(input), SearchParams.class);
312        } catch (Exception e) {
313            LOG.error("Exception ", e);
314        }
315        return SearchParamsElement.getValue();
316    }
317
318    public void buildSearchParams(SearchParams searchParams, String docType){
319
320        if(DocType.BIB.getCode().equalsIgnoreCase(docType)){
321            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocalId_display"));
322            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Title_sort"));
323            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Title_display"));
324            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "JournalTitle_display"));
325            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Author_display"));
326            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Publisher_display"));
327            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ISBN_display"));
328            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ISSN_display"));
329            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Subject_display"));
330            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Publisher_display"));
331            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "PublicationDate_display"));
332            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Edition_display"));
333            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Format_display"));
334            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Language_display"));
335            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Description_display"));
336            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "FormGenre_display"));
337            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DocFormat"));
338            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "staffOnlyFlag"));
339        } else if(DocType.HOLDINGS.getCode().equalsIgnoreCase(docType)){
340            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocalId_display"));
341            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(DocType.BIB.getCode(), "Title_sort"));
342            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumber_display"));
343            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumberPrefix_display"));
344            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ClassificationPart_display"));
345            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingOrder_display"));
346            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingOrderCode_display"));
347            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeCode_display"));
348            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeValue_display"));
349            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Uri_display"));
350            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ReceiptStatus_display"));
351            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CopyNumber_display"));
352            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Location_display"));
353            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DocFormat"));
354            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "bibIdentifier"));
355            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "itemIdentifier"));
356            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "holdingsIdentifier"));
357            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Location_display"));
358            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocationLevelName_display"));
359            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "HoldingsNote_display"));
360            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "staffOnlyFlag"));
361            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "isSeries"));
362            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "isAnalytic"));
363            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "isBoundwith"));
364            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ExtentOfOwnership_Type_display"));
365            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ExtentOfOwnership_Note_Value_display"));
366            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ExtentOfOwnership_Note_Type_display"));
367        } else if(DocType.EHOLDINGS.getCode().equalsIgnoreCase(docType)){
368            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocalId_display"));
369            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(DocType.BIB.getCode(), "Title_sort"));
370            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "AccessStatus_display"));
371            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Platform_display"));
372            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Imprint_display"));
373            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "StatisticalSearchingFullValue_display"));
374            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "StatisticalSearchingCodeValue_display"));
375            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DocFormat"));
376            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "bibIdentifier"));
377            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "holdingsIdentifier"));
378            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "staffOnlyFlag"));
379            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Location_display"));
380            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocationLevelName_display"));
381            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumber_display"));
382            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumberPrefix_display"));
383            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeCode_display"));
384            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeValue_display"));
385            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Access_Password_display"));
386            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Access_UserName_display"));
387            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "AccessLocation_display"));
388            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Admin_Password_display"));
389            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Admin_url_display"));
390            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Admin_UserName_display"));
391            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Authentication_display"));
392            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CoverageDate_display"));
393            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DonorCode_display"));
394            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DonorPublic_display"));
395            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DonorNote_display"));
396            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "E_Publisher_display"));
397            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "HoldingsNote_display"));
398            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ILL_display"));
399            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemPart_display"));
400            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Link_Text_display"));
401            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "NumberOfSimultaneousUses_display"));
402            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "PerpetualAccess_display"));
403            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Persist_Link_display"));
404            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Proxied_display"));
405            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ReceiptStatus_display"));
406            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Subscription_display"));
407            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Url_display"));
408        } else if(DocType.ITEM.getCode().equalsIgnoreCase(docType)){
409            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "LocalId_display"));
410            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(DocType.BIB.getCode(), "Title_sort"));
411            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Location_display"));
412            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumber_display"));
413            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CallNumberPrefix_display"));
414            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ClassificationPart_display"));
415            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingOrder_display"));
416            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingOrderCode_display"));
417            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeCode_display"));
418            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ShelvingSchemeValue_display"));
419            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DocFormat"));
420            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "bibIdentifier"));
421            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "holdingsIdentifier"));
422            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "id"));
423            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemBarcode_display"));
424            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemStatus_display"));
425            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Location_display"));
426            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemUri_display"));
427            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CopyNumber_display"));
428            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "CopyNumberLabel_display"));
429            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "VolumeNumber_display"));
430            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "VolumeNumberLabel_display"));
431            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Enumeration_display"));
432            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "Chronology_display"));
433            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "staffOnlyFlag"));
434            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "isAnalytic"));
435            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemTypeCodeValue_display"));
436            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "ItemTypeFullValue_display"));
437
438        }
439    }
440
441}