package org.exist.storage.serializers;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.exist.indexing.MatchListener;
import org.exist.storage.DBBroker;
import org.exist.util.Configuration;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
/**
* Configures and maintains a list of {@link org.exist.storage.serializers.CustomMatchListener}.
* There will be one CustomMatchListenerFactory for every {@link org.exist.storage.serializers.Serializer}
* instance.
*/
public class CustomMatchListenerFactory {
private final static Logger LOG = LogManager.getLogger(CustomMatchListenerFactory.class);
public final static String CONFIGURATION_ELEMENT = "custom-filter";
public final static String CONFIGURATION_ATTR_CLASS = "class";
public final static String CONFIG_MATCH_LISTENERS = "serialization.custom-match-listeners";
private CustomMatchListener first = null;
private CustomMatchListener last = null;
public CustomMatchListenerFactory(final DBBroker broker, final Configuration config) {
this(broker, config, null);
}
public CustomMatchListenerFactory(final DBBroker broker, final Configuration config, final List<String> customClasses) {
final List<String> classesAtConfig = (List<String>) config.getProperty(CONFIG_MATCH_LISTENERS);
final Collection<String> classes;
if (customClasses == null) {
if (classesAtConfig == null) {
return;
}
classes = classesAtConfig;
} else {
if (classesAtConfig == null) {
classes = customClasses;
} else {
classes = new LinkedHashSet<>();
classes.addAll(classesAtConfig);
classes.addAll(customClasses);
}
}
for (final String className : classes) {
try {
final Class<?> listenerClass = Class.forName(className);
if (CustomMatchListener.class.isAssignableFrom(listenerClass)) {
final CustomMatchListener listener = (CustomMatchListener) listenerClass.newInstance();
listener.setBroker(broker);
if (first == null) {
first = listener;
last = listener;
} else {
last.setNextInChain(listener);
last = listener;
}
} else {
LOG.error("Failed to instantiate class {}: it is not a subclass of CustomMatchListener", listenerClass.getName());
}
} catch (final Exception e) {
LOG.error("An exception was caught while trying to instantiate a custom MatchListener: " + e.getMessage(), e);
}
}
}
public MatchListener getFirst() {
if (first != null) {
first.reset();
}
return first;
}
public MatchListener getLast() {
return last;
}
}