<?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 NodeManager.php
*
* Ce fichier contient la classe NodeManager
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/06/05
* @version 0.3
* @package system_data
* @subpackage Node
* @copyright Copyright &copy; 2004-2005, ARD Limousin
*/

#####################################################################################################
################################# 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 Node...
*/
require ($CONF_LIB_PATH."lib/system/system_data/node/node.php");

/**
* Classe NodeManager
* 
* <P>Classe de gestion des instances de Nodes <br>
*   (permet de fabriquer, detruire, mettre à jour des objet Nodes)<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 Node
*/
class NodeManager extends Manager
{

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


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

/**
* doLoadFromId : charge le Noeud
*
* <P>Chargement depuis la source de données</P>
* <P>Cette méthode a pour but d'être surchargée et de gérer les accés aux données</P>
* @param entier identifiant de du noeud
* @access public
* @abstract
* @return tableau tableau des éléments d'un Noeud
*/
	function doLoadFromId($id)
	{
		return array();
	}

/**
* doLoadFromIdPere : charge le(s) Noeud(s) depuis un id pere
*
* <P>Chargement depuis la source de données</P>
* <P>Cette méthode a pour but d'être surchargée et de gérer les accés aux données</P>
* @param entier identifiant de du noeud
* @access public
* @abstract
* @return tableau tableau des éléments d'un Noeud
*/
	function doLoadFromIdPere($id)
	{
		return array();
	}

/**
* doUpdate : Update du Noeud
*
* <P>Insertion dans la source de données</P>
* <P>Cette méthode a pour but d'être surchargée et de gérer les accés aux données</P>
* @param entier identifiant du Noeud père
* @param chaine libelle du Noeud
* @param chaine icone du Noeud
* @access public
* @abstract
* @return entier
*/
	function doUpdate($id, $idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		return 0;	/* entier */
	}
	
/**
* doInsert : Insert le Noeud
*
* <P>Insertion dans la source de données</P>
* <P>Cette méthode a pour but d'être surchargée et de gérer les accés aux données</P>
* @param entier identifiant du Noeud père
* @param chaine libelle du Noeud
* @param chaine icone du Noeud
* @access public
* @abstract
* @return entier
*/
	function doInsert($idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		return true;
	}

/**
* doDelete : Detruit le Noeud
*
* <P>Suppression de l'objet à partir de son identifiant et dans la source de données</P>
* <P>Cette méthode a pour but d'être surchargée et de gérer les accés aux données</P>
* @param entier identifiant de du noeud
* @access public
* @abstract
* @return booleen
*/
	function doDelete($id)
	{
		return true;
	}

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

/**
* sourceLoadFromId: charge à partir d'un identifiant
*
* <p>Permet le récupération des infos d'un objet Node à partir de son identifiant</p>
* <P> Cette méthode gére le formatage des données avant leur passage à la source de données (methode doXXX equivalente)</P>
* <p>Retourne un tableau contenant les infos de l'objet<br>
* <br>ou faux si n'existe pas</p>
* @param identifiant du Noeud
* @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))
		{
			/* Erreur */
			$systemError=1;
			$classe="Node";
			$message="Erreur dans NodeManager";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}else{
			if ((!Is_numeric($tab["id"])) || (!Is_numeric($tab["idpere"])))
			{
				/* Erreur */
				$systemError=1;
				$classe="Node";
				$message="Erreur dans NodeManager";
				addError($systemError,$classe,$message, __line__, __file__);
				return array();
			}else{
				return $tab;
			}
		}
	}

