package uk.ac.diamond.scisoft.xpdf.operations;
import org.eclipse.dawnsci.analysis.api.processing.OperationData;
import org.eclipse.dawnsci.analysis.api.processing.OperationException;
import org.eclipse.dawnsci.analysis.api.processing.OperationRank;
import org.eclipse.dawnsci.analysis.api.processing.model.IOperationModel;
import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation;
import org.eclipse.january.dataset.IDataset;
import uk.ac.diamond.scisoft.xpdf.XPDFMetadataImpl;
import uk.ac.diamond.scisoft.xpdf.metadata.XPDFMetadata;
/**
* Insert any XPDF related metadata.
* @author Timothy Spain timothy.spain@diamond.ac.uk
*
* @param <T>
* the Operation Model.
* @param <D>
* the Operation data.
*/
public abstract class XPDFInsertXMetadataOperation <T extends IOperationModel, D extends OperationData> extends
AbstractOperation<T, D> {
@Override
public String getId() {
return "uk.ac.diamond.scisoft.xpdf.operations.XPDFInsertXMetadataOperation";
}
@Override
public OperationRank getInputRank() {
return OperationRank.ANY;
}
@Override
public OperationRank getOutputRank() {
return OperationRank.SAME;
}
protected XPDFMetadataImpl getAndRemoveXPDFMetadata( IDataset input) {
XPDFMetadataImpl theXPDFMetadata = (XPDFMetadataImpl) input.getFirstMetadata(XPDFMetadata.class);
// Create a new metadata if there is not one
if (theXPDFMetadata == null)
theXPDFMetadata = new XPDFMetadataImpl();
input.clearMetadata(XPDFMetadata.class);
return theXPDFMetadata;
}
/**
* Throws an {@link OperationException} if the data and auxillary data are not the same size and shape.
* @param data
* @param aux
* @throws OperationException
*/
protected void checkDataAndAuxillaryDataMatch(IDataset data, IDataset aux) throws OperationException {
if (data.getSize() != aux.getSize()) throw new OperationException(this, "Data and auxillary data sizes do not match.");
if (data.getShape().length != aux.getShape().length) throw new OperationException(this, "Data and auxillary data dimensionalities do not match.");
for (int iDimension = 0; iDimension < data.getShape().length; iDimension++) {
if (data.getShape()[iDimension] != aux.getShape()[iDimension]) throw new OperationException(this, "Data and auxillaty data dimensional extent mismatch.");
}
}
}