/* * $Id$ * * Copyright 2009 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.formats; // Java imports import java.io.File; import java.util.List; import loci.formats.FormatReader; import ome.formats.importer.IObservable; import ome.formats.importer.ImportCandidates; import ome.formats.importer.ImportConfig; import ome.formats.importer.ImportEvent; import ome.formats.importer.ImportLibrary; import ome.formats.importer.OMEROWrapper; import ome.formats.importer.util.ErrorHandler; // Was previously cli for sending debug text import ome.formats.importer.util.ErrorHandler.EXCEPTION_EVENT; import omero.model.Pixels; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * test fixture for importing files without a GUI. Sample usage: * * <pre> * OMEROMetadataStoreClient client = new OMEROMetadataStoreClient(sf); * OMEROImportFixture fixture = new OMEROImportFixture(client); * fixture.setUp(); * fixture.setFile(ResourceUtils.getFile("classpath:tinyTest.d3d.dv")); * fixture.setName(name); * fixture.doImport(); * List<Pixels> p = fixture.getPixels(); * fixture.tearDown(); * i.setName(name); * i = userSave(i); * </pre> * * This class is <em>not</em> thread safe. * * @author Josh Moore, josh.moore at gmx.de * @see OMEROMetadataStoreClient * @since 4.0 */ public class OMEROImportFixture { Logger log = LoggerFactory.getLogger(OMEROImportFixture.class); protected OMEROMetadataStoreClient store; private OMEROWrapper reader; private ImportLibrary library; private File file; private List<Pixels> pixels; private EXCEPTION_EVENT exception = null; @SuppressWarnings("unused") private String name; public OMEROImportFixture(OMEROMetadataStoreClient store, OMEROWrapper reader) { this.store = store; this.reader = reader; } /** * checks for the necessary fields and initializes the {@link ImportLibrary} * * @throws Exception if the import library could not be instantiated */ public void setUp() throws Exception { this.library = new ImportLibrary(store, reader); } /** * sets {@link ImportLibrary}, {@link OMEROMetadataStore}, and file array to * null. Also attempts to call {@link FormatReader#close()}. */ public void tearDown() { if (this.store != null) { this.store.logout(); this.store = null; } this.library = null; try { if (this.reader != null) { this.reader.close(); this.reader = null; } } catch (Exception e) { throw new RuntimeException(e); } finally { this.reader = null; } } /** * Provides one complete import cycle. * @param f the file to import * @param name the name (ignored) * @return the {@link Pixels} instance(s) created by the import * @throws Exception if the import failed */ public List<Pixels> fullImport(File f, String name) throws Exception { this.setUp(); try { this.setFile(f); this.setName(name); this.doImport(); return this.getPixels(); } finally { this.tearDown(); } } /** * Runs import by looping through all files and then calling * {@link ImportLibrary#importCandidates(ImportConfig, ImportCandidates)}. * @throws Exception if import failed in a way that is not handled by an {@link EXCEPTION_EVENT} */ public void doImport() throws Exception { String fileName = file.getAbsolutePath(); ImportConfig config = new ImportConfig(); ErrorHandler handler = new ErrorHandler(config) { @Override public void onUpdate(IObservable importLibrary, ImportEvent event) { // super.onUpdate(importLibrary, event); // Was previously cli.ErrorHandler, which sends feedback. if (event instanceof ImportEvent.IMPORT_DONE) { pixels = ((ImportEvent.IMPORT_DONE) event).pixels; } else if (event instanceof EXCEPTION_EVENT) { exception = (EXCEPTION_EVENT) event; } } }; ImportCandidates candidates = new ImportCandidates(reader, new String[]{fileName}, handler); library.addObserver(handler); library.importCandidates(config, candidates); } public void setFile(File file) { this.file = file; } public void setName(String name) { this.name = name; } /** * Accessor for the created pixels. Should be called before the next call to * {@link #doImport()} * @return the {@link Pixels} instance(s) created by the import * @throws Exception from an {@link EXCEPTION_EVENT} if the import failed */ public List<Pixels> getPixels() throws Exception { if (exception != null) { throw exception.exception; } return this.pixels; } }