1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.util;
17
18 import java.io.File;
19 import java.util.function.Consumer;
20
21 import org.apache.logging.log4j.LogManager;
22 import org.apache.logging.log4j.Logger;
23 import org.codelibs.core.exception.ResourceNotFoundRuntimeException;
24 import org.codelibs.core.io.FileUtil;
25 import org.codelibs.curl.CurlResponse;
26 import org.codelibs.fesen.action.ActionListener;
27 import org.codelibs.fesen.action.admin.indices.exists.indices.IndicesExistsResponse;
28 import org.codelibs.fesen.action.admin.indices.mapping.get.GetFieldMappingsResponse;
29 import org.codelibs.fesen.action.admin.indices.mapping.get.GetFieldMappingsResponse.FieldMappingMetadata;
30 import org.codelibs.fesen.action.admin.indices.mapping.get.GetMappingsResponse;
31 import org.codelibs.fesen.action.admin.indices.mapping.put.PutMappingRequestBuilder;
32 import org.codelibs.fesen.action.index.IndexRequest;
33 import org.codelibs.fesen.action.support.master.AcknowledgedResponse;
34 import org.codelibs.fesen.client.Client;
35 import org.codelibs.fesen.client.IndicesAdminClient;
36 import org.codelibs.fesen.cluster.metadata.MappingMetadata;
37 import org.codelibs.fesen.common.collect.ImmutableOpenMap;
38 import org.codelibs.fesen.common.xcontent.XContentType;
39 import org.codelibs.fess.mylasta.direction.FessConfig;
40
41 public final class UpgradeUtil {
42 private static final Logger logger = LogManager.getLogger(UpgradeUtil.class);
43
44 private UpgradeUtil() {
45 }
46
47 public static boolean uploadResource(final String indexConfigPath, final String indexName, final String path) {
48 final String filePath = indexConfigPath + "/" + indexName + "/" + path;
49 try {
50 final String source = FileUtil.readUTF8(filePath);
51 try (CurlResponse response =
52 ComponentUtil.getCurlHelper().post("/_configsync/file").param("path", path).body(source).execute()) {
53 if (response.getHttpStatusCode() == 200) {
54 logger.info("Register {} to {}", path, indexName);
55 return true;
56 }
57 logger.warn("Invalid request for {}", path);
58 }
59 } catch (final Exception e) {
60 logger.warn("Failed to register {}", filePath, e);
61 }
62 return false;
63 }
64
65 public static boolean createAlias(final IndicesAdminClient indicesClient, final String indexConfigPath, final String indexName,
66 final String aliasName) {
67 final FessConfig fessConfig = ComponentUtil.getFessConfig();
68 final String aliasConfigPath = indexConfigPath + "/" + indexName + "/alias/" + aliasName + ".json";
69 try {
70 final File aliasConfigFile = org.codelibs.core.io.ResourceUtil.getResourceAsFile(aliasConfigPath);
71 if (aliasConfigFile.exists()) {
72 final String source = FileUtil.readUTF8(aliasConfigFile);
73 final AcknowledgedResponse response = indicesClient.prepareAliases().addAlias(indexName, aliasName, source).execute()
74 .actionGet(fessConfig.getIndexIndicesTimeout());
75 if (response.isAcknowledged()) {
76 logger.info("Created {} alias for {}", aliasName, indexName);
77 return true;
78 }
79 if (logger.isDebugEnabled()) {
80 logger.debug("Failed to create {} alias for {}", aliasName, indexName);
81 }
82 }
83 } catch (final ResourceNotFoundRuntimeException e) {
84
85 } catch (final Exception e) {
86 logger.warn("{} is not found.", aliasConfigPath, e);
87 }
88 return false;
89 }
90
91 public static boolean addMapping(final IndicesAdminClient indicesClient, final String index, final String type,
92 final String indexResourcePath) {
93 final FessConfig fessConfig = ComponentUtil.getFessConfig();
94 final GetMappingsResponse getMappingsResponse =
95 indicesClient.prepareGetMappings(index).execute().actionGet(fessConfig.getIndexIndicesTimeout());
96 final ImmutableOpenMap<String, MappingMetadata> indexMappings = getMappingsResponse.mappings().get(index);
97 if (indexMappings == null || !indexMappings.containsKey(type)) {
98 String source = null;
99 final String mappingFile = indexResourcePath + "/" + type + ".json";
100 try {
101 source = FileUtil.readUTF8(mappingFile);
102 } catch (final Exception e) {
103 logger.warn("{} is not found.", mappingFile, e);
104 }
105 try {
106 final AcknowledgedResponse putMappingResponse = indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON)
107 .execute().actionGet(fessConfig.getIndexIndicesTimeout());
108 if (putMappingResponse.isAcknowledged()) {
109 logger.info("Created {}/{} mapping.", index, type);
110 return true;
111 }
112 logger.warn("Failed to create {}/{} mapping.", index, type);
113 } catch (final Exception e) {
114 logger.warn("Failed to create {}/{} mapping.", index, type, e);
115 }
116 }
117 return false;
118 }
119
120 public static boolean addFieldMapping(final IndicesAdminClient indicesClient, final String index, final String type, final String field,
121 final String source) {
122 final GetFieldMappingsResponse gfmResponse =
123 indicesClient.prepareGetFieldMappings(index).addTypes(type).setFields(field).execute().actionGet();
124 final FieldMappingMetadata fieldMappings = gfmResponse.fieldMappings(index, type, field);
125 if (fieldMappings == null || fieldMappings.isNull()) {
126 try {
127 final AcknowledgedResponse pmResponse =
128 indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON).execute().actionGet();
129 if (pmResponse.isAcknowledged()) {
130 return true;
131 }
132 logger.warn("Failed to add {} to {}/{}", field, index, type);
133 } catch (final Exception e) {
134 logger.warn("Failed to add {} to {}/{} ", field, index, type, e);
135 }
136 }
137 return false;
138 }
139
140 public static boolean putMapping(final IndicesAdminClient indicesClient, final String index, final String source) {
141 return putMapping(indicesClient, index, null, source);
142 }
143
144 public static boolean putMapping(final IndicesAdminClient indicesClient, final String index, final String type, final String source) {
145 try {
146 final PutMappingRequestBuilder builder = indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON);
147 final AcknowledgedResponse pmResponse = builder.execute().actionGet();
148 if (pmResponse.isAcknowledged()) {
149 return true;
150 }
151 logger.warn("Failed to update {} settings.", index);
152 } catch (final Exception e) {
153 logger.warn("Failed to update {} settings.", index, e);
154 }
155
156 return false;
157 }
158
159 public static boolean addData(final Client fessEsClient, final String index, final String id, final String source) {
160 try {
161 final IndexRequest indexRequest = new IndexRequest(index).id(id).source(source, XContentType.JSON);
162 fessEsClient.index(indexRequest).actionGet();
163 return true;
164 } catch (final Exception e) {
165 logger.warn("Failed to add {} to {}", id, index, e);
166 }
167 return false;
168 }
169
170 public static boolean existsIndex(final IndicesAdminClient indicesClient, final String index, final boolean expandWildcardsOpen,
171 final boolean expandWildcardsClosed) {
172 final FessConfig fessConfig = ComponentUtil.getFessConfig();
173 try {
174 final IndicesExistsResponse response = indicesClient.prepareExists(index).setExpandWildcardsClosed(expandWildcardsClosed)
175 .setExpandWildcardsOpen(expandWildcardsOpen).execute().actionGet(fessConfig.getIndexSearchTimeout());
176 return response.isExists();
177 } catch (final Exception e) {
178
179 }
180 return false;
181 }
182
183 public static void deleteIndex(final IndicesAdminClient indicesClient, final String index,
184 final Consumer<AcknowledgedResponse> comsumer) {
185 indicesClient.prepareDelete(index).execute(new ActionListener<AcknowledgedResponse>() {
186
187 @Override
188 public void onResponse(final AcknowledgedResponse response) {
189 logger.info("Deleted {} index.", index);
190 comsumer.accept(response);
191 }
192
193 @Override
194 public void onFailure(final Exception e) {
195 logger.warn("Failed to delete {} index.", index, e);
196 }
197 });
198 }
199 }