You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
8.7 KiB
281 lines
8.7 KiB
<?php
|
|
/**
|
|
* ProdsPath class file.
|
|
* @author Sifang Lu <sifang@sdsc.edu>
|
|
* @copyright Copyright © 2007, TBD
|
|
* @package Prods
|
|
*/
|
|
|
|
require_once("autoload.inc.php");
|
|
|
|
require_once(CLASS_DIR . "/ProdsConfig.inc.php");
|
|
|
|
/**
|
|
* ProdsPath class. This class is a abastract class for objects that can be represented as a path, such as file or directory
|
|
* @package Prods
|
|
*/
|
|
abstract class ProdsPath
|
|
{
|
|
/**
|
|
* string path
|
|
* @var string
|
|
*/
|
|
public $path_str;
|
|
|
|
public $account;
|
|
|
|
protected $path_exists;
|
|
|
|
protected $parent_path;
|
|
protected $name;
|
|
|
|
/**
|
|
* Default Constructor. Because this class is abstract, this constructor should not be called directly.
|
|
*
|
|
* @param RODSAccount account iRODS account used for connection
|
|
* @param string $path_str the path of this dir
|
|
* @return ProdsPath a new ProdsPath
|
|
*/
|
|
public function __construct(RODSAccount &$account, $path_str)
|
|
{
|
|
$this->account = $account;
|
|
|
|
// strip the tailing "/"
|
|
while ((strlen($path_str) > 1) && ($path_str{strlen($path_str) - 1} == '/')) {
|
|
$path_str = substr($path_str, 0, strlen($path_str) - 1);
|
|
}
|
|
// remove duplicate '/' characters
|
|
$path_str = str_replace('//', '/', $path_str);
|
|
$this->path_str = $path_str;
|
|
if ($path_str == '/') {
|
|
$this->parent_path = null;
|
|
} else {
|
|
$this->parent_path = dirname($this->path_str);
|
|
}
|
|
$this->name = basename($this->path_str);
|
|
}
|
|
|
|
public function __toString()
|
|
{
|
|
return $this->account . $this->path_str;
|
|
}
|
|
|
|
/**
|
|
* Whether this path (dir or file) exists on the server.
|
|
* @return boolean
|
|
*/
|
|
public function exists()
|
|
{
|
|
if (isset($this->path_exists))
|
|
return $this->path_exists;
|
|
|
|
else {
|
|
$this->verify();
|
|
return $this->path_exists;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Verify if a path exist with server. This function shouldn't be called directly, use {@link exists}
|
|
*/
|
|
abstract protected function verify();
|
|
|
|
/**
|
|
* Get meta data of this path (file or dir).
|
|
* @return array array of RODSMeta.
|
|
*/
|
|
//public function getMeta()
|
|
public function getMeta($get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type = 'd';
|
|
else
|
|
if ($this instanceof ProdsDir)
|
|
$type = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$meta_array = $conn->getMeta($type, $this->path_str);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
return $meta_array;
|
|
}
|
|
|
|
/**
|
|
* update metadata to this path (file or dir)
|
|
*/
|
|
public function updateMeta(RODSMeta $meta_old, RODSMeta $meta_new)
|
|
{
|
|
$this->rmMeta($meta_old);
|
|
$this->addMeta($meta_new);
|
|
}
|
|
|
|
/**
|
|
* Add metadata to this path (file or dir)
|
|
*/
|
|
// public function addMeta(RODSMeta $meta)
|
|
public function addMeta(RODSMeta $meta,
|
|
$get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type = 'd';
|
|
else
|
|
if ($this instanceof ProdsDir)
|
|
$type = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$conn->addMeta($type, $this->path_str, $meta);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
}
|
|
|
|
/**
|
|
* remove metadata to this path (file or dir)
|
|
*/
|
|
// public function rmMeta(RODSMeta $meta)
|
|
public function rmMeta(RODSMeta $meta,
|
|
$get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type = 'd';
|
|
else
|
|
if ($this instanceof ProdsDir)
|
|
$type = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$conn->rmMeta($type, $this->path_str, $meta);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
}
|
|
|
|
/**
|
|
* remove metadata of this path (file or dir) by id
|
|
* @param integer metaid id of the metadata entry
|
|
*/
|
|
// public function rmMetaByID ($metaid)
|
|
public function rmMetaByID($metaid,
|
|
$get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type = 'd';
|
|
else
|
|
if ($this instanceof ProdsDir)
|
|
$type = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$conn->rmMetaByID($type, $this->path_str, $metaid);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
}
|
|
|
|
/**
|
|
* copy meta data from this path (file or dir) to $dest path
|
|
*/
|
|
// public function cpMeta(ProdsPath $dest)
|
|
public function cpMeta(ProdsPath $dest,
|
|
$get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type_src = 'd';
|
|
else
|
|
if ($this instanceof ProdsDir)
|
|
$type_src = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
|
|
if ($dest instanceof ProdsFile)
|
|
$type_dest = 'd';
|
|
else
|
|
if ($dest instanceof ProdsDir)
|
|
$type_dest = 'c';
|
|
else
|
|
throw new RODSException("Unsupported data type:" . get_class($this),
|
|
"PERR_INTERNAL_ERR");
|
|
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$conn->cpMeta($type_src, $type_dest, $this->path_str, $dest->path_str);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
}
|
|
|
|
/**
|
|
* rename this path (file of dir)
|
|
* @param string $new_path_str new path string to be renamed to.
|
|
*/
|
|
// public function rename($new_path_str)
|
|
public function rename($new_path_str,
|
|
$get_cb = array('RODSConnManager', 'getConn'),
|
|
$rel_cb = array('RODSConnManager', 'releaseConn'))
|
|
{
|
|
if ($this instanceof ProdsFile)
|
|
$type = 0;
|
|
else
|
|
$type = 1;
|
|
//$conn = RODSConnManager::getConn($this->account);
|
|
$conn = call_user_func_array($get_cb, array(&$this->account));
|
|
$conn->rename($this->path_str, $new_path_str, $type);
|
|
//RODSConnManager::releaseConn($conn);
|
|
call_user_func($rel_cb, $conn);
|
|
$this->path_str = $new_path_str;
|
|
$this->parent_path = dirname($this->path_str);
|
|
$this->name = basename($this->path_str);
|
|
}
|
|
|
|
/**
|
|
* Get name of this path. note that this is not the full path. for instance if path is "/foo/bar", the name is "bar"
|
|
* @return string name of the path.
|
|
*/
|
|
public function getName()
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
/**
|
|
* Get string form of this path. note that this is the full path.
|
|
* @return string form of the path.
|
|
*/
|
|
public function getPath()
|
|
{
|
|
return $this->path_str;
|
|
}
|
|
|
|
/**
|
|
* Get parent's path of this path.
|
|
* @return string parent's path.
|
|
*/
|
|
public function getParentPath()
|
|
{
|
|
return $this->parent_path;
|
|
}
|
|
|
|
/**
|
|
* Get URI of this path.
|
|
* @return string this path's URI.
|
|
*/
|
|
public function toURI()
|
|
{
|
|
return $this->account->toURI() . $this->path_str;
|
|
}
|
|
|
|
}
|
|
|