<?php
/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Fichier RightManager.php
*
* Ce fichier contient la classe RightManager
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/06/05
* @version 0.3
* @package system_data
* @subpackage Right
* @copyright Copyright &copy; 2009-2018, Rooty
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################

/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
* <p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/

if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Appel à la classe Right...
*/
require ($CONF_LIB_PATH."lib/system/system_data/right/right.php");

/**
* Classe RightManager
*
* <p>Classe de gestion des instances de Rights <br>
*   (permet de fabriquer, detruire, mettre à jour des objet Rights)<br>
* Cette classe se sert des ressources à sa disposition (dans ./ressource)<br>
* Les Classes de ressource doivent avoir toutes les methodes correspondantes <br>
* aux methodes de la classe intitulés sourceXXX</p>
*
* <p>Est configuré dans data_acces.php : <br>
* - La Source d'information (Db)<br>
* l'objet ressource se sert lui-même des classes d'accés aux données(lib/data_source/...)<br>
* </p>
* @package system_data
* @subpackage Right
*/
class RightManager extends Manager
{

	//
	// Constructor
	//
/**
* Constructeur de la classe RightManager PHP5
*
* @access public
*/
	function __construct()
	{
	}


###########################################################################
#### Méthodes abstraites
###########################################################################

/**
* doLoadFromId: Charge le droit depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @abstract
* @param entier identifiant du droit
* @return tableau
*/
	function doLoadFromId($id)
	{
		return array();
	}

/**
* doInsert: Insert le droit dans la BD
*
* <p>Insertion dans la Bd</p>
* @param chaine nom de la classe concernée
* @param chaine nom de la methode concernée
* @param entier identifiant de l'objet
* @param entier identifiant du noeud
* @param booleen si l'objet à des droits recursifs ou non?!
* @param entier identifiant utilisateur
* @param entier identifiant du groupe utilisateur
* @param booleen est un droit d'entrée
* @abstract
* @access public
* @return entier
*/
	function doInsert($className, $methodName, $objectId, $noeudId, $RightId, $groupId)
	{
		return 0;
	}

/**
* doUpdate:Modifie le droit dans la BD
*
* <p>Mise à jour du droit</p>
* @param entier identifiant
* @param chaine libelle du droit
* @param chaine repertoire du droit
* @param chaine icone du droit
* @param entier état du droit (active ou inactive)
* @abstract
* @access public
* @return entier
*/
	function doUpdate($id, $className, $methodName, $objectId, $noeudId, $RightId, $groupId)
	{
		return 0;
	}

/**
* doDelete : Detruit le droit dans la BD
*
* <p>Suppression de le droit à partir de son identifiant</p>
* @param entier identifiant
* @abstract
* @access public
* @return booleen
*/
	function doDelete($id)
	{
		return true;
	}

/**
* doLoadPermission : Charge les droits depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
*
* @access public
* @abstract
* @param entier identifiant du droit
* @param tableau tableau des groupes de l'utilisateur
* @return tableau
*/
	function doLoadPermission($id, $array, $nodeAvailable)
	{
		return array();
	}
/**
* doLoadFromObjectId : Charge les droits depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
*
* @access public
* @abstract
* @param entier identifiant du droit
* @return tableau
*/
	function doLoadFromObjectId($id)
	{
		return array();
	}
/**
* doLoadFromGroupId : Charge les droits depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @abstract
* @param entier identifiant du droit
* @return tableau
*/
	function doLoadFromGroupId($id)
	{
		return array();
	}
/**
* doLoadFromNodeId : Charge les droits depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @abstract
* @param entier identifiant du droit
* @return tableau
*/
	function doLoadFromNodeId($id)
	{
		return array();
	}


###########################################################################
#### Methodes privee
###########################################################################

/**
* sourceLoadFromId : charge à partir d'un identifiant de droit
*
* <P>Permet le récupération des infos d'un objet Right à partir de son identifiant</P>
* <P>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas</P>
* @param identifiant du droit
* @access private
* @return tableau
*/
	function sourceLoadFromId($id)
	{
		$tab=$this->doLoadFromId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if ((!is_array($tab)) || (count($tab)==0) || (!Is_numeric($tab["id"])))
		{
			$systemError=2;
			$classe="Right";
			$message="Erreur de SUPPRESSION dans FetchRightDb avec l'id ".$id;
			addError($systemError, $classe, $message, __line__, __file__);
			return array();
		}
		return $tab;
	}

/**
* sourceLoadFromUserId : charge à partir d'un identifiant utilisateur
*
* <p>Permet le récupération des infos d'un objet Right à partir de son identifiant</p>
* <p>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* </p>
* @param identifiant de l'association Right
* @param tableau des incdices des groupes de l'utilisateur
* @param tableau tableau des noeuds disponilbes (accessible) pour l'utilisateur (optionnel)
* @access private
* @return tableau
*/
	function sourceLoadFromUserId($id, $groupe, $nodeAvailable)
	{
		$tab=$this->doLoadPermission($id, $groupe, $nodeAvailable);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!is_array($tab))
		{
			$systemError=2;
			$classe="Right";
			$message="Erreur de Load dans FetchRightDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}
		return $tab;
	}

/**
* sourceLoadFromGroupId : charge à partir d'un identifiant de groupe
*
* <p>Permet le récupération des infos d'un objet Right à partir de son identifiant</p>
* <p>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* </p>
* @param identifiant de l'association Right
* @param tableau des incdices des groupes de l'utilisateur
* @access private
* @return tableau
*/
	function sourceLoadFromGroupId($id)
	{
		$tab=$this->doLoadFromGroupId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!is_array($tab))
		{
			$systemError=2;
			$classe="Right";
			$message="Erreur de Load dans FetchRightDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}
		return $tab;
	}

/**
* sourceLoadFromObjectId : charge à partir d'un identifiant de groupe
*
* <p>Permet le récupération des infos d'un objet Right à partir de son identifiant</p>
* <p>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* </p>
* @param identifiant de l'association Right
* @param tableau des incdices des groupes de l'utilisateur
* @access private
* @return tableau
*/
	function sourceLoadFromObjectId($id)
	{
		$tab=$this->doLoadFromObjectId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!is_array($tab))
		{
			$systemError=2;
			$classe="Right";
			$message="Erreur de Load dans FetchRightDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}
		return $tab;
	}


/**
* sourceLoadFromNodeId : charge à partir d'un identifiant de noeud (pour l'admin)
*
* <p>Permet le récupération des infos d'un objet Right à partir de son identifiant</p>
* <p>Retourne un tableau contenant les infos de l'objets<br>
* </p>
* @param identifiant de l'association Right
* @access private
* @return tableau
*/
	function sourceLoadFromNodeId($id)
	{
		$tab=$this->doLoadFromNodeId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!is_array($tab))
		{
			$systemError=2;
			$classe="Right";
			$message="Erreur de Load dans FetchRightDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}
		return $tab;
	}

/**
* sourceInsert: Insert la Right
*
* <P>Insertion de l'objet Right dans la source de données<br>
* indifférement du type de cette source</P>
* <P>Retourne L'identifiant de l'objet insérer</P>
* @param chaine nom de la classe concernée
* @param chaine nom de la methode concernée
* @param entier identifiant de l'objet
* @param entier identifiant du noeud
* @param booleen si l'objet à des Rights recursifs ou non?!
* @param entier identifiant utilisateur
* @param entier identifiant du groupe utilisateur
* @param booleen est un Right d'entrée
* @access public
* @return entier
*/
	function sourceInsert($className, $methodName, $objectId, $noeudId, $userId, $groupId)
	{
		$GLOBALS['SYSTEM_ERROR']=0;	#ignore les anciennes Erreurs

		$ObjClass=new Chaine($className);
		$ObjMethod=new Chaine($methodName);
		return $this->doInsert($ObjClass->StrToSql(), $ObjMethod->StrToSql(), $objectId, $noeudId, $userId, $groupId);
	}


/**
* sourceUpdate: Met à jour le droit
*
* @access public
* @param entier id du Right...
* @param chaine nom de la classe concernée
* @param chaine nom de la methode concernée
* @param entier identifiant de l'objet
* @param entier identifiant du noeud
* @param booleen si l'objet à des Rights recursifs ou non?!
* @param entier identifiant utilisateur
* @param entier identifiant du groupe utilisateur
* @param booleen est un Right d'entrée
* @return booleen
*/
	function sourceUpdate($id, $className, $methodName, $objectId, $noeudId, $userId, $groupId)
	{
		$GLOBALS['SYSTEM_ERROR']=0;	#ignore les anciennes Erreurs

		# Gestion d'un tableau intermediaire avec la reprise des elements

		if (!Is_numeric($id))
		{
			/* Erreur */
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
			return false;
		}
		$ObjClass=new Chaine($className);
		$ObjMethod=new Chaine($methodName);

		return $this->doUpdate($id, $ObjClass->StrToSql(), $ObjMethod->StrToSql(), $objectId, $noeudId, $userId, $groupId);
	}

/**
* sourceDelete: Detruit la Right
*
* <P>Suppression de l'objet à partir de son identifiant</P>
* @param entier identifiant du Right
* @access public
* @return booleen
*/
	function sourceDelete($id)
	{
		if (!Is_numeric($id))
		{
			/* Erreur */
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);

			return false;
		}

