// 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