/*
 * Copyright 1998, University Corporation for Atmospheric Research
 * All Rights Reserved.
 * See file LICENSE for copying and redistribution conditions.
 *
 * $Id: InputNetcdf.java,v 1.3 2002-09-20 18:16:33 steve Exp $
 */

package visad.data.netcdf;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.io.Serializable;
import visad.DataImpl;
import visad.VisADException;
import visad.data.BadFormException;


/**
 * A Java bean for importing a netCDF file.
 */
public class
InputNetcdf
    implements	Serializable
{
    /**
     * The pathname property of the netCDF dataset.
     */
    private String			pathname;

    /**
     * The VisAD data object property.
     */
    private DataImpl			data;

    /**
     * The quantity database property.
     */
    private QuantityDB                  quantityDB;

    /**
     * Support for property changes.
     */
    private final PropertyChangeSupport	changes;


    /**
     * Construct.  The pathname and data object properties will be 
     * null; the quantity database property will be {@link
     * StandardQuantityDB}.
     */
    public
    InputNetcdf()
    {
	pathname = null;
	data = null;
	changes = new PropertyChangeSupport(this);
	quantityDB = StandardQuantityDB.instance();
    }


    /**
     * Set the quantity database property.  The quantity database is used
     * to transform the incoming netCDF variables into their canonical
     * {@link visad.RealType}s.  If no transformation is desired, then use {@link
     * QuantityDB#emptyDB}.  A {@link java.beans.PropertyChangeEvent} for quantityDB
     *  will be fired, if appropriate.  If the pathname property is
     * non-null, then the netCDF database will be read and a {@link
     * java.beans.PropertyChangeEvent} for the data property will be fired, if appropriate.
     *
     * @param db                    The new quantity database.
     * @throws NullPointerException if the argument is null.
     * @throws BadFormException     if the netCDF dataset doesn't have the 
     *                              right form.
     * @throws IOException          if an error occurs while reading the netCDF
     *                              dataset.
     * @throws VisADException       if a VisAD failure occurs.
     */
    public void
    setQuantityDB(QuantityDB db)
	throws BadFormException, IOException, VisADException
    {
	if (db == null)
	    throw new NullPointerException();

	QuantityDB oldDB;
	DataImpl oldData;
	String   name;

	synchronized(this) {
	    oldDB = quantityDB;
	    oldData = data;
	    name = pathname;
	}

	DataImpl newData = new Plain(db).open(name);

	synchronized(this) {
	    quantityDB = db;
	    data = newData;
	}

        changes.firePropertyChange("quantityDB", oldDB, db);
        changes.firePropertyChange("data", oldData, newData);
    }


    /**
     * Sets the dataset name property.  If the name is null,
     * then the data property will be set to null; otherwise,
     * the dataset will be read. {@link java.beans.PropertyChangeEvent}s for the
     * pathname and data properties will be fired when appropriate.
     *
     * @param name                  The new name of the dataset or 
     *                              null.
     */
    public void
    setPathname(String name)
	throws IOException, VisADException, BadFormException
    {
        String   oldName;
	DataImpl oldData;
        DataImpl newData;

        if (name == null) {
            synchronized(this) {
		oldName = pathname;
		oldData = data;
	    }
	    newData = null;
        }
        else {
            QuantityDB      db;

            synchronized(this) {
                db = quantityDB;
                oldData = data;
                oldName = pathname;
            }

            newData = new Plain(db).open(name);

            synchronized(this) {
                pathname = name;
                data = newData;
            }
        }

        changes.firePropertyChange("pathname", oldName, name);
        changes.firePropertyChange("data", oldData, newData);
    }


    /**
     * Returns the dataset pathname property.  Returns null if the
     * property has no value.
     */
    public synchronized String
    getPathname()
    {
	return pathname;
    }


    /**
     * Returns the VisAD data object property.  Returns null if the
     * property has no value.
     */
    public synchronized DataImpl
    getData()
    {
	return data;
    }


    /**
     * Add a property change listener.
     */
    public synchronized void
    addPropertyChangeListener(PropertyChangeListener p)
    {
	changes.addPropertyChangeListener(p);
    }


    /**
     * Remove a property change listener.
     */
    public synchronized void
    removePropertyChangeListener(PropertyChangeListener p)
    {
	changes.removePropertyChangeListener(p);
    }
}

 

Ads help maintain this website.