		return $this->doDelete($id);
	}


###########################################################################
#### Methodes public
###########################################################################

/**
* createNewInstance : créer un objet vierge
*
* @access public
* @return booleen
*/
	function createNewInstance()
	{
		return new Right();
	}
/**
* createInstance : récupere l'objet avec l'identifiant $id
*
* @param entier identifiant de l'association Right
* @access public
* @return object retourne un objet de type Right
*/
	function createInstance($id)
	{
		$return = new Right();
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromId($id);
			if (is_array($tab) && isset($tab["id"]) && is_numeric($tab["id"]))
			{
				/* création et alimentation de l'objet */
				$return->doLoad($tab["id"], $tab["class_name"], $tab["method_name"], $tab["object_id"], $tab["node_id"], $tab["user_id"], $tab["group_id"]);
			}else{
				$systemError=3;
				$classe="RightManager";
				$message="Erreur id inexistant ".$id;
				addError($systemError, $classe, $message, __line__, __file__);
			}
		}else{
			$systemError=3;
			$classe="RightManager";
			$message="Erreur id invalide ".$id;
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}
/**
* deleteInstance : detruit l'objet physique
*
* @param object objet Right à effacer
* @access public
* @return object objetRight mis à jour
*/
	function deleteInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="right") )
		{
			if($obj->isLoaded()==true)
			{
				/* Récupération des infos */
				$this->CallSystemPlugin("__deleteRight", $obj);
				$return=$this->sourceDelete($obj->getId());
				$obj->setId(0);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="RightManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}
/**
* updateInstance : met à jour l'objet
*
* @param object objet Right à modifier
* @access public
* @return object objetRight mis à jour
*/
	function updateInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="right") && ($obj->isLoaded()==true))
		{
			/* Récupération des infos */
			$id=$this->sourceUpdate($obj->getId(), $obj->getClassName(), $obj->getMethodName(), $obj->getObjectId(), $obj->getNodeId(), $obj->getUserId(), $obj->getGroupId());
			$this->CallSystemPlugin("__updateRight", $obj);
			return $obj;
		}
		/* Erreur */
		$systemError=3;
		$classe="RightManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}
