/*- ******************************************************************************* * Copyright (c) 2011, 2016 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 * * Contributors: * Matthew Gerring - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.dawnsci.remotedataset.test.mock; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Matcher; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.IFileLoader; import org.eclipse.dawnsci.analysis.api.io.ILoaderService; import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException; import org.eclipse.dawnsci.hdf5.nexus.NexusFileFactoryHDF5; import org.eclipse.dawnsci.nexus.INexusFileFactory; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.dataset.LazyDataset; import org.eclipse.january.metadata.AxesMetadata; import org.eclipse.dawnsci.analysis.api.metadata.IDiffractionMetadata; import org.eclipse.january.metadata.IMetadata; /** * This mocks the loader service, only implementing dataset loading * where the dataset path is known. * * @author Matthew Gerring * */ public class LoaderServiceMock implements ILoaderService { private INexusFileFactory factory; public LoaderServiceMock() { this(new NexusFileFactoryHDF5()); } public LoaderServiceMock(INexusFileFactory nexusFileFactoryHDF5) { this.factory = nexusFileFactoryHDF5; } @Override public IDataHolder getData(String filePath, IMonitor monitor) throws Exception { return getData(filePath, true, monitor); } @Override public IDataHolder getData(String filePath, boolean lazily, IMonitor monitor) throws Exception { final File file = new File(filePath); if (file.isDirectory()) { return createFolderLoader(file, monitor); } else { if (isImageName(file.getName())) { return getImage(filePath, lazily, monitor); } return getNexusHolder(filePath, lazily, monitor); } } private IDataHolder createFolderLoader(File dir, IMonitor monitor) throws Exception { final IDataHolder ret = new MockDataHolder(factory, dir.getAbsolutePath()); final Map<String, List<String>> imageFilenames = new TreeMap<String, List<String>>(); imageFilenames.put("Image Stack", new ArrayList<String>(31)); if (dir.isDirectory()) { // Which it should be... final List<String> files = Arrays.asList(dir.list()); Collections.sort(files, new SortNatural<String>(true)); for (String fName : files) { if (isImageName(fName)) { final File f = new File(dir,fName); String name = "Image Stack"; imageFilenames.get(name).add(f.getAbsolutePath()); } } } if (imageFilenames.size() > 0) { for (String name : imageFilenames.keySet()) { final List<String> files = imageFilenames.get(name); if (files==null || files.size()<2) continue; MockImageStackLoader loader = new MockImageStackLoader(files, ret, monitor); LazyDataset lazyDataset = new LazyDataset(name, loader.getDType(), loader.getShape(), loader); ret.addDataset(name, lazyDataset); } } return ret; // Might be empty } private boolean isImageName(String fName) { return fName.toLowerCase().endsWith(".tif") || fName.toLowerCase().endsWith(".tiff") || fName.toLowerCase().endsWith(".png") || fName.toLowerCase().endsWith(".jpg") || fName.toLowerCase().endsWith(".jpeg") || fName.toLowerCase().endsWith(".gif"); } private IDataHolder getImage(String filePath, boolean lazily, IMonitor monitor) throws ScanFileHolderException { MockImageLoader tify = new MockImageLoader(filePath); return tify.loadFile(); } private IDataHolder getNexusHolder(String filePath, boolean lazily, IMonitor monitor) throws Exception{ return new MockDataHolder(factory, filePath); } @Override public IDataset getDataset(String filePath, IMonitor monitor) throws Exception { throw new Exception("This method is not implemented by "+getClass().getSimpleName()); } @Override public IDataset getDataset(String filePath, String datasetPath, IMonitor monitor) throws Exception { throw new Exception("This method is not implemented by "+getClass().getSimpleName()); } @Override public IMetadata getMetadata(String filePath, IMonitor monitor) throws Exception { throw new Exception("This method is not implemented by "+getClass().getSimpleName()); } private IDiffractionMetadata diffMetaData; @Override public IDiffractionMetadata getLockedDiffractionMetaData() { return diffMetaData; } @Override public IDiffractionMetadata setLockedDiffractionMetaData(IDiffractionMetadata diffMetaData) { IDiffractionMetadata old = this.diffMetaData; this.diffMetaData = diffMetaData; return old; } @Override public Collection<String> getSupportedExtensions() { // TODO Auto-generated method stub return Arrays.asList("h5", "nxs"); } @Override public void clearSoftReferenceCache() { } @Override public void clearSoftReferenceCache(String filePath) { } @Override public Matcher getStackMatcher(String fileName) { return null; } @Override public AxesMetadata getAxesMetadata(ILazyDataset parent, String path, Map<Integer, String> axesNames, boolean lazy) throws Exception { // TODO Auto-generated method stub return null; } @Override public Class<? extends IFileLoader> getLoaderClass(String extension) { return null; } @Override public AxesMetadata getAxesMetadata(ILazyDataset parent, String path, List<String>[] axesNames, boolean lazy) throws Exception { return null; } }