// Copyright 2000-2005 the Contributors, as shown in the revision logs.
// Licensed under the Apache Public Source License 2.0 ("the License").
// You may not use this file except in compliance with the License.
package org.ibex.js;
import org.ibex.util.*;
import org.ibex.io.*;
import java.io.*;
// FEATURE: support for move
// FEATURE: support for bytestreams
// FEATURE: cache directories so we can do equality checking on them?
// FEATURE: autoconvert "true" to true and "0.3" to 0.3 on readback
/**
* A crude mechanism for using a filesystem as object storage.
*
* This object represents a directory; writing a string, number, or
* boolean to any of its properties will create a file with the
* (encoded) property name as its filename and the "stringified"
* value as its contents.
*
* Writing 'null' to one of this object's properties will
* [recursively if necessary] delete the corresponding directory
* entry.
*
* Writing any other object to one of this object's properties will
* create a new Directory object and copy the other object's keys()
* into the new Directory. This means that assigning one directory
* to a property of another directory will copy the directory,
* not move it. There is currently no way to move directories.
*
* If an object is written to a property that already has an entry,
* the old one is deleted (equivalent to writing 'null') first.
*
* WARNING: when instantiating a Directory object with a file
* argument that points to a non-directory File, this class will
* delete that file and create a directory!
*/
public class Directory extends JS.Immutable {
File f;
/**
* Create the directory object. Existing directories will be
* preserved; if a file is present it will be obliterated.
*/
public Directory(File f) throws IOException {
this.f = f;
if (!f.exists()) new Directory(new File(f.getParent()));
if (!f.isDirectory()) destroy(f);
f.mkdirs();
}
private static void destroy(File f) throws IOException {
if (!f.exists()) return;
if (f.isDirectory()) {
String[] entries = f.list();
for(int i=0; i