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.ingest;
17
18 import java.util.Arrays;
19
20 import org.apache.logging.log4j.LogManager;
21 import org.apache.logging.log4j.Logger;
22
23 /**
24 * Factory class for managing and organizing document ingesters.
25 * The factory maintains a sorted collection of ingesters based on their priority
26 * and provides methods to add new ingesters and retrieve the current collection.
27 *
28 * Ingesters are automatically sorted by priority, with lower numbers having higher priority.
29 */
30 public class IngestFactory {
31 /** Logger instance for this class */
32 private static final Logger logger = LogManager.getLogger(IngestFactory.class);
33
34 /** Array of registered ingesters, sorted by priority */
35 private Ingester[] ingesters = {};
36
37 /**
38 * Default constructor.
39 */
40 public IngestFactory() {
41 // Default constructor
42 }
43
44 /**
45 * Adds an ingester to the factory.
46 * The ingester is inserted into the collection and the array is re-sorted by priority.
47 * This method is thread-safe.
48 *
49 * @param ingester the ingester to add
50 */
51 public synchronized void add(final Ingester ingester) {
52 if (logger.isDebugEnabled()) {
53 logger.debug("Loaded Ingester: {}", ingester.getClass().getSimpleName());
54 }
55 final Ingester[] newIngesters = Arrays.copyOf(ingesters, ingesters.length + 1);
56 newIngesters[ingesters.length] = ingester;
57 Arrays.sort(newIngesters, (o1, o2) -> o1.priority - o2.priority);
58 ingesters = newIngesters;
59 }
60
61 /**
62 * Returns the array of registered ingesters sorted by priority.
63 * The returned array contains all ingesters in priority order
64 * (lower priority numbers first).
65 *
66 * @return the sorted array of ingesters
67 */
68 public Ingester[] getIngesters() {
69 return ingesters;
70 }
71 }