/** * FUSE-J: Java bindings for FUSE (Filesystem in Userspace by Miklos Szeredi (mszeredi@inf.bme.hu)) * * Copyright (C) 2003 Peter Levart (peter@select-tech.si) * * This program can be distributed under the terms of the GNU LGPL. * See the file COPYING.LIB */ package fuse.staticfs; import fuse.FuseFtype; import fuse.compat.FuseStat; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class DirectoryNode extends Node { private final static int FILE_PERMS = 493; // 0755 in octal private Map<String, Node> children; public DirectoryNode(String name) { super(name); children = new HashMap<String, Node>(); } // // create initial FuseStat structure (called from Node's constructor) protected FuseStat createStat() { FuseStat stat = new FuseStat(); stat.mode = FuseFtype.TYPE_DIR | FILE_PERMS; stat.uid = stat.gid = 0; stat.ctime = stat.mtime = stat.atime = (int) (System.currentTimeMillis() / 1000L); stat.size = 0; stat.blocks = 0; return stat; } // // public API public synchronized Node addChild(Node node) { Node previousNode = children.put(node.getName(), node); node.setParent(this); FuseStat stat = (FuseStat) getStat().clone(); stat.mtime = stat.atime = (int) (System.currentTimeMillis() / 1000L); setStat(stat); if (previousNode != null) { previousNode.setParent(null); } return previousNode; } public synchronized Node removeChild(String name) { Node removedNode = children.remove(name); if (removedNode != null) { FuseStat stat = (FuseStat) getStat().clone(); stat.mtime = stat.atime = (int) (System.currentTimeMillis() / 1000L); setStat(stat); removedNode.setParent(null); } return removedNode; } public synchronized Node getChild(String name) { return children.get(name); } @SuppressWarnings("unchecked") public synchronized Node[] getChildren() { Collection childNodes = children.values(); return (Node[]) childNodes.toArray(new Node[childNodes.size()]); } }