/**
* sourceInsert: Insert le Noeud
*
* <p>Insertion de l'objet Noeud dans la source de données<br>
* indifférement du type de cette source</p>
* <P> Cette méthode gére le formatage des données avant leur passage à la source de données (methode doXXX equivalente)</P>
* <p>Retourne L'identifiant de l'objet inséré</p>
* @param entier identifiant du Noeud père
* @param chaine libelle du Noeud
* @param chaine icone du Noeud
* @access private
* @return entier
*/
	function sourceInsert($idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!is_numeric($idPere))
		{
			/* Erreur */
			$systemError=1;
			$classe="Node";
			$message="Erreur dans NodeManager";
			addError($systemError,$classe,$message, __line__, __file__);
			return false;
		}
		return $this->doInsert($idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode);
	}

/**
* sourceUpdate: Met à jour le Noeud
*
* <P>Mise à jour de l'objet indifferemment de la source de données</P>
* <P> Cette méthode gére le formatage des données avant leur passage à la source de données (methode doXXX equivalente)</P>
* @param entier identifiant du Noeud père
* @param chaine libelle du Noeud
* @param chaine icone du Noeud
* @access private
* @return booleen
*/
	function sourceUpdate($id, $idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		# Gestion d'un tableau intermediaire avec la reprise des elements
		if (!Is_numeric($id) || !is_numeric($idPere))
		{
			/* Erreur */
			$systemError=1;
			$classe="Node";
			$message="Erreur dans NodeManager";
			addError($systemError,$classe,$message, __line__, __file__);
			return false;
		}

		return $this->doUpdate($id, $idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode);
	}

/**
* sourceDelete: Detruit le Noeud
*
*<p>Suppression de l'objet à partir de son identifiant</p>
*<P> Cette méthode gére le formatage des données avant leur passage à la source de données (methode doXXX equivalente)</P>
* @param entier identifiant de du noeud
* @access private
* @return booleen
*/
	function sourceDelete($id)
	{
		return $this->doDelete($id);
	}

/**
* sourceLoadFromIdPere: charge à partir d'un identifiant
*
* <p>Permet le récupération des infos d'un objet Node à partir de son identifiant</p>
* <P> Cette méthode gére le formatage des données avant leur passage à la source de données (methode doXXX equivalente)</P>
* <p>Retourne un tableau contenant les infos de l'objet<br>
* <br>ou faux si n'existe pas</p>
* @param identifiant du Noeud
* @access private
* @return tableau
*/
	function sourceLoadFromIdPere($id)
	{
		$tab=$this->doLoadFromIdPere($id);
		if (is_array($tab))
		{
			return $tab;
		}
		/* Erreur */
		$systemError=1;
		$classe="Node";
		$message="Erreur dans NodeManager";
		addError($systemError,$classe,$message, __line__, __file__);
		return $tab;
	}


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

/**
* createNewInstance : créer un objet vierge
*
* @access public
* @return objet
*/
	function createNewInstance()
	{
		return new Node();
	}
/**
* createInstance : récupere l'objet avec l'identifiant $id
*
* @param entier identifiant de l'association Node
* @access public 
* @return object retourne un objet de type Node
*/
	function createInstance($id)
	{
		$return = new Node();
		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["idpere"], $tab["libelle"], $tab["icone"], $tab["template"], $tab["domain"], $tab["haspublic"], $tab["ctype"], $tab["ctypereg"], $tab["usergroupid"], $tab["subsgroupid"], $tab["subsgrouptempid"], $tab["mailnode"]);
			}else{
				$systemError=3;
				$classe="NodeManager";
				$message="Erreur id inexistant ".$id;
				addError($systemError, $classe, $message, __line__, __file__);				
			}
		}else{
			$systemError=3;
			$classe="NodeManager";
			$message="Erreur id invalide ".$id;
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}