/**
* insertInstance : créer enregistre l'objet
*
* <p>affecte l'id de l'objet si nécessaire</p>
* @param object objet Right à inserer
* @access public
* @return object objetRight mis à jour
*/
	function insertInstance($obj)
	{
		if ((strtolower(get_class($obj))=="right"))
		{
			if ($obj->isLoaded()==false)
			{
				/* Récupération des infos */
				$id=$this->sourceInsert( $obj->getClassName(), $obj->getMethodName(), $obj->getObjectId(), $obj->getNodeId(), $obj->getUserId(), $obj->getGroupId());
				$obj->setId($id);
				$this->CallSystemPlugin("__insertRight", $obj);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="RightManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* saveInstance : créer enregistre l'objet
*
* @param object objet Right à sauvegarder
* @access public
* @return object objetRight mis à jour
*/
	function saveInstance($obj)
	{
		if ((strtolower(get_class($obj))=="right"))
		{
			if ($obj->isLoaded()==false)
			{
				$return=$this->insertInstance($obj);
			}else{
				$return=$this->updateInstance($obj);
			}
			return $return;
		}
		/* Erreur */
		$systemError=3;
		$classe="RightManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);
		$return=$obj;

		return $return;
	}

/**
* getInstanceFromUserId : récupere les objets Right de l'utilisateur($id) ayant pour groupe (tableau de groupe $groupe)
*
* @param entier identifiant de l'utilisateur
* @param tableau tableau des groupes associés à l'utilisateur
* @param tableau tableau des noeuds disponilbes (accessible) pour l'utilisateur (optionnel)
* @access public
* @return tableau tableau d'objets Right
*/
	function getInstanceFromUserId($id, $group, $nodeAvailable="")
	{
		$return = array();		/* Tableau de NodeUserGroup */
		$nodeAvailable=(is_array($nodeAvailable))?$nodeAvailable:"";

		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromUserId($id, $group, $nodeAvailable);
			foreach($tab as $right){
				$Right=new Right();
				$Right->doLoad($right["id"], $right["class_name"], $right["method_name"], $right["object_id"], $right["node_id"], $right["user_id"], $right["group_id"]);
				$return[]=$Right;
			}
		}else{
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}

/**
* getInstanceFromGroupId : récupere les objets Right de l'utilisateur($id) ayant pour groupe (tableau de groupe $groupe)
* @param entier identifiant du groupe
* @access public
* @return tableau tableau d'objets Right
*/
	function getInstanceFromGroupId($id)
	{
		$return = array();		/* Tableau de NodeUserGroup */
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromGroupId($id);
			foreach($tab as $right){
				$Right=new Right();
				$Right->doLoad($right["id"], $right["class_name"], $right["method_name"], $right["object_id"], $right["node_id"], $right["user_id"], $right["group_id"]);
				$return[]=$Right;
			}
		}else{
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}
/**
* getInstanceFromGroupId : récupere les objets Right de l'utilisateur($id) ayant pour groupe (tableau de groupe $groupe)
* @param entier identifiant du groupe
* @access public
* @return tableau tableau d'objets Right
*/
	function getInstanceFromNodeId($id)
	{
		$return = array();				/* Tableau de NodeUserGroup */
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromNodeId($id);
			if (is_array($tab))
			{
				/* création et alimentation du tableau */
				for ($i=0; $i<count($tab); $i++)
				{
					$return[$i]=new Right();
					$return[$i]->doLoad($tab[$i]["id"], $tab[$i]["class_name"], $tab[$i]["method_name"], $tab[$i]["object_id"], $tab[$i]["node_id"], $tab[$i]["user_id"], $tab[$i]["group_id"]);
				}
			}else{
				$systemError=3;
				$classe="RightManager";
				$message="Erreur objet invalide ";
				addError($systemError, $classe, $message, __line__, __file__);
			}
		}else{
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}
/**
* getInstanceFromObjectId : tous les droits pour l'object
* @param entier identifiant du groupe
* @access public
* @return tableau tableau d'objets Right
*/
	function getInstanceFromObjectId($id)
	{
		$return = array();				/* Tableau de NodeUserGroup */
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromObjectId($id);
			if (is_array($tab))
			{
				/* création et alimentation du tableau */
				for ($i=0; $i<count($tab); $i++)
				{
					$return[$i]=new Right();
					$return[$i]->doLoad($tab[$i]["id"], $tab[$i]["class_name"], $tab[$i]["method_name"], $tab[$i]["object_id"], $tab[$i]["node_id"], $tab[$i]["user_id"], $tab[$i]["group_id"]);
				}
			}else{
				$systemError=3;
				$classe="RightManager";
				$message="Erreur objet invalide ";
				addError($systemError, $classe, $message, __line__, __file__);
			}
		}else{
			$systemError=3;
			$classe="RightManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}
}
?>
