/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * 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 * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.operator.nio.file; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.ObjectStreamException; import java.io.WriteAbortedException; import com.rapidminer.operator.Annotations; import com.rapidminer.operator.OperatorException; import com.rapidminer.operator.ResultObjectAdapter; import com.rapidminer.tools.Tools; /** * * This class represents buffers, files or streams that can be parsed by Operators. * * @author Nils Woehler, Marius Helf * */ public abstract class FileObject extends ResultObjectAdapter { private static final long serialVersionUID = 1L; /** * Open Stream to read data in this Object. * * @throws OperatorException */ public abstract InputStream openStream() throws OperatorException; /** * Returns the data as a file. Maybe slow if underlying implementation needs to copy the data * into the file first. This file should be used only for reading. Writing to this file has an * undefined effect. * * @throws OperatorException */ public abstract File getFile() throws OperatorException; /** * Returns the size of the related file in number of bytes. * * @throws OperatorException */ public abstract long getLength() throws OperatorException; @Override public String getName() { return "File"; } /** * Returns the filename of this file object.<br/> * <br/> * If the {@link Annotations#KEY_FILENAME} annotation is defined, returns it. Otherwise, tries * to retrieve the {@link Annotations#KEY_SOURCE} annotation and extract a filename from it.<br/> * <br/> * Returns null if none of the above works. */ public String getFilename() { String filename = getAnnotations().getAnnotation(Annotations.KEY_FILENAME); if (filename == null) { filename = getAnnotations().getAnnotation(Annotations.KEY_SOURCE); if (filename != null) { filename = filename.replaceAll(".*[/\\\\]([^/\\\\\\?]*).*", "$1"); } } return filename; } protected Object writeReplace() throws ObjectStreamException { if (this instanceof BufferedFileObject) { return this; } InputStream fileInputStream = null; try { fileInputStream = openStream(); return new BufferedFileObject(Tools.readInputStream(fileInputStream)); } catch (OperatorException e) { throw new WriteAbortedException("Could not write FileObject", e); } catch (IOException e) { throw new WriteAbortedException("Could not write FileObject", e); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { } } } } }