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.service;
17
18 import java.util.Collections;
19 import java.util.List;
20
21 import org.codelibs.core.beans.util.BeanUtil;
22 import org.codelibs.fess.Constants;
23 import org.codelibs.fess.app.pager.StemmerOverridePager;
24 import org.codelibs.fess.dict.DictionaryFile.PagingList;
25 import org.codelibs.fess.dict.DictionaryManager;
26 import org.codelibs.fess.dict.stemmeroverride.StemmerOverrideFile;
27 import org.codelibs.fess.dict.stemmeroverride.StemmerOverrideItem;
28 import org.codelibs.fess.mylasta.direction.FessConfig;
29 import org.dbflute.optional.OptionalEntity;
30
31 import jakarta.annotation.Resource;
32
33 /**
34 * Service class for managing stemmer override dictionary operations.
35 *
36 * This service provides functionality for CRUD operations on stemmer override
37 * dictionaries. Stemmer override dictionaries allow administrators to define
38 * custom stemming rules that override the default stemming behavior for
39 * specific terms, improving search accuracy for domain-specific vocabularies.
40 */
41 public class StemmerOverrideService {
42
43 /** Dictionary manager for accessing dictionary files. */
44 @Resource
45 protected DictionaryManager dictionaryManager;
46
47 /** Fess configuration for accessing system settings. */
48 @Resource
49 protected FessConfig fessConfig;
50
51 /**
52 * Default constructor.
53 */
54 public StemmerOverrideService() {
55 // Default constructor
56 }
57
58 /**
59 * Retrieves a paginated list of stemmer override items from the specified dictionary.
60 *
61 * This method fetches stemmer override entries with pagination support, updating
62 * the provided pager with the current page state and navigation information.
63 *
64 * @param dictId The ID of the stemmer override dictionary to query
65 * @param stemmerOvberridePager The pager object for pagination control and state
66 * @return A list of stemmer override items for the current page, or empty list if dictionary not found
67 */
68 public List<StemmerOverrideItem> getStemmerOverrideList(final String dictId, final StemmerOverridePager stemmerOvberridePager) {
69 return getStemmerOverrideFile(dictId).map(file -> {
70 final int pageSize = stemmerOvberridePager.getPageSize();
71 final PagingList<StemmerOverrideItem> stemmerOvberrideList =
72 file.selectList((stemmerOvberridePager.getCurrentPageNumber() - 1) * pageSize, pageSize);
73
74 // update pager
75 BeanUtil.copyBeanToBean(stemmerOvberrideList, stemmerOvberridePager, option -> option.include(Constants.PAGER_CONVERSION_RULE));
76 stemmerOvberrideList.setPageRangeSize(fessConfig.getPagingPageRangeSizeAsInteger());
77 stemmerOvberridePager.setPageNumberList(stemmerOvberrideList.createPageNumberList());
78
79 return (List<StemmerOverrideItem>) stemmerOvberrideList;
80 }).orElse(Collections.emptyList());
81 }
82
83 /**
84 * Retrieves the stemmer override dictionary file by ID.
85 *
86 * @param dictId The ID of the stemmer override dictionary to retrieve
87 * @return An OptionalEntity containing the stemmer override file if found, empty otherwise
88 */
89 public OptionalEntity<StemmerOverrideFile> getStemmerOverrideFile(final String dictId) {
90 return dictionaryManager.getDictionaryFile(dictId)
91 .filter(StemmerOverrideFile.class::isInstance)
92 .map(file -> OptionalEntity.of((StemmerOverrideFile) file))
93 .orElse(OptionalEntity.empty());
94 }
95
96 /**
97 * Retrieves a specific stemmer override item by dictionary ID and item ID.
98 *
99 * @param dictId The ID of the stemmer override dictionary
100 * @param id The unique ID of the stemmer override item to retrieve
101 * @return An OptionalEntity containing the stemmer override item if found, empty otherwise
102 */
103 public OptionalEntity<StemmerOverrideItem> getStemmerOverrideItem(final String dictId, final long id) {
104 return getStemmerOverrideFile(dictId).map(file -> file.get(id).get());
105 }
106
107 /**
108 * Stores (creates or updates) a stemmer override item in the specified dictionary.
109 *
110 * If the item ID is 0, this method performs an insert operation. Otherwise,
111 * it performs an update operation for the existing item.
112 *
113 * @param dictId The ID of the stemmer override dictionary
114 * @param stemmerOvberrideItem The stemmer override item to store
115 */
116 public void store(final String dictId, final StemmerOverrideItem stemmerOvberrideItem) {
117 getStemmerOverrideFile(dictId).ifPresent(file -> {
118 if (stemmerOvberrideItem.getId() == 0) {
119 file.insert(stemmerOvberrideItem);
120 } else {
121 file.update(stemmerOvberrideItem);
122 }
123 });
124 }
125
126 /**
127 * Deletes a stemmer override item from the specified dictionary.
128 *
129 * @param dictId The ID of the stemmer override dictionary
130 * @param stemmerOvberrideItem The stemmer override item to delete
131 */
132 public void delete(final String dictId, final StemmerOverrideItem stemmerOvberrideItem) {
133 getStemmerOverrideFile(dictId).ifPresent(file -> {
134 file.delete(stemmerOvberrideItem);
135 });
136 }
137 }