package eu.kielczewski.akanke.common.service.document; 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.context.ApplicationListener; import org.springframework.stereotype.Component; import javax.inject.Inject; import java.io.IOException; @Component class DocumentFilesystemChangeEventHandler implements ApplicationListener<DirectoryWatcherDao.FilesystemChangeEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(DocumentFilesystemChangeEventHandler.class); private static final String EXTENSION_DOCUMENT = "md"; private final DocumentRepository repository; private final DocumentImporter importer; private final DocumentCreator creator; @Autowired public DocumentFilesystemChangeEventHandler(DocumentImporter importer, DocumentCreator creator, DocumentRepository repository) { this.importer = importer; this.creator = creator; this.repository = repository; } @Override public void onApplicationEvent(final DirectoryWatcherDao.FilesystemChangeEvent event) { LOGGER.debug("Handling {}", event); String target = event.getTarget(); try { if (target.endsWith(EXTENSION_DOCUMENT)) { handleEventForFile(event, target); } else { handleEventForDirectory(event, target); } } catch (IOException e) { LOGGER.error("Couldn't read file={}", target, e); } catch (Exception e) { LOGGER.error("Exception occurred while handling {}", event, e); } } private void handleEventForDirectory(DirectoryWatcherDao.FilesystemChangeEvent event, String target) throws IOException { if (event.getType() == DirectoryWatcherDao.FilesystemChangeEvent.Type.DELETE) { LOGGER.trace("Deleting documents in directory={}", target); repository.deleteByFileStartingWith(target); } if (event.getType() == DirectoryWatcherDao.FilesystemChangeEvent.Type.CREATE) { LOGGER.trace("Adding documents from directory={}", target); importer.importFrom(target); } } private void handleEventForFile(DirectoryWatcherDao.FilesystemChangeEvent event, String file) throws IOException { Document existing = repository.getByFile(file); if (existing != null) { LOGGER.trace("Deleting existing document id={}", existing.getId()); repository.delete(existing); } if (event.getType() == DirectoryWatcherDao.FilesystemChangeEvent.Type.CREATE) { LOGGER.trace("Saving new document"); repository.save(creator.createDocument(file)); } if (event.getType() == DirectoryWatcherDao.FilesystemChangeEvent.Type.MODIFY) { LOGGER.trace("Saving updated document"); repository.save(creator.createDocument(file)); } } }