package ncsa.hdf.object.fits;
import java.io.DataInput;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import ncsa.hdf.object.Dataset;
import ncsa.hdf.object.Datatype;
import ncsa.hdf.object.FileFormat;
import ncsa.hdf.object.Group;
import ncsa.hdf.object.HObject;
import nom.tam.fits.AsciiTableHDU;
import nom.tam.fits.BasicHDU;
import nom.tam.fits.BinaryTableHDU;
import nom.tam.fits.Fits;
import nom.tam.fits.ImageHDU;
import nom.tam.fits.RandomGroupsHDU;
import nom.tam.fits.TableHDU;
public class FitsFile extends FileFormat
{
private static final long serialVersionUID = -1965689032980605791L;
private MutableTreeNode rootNode;
private Fits fitsFile;
private static boolean isFileOpen;
this("");
}
super(pathname);
isReadOnly = true;
isFileOpen = false;
this.fid = -1;
try { fitsFile = new Fits(fullFileName); }
catch (Exception ex) {}
}
@Override
public boolean isThisType(FileFormat fileformat) {
return (fileformat instanceof FitsFile);
}
@Override
{
boolean is_fits = false;
RandomAccessFile raf = null;
try { raf = new RandomAccessFile(filename, "r"); }
catch (Exception ex) { raf = null; }
if (raf == null) {
try { raf.close();} catch (Exception ex) {}
return false;
}
byte[] header = new byte[80];
try { raf.read(header); }
catch (Exception ex) { header = null; }
if (header != null)
{
String front = new String(header, 0, 9);
if (!front.startsWith("SIMPLE =")) {
try { raf.close();} catch (Exception ex) {}
return false;
}
String back = new String(header, 9, 70);
back = back.trim();
if ((back.length() < 1) || (back.charAt(0) != 'T')) {
try { raf.close();} catch (Exception ex) {}
return false;
}
is_fits = true;;
}
try { raf.close();} catch (Exception ex) {}
return is_fits;
}
@Override
throws Exception {
return new FitsFile(filename);
}
@Override
public int open()
throws Exception {
if (!isFileOpen) {
isFileOpen = true;
rootNode = loadTree();
}
return 0;
}
long[] oid = {0};
FitsGroup rootGroup = new FitsGroup(
this,
"/",
null,
null,
oid);
DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootGroup) {
private static final long serialVersionUID = 5556789624491863365L;
@Override
public boolean isLeaf() {
return false; }
};
if (fitsFile == null) {
return root;
}
BasicHDU[] hdus = null;
try { hdus = fitsFile.read(); }
catch (Exception ex) {}
if (hdus == null) {
return root;
}
int n = hdus.length;
int nImageHDU = 0;
int nTableHDU = 0;
String hduName = null;
BasicHDU hdu = null;
for (int i=0; i<n; i++) {
hdu = hdus[i];
hduName = null;
if (hdu instanceof ImageHDU) {
hduName = "ImageHDU #"+nImageHDU++;
} else if (hdu instanceof RandomGroupsHDU) {
hduName = "RandomGroupsHDU #"+nImageHDU++;
} else if (hdu instanceof TableHDU) {
if (hdu instanceof AsciiTableHDU) {
hduName = "AsciiTableHDU #"+nTableHDU++;
} else if (hdu instanceof BinaryTableHDU) {
hduName = "BinaryTableHDU #"+nTableHDU++;
} else {
hduName = "TableHDU #"+nTableHDU++;
}
}
if (hduName != null) {
oid[0] = hdu.hashCode();
FitsDataset d = new FitsDataset(this, hdu, hduName, oid);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(d);
root.add( node );
rootGroup.addToMemberList(d);
}
}
return root;
}
@Override
public void close()
throws IOException {
if (fitsFile == null) {
return;
}
DataInput di = fitsFile.getStream();
if (di instanceof InputStream) {
((InputStream)di).close();
}
}
@Override
return rootNode;
}
return fitsFile;
}
@Override
public Group
createGroup(String name, Group pgroup)
throws Exception {
throw new UnsupportedOperationException("Unsupported operation for Fits.");
}
@Override
int tclass,
int tsize,
int torder,
int tsign) throws Exception {
throw new UnsupportedOperationException("Unsupported operation for Fits.");
}
@Override
int tclass,
int tsize,
int torder,
int tsign,
String name) throws Exception
{
throw new UnsupportedOperationException("Unsupported operation for Fits.");
}
@Override
String name,
Group pgroup,
Datatype type,
long[] dims,
long[] maxdims,
long[] chunks,
int gzip,
Object fillValue,
Object data) throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
String name,
Group pgroup,
Datatype type,
long[] dims,
long[] maxdims,
long[] chunks,
int gzip,
int ncomp,
int intelace,
Object data) throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
public void delete(HObject obj)
throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
public TreeNode
copy(HObject srcObj, Group dstGroup, String dstName)
throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
private TreeNode
copyDataset(Dataset srcDataset, FitsGroup pgroup)
throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
private TreeNode
copyGroup(FitsGroup srcGroup, FitsGroup pgroup)
throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
throw new UnsupportedOperationException("Unsupported operation.");
}
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
public void writeAttribute(HObject obj, ncsa.hdf.object.Attribute attr,
boolean attrExisted) throws Exception {
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
{
String ver = "Fits Java (version 2.4)";
return ver;
}
@Override
public HObject
get(String path)
throws Exception
{
throw new UnsupportedOperationException("get() is not supported");
}
}