package com.linkedin.parseq;
import java.util.Iterator;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class TaskDescriptorFactory {
static final Logger LOGGER = LoggerFactory.getLogger(TaskDescriptorFactory.class);
private static ServiceLoader<TaskDescriptor> _loader;
private static TaskDescriptor _identifier;
static {
try {
_loader = ServiceLoader.load(TaskDescriptor.class);
} catch (Throwable e) {
LOGGER.error("Unable to load providers of TaskDescriptor", e.getMessage());
}
}
private TaskDescriptorFactory() {
}
static synchronized TaskDescriptor getTaskDescriptor() {
if (_identifier != null) {
return _identifier;
}
try {
Iterator<TaskDescriptor> identifiers = _loader.iterator();
if (identifiers.hasNext()) {
_identifier = identifiers.next();
LOGGER.info("Using TaskDescriptor: " + _identifier.getClass());
while (identifiers.hasNext()) {
TaskDescriptor descriptor = identifiers.next();
LOGGER.debug("Discarding TaskDescriptor: {} as its not first one to be loaded: ", descriptor.getClass());
}
} else {
LOGGER.info("No provider found for TaskDescriptor, falling back to DefaultTaskDescriptor");
_identifier = getDefaultTaskDescriptor();
}
} catch (ServiceConfigurationError e) {
LOGGER.error("Unable to load provider for TaskDescriptor, falling back to DefaultTaskDescriptor", e.getMessage());
_identifier = getDefaultTaskDescriptor();
}
return _identifier;
}
private static TaskDescriptor getDefaultTaskDescriptor() {
return new DefaultTaskDescriptor();
}
static class DefaultTaskDescriptor implements TaskDescriptor {
DefaultTaskDescriptor() {
}
@Override
public String getDescription(String className) {
return className;
}
}
}