package com.after_sunrise.oss.otdb.je.service;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.after_sunrise.oss.otdb.api.service.TickIterator;
import com.after_sunrise.oss.otdb.api.service.TickService;
import com.after_sunrise.oss.otdb.api.tick.Tick;
import com.after_sunrise.oss.otdb.je.database.CodeDatabase;
import com.after_sunrise.oss.otdb.je.database.TickDatabase;
import com.after_sunrise.oss.otdb.je.database.TickDatabaseIterator;
import com.after_sunrise.oss.otdb.je.database.impl.TickIteratorAdapter;
import com.after_sunrise.oss.otdb.je.database.impl.TickIteratorImpl;
import com.after_sunrise.oss.otdb.je.entity.TickEntry;
import com.after_sunrise.oss.otdb.je.entity.TickImpl;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.sleepycat.je.Environment;
import com.sleepycat.je.Transaction;
/**
* @author takanori.takase
*/
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class JeTickServiceDelegate implements TickService {
private final Log log = LogFactory.getLog(getClass());
@Autowired
private Environment environment;
@Autowired
private CodeDatabase codeDatabase;
@Autowired
private TickDatabase tickDatabase;
// TODO Handle transaction if needed.
private Transaction tx;
@VisibleForTesting
void setEnvironment(Environment environment) {
this.environment = environment;
}
@VisibleForTesting
void setCodeDatabase(CodeDatabase codeDatabase) {
this.codeDatabase = codeDatabase;
}
@VisibleForTesting
void setTickDatabase(TickDatabase tickDatabase) {
this.tickDatabase = tickDatabase;
}
@VisibleForTesting
void setTx(Transaction tx) {
this.tx = tx;
}
@Override
public void initialize() throws IOException {
log.info("Initializing service.");
codeDatabase.initialize(environment, tx);
tickDatabase.initialize(environment, tx);
log.info("Initialized service.");
}
@Override
public void close() throws IOException {
log.info("Closing service.");
IOUtils.closeQuietly(tickDatabase);
IOUtils.closeQuietly(codeDatabase);
log.info("Closed service.");
}
@Override
public List<Tick> find(final String code, Long start, Long end)
throws IOException {
return find(code, start, end, null);
}
@Override
public List<Tick> find(final String code, Long start, Long end,
Set<Integer> fields) throws IOException {
Long id = codeDatabase.search(tx, code);
if (id == null) {
return Collections.emptyList();
}
List<TickEntry> entries = tickDatabase.find(tx, id, start, end);
if (entries == null) {
return Collections.emptyList();
}
return Lists.transform(entries, new Function<TickEntry, Tick>() {
@Override
public Tick apply(TickEntry input) {
return new TickImpl(code, input);
}
});
}
@Override
public TickIterator iterate(String code, Long start, Long end)
throws IOException {
return iterate(code, start, end, null);
}
@Override
public TickIterator iterate(String code, Long start, Long end,
Set<Integer> fields) throws IOException {
Long id = codeDatabase.search(tx, code);
if (id == null) {
return TickIteratorAdapter.getInstance();
}
TickDatabaseIterator itr = tickDatabase.iterator(tx, id, start, end);
if (itr == null) {
return TickIteratorAdapter.getInstance();
}
return new TickIteratorImpl(code, itr);
}
}