package de.fhopf.lucenesolrtalk.lucene;
import com.google.common.base.Optional;
import de.fhopf.lucenesolrtalk.Talk;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.sax.BodyContentHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
/**
* Indexes files where the content is extracted by Tika.
*/
public class TikaIndexer {
private final Indexer indexer;
private final Logger logger = LoggerFactory.getLogger(TikaIndexer.class);
public TikaIndexer(Indexer indexer) {
this.indexer = indexer;
}
public void indexDir(String path) {
File [] files = new File(path).listFiles();
AutoDetectParser parser = new AutoDetectParser();
logger.debug("Found {} files in dir", files.length);
List<Talk> talks = new ArrayList<Talk>();
for (File file: files) {
Metadata metadata = new Metadata();
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());
BodyContentHandler contentHandler = new BodyContentHandler();
FileInputStream in = null;
try {
in = new FileInputStream(file);
parser.parse(in, contentHandler, metadata);
logMetadata(metadata);
Optional<String> title = Optional.fromNullable(metadata.get(Metadata.TITLE));
Optional<String> speaker = Optional.fromNullable(metadata.get(Metadata.AUTHOR));
String content = contentHandler.toString();
// TODO date
Date date = new Date();
Talk talk = new Talk(file.getAbsolutePath(), title.or(file.getName()), Arrays.asList(speaker.or("")), date, contentHandler.toString(),
Collections.<String>emptyList(), "");
talks.add(talk);
} catch (FileNotFoundException e) {
logger.warn(e.getMessage(), e);
} catch (SAXException e) {
logger.warn(e.getMessage(), e);
} catch (TikaException e) {
logger.warn(e.getMessage(), e);
} catch (IOException e) {
logger.warn(e.getMessage(), e);
} finally {
Utils.close(in);
}
}
logger.debug("Extracted {} talks", talks.size());
indexer.index(talks.toArray(new Talk[talks.size()]));
}
private void logMetadata(Metadata metadata) {
for (String name: metadata.names()) {
System.err.println(name + ": " + metadata.get(name));
logger.error("{}: {}", name, metadata.get(name));
}
}
public static void main(String [] args) throws IOException {
if (args.length != 2) {
System.out.println(String.format("Usage: java %s <indexdir> <datadir>", TikaIndexer.class.getCanonicalName()));
System.exit(1);
}
Directory dir = FSDirectory.open(new File(args[0]));
Indexer indexer = new Indexer(dir);
TikaIndexer tikaIndexer = new TikaIndexer(indexer);
tikaIndexer.indexDir(args[1]);
}
}