ResampledReader

package test;
import com.interactive.intviewerapi.data.IFieldDesc;
import com.interactive.intviewerapi.data.query.SeismicRangeQuery;
import com.interactive.intviewerapi.data.seismic.ISeismicReader;
import com.interactive.intviewerapi.data.seismic.ISeismicStatistics;
import com.interactive.intviewerapi.data.seismic.ITrace;
/**
 * Implementation or new reader. We just return the result from the
 * originalReader except in the methods that return the sample rate and the
 * number of samples per trace.
 */
public class ResampledReader implements ISeismicReader {
    private ISeismicReader originalReader;
    private float samplingFactor;
    private final ISeismicStatistics stats;
    public ResampledReader(ISeismicStatistics stats, ISeismicReader originalReader, float samplingFactor) {
        this.originalReader = originalReader;
        this.samplingFactor = samplingFactor;
        this.stats = stats;
    }
    @Override
    public int getNumberOfTraces() {
        return originalReader.getNumberOfTraces();
    }
    @Override
    public ITrace getTrace(int traceIndex) throws IllegalArgumentException {
        return new ResampledTrace(originalReader.getTrace(traceIndex));
    }
    @Override
    public IFieldDesc[] getTraceHeaderFields() {
        return originalReader.getTraceHeaderFields();
    }
    @Override
    public IFieldDesc getTraceHeaderField(String name) {
        return originalReader.getTraceHeaderField(name);
    }
    @Override
    public int findFirstTrace(SeismicRangeQuery query) {
        return originalReader.findFirstTrace(query);
    }
    @Override
    public double getPreviousValue(String keyName, double current) {
        return originalReader.getPreviousValue(keyName, current);
    }
    @Override
    public double getNextValue(String keyName, double current) {
        return originalReader.getNextValue(keyName, current);
    }
    @Override
    public ISeismicStatistics getDataStatistics() {
        return stats;
    }
    /**
     * Implementation of trace. The data conversion is done in the getSamples
     * method.
     */
    private class ResampledTrace implements ITrace {
        private ITrace originalTrace;
        public ResampledTrace(ITrace originalTrace) {
            this.originalTrace = originalTrace;
        }
        @Override
        public Number getHeader(int id) {
            return originalTrace.getHeader(id);
        }
        @Override
        public int getSamples(float[] buf) {
            int originalSampleCount = originalTrace.getSize();
            float[] originalSamples = new float[originalSampleCount];
            originalTrace.getSamples(originalSamples);
            int newSampleCount = this.getSize();
            for (int i = 0; i < newSampleCount; i++) {
                int index = (int) (i * samplingFactor + 0.5);
                if (index >= originalSampleCount) {
                    index = originalSampleCount - 1;
                }
                buf[i] = originalSamples[index];
            }
            return newSampleCount;
        }
        @Override
        public void setSamples(float[] buf) {
            throw new UnsupportedOperationException("We don't support writing here.");
        }
        @Override
        public int getSize() {
            return (int) (originalTrace.getSize() * samplingFactor + 0.5);
        }
        @Override
        public void putHeader(Integer intgr, Number number) {
            throw new UnsupportedOperationException("We don't support writing here.");
        }
    }
}