/* * org.openmicroscopy.shoola.env.ui.DownloadActivity * *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.env.ui; //Java imports import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import omero.model.OriginalFile; import org.openmicroscopy.shoola.env.config.Registry; import org.openmicroscopy.shoola.env.data.model.DeletableObject; import org.openmicroscopy.shoola.env.data.model.DownloadActivityParam; import omero.gateway.SecurityContext; import org.openmicroscopy.shoola.util.filter.file.CustomizedFileFilter; import org.openmicroscopy.shoola.util.filter.file.HTMLFilter; import org.openmicroscopy.shoola.util.filter.file.JPEGFilter; import org.openmicroscopy.shoola.util.filter.file.OMETIFFFilter; import org.openmicroscopy.shoola.util.filter.file.PNGFilter; import org.openmicroscopy.shoola.util.filter.file.TIFFFilter; import org.openmicroscopy.shoola.util.ui.UIUtilities; /** * Activity to download an image or file. * * @author Jean-Marie Burel      <a * href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      <a * href="mailto:donald@lifesci.dundee.ac.uk" * >donald@lifesci.dundee.ac.uk</a> * @version 3.0 <small> (<b>Internal version:</b> $Revision: $Date: $) </small> * @since 3.0-Beta4 */ public class DownloadActivity extends ActivityComponent { /** Open the file in the Browser. */ private static final String FILE = "file://"; /** The description of the activity when finished. */ private static final String DESCRIPTION = "File downloaded"; /** The description of the activity when cancelled. */ private static final String DESCRIPTION_CANCEL = "Download cancelled"; /** The text and extension added to the name of the file. */ public static final String LEGEND_TEXT = "_legend.txt"; /** The text and extension added to the name of the file. */ public static final String LEGEND_TEXT_CSV = "_legend.csv"; /** The parameters hosting information about the file to download. */ protected DownloadActivityParam parameters; /** The name of the file. */ protected String fileName; /** Reference to the file to load. */ protected File file; /** The local name of the file. */ private String localFileName; /** Overwrite if local file already exists */ private boolean overwrite = false; /** The supported file filters. */ private static final List<CustomizedFileFilter> FILTERS; static { FILTERS = new ArrayList<CustomizedFileFilter>(); FILTERS.add(new JPEGFilter()); FILTERS.add(new PNGFilter()); FILTERS.add(new HTMLFilter()); FILTERS.add(new TIFFFilter()); } /** * Returns the name of the file. * * @return See above. */ private String getFileName() { File folder = parameters.getFolder(); File directory = folder; directory = folder.getParentFile(); File[] files = directory.listFiles(); String dirPath = directory.getAbsolutePath() + File.separator; String value = folder.getName(); if (parameters.getFileName() != null) value = parameters.getFileName(); String extension = null; if (value != null && value.trim().length() > 0) { int lastDot = value.lastIndexOf("."); if (lastDot == -1) { // no extension specified. // get the extension from the file. String s = parameters.getOriginalFileName(); if (s.endsWith(OMETIFFFilter.OME_TIF) || s.endsWith(OMETIFFFilter.OME_TIFF)) extension = OMETIFFFilter.OME_TIFF; else { lastDot = s.lastIndexOf("."); if (lastDot != -1) extension = s.substring(lastDot, s.length()); } if (extension != null) value = value + extension; } return getFileName(files, value, value, dirPath, 1, extension); } value = parameters.getOriginalFileName(); ; if (value == null || value.length() == 0) return ""; return getFileName(files, value, value, dirPath, 1, null); } /** * Returns <code>true</code> if the file can be opened, <code>false</code> * otherwise. * * @param path * The path to handle. * @return See above. */ private boolean canOpenFile(String path) { Iterator<CustomizedFileFilter> i = FILTERS.iterator(); CustomizedFileFilter filter; while (i.hasNext()) { filter = i.next(); if (filter.accept(path)) return true; } return false; } /** * Creates a new instance. * * @param viewer * The viewer this data loader is for. Mustn't be * <code>null</code>. * @param registry * Convenience reference for subclasses. * @param ctx * The security context. * @param parameters * The parameters used to export the image. */ public DownloadActivity(UserNotifier viewer, Registry registry, SecurityContext ctx, DownloadActivityParam parameters) { super(viewer, registry, ctx); if (parameters == null) throw new IllegalArgumentException("Parameters not valid."); this.parameters = parameters; initialize("Download", parameters.getIcon()); File folder = parameters.getFolder(); fileName = getFileName(); if (folder.isDirectory()) localFileName = folder + File.separator + fileName; else localFileName = folder.toString(); messageLabel.setText(localFileName); this.overwrite = parameters.isOverwrite(); } /** * Creates a concrete loader. * * @see ActivityComponent#createLoader() */ protected UserNotifierLoader createLoader() { OriginalFile f = parameters.getFile(); File folder = parameters.getFolder(); if (folder.isDirectory()) file = new File(folder, fileName); else file = folder; registry.getLogger().debug(this, file.getAbsolutePath()); boolean load = true; if (file.exists() && !overwrite) load = false; switch (parameters.getIndex()) { case DownloadActivityParam.FILE_ANNOTATION: case DownloadActivityParam.ORIGINAL_FILE: case DownloadActivityParam.METADATA_FROM_IMAGE: loader = new FileLoader(viewer, registry, ctx, file, parameters.getId(), parameters.getIndex(), load, this); break; default: loader = new FileLoader(viewer, registry, ctx, file, f.getId() .getValue(), load, this); } return loader; } /** * Modifies the text of the component. * * @see ActivityComponent#notifyActivityEnd() */ protected void notifyActivityEnd() { type.setText(DESCRIPTION); String name = null; String legend = parameters.getLegend(); if (legend != null && legend.trim().length() > 0) { // Write the description if any File folder = parameters.getFolder(); File directory = folder.getParentFile(); BufferedWriter out = null; String n = UIUtilities.removeFileExtension(fileName); String ext = LEGEND_TEXT; String le = parameters.getLegendExtension(); if (le != null && le.length() > 0) ext = le; try { name = directory + File.separator + n; name += ext; out = new BufferedWriter(new FileWriter(name)); out.write(legend); out.close(); } catch (Exception e) { try { if (out != null) out.close(); } catch (Exception ex) { } } } if (localFileName == null) return; if (canOpenFile(localFileName)) { String url; if (UIUtilities.isMacOS()) url = FILE + localFileName; else url = FILE + "/" + localFileName; registry.getTaskBar().openURL(url); } if (parameters.getToDelete() != null) { List<DeletableObject> tmp = new ArrayList<DeletableObject>(); tmp.add(new DeletableObject(parameters.getToDelete())); DataObjectRemover eraser = new DataObjectRemover(viewer, registry, tmp, null); eraser.load(); } } /** * Modifies the text of the component. * * @see ActivityComponent#notifyActivityCancelled() */ protected void notifyActivityCancelled() { type.setText(DESCRIPTION_CANCEL); } /** * No-operation in this case. * * @see ActivityComponent#notifyActivityError() */ protected void notifyActivityError() {} }