All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nom.tam.fits.Data Maven / Gradle / Ivy

package nom.tam.fits;

import static nom.tam.util.LoggerHelper.getLogger;

/*
 * #%L
 * nom.tam FITS library
 * %%
 * Copyright (C) 2004 - 2015 nom-tam-fits
 * %%
 * This is free and unencumbered software released into the public domain.
 * 
 * Anyone is free to copy, modify, publish, use, compile, sell, or
 * distribute this software, either in source code form or as a compiled
 * binary, for any purpose, commercial or non-commercial, and by any
 * means.
 * 
 * In jurisdictions that recognize copyright laws, the author or authors
 * of this software dedicate any and all copyright interest in the
 * software to the public domain. We make this dedication for the benefit
 * of the public at large and to the detriment of our heirs and
 * successors. We intend this dedication to be an overt act of
 * relinquishment in perpetuity of all present and future rights to this
 * software under copyright law.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 * #L%
 */

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import nom.tam.util.ArrayDataInput;
import nom.tam.util.ArrayDataOutput;
import nom.tam.util.RandomAccess;

/**
 * This class provides methods to access the data segment of an HDU.
 * 

* This is the object which contains the actual data for the HDU. *

*
    *
  • For images and primary data this is a simple (but possibly * multi-dimensional) primitive array. When group data is supported it will be a * possibly multidimensional array of group objects. *
  • For ASCII data it is a two dimensional Object array where each of the * constituent objects is a primitive array of length 1. *
  • For Binary data it is a two dimensional Object array where each of the * constituent objects is a primitive array of arbitrary (more or less) * dimensionality. *
*/ public abstract class Data implements FitsElement { private static final Logger LOG = getLogger(Data.class); private static final int FITS_BLOCK_SIZE_MINUS_ONE = FitsFactory.FITS_BLOCK_SIZE - 1; /** * The starting location of the data when last read */ protected long fileOffset = -1; /** * The size of the data when last read */ protected long dataSize; /** * The input stream used. */ protected RandomAccess input; /** * Modify a header to point to this data, this differs per subclass, they * all need oder provided different informations to the header. Basically * they describe the structure of this data object. * * @param head * header to fill with the data from the current data object * @throws FitsException * if the operation fails */ abstract void fillHeader(Header head) throws FitsException; /** * @return the data array object. * @throws FitsException * if the data could not be gathered . */ public abstract Object getData() throws FitsException; /** * @return the file offset */ @Override public long getFileOffset() { return this.fileOffset; } /** * @return the non-FITS data object. * @throws FitsException * if the data could not be gathered . */ public Object getKernel() throws FitsException { return getData(); } /** * @return the size of the data element in bytes. */ @Override public long getSize() { return FitsUtil.addPadding(getTrueSize()); } abstract long getTrueSize(); @Override public abstract void read(ArrayDataInput in) throws FitsException; @Override public boolean reset() { try { FitsUtil.reposition(this.input, this.fileOffset); return true; } catch (Exception e) { LOG.log(Level.SEVERE, "Unable to reset", e); return false; } } @Override public void rewrite() throws FitsException { if (!rewriteable()) { throw new FitsException("Illegal attempt to rewrite data"); } FitsUtil.reposition(this.input, this.fileOffset); write((ArrayDataOutput) this.input); try { ((ArrayDataOutput) this.input).flush(); } catch (IOException e) { throw new FitsException("Error in rewrite flush: " + e); } } @Override public boolean rewriteable() { return this.input != null && this.fileOffset >= 0 && (getTrueSize() + FITS_BLOCK_SIZE_MINUS_ONE) / FitsFactory.FITS_BLOCK_SIZE == (this.dataSize + FITS_BLOCK_SIZE_MINUS_ONE) / FitsFactory.FITS_BLOCK_SIZE; } /** * Set the fields needed for a re-read. * * @param o * reread information. */ protected void setFileOffset(ArrayDataInput o) { if (o instanceof RandomAccess) { this.fileOffset = FitsUtil.findOffset(o); this.dataSize = getTrueSize(); this.input = (RandomAccess) o; } } /** * Write the data -- including any buffering needed * * @param o * The output stream on which to write the data. */ @Override public abstract void write(ArrayDataOutput o) throws FitsException; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy