View Javadoc
1   /*
2    * Copyright 2012-2021 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.util;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  import java.util.function.Consumer;
23  
24  import org.apache.logging.log4j.LogManager;
25  import org.apache.logging.log4j.Logger;
26  import org.apache.lucene.queryparser.classic.QueryParser;
27  import org.codelibs.core.crypto.CachedCipher;
28  import org.codelibs.core.misc.DynamicProperties;
29  import org.codelibs.fess.api.WebApiManagerFactory;
30  import org.codelibs.fess.auth.AuthenticationManager;
31  import org.codelibs.fess.crawler.client.CrawlerClientCreator;
32  import org.codelibs.fess.crawler.client.CrawlerClientFactory;
33  import org.codelibs.fess.crawler.entity.EsAccessResult;
34  import org.codelibs.fess.crawler.extractor.ExtractorFactory;
35  import org.codelibs.fess.crawler.service.DataService;
36  import org.codelibs.fess.dict.DictionaryManager;
37  import org.codelibs.fess.ds.DataStoreFactory;
38  import org.codelibs.fess.es.client.SearchEngineClient;
39  import org.codelibs.fess.exception.ContainerNotAvailableException;
40  import org.codelibs.fess.helper.AccessTokenHelper;
41  import org.codelibs.fess.helper.ActivityHelper;
42  import org.codelibs.fess.helper.CrawlingConfigHelper;
43  import org.codelibs.fess.helper.CrawlingInfoHelper;
44  import org.codelibs.fess.helper.CurlHelper;
45  import org.codelibs.fess.helper.DocumentHelper;
46  import org.codelibs.fess.helper.DuplicateHostHelper;
47  import org.codelibs.fess.helper.FileTypeHelper;
48  import org.codelibs.fess.helper.IndexingHelper;
49  import org.codelibs.fess.helper.IntervalControlHelper;
50  import org.codelibs.fess.helper.JobHelper;
51  import org.codelibs.fess.helper.KeyMatchHelper;
52  import org.codelibs.fess.helper.LabelTypeHelper;
53  import org.codelibs.fess.helper.LanguageHelper;
54  import org.codelibs.fess.helper.NotificationHelper;
55  import org.codelibs.fess.helper.PathMappingHelper;
56  import org.codelibs.fess.helper.PermissionHelper;
57  import org.codelibs.fess.helper.PluginHelper;
58  import org.codelibs.fess.helper.PopularWordHelper;
59  import org.codelibs.fess.helper.ProcessHelper;
60  import org.codelibs.fess.helper.QueryHelper;
61  import org.codelibs.fess.helper.RelatedContentHelper;
62  import org.codelibs.fess.helper.RelatedQueryHelper;
63  import org.codelibs.fess.helper.RoleQueryHelper;
64  import org.codelibs.fess.helper.SambaHelper;
65  import org.codelibs.fess.helper.SearchHelper;
66  import org.codelibs.fess.helper.SearchLogHelper;
67  import org.codelibs.fess.helper.SuggestHelper;
68  import org.codelibs.fess.helper.SystemHelper;
69  import org.codelibs.fess.helper.ThemeHelper;
70  import org.codelibs.fess.helper.UserAgentHelper;
71  import org.codelibs.fess.helper.UserInfoHelper;
72  import org.codelibs.fess.helper.ViewHelper;
73  import org.codelibs.fess.helper.VirtualHostHelper;
74  import org.codelibs.fess.indexer.IndexUpdater;
75  import org.codelibs.fess.ingest.IngestFactory;
76  import org.codelibs.fess.job.JobExecutor;
77  import org.codelibs.fess.ldap.LdapManager;
78  import org.codelibs.fess.mylasta.direction.FessConfig;
79  import org.codelibs.fess.mylasta.direction.FessProp;
80  import org.codelibs.fess.script.ScriptEngineFactory;
81  import org.codelibs.fess.sso.SsoManager;
82  import org.codelibs.fess.thumbnail.ThumbnailManager;
83  import org.lastaflute.core.message.MessageManager;
84  import org.lastaflute.core.security.PrimaryCipher;
85  import org.lastaflute.di.core.SingletonLaContainer;
86  import org.lastaflute.di.core.exception.ComponentNotFoundException;
87  import org.lastaflute.di.core.factory.SingletonLaContainerFactory;
88  import org.lastaflute.di.core.smart.hot.HotdeployUtil;
89  import org.lastaflute.job.JobManager;
90  import org.lastaflute.web.servlet.request.RequestManager;
91  import org.lastaflute.web.servlet.request.ResponseManager;
92  
93  public final class ComponentUtil {
94  
95      private static final Logger logger = LogManager.getLogger(ComponentUtil.class);
96  
97      private static Map<String, Object> componentMap = new HashMap<>();
98  
99      private static final String SCRIPT_ENGINE_FACTORY = "scriptEngineFactory";
100 
101     private static final String INGEST_FACTORY = "ingestFactory";
102 
103     private static final String NOTIFICATION_HELPER = "notificationHelper";
104 
105     private static final String SEARCH_HELPER = "searchHelper";
106 
107     private static final String THEME_HELPER = "themeHelper";
108 
109     private static final String PLUGIN_HELPER = "pluginHelper";
110 
111     private static final String LANGUAGE_HELPER = "languageHelper";
112 
113     private static final String CURL_HELPER = "curlHelper";
114 
115     private static final String QUERY_STRING_BUILDER = "queryStringBuilder";
116 
117     private static final String ACCESS_TOKEN_HELPER = "accessTokenHelper";
118 
119     private static final String AUTHENTICATION_MANAGER = "authenticationManager";
120 
121     private static final String THUMBNAIL_MANAGER = "thumbnailManager";
122 
123     private static final String SSO_MANAGER = "ssoManager";
124 
125     private static final String PERMISSION_HELPER = "permissionHelper";
126 
127     private static final String QUERY_PARSER = "queryParser";
128 
129     private static final String DOCUMENT_HELPER = "documentHelper";
130 
131     private static final String ACTIVITY_HELPER = "activityHelper";
132 
133     private static final String LDAP_MANAGER = "ldapManager";
134 
135     private static final String ROLE_QUERY_HELPER = "roleQueryHelper";
136 
137     private static final String SUGGEST_HELPER = "suggestHelper";
138 
139     private static final String FESS_ES_CLIENT = "fessEsClient";
140 
141     private static final String DICTIONARY_MANAGER = "dictionaryManager";
142 
143     private static final String DATA_SERVICE = "dataService";
144 
145     private static final String MESSAGE_MANAGER = "messageManager";
146 
147     private static final String INDEX_UPDATER = "indexUpdater";
148 
149     private static final String FILE_TYPE_HELPER = "fileTypeHelper";
150 
151     private static final String EXTRACTOR_FACTORY = "extractorFactory";
152 
153     private static final String INTERVAL_CONTROL_HELPER = "intervalControlHelper";
154 
155     private static final String DATA_STORE_FACTORY = "dataStoreFactory";
156 
157     private static final String USER_AGENT_HELPER = "userAgentHelper";
158 
159     private static final String USER_INFO_HELPER = "userInfoHelper";
160 
161     private static final String WEB_API_MANAGER_FACTORY = "webApiManagerFactory";
162 
163     private static final String PROCESS_HELPER = "processHelper";
164 
165     private static final String JOB_HELPER = "jobHelper";
166 
167     private static final String DUPLICATE_HOST_HELPER = "duplicateHostHelper";
168 
169     private static final String PATH_MAPPING_HELPER = "pathMappingHelper";
170 
171     private static final String POPULAR_WORD_HELPER = "popularWordHelper";
172 
173     private static final String CRAWLING_INFO_HELPER = "crawlingInfoHelper";
174 
175     private static final String CRAWLING_CONFIG_HELPER = "crawlingConfigHelper";
176 
177     private static final String SEARCH_LOG_HELPER = "searchLogHelper";
178 
179     private static final String LABEL_TYPE_HELPER = "labelTypeHelper";
180 
181     private static final String QUERY_HELPER = "queryHelper";
182 
183     private static final String SAMBA_HELPER = "sambaHelper";
184 
185     private static final String VIEW_HELPER = "viewHelper";
186 
187     private static final String SYSTEM_HELPER = "systemHelper";
188 
189     private static final String CRAWLER_PROPERTIES = "systemProperties";
190 
191     private static final String QUERY_RESPONSE_LIST = "queryResponseList";
192 
193     private static final String JOB_EXECUTOR_SUFFIX = "JobExecutor";
194 
195     private static final String KEY_MATCH_HELPER = "keyMatchHelper";
196 
197     private static final String INDEXING_HELPER = "indexingHelper";
198 
199     private static final String VIRTUAL_HOST_HELPER = "virtualHostHelper";
200 
201     private static final String RELATED_CONTENT_HELPER = "relatedContentHelper";
202 
203     private static final String RELATED_QUERY_HELPER = "relatedQueryHelper";
204 
205     private static IndexingHelper indexingHelper;
206 
207     private static CrawlingConfigHelper crawlingConfigHelper;
208 
209     private static SystemHelper systemHelper;
210 
211     private static FessConfig fessConfig;
212 
213     private static List<Runnable> initProcesses = new ArrayList<>();
214 
215     private ComponentUtil() {
216     }
217 
218     public static void processAfterContainerInit(final Runnable process) {
219         if (available()) {
220             process.run();
221         } else {
222             initProcesses.add(process);
223         }
224     }
225 
226     public static void doInitProcesses(final Consumer<? super Runnable> action) {
227         try {
228             initProcesses.forEach(action);
229         } finally {
230             initProcesses.clear();
231         }
232     }
233 
234     public static CachedCipher getCipher(final String cipherName) {
235         return getComponent(cipherName);
236     }
237 
238     public static QueryResponseList getQueryResponseList() {
239         return getComponent(QUERY_RESPONSE_LIST);
240     }
241 
242     public static DynamicProperties getSystemProperties() {
243         return getComponent(CRAWLER_PROPERTIES);
244     }
245 
246     public static SystemHelper getSystemHelper() {
247         if (systemHelper == null || HotdeployUtil.isHotdeploy()) {
248             systemHelper = getComponent(SYSTEM_HELPER);
249         }
250         return systemHelper;
251     }
252 
253     public static ViewHelper getViewHelper() {
254         return getComponent(VIEW_HELPER);
255     }
256 
257     public static SambaHelper getSambaHelper() {
258         return getComponent(SAMBA_HELPER);
259     }
260 
261     public static QueryHelper getQueryHelper() {
262         return getComponent(QUERY_HELPER);
263     }
264 
265     public static LabelTypeHelper getLabelTypeHelper() {
266         return getComponent(LABEL_TYPE_HELPER);
267     }
268 
269     public static SearchLogHelper getSearchLogHelper() {
270         return getComponent(SEARCH_LOG_HELPER);
271     }
272 
273     public static CrawlingConfigHelper getCrawlingConfigHelper() {
274         if (crawlingConfigHelper == null || HotdeployUtil.isHotdeploy()) {
275             crawlingConfigHelper = getComponent(CRAWLING_CONFIG_HELPER);
276         }
277         return crawlingConfigHelper;
278     }
279 
280     public static CrawlingInfoHelper getCrawlingInfoHelper() {
281         return getComponent(CRAWLING_INFO_HELPER);
282     }
283 
284     public static PopularWordHelper getPopularWordHelper() {
285         return getComponent(POPULAR_WORD_HELPER);
286     }
287 
288     public static PathMappingHelper getPathMappingHelper() {
289         return getComponent(PATH_MAPPING_HELPER);
290     }
291 
292     public static DuplicateHostHelper getDuplicateHostHelper() {
293         return getComponent(DUPLICATE_HOST_HELPER);
294     }
295 
296     public static ProcessHelper getProcessHelper() {
297         return getComponent(PROCESS_HELPER);
298     }
299 
300     public static JobHelper getJobHelper() {
301         return getComponent(JOB_HELPER);
302     }
303 
304     public static WebApiManagerFactory getWebApiManagerFactory() {
305         return getComponent(WEB_API_MANAGER_FACTORY);
306     }
307 
308     public static UserAgentHelper getUserAgentHelper() {
309         return getComponent(USER_AGENT_HELPER);
310     }
311 
312     public static DataStoreFactory getDataStoreFactory() {
313         return getComponent(DATA_STORE_FACTORY);
314     }
315 
316     public static IntervalControlHelper getIntervalControlHelper() {
317         return getComponent(INTERVAL_CONTROL_HELPER);
318     }
319 
320     public static ExtractorFactory getExtractorFactory() {
321         return getComponent(EXTRACTOR_FACTORY);
322     }
323 
324     public static JobExecutor getJobExecutor(final String name) {
325         if (name.endsWith(JOB_EXECUTOR_SUFFIX)) {
326             return getComponent(name);
327         }
328         return getComponent("script" + JOB_EXECUTOR_SUFFIX);
329     }
330 
331     public static FileTypeHelper getFileTypeHelper() {
332         return getComponent(FILE_TYPE_HELPER);
333     }
334 
335     public static IndexUpdater getIndexUpdater() {
336         return getComponent(INDEX_UPDATER);
337     }
338 
339     public static KeyMatchHelper getKeyMatchHelper() {
340         return getComponent(KEY_MATCH_HELPER);
341     }
342 
343     public static IndexingHelper getIndexingHelper() {
344         if (indexingHelper == null || HotdeployUtil.isHotdeploy()) {
345             indexingHelper = getComponent(INDEXING_HELPER);
346         }
347         return indexingHelper;
348     }
349 
350     public static UserInfoHelper getUserInfoHelper() {
351         return getComponent(USER_INFO_HELPER);
352     }
353 
354     public static MessageManager getMessageManager() {
355         return getComponent(MESSAGE_MANAGER);
356     }
357 
358     public static DictionaryManager getDictionaryManager() {
359         return getComponent(DICTIONARY_MANAGER);
360     }
361 
362     public static DataService<EsAccessResult> getDataService() {
363         return getComponent(DATA_SERVICE);
364     }
365 
366     public static SearchEngineClient getSearchEngineClient() {
367         return getComponent(FESS_ES_CLIENT);
368     }
369 
370     public static FessConfig getFessConfig() {
371         if (fessConfig != null) {
372             return fessConfig;
373         }
374         fessConfig = getComponent(FessConfig.class);
375         return fessConfig;
376     }
377 
378     public static SuggestHelper getSuggestHelper() {
379         return getComponent(SUGGEST_HELPER);
380     }
381 
382     public static RoleQueryHelper getRoleQueryHelper() {
383         return getComponent(ROLE_QUERY_HELPER);
384     }
385 
386     public static LdapManager getLdapManager() {
387         return getComponent(LDAP_MANAGER);
388     }
389 
390     public static ActivityHelper getActivityHelper() {
391         return getComponent(ACTIVITY_HELPER);
392     }
393 
394     public static RequestManager getRequestManager() {
395         return getComponent(RequestManager.class);
396     }
397 
398     public static ResponseManager getResponseManager() {
399         return getComponent(ResponseManager.class);
400     }
401 
402     public static JobManager getJobManager() {
403         return getComponent(JobManager.class);
404     }
405 
406     public static DocumentHelper getDocumentHelper() {
407         return getComponent(DOCUMENT_HELPER);
408     }
409 
410     public static QueryParser getQueryParser() {
411         return getComponent(QUERY_PARSER);
412     }
413 
414     public static PermissionHelper getPermissionHelper() {
415         return getComponent(PERMISSION_HELPER);
416     }
417 
418     public static SsoManager getSsoManager() {
419         return getComponent(SSO_MANAGER);
420     }
421 
422     public static ThumbnailManager getThumbnailManager() {
423         return getComponent(THUMBNAIL_MANAGER);
424     }
425 
426     public static AuthenticationManager getAuthenticationManager() {
427         return getComponent(AUTHENTICATION_MANAGER);
428     }
429 
430     public static PrimaryCipher getPrimaryCipher() {
431         return getComponent(PrimaryCipher.class);
432     }
433 
434     public static CrawlerClientFactory getCrawlerClientFactory() {
435         return getComponent(CrawlerClientFactory.class);
436     }
437 
438     public static CrawlerClientCreator getCrawlerClientCreator() {
439         return getComponent(CrawlerClientCreator.class);
440     }
441 
442     public static RelatedQueryHelper getRelatedQueryHelper() {
443         return getComponent(RELATED_QUERY_HELPER);
444     }
445 
446     public static RelatedContentHelper getRelatedContentHelper() {
447         return getComponent(RELATED_CONTENT_HELPER);
448     }
449 
450     public static VirtualHostHelper getVirtualHostHelper() {
451         return getComponent(VIRTUAL_HOST_HELPER);
452     }
453 
454     public static AccessTokenHelper getAccessTokenHelper() {
455         return getComponent(ACCESS_TOKEN_HELPER);
456     }
457 
458     public static QueryStringBuilder getQueryStringBuilder() {
459         return getComponent(QUERY_STRING_BUILDER);
460     }
461 
462     public static CurlHelper getCurlHelper() {
463         return getComponent(CURL_HELPER);
464     }
465 
466     public static LanguageHelper getLanguageHelper() {
467         return getComponent(LANGUAGE_HELPER);
468     }
469 
470     public static PluginHelper getPluginHelper() {
471         return getComponent(PLUGIN_HELPER);
472     }
473 
474     public static ThemeHelper getThemeHelper() {
475         return getComponent(THEME_HELPER);
476     }
477 
478     public static SearchHelper getSearchHelper() {
479         return getComponent(SEARCH_HELPER);
480     }
481 
482     public static NotificationHelper getNotificationHelper() {
483         return getComponent(NOTIFICATION_HELPER);
484     }
485 
486     public static IngestFactory getIngestFactory() {
487         return getComponent(INGEST_FACTORY);
488     }
489 
490     public static ScriptEngineFactory getScriptEngineFactory() {
491         return getComponent(SCRIPT_ENGINE_FACTORY);
492     }
493 
494     public static <T> T getComponent(final Class<T> clazz) {
495         try {
496             return SingletonLaContainer.getComponent(clazz);
497         } catch (final NullPointerException e) {
498             if (logger.isDebugEnabled()) {
499                 throw new ContainerNotAvailableException(clazz.getCanonicalName(), e);
500             }
501             throw new ContainerNotAvailableException(clazz.getCanonicalName());
502         }
503     }
504 
505     public static <T> T getComponent(final String componentName) {
506         try {
507             return SingletonLaContainer.getComponent(componentName);
508         } catch (final NullPointerException e) {
509             if (logger.isDebugEnabled()) {
510                 throw new ContainerNotAvailableException(componentName, e);
511             }
512             throw new ContainerNotAvailableException(componentName);
513         } catch (final ComponentNotFoundException e) {
514             if (componentMap.containsKey(componentName)) {
515                 @SuppressWarnings("unchecked")
516                 final T c = (T) componentMap.get(componentName);
517                 return c;
518             }
519             throw e;
520         }
521     }
522 
523     public static boolean hasComponent(final String componentKey) {
524         return SingletonLaContainerFactory.getContainer().hasComponentDef(componentKey);
525     }
526 
527     public static boolean hasViewHelper() {
528         return hasComponent(VIEW_HELPER);
529     }
530 
531     public static boolean hasQueryHelper() {
532         return hasComponent(QUERY_HELPER);
533     }
534 
535     public static boolean hasPopularWordHelper() {
536         return hasComponent(POPULAR_WORD_HELPER);
537     }
538 
539     public static boolean hasRelatedQueryHelper() {
540         return hasComponent(RELATED_QUERY_HELPER);
541     }
542 
543     public static boolean hasIngestFactory() {
544         return hasComponent(INGEST_FACTORY);
545     }
546 
547     public static boolean available() {
548         try {
549             return SingletonLaContainer.getComponent(SYSTEM_HELPER) != null;
550         } catch (final Exception e) {
551             // ignore
552         }
553         return false;
554     }
555 
556     /**
557      * For test purpose only.
558      *
559      * @param fessConfig fessConfig instance
560      */
561     public static void setFessConfig(final FessConfig fessConfig) {
562         ComponentUtil.fessConfig = fessConfig;
563         if (fessConfig == null) {
564             FessProp.propMap.clear();
565             componentMap.clear();
566         }
567     }
568 
569     public static void register(final Object instance, final String name) {
570         componentMap.put(name, instance);
571     }
572 }