package org.exist.storage.serializers;
import org.apache.log4j.Logger;
import org.exist.indexing.MatchListener;
import org.exist.storage.DBBroker;
import org.exist.util.Configuration;
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 = Logger.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(DBBroker broker, Configuration config) {
List classes = (List) config.getProperty(CONFIG_MATCH_LISTENERS);
if (classes == null)
return;
CustomMatchListener listener;
for (int i = 0; i < classes.size(); i++) {
try {
Class listenerClass = Class.forName(classes.get(i).toString());
if (CustomMatchListener.class.isAssignableFrom(listenerClass)) {
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 " + listenerClass.getName() +
": it is not a subclass of CustomMatchListener");
} catch (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;
}
}