/*
* Copyright (C) 2009-2014 University of Dundee & Open Microscopy Environment.
* All rights reserved.
*
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.formats.importer.cli;
import static ome.formats.importer.ImportEvent.*;
import ome.formats.importer.IObservable;
import ome.formats.importer.IObserver;
import ome.formats.importer.ImportEvent;
import omero.model.IObject;
import omero.model.Pixels;
import org.apache.commons.lang.time.DurationFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Basic import process monitor that writes information to the log.
*
* @author Chris Allan <callan@glencoesoftware.com>
*
*/
public class LoggingImportMonitor implements IObserver
{
private static Logger log = LoggerFactory.getLogger(LoggingImportMonitor.class);
private final ImportSummary importSummary = new ImportSummary();
public void update(IObservable importLibrary, ImportEvent event)
{
if (event instanceof IMPORT_DONE) {
IMPORT_DONE ev = (IMPORT_DONE) event;
log.info(event.toLog());
// send the import results to stdout
// to enable external tools integration
importSummary.outputGreppableResults(ev);
importSummary.update(ev);
} else if (event instanceof IMPORT_SUMMARY) {
IMPORT_SUMMARY ev = (IMPORT_SUMMARY) event;
importSummary.setTime(ev.importTime);
importSummary.setErrors(ev.errorCount);
importSummary.report();
} else if (event instanceof FILESET_UPLOAD_PREPARATION) {
log.info(event.toLog());
} else if (event instanceof FILESET_UPLOAD_START) {
log.info(event.toLog());
} else if (event instanceof FILESET_UPLOAD_END) {
log.info(event.toLog());
} else if (event instanceof FILE_UPLOAD_STARTED) {
FILE_UPLOAD_STARTED ev = (FILE_UPLOAD_STARTED) event;
log.info(event.toLog() + ": " + ev.filename);
} else if (event instanceof FILE_UPLOAD_COMPLETE) {
FILE_UPLOAD_COMPLETE ev = (FILE_UPLOAD_COMPLETE) event;
log.info(event.toLog() + ": " + ev.filename);
importSummary.update(ev);
} else if (event instanceof PROGRESS_EVENT) {
log.info(event.toLog());
} else if (log.isDebugEnabled()) {
log.debug(event.toLog());
}
}
/**
* Placeholder used for printing a final import summary.
*/
private class ImportSummary
{
private final static String PLATE_CLASS = "PlateI";
private int createdFilesets;
private int createdPlates;
private int errors;
private int importedImages;
private int uploadedFiles;
/** Time taken by import in milliseconds. **/
private long time;
/**
* Updates the state of the object using information held by given even
* type.
*
* @param event An import event.
*/
public void update(IMPORT_DONE event) {
importedImages += event.pixels.size();
createdFilesets++;
for (IObject object : event.objects) {
if (PLATE_CLASS.equals(object.getClass().getSimpleName())) {
createdPlates++;
}
}
}
/**
* Updates the state of the object using information held by given event
* type.
*
* @param event An import event.
*/
public void update(FILE_UPLOAD_COMPLETE event) {
uploadedFiles++;
}
/**
* Sets the import error count to the given number.
*
* @param errors Count.
*/
public void setErrors(int errors) {
this.errors = errors;
}
/**
* Sets the time taken by import to given value.
*
* @param time The time in milliseconds.
*/
public void setTime(long time) {
this.time = time;
}
/**
* Prints out the import summary to stderr.
*/
public void report() {
StringBuilder sb = new StringBuilder();
sb.append("\n==> Summary\n");
sb.append(entityCountToString("file", uploadedFiles));
sb.append(" uploaded, ");
sb.append(entityCountToString("fileset", createdFilesets));
if (createdPlates != 0) {
sb.append(", ");
sb.append(entityCountToString("plate", createdPlates));
}
sb.append(" created, ");
sb.append(entityCountToString("image", importedImages));
sb.append(" imported, ");
sb.append(entityCountToString("error", errors));
sb.append(String.format(" in %s\n",
DurationFormatUtils.formatDurationHMS(time)));
System.err.print(sb.toString());
}
/**
* Returns a string with a digit and singular/plural form of the
* provided entity name (e.g. "3 apples", "1 car").
*
* @param name The name of the entity used in the output.
* @param count The number of entity elements.
* @return See above.
*/
private String entityCountToString(String name, int count) {
return String.format("%d %s%s", count, name, count != 1 ? "s" : "");
}
/**
* Displays a list of successfully imported Pixels IDs on standard
* output.
*
* Note that this behavior is intended for other command line tools to
* pipe/grep the import results, and should be kept as is.
*
* @param ev the end of import event.
*/
void outputGreppableResults(IMPORT_DONE ev) {
System.err.println("Imported pixels:");
for (Pixels p : ev.pixels) {
System.out.println(p.getId().getValue());
}
System.err.println("Other imported objects:");
System.err.print("Fileset:");
System.err.println(ev.fileset.getId().getValue());
for (IObject object : ev.objects) {
if (object != null && object.getId() != null) {
// Not printing to stdout since the contract at the moment
// is that only pixel IDs hit stdout.
String kls = object.getClass().getSimpleName();
if (kls.endsWith("I")) {
kls = kls.substring(0,kls.length()-1);
}
System.err.print(kls);
System.err.print(":");
System.err.println(object.getId().getValue());
}
}
}
}
}