/**
* getInstanceFromIdPere : récupere les objets Node ayant pour pere l'id
*
* @param entier identifiant de l'utilisateur
* @access public 
* @return tableau tableau d'objets Node
*/
	function getInstanceFromIdPere($id)
	{
		$return = array();		/* Tableau de NodeUserNode */
		if (is_numeric($id))
		{
			/* Récupération des infos */
			$tab=$this->sourceLoadFromIdPere($id);
			if (is_array($tab))
			{
				/* création et alimentation de l'objet */
				for ($i=0; $i<count($tab); $i++)
				{
					$return[$i]=new Node();
					$return[$i]->doLoad($tab[$i]["id"], $tab[$i]["idpere"], $tab[$i]["libelle"], $tab[$i]["icone"], $tab[$i]["template"], $tab[$i]["domain"], $tab[$i]["haspublic"], $tab[$i]["ctype"], $tab[$i]["ctypereg"], $tab[$i]["usergroupid"], $tab[$i]["subsgroupid"], $tab[$i]["subsgrouptempid"], $tab[$i]["mailnode"]);
				}
			}else{
				$systemError=3;
				$classe="NodeManager";
				$message="Erreur objet invalide ";
				addError($systemError, $classe, $message, __line__, __file__);
			}
		}else{
			$systemError=3;
			$classe="NodeManager";
			$message="Erreur objet invalide ";
			addError($systemError, $classe, $message, __line__, __file__);
		}
		return $return;
	}

/**
* deleteInstance : detruit l'objet physique
*
* @param object objet Node à effacer
* @access public
* @return object objetNode mis à jour
*/
	function deleteInstance($obj)
	{
		$return = false;
		if ( strtolower(get_class($obj))=="node" )
		{
			if($obj->isLoaded()==true)
			{
				/* Récupération des infos */
				$this->CallSystemPlugin("__deleteNode", $obj);
				$return=$this->sourceDelete($obj->getId());
				$obj->setId(0);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="NodeManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* updateInstance : met à jour l'objet
*
* @param object objet Node à modifier
* @access public
* @return object objetNode mis à jour
*/
	function updateInstance($obj)
	{
// 		var_dump($obj);
// 		exit(0);
	
		$return = false;
		if ((strtolower(get_class($obj))=="node") && ($obj->isLoaded()==true))
		{
			/* Récupération des infos */
			$id=$this->sourceUpdate($obj->getId(), $obj->getIdPere(), $obj->getXmlLibelle(), $obj->getIcone(), $obj->getTemplate(), $obj->getDomain(), $obj->getHasPublic(), $obj->getCType(), $obj->getCTypereg(), $obj->getUserGroupId(), $obj->getSubsGroupId(), $obj->getSubsGroupTempId(), $obj->getMailNode());
			$this->CallSystemPlugin("__updateNode", $obj);
			return $obj;
		}
		/* Erreur */
		$systemError=3;
		$classe="NodeManager";
		$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 Node à inserer
* @access public
* @return object objetNode mis à jour
*/
	function insertInstance($obj)
	{
		if ((strtolower(get_class($obj))==strtolower("Node")))
		{
			if ($obj->isLoaded()==false)
			{
				/* Récupération des infos */
				$id=$this->sourceInsert($obj->getIdPere(), $obj->getXmlLibelle(), $obj->getIcone(), $obj->getTemplate(), $obj->getDomain(), $obj->getHasPublic(), $obj->getCType(), $obj->getCTypereg(), $obj->getUserGroupId(), $obj->getSubsGroupId(), $obj->getSubsGroupTempId(), $obj->getMailNode());
				$obj->setId($id);
				$this->CallSystemPlugin("__insertNode", $obj);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="NodeManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}
/**
* saveInstance : créer enregistre l'objet
*
* @param object objet Node à sauvegarder
* @access public
* @return object objetNode mis à jour
*/
	function saveInstance($obj)
	{
		if ((strtolower(get_class($obj))==strtolower("Node")))
		{
			if ($obj->isLoaded()==false)
			{
				$return=$this->insertInstance($obj);
			}else{
				$return=$this->updateInstance($obj);
			}
			return $return;
		}

		/* Erreur */
		$systemError=3;
		$classe="NodeManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);
		$return=$obj;

		return $return;
	}
}
?>
