package eu.kielczewski.akanke.common.service.document;
import eu.kielczewski.akanke.common.dao.directory.DirectorySeekerDao;
import eu.kielczewski.akanke.common.dao.directory.DirectoryWatcherDao;
import eu.kielczewski.akanke.common.domain.Document;
import eu.kielczewski.akanke.common.repository.DocumentRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@Component
class DocumentImporter {
private static final Logger LOGGER = LoggerFactory.getLogger(DocumentImporter.class);
private static final String EXTENSION_DOCUMENT = "md";
private final String baseDir;
private final DirectorySeekerDao seekerDao;
private final DirectoryWatcherDao watcherDao;
private final DocumentCreator documentCreator;
private final DocumentRepository repository;
private final TaskExecutor taskExecutor;
@Autowired
public DocumentImporter(@Value("${akanke.documents.path}") String baseDir,
DirectorySeekerDao seekerDao,
DirectoryWatcherDao watcherDao,
DocumentRepository repository,
DocumentCreator documentCreator,
TaskExecutor taskExecutor) {
this.baseDir = baseDir;
this.documentCreator = documentCreator;
this.seekerDao = seekerDao;
this.watcherDao = watcherDao;
this.repository = repository;
this.taskExecutor = taskExecutor;
}
@PostConstruct
void importAndWatch() throws Exception {
LOGGER.debug("Starting initial import of documents from directory {}", baseDir);
taskExecutor.execute(() -> {
try {
importFrom(baseDir);
watcherDao.watch(baseDir);
} catch (IOException e) {
LOGGER.error("Couldn't proceed with initial import or watch due to exception", e);
}
});
}
public void importFrom(String path) throws IOException {
LOGGER.debug("Importing documents from directory {}", path);
repository.save(loadDocuments(path));
}
private List<Document> loadDocuments(String path) throws IOException {
return seekerDao.seekByExtension(EXTENSION_DOCUMENT, path).parallelStream()
.map(documentCreator::createDocument)
.collect(Collectors.toList());
}
}