getDebugInstance()->output(sprintf("[%s:] Konstruktor erreicht.
\n",
$this->__toString()
));
// Set description
$this->setPartDescr("Simulationspersonal");
// Create unique ID
$this->createUniqueID();
// Clean-up a little
$this->removeSystemArray();
}
/**
* Magic wake-up method called when unserialize() is called. This is
* neccessary because in this case a personell does not need to know the
* min/max ages range and system classes. This would anyway use more RAM
* what is not required.
*
* @return void
*/
public function __wakeup () {
// Tidy up a little
$this->removePersonellList();
$this->removeMinMaxAge();
$this->removeCache();
$this->removeSystemArray();
}
/**
* Generate a specified amount of personell and return the prepared instance
*
* @param $amountPersonell Number of personell we shall
* generate
* @return $personellInstance An instance of this object with a
* list of personells
*/
public static function createSimulatorPersonell ($amountPersonell) {
// Make sure only integer can pass
$amountPersonell = (int) $amountPersonell;
// Get a new instance
$personellInstance = new SimulatorPersonell();
// Generate unique ID number
$personellInstance->createUniqueID();
// Debug message
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $personellInstance->getDebugInstance()->output(sprintf("[%s:%d] Es werden %d Personal bereitgestellt.
\n",
__CLASS__,
__LINE__,
$amountPersonell
));
// Initialize the personell list
$personellInstance->createPersonellList();
// Create requested amount of personell
for ($idx = 0; $idx < $amountPersonell; $idx++) {
$personellInstance->addPersonell();
}
// Debug message
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $personellInstance->getDebugInstance()->output(sprintf("[%s:%d] %d Personal bereitgestellt.
\n",
__CLASS__,
__LINE__,
$amountPersonell
));
// Tidy up a little
$personellInstance->removeGender();
$personellInstance->removeNames();
$personellInstance->removeBirthday();
$personellInstance->removeSalary();
$personellInstance->removeEmployed();
$personellInstance->removeMarried();
$personellInstance->removeNumberFormaters();
//$personellInstance->removeCache();
$personellInstance->removeSystemArray();
// Instanz zurueckgeben
return $personellInstance;
}
/**
* Create a SimulatorPersonell object by loading the specified personell
* list from an existing database backend
*
* @param $idNumber The ID number (only right part) of the list
* @return $personellInstance An instance of
* @throws InvalidIDFormatException If the given id number
* $idNumber is invalid
* @throws NullPointerException If a null pointer (instance)
* has been returned.
* @throws NoObjectException If a non-object has been
* returned
* @throws MissingMethodException If a required method is missing
* @throws MissingSimulatorIDException If an ID number was not found
*/
public final static function createSimulatorPersonellByID ($idNumber) {
// Add the class name if it was not found
if (count(explode("@", $idNumber)) < 2) {
// Add class name in front of the incomplete ID number
$tempID = sprintf("%s@%s", __CLASS__, $idNumber);
} else {
// Use the direct ID number
$tempID = $idNumber;
}
// Validate the ID number
if (!preg_match(sprintf("/%s\@([a-f0-9]){32}/i", __CLASS__), $tempID)) {
// Invalid format
throw new InvalidIDFormatException(new SimulatorPersonell(), self::EXCEPTION_ID_IS_INVALID_FORMAT);
}
// Get instance
$personellInstance = new SimulatorPersonell(false);
// Get database instance
$dbInstance = $personellInstance->getDatabaseInstance();
// Is this a valid database instance?
if (is_null($dbInstance)) {
// No class returned
throw new NullPointerException($personellInstance, self::EXCEPTION_IS_NULL_POINTER);
} elseif (!is_object($dbInstance)) {
// Not an object! ;-(
throw new NoObjectException($dbInstance, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!method_exists($dbInstance, 'isUniqueIdUsed')) {
// Required method not found
throw new MissingMethodException(array($dbInstance, 'isUniqueIdUsed'), self::EXCEPTION_MISSING_METHOD);
}
// Is the unique ID already used? Then it must be there!
if (!$dbInstance->isUniqueIdUsed($tempID)) {
// Entry not found!
throw new MissingSimulatorIDException(array($personellInstance, $idNumber), self::EXCEPTION_SIMULATOR_ID_INVALID);
}
// Load the personell list and add it to this object
$personellInstance->loadPersonellList($tempID);
// Clean-up a little
$personellInstance->removeGender();
$personellInstance->removeNames();
$personellInstance->removeBirthday();
$personellInstance->removeSalary();
$personellInstance->removeEmployed();
$personellInstance->removeMarried();
$personellInstance->removeNumberFormaters();
//$personellInstance->removeCache();
$personellInstance->removeSystemArray();
// Return instance
return $personellInstance;
}
// Create personell list
public function createPersonellList () {
if (is_null($this->personellList)) {
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Personell-Liste erstellt.
\n",
__CLASS__,
__LINE__
));
$this->personellList = new FrameworkArrayObject();
} else {
throw new PersonellListAlreadyCreatedException($this, self::EXCEPTION_DIMENSION_ARRAY_INVALID);
}
}
// Remove the personell list
private function removePersonellList () {
if (defined('DEBUG_PERSONELL')) $this->getDebugInstance()->output(sprintf("[%s:%d] Personell-Liste entfernt.
\n",
__CLASS__,
__LINE__
));
unset($this->personellList);
}
// Add new personell object to our list
public function addPersonell () {
// Gender list...
$genders = array('M', 'F');
// Create new personell members
$personellInstance = new SimulatorPersonell();
// Set a randomized gender
$personellInstance->setGender($genders[mt_rand(0, 1)]);
// Set a randomized birthday (maximum age required, see const MAX_AGE)
$personellInstance->createBirthday();
// Married? Same values means: married
if (mt_rand(0, 5) == mt_rand(0, 5)) $personellInstance->setMarried(true);
// Tidy up a little
$personellInstance->removePersonellList();
$personellInstance->removeMinMaxAge();
$personellInstance->removeCache();
$personellInstance->removeSystemArray();
// Add new member to the list
$this->personellList->append($personellInstance);
}
/**
* Get a specifyable list of our people, null or empty string will be ignored!
*
* @return $cacheList A list of cached personells
*/
function getSpecialPersonellList ($isEmployed = null, $isMarried = null, $hasGender = "") {
// Serialize the conditions for checking if we can take the cache
$serialized = serialize(array($isEmployed, $isMarried, $hasGender));
// The same (last) conditions?
if (($serialized == $this->cacheCond) && (!is_null($this->cacheCond))) {
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Gecachte Liste wird verwendet.
\n",
__CLASS__,
__LINE__
));
// Return cached list
return $this->cacheList;
}
// Output debug message
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Personalliste wird nach Kriterien durchsucht...
\n",
__CLASS__,
__LINE__
));
// Remember the conditions
$this->setCacheCond($serialized);
// Create cached list
$this->setAllCacheList(new FrameworkArrayObject());
// Search all unemployed personells
for ($idx = $this->personellList->getIterator(); $idx->valid(); $idx->next()) {
// Element holen
$el = $idx->current();
// Check currenylt all single conditions (combined conditions are not yet supported)
if ((!is_null($isEmployed)) && ($el->isEmployed() == $isEmployed)) {
// Add this one (employed status asked)
$this->cacheList->append($el);
} elseif ((!is_null($isMarried)) && ($el->isMarried() == $isMarried)) {
// Add this one (marrital status asked)
$this->cacheList->append($el);
} elseif ((!empty($hasGender)) && ($el->getGender() == $hasGender)) {
// Add this one (specified gender)
$this->cacheList->append($el);
}
}
// Return the completed list
return $this->cacheList;
}
/**
* Get amount of unemployed personell
*
* @return $count Amount of unemployed personell
*/
public function getAllUnemployed () {
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Es werden alle erwerbslosen Personen gesucht.
\n",
__CLASS__,
__LINE__
));
// Get a temporary list
$list = $this->getSpecialPersonellList(false);
// Anzahl zurueckliefern
return $list->count();
}
/**
* Remove cache things
*
* @return void
*/
private function removeCache () {
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Cache-Attribute entfernt.
\n",
__CLASS__,
__LINE__
));
// Remove cache data
unset($this->cacheList);
unset($this->cacheCond);
}
/**
* Setter for cache list
*
* @param $cacheList The new cache list to set or null for initialization/reset
* @return void
*/
private function setAllCacheList (FrameworkArrayObject $cacheList = null) {
$this->cacheList = $cacheList;
}
/**
* Setter for cache conditions
*
* @param $cacheCond The new cache conditions to set
* @return void
*/
private function setCacheCond ($cacheCond) {
$this->cacheCond = (string) $cacheCond;
}
/**
* Reset cache list
*
* @return void
*/
public function resetCache () {
if ((defined('DEBUG_PERSONELL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Cache-Liste zurückgesetzt.
\n",
__CLASS__,
__LINE__
));
$this->setAllCacheList(null);
$this->setCacheCond("");
}
/**
* Getter for surname. If no surname is set then default surnames are set
* for male and female personells.
*
* @return $surname The personell' surname
*/
public final function getSurname () {
$surname = parent::getSurname();
// Make sure every one has a surname...
if (empty($surname)) {
if ($this->isMale()) {
// Typical male name
$surname = "John";
} else {
// Typical female name
$surname = "Jennifer";
}
// Set typical family name
parent::setFamily("Smith");
}
return $surname;
}
/**
* Saves only the personell list to the database
*
* @return void
*/
public function saveObjectToDatabase () {
// Get the database
$dbInstance = $this->getDatabaseInstance();
// Prepare the limitation object. We just need the personellList array object.
$limitInstance = ObjectLimits::createObjectLimits(array("personellList"));
// Limitate the saving amount
$dbInstance->limitObject($limitInstance);
// Save this object
$dbInstance->saveObject($this);
}
/**
* Getter for personell list
*
* @return $personellList The list of all personells
*/
public function getPersonellList () {
return $this->personellList;
}
/**
* Loads the mostly pre-cached personell list
*
* @param $idNumber The ID number we shall use for looking up
* the right data.
* @return void
* @throws ContainerItemIsNullException If a container item is null
* @throws ContainerItemIsNoArrayException If a container item is
* not an array
* @throws ContainerMaybeDamagedException If the container item
* is missing the indexes
* 'name' and/or 'value'
* @see SerializationContainer A special container class which
* helps storing only some attributes
* of a class.
*/
public function loadPersonellList ($idNumber) {
// Get database instance
$dbInstance = $this->getDatabaseInstance();
// Get the serialization container within the personell list from
// the database layer
$containerInstance = $dbInstance->getObjectFromCachedData($idNumber);
// Iterate through the whole container
for ($idx = $containerInstance->getIterator(); $idx->valid(); $idx->next()) {
// Get current item from container
$item = $idx->current();
// Validate it a bit
if (is_null($item)) {
// Is null
throw new ContainerItemIsNullException($this, self::EXCEPTION_CONTAINER_ITEM_IS_NULL);
} elseif (!is_array($item)) {
// Is not an array
throw new ContainerItemIsNoArrayException($this, self::EXCEPTION_ITEM_IS_NO_ARRAY);
} elseif ((!isset($item['name'])) || (!isset($item['value']))) {
// Missing elements
throw new ContainerMaybeDamagedException($this, self::EXCEPTION_CONTAINER_MAYBE_DAMAGED);
}
// Okay, now we can get the item and generate a valid command for eval().
// We need to convert the first letter to lower-case but keep all others intact
$eval = sprintf("\$this->%s = \$item['value'];",
strtolower(substr($item['name'], 0, 1))
.
substr($item['name'], 1)
);
// Debug message
if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Konstruierte PHP-Anweisung:
%s