/* * #%L * BSD implementations of Bio-Formats readers and writers * %% * Copyright (C) 2005 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * #L% */ package loci.formats.tools; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JFrame; import javax.swing.border.EmptyBorder; import loci.common.Constants; import loci.formats.FormatException; import loci.formats.FormatTools; import loci.formats.IFormatReader; import loci.formats.ImageReader; import loci.formats.cache.ByteArraySource; import loci.formats.cache.Cache; import loci.formats.cache.CacheEvent; import loci.formats.cache.CacheListener; import loci.formats.cache.CrosshairStrategy; import loci.formats.cache.ICacheSource; import loci.formats.cache.ICacheStrategy; import loci.formats.cache.RectangleStrategy; import loci.formats.gui.BufferedImageSource; import loci.formats.gui.CacheComponent; /** * CacheConsole provides an interactive interpreter for * testing the Bio-Formats caching implementation. */ public final class CacheConsole { // -- Constructor -- private CacheConsole() { } // -- Main method -- /** Interactive interpreter for testing Bio-Formats caching implementation. */ public static void main(String[] args) throws FormatException, IOException { if (args.length < 1) { System.out.println("Please specify a filename containing image data."); System.exit(1); } ImageReader reader = new ImageReader(); String id = args[0]; System.out.println("Reading " + id); reader.setId(id); System.out.println("Initializing cache"); final Cache cache = new Cache( new CrosshairStrategy(getLengths(reader)), new BufferedImageSource(reader), true); CacheListener l = new CacheListener() { @Override public void cacheUpdated(CacheEvent e) { int type = e.getType(); int ndx = e.getIndex(); int[] len, pos; switch (type) { case CacheEvent.SOURCE_CHANGED: printSource("source ->", cache); break; case CacheEvent.STRATEGY_CHANGED: printStrategy("strategy ->", cache); break; case CacheEvent.POSITION_CHANGED: len = cache.getStrategy().getLengths(); pos = FormatTools.rasterToPosition(len, ndx); printArray("pos ->", pos); break; case CacheEvent.PRIORITIES_CHANGED: printArray("priorities ->", cache.getStrategy().getPriorities()); break; case CacheEvent.ORDER_CHANGED: printOrder("order ->", cache); break; case CacheEvent.RANGE_CHANGED: printArray("range ->", cache.getStrategy().getRange()); break; case CacheEvent.OBJECT_LOADED: len = cache.getStrategy().getLengths(); pos = FormatTools.rasterToPosition(len, ndx); printArray("loaded:", pos); break; case CacheEvent.OBJECT_DROPPED: len = cache.getStrategy().getLengths(); pos = FormatTools.rasterToPosition(len, ndx); printArray("dropped:", pos); break; } } }; cache.addCacheListener(l); BufferedReader r = new BufferedReader(new InputStreamReader(System.in, Constants.ENCODING)); System.out.println("Entering Bio-Formats caching test console"); while (true) { System.out.print("> "); String cmd = r.readLine().trim(); if (cmd.equals("")) continue; else if (cmd.startsWith("c")) { // cache cache.recache(); } else if (cmd.startsWith("e") || cmd.startsWith("q")) break; // exit/quit else if (cmd.startsWith("g")) { // gui String[] axes = {"Z", "C", "T"}; CacheComponent widget = new CacheComponent(cache, axes, id); widget.setBorder(new EmptyBorder(15, 15, 15, 15)); JFrame frame = new JFrame("Cache controls"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setContentPane(widget); frame.pack(); frame.setVisible(true); } else if (cmd.startsWith("h")) { // help System.out.println("Available commands:"); System.out.println( " cache -- begins loading planes into the cache"); System.out.println( " gui -- pops up a GUI to configure the cache"); System.out.println(" info -- displays the cache state"); System.out.println(" position -- changes the current position"); System.out.println(" strategy -- changes the cache strategy"); System.out.println(" source -- changes the cache source"); System.out.println(" priority -- changes the cache priorities"); System.out.println(" order -- changes the cache order"); System.out.println(" range -- changes the cache ranges"); System.out.println(" read -- gets a plane from the cache"); System.out.println(" exit -- quits the interpreter"); } else if (cmd.startsWith("i")) { // info // output dimensional position printArray("pos =", cache.getCurrentPos()); // output source information ICacheSource source = cache.getSource(); printSource("source =", cache); System.out.println("object count = " + source.getObjectCount()); // output strategy information ICacheStrategy strategy = cache.getStrategy(); printStrategy("strategy =", cache); printArray("priorities =", strategy.getPriorities()); printOrder("order =", cache); printArray("range =", strategy.getRange()); printArray("lengths =", strategy.getLengths()); } else if (cmd.startsWith("o")) { // order System.out.println(ICacheStrategy.CENTERED_ORDER + " => centered"); System.out.println(ICacheStrategy.FORWARD_ORDER + " => forward"); System.out.println(ICacheStrategy.BACKWARD_ORDER + " => backward"); System.out.print("Z: "); int z = Integer.parseInt(r.readLine().trim()); System.out.print("C: "); int c = Integer.parseInt(r.readLine().trim()); System.out.print("T: "); int t = Integer.parseInt(r.readLine().trim()); ICacheStrategy strategy = cache.getStrategy(); strategy.setOrder(z, 0); strategy.setOrder(c, 1); strategy.setOrder(t, 2); } else if (cmd.startsWith("po")) { // position System.out.print("Z: "); int z = Integer.parseInt(r.readLine().trim()); System.out.print("C: "); int c = Integer.parseInt(r.readLine().trim()); System.out.print("T: "); int t = Integer.parseInt(r.readLine().trim()); cache.setCurrentPos(new int[] {z, c, t}); } else if (cmd.startsWith("pr")) { // priority System.out.println(ICacheStrategy.MIN_PRIORITY + " => min priority"); System.out.println(ICacheStrategy.LOW_PRIORITY + " => low priority"); System.out.println( ICacheStrategy.NORMAL_PRIORITY + " => normal priority"); System.out.println(ICacheStrategy.HIGH_PRIORITY + " => high priority"); System.out.println(ICacheStrategy.MAX_PRIORITY + " => max priority"); System.out.print("Z: "); int z = Integer.parseInt(r.readLine().trim()); System.out.print("C: "); int c = Integer.parseInt(r.readLine().trim()); System.out.print("T: "); int t = Integer.parseInt(r.readLine().trim()); ICacheStrategy strategy = cache.getStrategy(); strategy.setPriority(z, 0); strategy.setPriority(c, 1); strategy.setPriority(t, 2); } else if (cmd.startsWith("ra")) { // range System.out.print("Z: "); int z = Integer.parseInt(r.readLine().trim()); System.out.print("C: "); int c = Integer.parseInt(r.readLine().trim()); System.out.print("T: "); int t = Integer.parseInt(r.readLine().trim()); cache.getStrategy().setRange(z, 0); cache.getStrategy().setRange(c, 1); cache.getStrategy().setRange(t, 2); } else if (cmd.startsWith("re")) { // read System.out.print("Z: "); int z = Integer.parseInt(r.readLine().trim()); System.out.print("C: "); int c = Integer.parseInt(r.readLine().trim()); System.out.print("T: "); int t = Integer.parseInt(r.readLine().trim()); System.out.println("Retrieving Z" + z + "-C" + c + "-T" + t); Object o = cache.getObject(new int[] {z, c, t}); System.out.println(o); } else if (cmd.startsWith("so")) { // source System.out.println("0: BufferedImage"); System.out.println("1: byte array"); System.out.print("> "); int n = Integer.parseInt(r.readLine().trim()); switch (n) { case 0: cache.setSource(new BufferedImageSource(reader)); break; case 1: cache.setSource(new ByteArraySource(reader)); break; default: System.out.println("Unknown source: " + n); } } else if (cmd.startsWith("st")) { // strategy System.out.println("0: crosshair"); System.out.println("1: rectangle"); System.out.print("> "); int n = Integer.parseInt(r.readLine().trim()); int[] zct = getLengths(reader); ICacheStrategy strategy = null; switch (n) { case 0: strategy = new CrosshairStrategy(zct); break; case 1: strategy = new RectangleStrategy(zct); break; default: System.out.println("Unknown strategy: " + n); } if (strategy != null) { ICacheStrategy old = cache.getStrategy(); int[] priorities = old.getPriorities(); int[] range = old.getRange(); int[] order = old.getOrder(); for (int i=0; i<zct.length; i++) { strategy.setPriority(priorities[i], i); strategy.setRange(range[i], i); strategy.setOrder(order[i], i); } cache.setStrategy(strategy); } } else System.out.println("Unknown command: " + cmd); } reader.close(); } // -- Helper methods -- /** Helper utility for outputing contents of an int array, used by main. */ private static final void printArray(String prefix, int[] array) { System.out.print(prefix); if (array == null) System.out.println(" null"); else { for (int i=0; i<array.length; i++) System.out.print(" " + array[i]); System.out.println(); } } /** Helper utility for outputing cache's associated source, used by main. */ private static final void printSource(String prefix, Cache cache) { ICacheSource source = cache.getSource(); System.out.print(prefix + " "); Class sourceClass = source.getClass(); if (sourceClass == BufferedImageSource.class) { System.out.println("BufferedImage"); } else if (sourceClass == ByteArraySource.class) { System.out.println("byte array"); } else System.out.println("unknown"); } /** Helper utility for outputing cache's associated strategy, used by main. */ private static final void printStrategy(String prefix, Cache cache) { ICacheStrategy strategy = cache.getStrategy(); System.out.print(prefix + " "); Class strategyClass = strategy.getClass(); if (strategyClass == CrosshairStrategy.class) { System.out.println("crosshair"); } else if (strategyClass == RectangleStrategy.class) { System.out.println("rectangle"); } else System.out.println("unknown"); } /** Helper utility for outputing cache strategy's order, used by main. */ private static final void printOrder(String prefix, Cache cache) { ICacheStrategy strategy = cache.getStrategy(); int[] order = strategy.getOrder(); System.out.print(prefix); for (int i=0; i<order.length; i++) { switch (order[i]) { case ICacheStrategy.CENTERED_ORDER: System.out.print(" C"); break; case ICacheStrategy.FORWARD_ORDER: System.out.print(" F"); break; case ICacheStrategy.BACKWARD_ORDER: System.out.print(" B"); break; default: System.out.print(" ?"); } } System.out.println(); } /** Helper utility for constructing lengths array, used by main. */ private static final int[] getLengths(IFormatReader r) { return new int[] {r.getSizeZ(), r.getSizeC(), r.getSizeT()}; } }