/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA

$Id: DirectoryRepository.java,v 1.14 2009-03-02 23:35:46 curtis Exp $
*/

package visad.data;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.NoSuchElementException;


/**
 * A data object repository implemented as files in a local directory.
 */
public class DirectoryRepository extends Repository
{
    /**
     * The directory.
     * Effectively "final" if the constructor succeeds.
     */
    protected File	dir;

    /**
     * Unambiguous representation of directory for error messages.
     * Effectively "final" if the constructor succeeds.
     */
    protected String	dirString;


    /**
     * Construct a directory repository with support for the default
     * forms of data.
     */
    public
    DirectoryRepository(String name, String location)
	throws BadRepositoryException, IOException
    {
	super(name, location);

	// Check the directory.
	try
	{
	    dir = new File(getLocation());
	}
	catch (NullPointerException e)
	{
	    throw new BadRepositoryException("Null repository name");
	}
	dirString = "\"" + getName() + "\" (path \"" + getLocation() + "\")";

	if (!dir.isDirectory())
	    throw new BadRepositoryException("Repository " + dirString +
		" is not a directory");
	if (!dir.canRead())
	    throw new BadRepositoryException("Repository " + dirString +
		" is not readable");
    }


    // TODO: method(s) for constructing the data form hierarchy


    /**
     * Return an enumeration of the data objects in this repository.
     */
    public Enumeration
    getEnumeration()
	throws	BadRepositoryException, SecurityException
    {
	return new Enumerator();
    }


    /**
     * Inner class for enumerating the files in the directory.
     */
    public class
    Enumerator
	implements	Enumeration
    {
	protected int			i;
	protected final String[]	list;

	protected
	Enumerator()
	    throws SecurityException
	{
	    list = dir.list();
	    i = 0;
	}

	public boolean
	hasMoreElements()
	{
	    return i < list.length;
	}

	public Object
	nextElement()
	    throws NoSuchElementException
	{
	    if (i == list.length)
		throw new NoSuchElementException();

	    return list[i++];
	}
    }


    /**
     * Return the fully-qualified name of a persistent data object.
     */
    protected String fullName(String id)
    {
	return getLocation() + File.separator + id;
    }


    /**
     * Test this class.
     */
    public static void main(String[] args)
	throws BadRepositoryException, IOException
    {
	DirectoryRepository	dir = new DirectoryRepository("Test", ".");

	for (Enumeration en = dir.getEnumeration(); en.hasMoreElements();)
	    System.out.println((String)en.nextElement());

	System.out.println("dir.fullName(\"foo.bar\") = " +
	    dir.fullName("foo.bar"));
    }
}

 

Ads help maintain this website.