package info.freelibrary.djatoka.ingest;
import gov.lanl.adore.djatoka.util.IOUtils;
import info.freelibrary.djatoka.view.IdentifierResolver;
import info.freelibrary.util.StringUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IngestServlet extends HttpServlet {
private static final Logger LOGGER = LoggerFactory
.getLogger(IngestServlet.class);
/**
* IngestServlet's <code>serialVersionUID</code>.
*/
private static final long serialVersionUID = 8661545409056868772L;
private static final String PROPERTIES_FILE = "djatoka.properties";
@Override
protected void doGet(HttpServletRequest aReq, HttpServletResponse aResp)
throws ServletException, IOException {
String dir = getServletContext().getRealPath("/WEB-INF/classes") + "/";
String propertiesFile = dir + PROPERTIES_FILE;
ServletContext context = getServletContext();
IngestThread thread = (IngestThread) context.getAttribute("ingest");
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Loading properties file: {}", propertiesFile);
}
try {
Properties props = IOUtils.loadConfigByPath(propertiesFile);
String dataDir = props.getProperty("djatoka.ingest.data.dir");
String jp2Dir = props.getProperty("djatoka.ingest.jp2.dir");
String extString = props.getProperty("djatoka.ingest.data.exts");
File source = new File(dataDir);
File dest = new File(jp2Dir);
String[] exts = extString.split(","); // TODO: support ; etc?
if (thread != null) {
PrintWriter toBrowser = aResp.getWriter();
int count = thread.getCount();
StringBuilder data = new StringBuilder(" (");
data.append(dest.getUsableSpace() / 1024 / 1024);
data.append(" MB available on the disk)");
if (thread.isFinished()) {
toBrowser.write("Finished: " + count + " ingested" + data);
new IdentifierResolver().loadFileSystemImages(jp2Dir);
context.removeAttribute("ingest");
thread.cleanUp();
}
else {
toBrowser.write("Ingesting... at number " + count + data);
}
toBrowser.close();
return;
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Loading/processing images from {}", dataDir);
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Looking for '{}' files",
StringUtils.toString(exts, ' '));
}
if (source.exists()) {
if (!source.isDirectory() || !source.canRead()) {
String msg = dataDir + " cannot be read or is not a dir";
LOGGER.error(msg, new IOException(dataDir));
aResp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
else {
thread = new IngestThread(source, dest, exts, props);
thread.start();
context.setAttribute("ingest", thread);
}
}
else if (LOGGER.isWarnEnabled()) {
String msg = "Supplied source directory didn't exist: "
+ dataDir;
LOGGER.warn(msg, new FileNotFoundException(dataDir));
aResp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
catch (Exception details) {
throw new IOException(details.getMessage(), details);
}
}
}