Enable json-specified objects in queue_item frames

This commit is contained in:
Mikael Nordfeldth
2013-10-25 18:15:34 +02:00
parent 2ef9beb4b1
commit e7a4ccb7b5
3 changed files with 54 additions and 20 deletions

View File

@@ -177,7 +177,39 @@ abstract class QueueManager extends IoManager
*/
protected function decode($frame)
{
return unserialize($frame);
$object = unserialize($frame);
// If it is a string, we really store a JSON object in there
if (is_string($object)) {
$json = json_decode($object);
if ($json === null) {
throw new Exception('Bad frame in queue item');
}
// The JSON object has a type parameter which contains the class
if (empty($json->type)) {
throw new Exception('Type not specified for queue item');
}
if (!is_a($json->type, 'Managed_DataObject', true)) {
throw new Exception('Managed_DataObject class does not exist for queue item');
}
// And each of these types should have a unique id (or uri)
if (isset($json->id) && !empty($json->id)) {
$object = call_user_func(array($json->type, 'getKV'), 'id', $json->id);
} elseif (isset($json->uri) && !empty($json->uri)) {
$object = call_user_func(array($json->type, 'getKV'), 'uri', $json->uri);
}
// But if no object was found, there's nothing we can handle
if (!$object instanceof Managed_DataObject) {
throw new Exception('Queue item frame referenced a non-existant object');
}
}
// If the frame was not a string, it's either an array or an object.
return $object;
}
/**