/*
* 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.File;
import java.io.IOException;
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.dataset.DatasetUtils;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.LazyDataset;
import org.eclipse.january.dataset.SliceND;
import org.eclipse.january.io.ILazyLoader;
import org.eclipse.january.io.IMetaLoader;
import org.eclipse.january.metadata.IMetadata;
/**
* A class which can be extended when implementing IFileLoader
*/
public abstract class AbstractFileLoader implements IFileLoader, IMetaLoader {
/**
* Name prefix for an image dataset (should be followed by two digits, starting with 01)
*/
public static final String IMAGE_NAME_PREFIX = "image-";
/**
* Name format for an image dataset
*/
public static final String IMAGE_NAME_FORMAT = IMAGE_NAME_PREFIX + "%02d";
/**
* Default name for first image dataset
*/
public static final String DEF_IMAGE_NAME = IMAGE_NAME_PREFIX + "01";
/**
* Name for image stack
*/
public static final String STACK_NAME = "image-stack";
/**
* String to separate full file path or file name from dataset name
*/
public static final String FILEPATH_DATASET_SEPARATOR = ":";
protected String fileName = "";
public void setFile(final String fileName) {
this.fileName = fileName;
clearMetadata();
}
protected boolean loadMetadata = true;
protected IMetadata metadata;
protected boolean loadLazily = false;
abstract protected void clearMetadata();
@Override
public IMetadata getMetadata() {
return metadata;
}
@Override
public IDataHolder loadFile(IMonitor mon) throws ScanFileHolderException {
return loadFile();
}
@Override
public void setLoadMetadata(boolean willLoadMetadata) {
loadMetadata = willLoadMetadata;
}
@Override
public void setLoadAllLazily(boolean willLoadLazily) {
loadLazily = willLoadLazily;
}
@Override
public void loadMetadata(IMonitor mon) throws IOException {
if (metadata != null)
return;
boolean oldMeta = loadMetadata;
boolean oldLazily = loadLazily;
loadMetadata = true;
loadLazily = true;
try {
loadFile(mon);
} catch (ScanFileHolderException e) {
throw new IOException(e);
}
loadMetadata = oldMeta;
loadLazily = oldLazily;
}
protected class LazyLoaderStub implements ILazyLoader {
public static final long serialVersionUID = 5057544213374303912L;
private IFileLoader loader;
private String name;
public LazyLoaderStub() {
loader = null;
name = null;
}
public LazyLoaderStub(IFileLoader loader) {
this(loader, null);
}
/**
* @param loader
* @param name dataset name in data holder (can be null to signify first dataset)
*/
public LazyLoaderStub(IFileLoader loader, String name) {
this.loader = loader;
this.name = name;
if (loader != null) {
loader.setLoadAllLazily(false);
loader.setLoadMetadata(false);
}
}
public IFileLoader getLoader() {
return loader;
}
@Override
public IDataset getDataset(IMonitor mon, SliceND slice) throws IOException {
if (loader == null) {
return null;
}
IDataHolder holder = LoaderFactory.fetchData(fileName, loadMetadata);
if (holder != null) {
IDataset data = name == null ? holder.getDataset(0) : holder.getDataset(name);
if (data != null) {
return DatasetUtils.convertToDataset(data).getSliceView(slice);
}
}
try {
IDataHolder nHolder = loader.loadFile(mon);
if (holder != null) { // update old holder
for (String dn : nHolder.getNames()) {
holder.addDataset(dn, nHolder.getLazyDataset(dn));
}
holder.setMetadata(nHolder.getMetadata());
if (holder.getLoaderClass() == null) {
holder.setLoaderClass(loader.getClass());
}
} else {
if (nHolder.getFilePath() == null) {
nHolder.setFilePath(fileName);
}
if (nHolder.getLoaderClass() == null) {
nHolder.setLoaderClass(loader.getClass());
}
LoaderFactory.cacheData(nHolder);
holder = nHolder;
}
} catch (ScanFileHolderException e) {
throw new IOException(e);
}
IDataset data = name == null ? holder.getDataset(0) : holder.getDataset(name);
return data.getSliceView(slice);
}
@Override
public boolean isFileReadable() {
return new File(fileName).canRead();
}
}
protected LazyDataset createLazyDataset(String dName, int dtype, int[] shape, LazyLoaderStub l) {
return new LazyDataset(dName, dtype, shape, l);
}
protected LazyDataset createLazyDataset(String dName, String dhName, int dtype, int[] shape, IFileLoader loader) {
return new LazyDataset(dName, dtype, shape, new LazyLoaderStub(loader, dhName));
}
protected LazyDataset createLazyDataset(String dName, int dtype, int[] shape, IFileLoader loader) {
return createLazyDataset(dName, dName, dtype, shape, loader);
}
/**
* @param mon
* @return false if cancelled
*/
protected static boolean monitorIncrement(IMonitor mon) {
if (mon != null) {
mon.worked(1);
if (mon.isCancelled()) return false;
}
return true;
}
@Override
public void setAsyncLoad(boolean treeOnTop) {
throw new RuntimeException("Asynchronous loading is not supported!");
}
@Override
public boolean isLoading() {
throw new RuntimeException("Asynchronous loading is not supported!");
}
}