extras-legacy/java/trunk/src/java/org/pykix/libburnia/libisofs/IsoTreeNode.java

233 lines
6.5 KiB
Java

/*
* IsoTreeNode.java
*
* Copyright (c) 2007 Vreixo Formoso
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* See COPYING file for details.
*/
package org.pykix.libburnia.libisofs;
import java.io.File;
import java.io.FileNotFoundException;
import org.pykix.libburnia.bindings.Proxy;
/**
* A node in the filesystem tree.
*
* @author Vreixo Formoso
* @since 0.1
*/
public class IsoTreeNode extends Proxy {
/*
* Package protected
*/
IsoTreeNode(long ptr) {
super(ptr);
}
/**
* Add a file to this node (have to be a directory).
*
* @param path
* The path, on the local filesystem, of the file. Have to be not a
* directory, but a file.
* @return
* An IsoTreeNode whose path is <code>path</code> and whose parent
* is this node.
* @throws FileNotFoundException
* If path not exists or is not a file.
*/
public IsoTreeNode addNode(String path) throws FileNotFoundException {
return addNode(this, new File(path));
}
/**
* Add a file to this node (have to be a directory).
*
* @param path
* The path, on the local filesystem, of the file. Have to be not a
* directory, but a file.
* @return
* An IsoTreeNode whose path is <code>path</code> and whose parent
* is this node.
* @throws FileNotFoundException
* If path not exists or is not a file.
*/
public IsoTreeNode addNode(File path) throws FileNotFoundException {
return addNode(this, path);
}
/**
* Recursively add an existing directory as a child of this node, that have
* to be a directory.
* Warning: when using this, you'll lose files or subdirectories objects.
* If you want to have all files and directories objects,
* use {@link #addNode(File)} and {@link #addNewDir(String)}
*
* @param path
* The path, on the local filesystem, of the directory to add.
* @return
* The new created node or <code>null</code>.
* @throws FileNotFoundException
* If path not exists or is not a directory
*/
public IsoTreeNode raddDir(String path) throws FileNotFoundException {
return raddDir(this, new File(path));
}
/**
* Recursively add an existing directory as a child of this node, that have
* to be a directory.
* Warning: when using this, you'll lose files or subdirectories objects.
* If you want to have all files and directories objects,
* use {@link #addNode(File)} and {@link #addNewDir(String)}
*
* @param path
* The path, on the local filesystem, of the directory to add.
* @return
* The new created node or <code>null</code>.
* @throws FileNotFoundException
* If path not exists or is not a directory
*/
public IsoTreeNode raddDir(File path) throws FileNotFoundException {
return raddDir(this, path);
}
/* this function is for testing purposes mainly */
void print(int spaces) {
iso_tree_print( pointerOf(this), spaces);
}
/**
* Set the name of the node (using the current locale).
*
* @param name
* Name to set
*/
public void setName(String name) {
iso_tree_node_set_name( pointerOf(this), name);
}
/**
* Creates a new directory as a child of this node (have to be a
* directory).
*
* @param name
* Name of the directory to create. Must be a unique name among
* all node children, and mustn't contain '/' characters.
* @return
* The newly created directory.
*/
public IsoTreeNode addNewDir(String name) {
return addNewDir(this, name);
}
/**
* Add a file to a directory.
*
* @param parent
* Node to which add file. Can be <code>null</code>, but if
* not it must be a directory.
* @param path
* The path, on the local filesystem, of the file. Have to be non-dir
* @return
* An IsoTreeNode whose path is <code>path</code> and whose parent
* is <code>parent</code>.
* @throws FileNotFoundException
* If path not exists or is not a file
*/
public static IsoTreeNode addNode(IsoTreeNode parent, File path)
throws FileNotFoundException {
long pptr = (parent == null) ? 0 : pointerOf(parent);
/* extra check */
if ( !path.exists() ) {
throw new FileNotFoundException(path.getPath());
}
if ( !path.isFile() ) {
throw new FileNotFoundException(path + " is not a file");
}
long ptr = iso_tree_add_node(pptr, path.getPath());
return (ptr == 0) ? null : new IsoTreeNode(ptr);
}
/**
* Recursively add an existing directory to the tree.
* Warning: when using this, you'll lose files or subdirectories objects.
* If you want to have all files and directories objects,
* use {@link #addNode(File)} and {@link #addNewDir(String)}.
*
* @param parent
* Node to which add file. Can be <code>null</code>, but if
* not it must be a directory.
* @param path
* The path, on the local filesystem, of the directory to add.
* @return
* The new created node or <code>null</code>.
* @throws FileNotFoundException
* If path not exists or is not a directory
*/
public static IsoTreeNode raddDir(IsoTreeNode parent, File path)
throws FileNotFoundException {
long pptr = (parent == null) ? 0 : pointerOf(parent);
/* extra check */
if ( !path.exists() ) {
throw new FileNotFoundException(path.getPath());
}
if ( !path.isDirectory() ) {
throw new FileNotFoundException(path + " is not a directory");
}
long ptr = iso_tree_radd_dir(pptr, path.getPath());
return (ptr == 0) ? null : new IsoTreeNode(ptr);
}
/**
* Creates a new, empty directory on the volume.
*
* @param parent
* Directory in which add the new dir, or <code>null</code>
* @param name
* Name of the directory to create. Must be a unique name among
* the children and files belonging to parent, and mustn't
* contain '/' characters.
* @return
* The newly created directory.
*/
public static IsoTreeNode addNewDir(IsoTreeNode parent, String name) {
long pptr = (parent == null) ? 0 : pointerOf(parent);
long ptr = iso_tree_add_new_dir(pptr, name);
return (ptr == 0) ? null : new IsoTreeNode(ptr);
}
private static native long iso_tree_add_node(long parent, String path);
private static native long iso_tree_radd_dir(long parent, String path);
private static native void iso_tree_print(long root, int spaces);
private static native void iso_tree_node_set_name(long file, String name);
private static native long iso_tree_add_new_dir(long parent, String name);
static {
System.loadLibrary("java-libburn-0.1");
}
}