/* * Copyright (c) 2012 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipInputStream; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.IFileLoader; import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException; import org.eclipse.january.IMonitor; import org.eclipse.january.io.IMetaLoader; import org.eclipse.january.metadata.IMetadata; import org.eclipse.january.metadata.Metadata; import uk.ac.diamond.scisoft.analysis.utils.FileUtils; public class CompressedLoader extends AbstractFileLoader { private IFileLoader loader; public CompressedLoader() { } public CompressedLoader(final String file) throws Exception { setFile(file); initFile(); } @Override protected void clearMetadata() { } private static final Pattern ZIP_PATH = Pattern.compile("(.+)\\.(.+)\\."+LoaderFactory.getZipExpression()); public void initFile() throws Exception { final Matcher m = ZIP_PATH.matcher((new File(fileName)).getName()); if (m.matches()) { final String name = m.group(1); final String ext = m.group(2); final String zipType = m.group(3); final Class<? extends InputStream> clazz = LoaderFactory.getZipStream(zipType); final Constructor<? extends InputStream> c = clazz.getConstructor(InputStream.class); final InputStream in = c.newInstance(new FileInputStream(fileName)); // Hack zip files if (in instanceof ZipInputStream) { ((ZipInputStream)in).getNextEntry(); } final File tmp = File.createTempFile(name, "."+ext); tmp.deleteOnExit(); // This is slow and unnecessary. Should refactor LoaderFactory to // work either from a file path or in memory representation. FileUtils.write(new BufferedInputStream(in), tmp); final Class<? extends IFileLoader> lclass = LoaderFactory.getLoaderClass(ext); this.loader = LoaderFactory.getLoader(lclass, tmp.getAbsolutePath()); } } @Override public IDataHolder loadFile() throws ScanFileHolderException { return loader.loadFile(); } @Override public IDataHolder loadFile(IMonitor mon) throws ScanFileHolderException { return loader.loadFile(mon); } @Override public void loadMetadata(IMonitor mon) throws IOException { try { loader.loadFile(mon); } catch (ScanFileHolderException e) { throw new IOException(e); } } @Override public IMetadata getMetadata() { if (loader instanceof IMetaLoader) return ((IMetaLoader)loader).getMetadata(); return new Metadata(); } }