package com.after_sunrise.oss.otdb.lib.load.impl;
import static com.after_sunrise.commons.log.object.Logs.logDebug;
import static com.after_sunrise.commons.log.object.Logs.logErrors;
import static com.after_sunrise.commons.log.object.Logs.logInfo;
import static com.after_sunrise.commons.log.object.Logs.logTrace;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.after_sunrise.oss.otdb.api.loader.LoadableTickIterator;
import com.after_sunrise.oss.otdb.api.loader.LoadableTickLoader;
import com.after_sunrise.oss.otdb.lib.load.TickLoader;
import com.after_sunrise.oss.otdb.lib.load.TickProvider;
import com.google.common.annotations.VisibleForTesting;
/**
* @author takanori.takase
*/
public class TickLoaderImpl implements TickLoader {
private final Log log = LogFactory.getLog(getClass());
private Collection<TickProvider> providers;
private Collection<LoadableTickLoader> loaders;
public void setProviders(Collection<TickProvider> providers) {
this.providers = providers;
}
public void setLoader(Collection<LoadableTickLoader> loaders) {
this.loaders = loaders;
}
@Override
public void load() {
logInfo(log, "Loading loaders [%s]", loaders.size());
for (LoadableTickLoader loader : loaders) {
logInfo(log, "Loading providers [%s]", providers.size());
for (TickProvider p : providers) {
try {
logInfo(log, "Processing provider [%s]", p);
long total = process(loader, p);
logInfo(log, "Processed provider [%s] [%s]", p, total);
} catch (Exception e) {
logErrors(log, "Failed to process provider [%s}", e, p);
}
}
logInfo(log, "Loaded providers [%s]", providers.size());
}
logInfo(log, "Loading loaders [%s]", loaders.size());
}
@VisibleForTesting
long process(LoadableTickLoader loader, TickProvider provider)
throws IOException {
List<String> sources = provider.listSources();
logDebug(log, "Listed sources [%s]", sources.size());
long total = 0;
for (String source : sources) {
Long id = loader.find(source);
if (id != null) {
logTrace(log, "Skipping source [%s]", source);
continue;
}
logInfo(log, "Loading source [%s]", source);
try (LoadableTickIterator itr = provider.iterator(source)) {
long count = loader.load(source, itr);
logInfo(log, "Loaded source [%s] [%,3d]", source, count);
total += count;
} catch (IOException e) {
logErrors(log, "Failed to load source [%s]", e, source);
}
}
return total;
}
public static void main(String[] args) {
String config = System.getProperty(CONFIG_KEY, CONFIG_VAL);
ApplicationContext c = new ClassPathXmlApplicationContext(config);
try {
TickLoader loader = c.getBean(TickLoader.class);
loader.load();
} finally {
((ConfigurableApplicationContext) c).close();
}
}
}