body = ""; $this->setAttribute('generated', date("r")); } protected function setAttribute($key, $value) { $this->attributes[$key] = $value; } protected function getAttribute($key) { if (isset($this->attributes[$key])) return $this->attributes[$key]; return NULL; } protected function setBody($value) { $this->body = $value; } protected function getBody() { return $this->body; } /** * Return the version of ODD being used. * * @return real */ public function getVersion() { return $this->ODDSupportedVersion; } /** * For serialisation, implement to return a string name of the tag eg "header" or "metadata". * @return string */ abstract protected function getTagName(); /** * Magic function to generate valid ODD XML for this item. */ public function __toString() { // Construct attributes $attr = ""; foreach ($this->attributes as $k => $v) $attr .= ($v!="") ? "$k=\"$v\" " : ""; $body = $this->getBody(); $tag = $this->getTagName(); $end = "/>"; if ($body!="") $end = ">$body"; return "<$tag $attr" . $end . "\n"; } } /** * ODD Header class. * @package Elgg * @subpackage Core * @author Marcus Povey */ class ODDHeader extends ODD { function __construct($extension = "SN1.0") { parent::__construct(); $this->setAttribute('version', $this->getVersion()); $this->setAttribute('extension', $extension); } protected function getTagName() { return "header"; } } /** * ODD Entity class. * @package Elgg * @subpackage Core * @author Marcus Povey */ class ODDEntity extends ODD { function __construct($uuid, $class, $subclass = "") { parent::__construct(); $this->setAttribute('uuid', $uuid); $this->setAttribute('class', $class); $this->setAttribute('subclass', $subclass); } protected function getTagName() { return "entity"; } } /** * ODD Metadata class. * @package Elgg * @subpackage Core * @author Marcus Povey */ class ODDMetaData extends ODD { function __construct($uuid, $entity_uuid, $name, $value, $type = "", $owner_uuid = "") { parent::__construct(); $this->setAttribute('uuid', $uuid); $this->setAttribute('entity_uuid', $entity_uuid); $this->setAttribute('name', $name); $this->setAttribute('type', $type); $this->setAttribute('owner_uuid', $owner_uuid); $this->setBody($value); } protected function getTagName() { return "metadata"; } } /** * ODD Relationship class. * @package Elgg * @subpackage Core * @author Marcus Povey */ class ODDRelationship extends ODD { function __construct($uuid1, $verb, $uuid2) { parent::__construct(); $this->setAttribute('uuid1', $uuid); $this->setAttribute('verb', $uuid); $this->setAttribute('uuid2', $uuid); } protected function getTagName() { return "relationship"; } } /** Relationship verb mapping */ $ODD_RELATIONSHIP_VERBS = array(); /** * This function provides a mapping between entity relationships and ODD relationship verbs. * @param string $relationship The relationship as stored in the database, eg "friend" or "member of" * @param string $verb The verb, eg "friends" or "joins" */ function register_odd_relationship_mapping($relationship, $verb) { global $ODD_RELATIONSHIP_VERBS; $ODD_RELATIONSHIP_VERBS[$relationship] = $verb; } /** * Return a mapping for relationship to a pre-registered ODD verb, or false. * @param string $relationship The relationship */ function get_verb_from_relationship($relationship) { global $ODD_RELATIONSHIP_VERBS; if (isset($ODD_RELATIONSHIP_VERBS[$relationship])) return $ODD_RELATIONSHIP_VERBS[$relationship]; return false; } /** * Return the relationship registered with a given verb, or false. * @param string $verb The verb. */ function get_relationship_from_verb($verb) { global $ODD_RELATIONSHIP_VERBS; foreach ($ODD_RELATIONSHIP_VERBS as $k => $v) if ($v == $verb) return $k; return false; } /** * Generate a UUID from a given GUID. * * @param int $guid The GUID of an object. */ function guid_to_uuid($guid) { global $CONFIG; return $CONFIG->wwwroot . "odd/$guid/"; } /** * Test to see if a given uuid is for this domain, returning true if so. * @param $uuid * @return bool */ function is_uuid_this_domain($uuid) { global $CONFIG; if (strpos($uuid, $CONFIG->wwwroot) === 0) return true; return false; } /** * This function attempts to retrieve a previously imported entity via its UUID. * * @param $uuid */ function get_entity_from_uuid($uuid) { $uuid = sanitise_string($uuid); $entities = get_entities_from_metadata("import_uuid", $uuid); if ($entities) return $entities[0]; return false; } /** * Tag a previously created guid with the uuid it was imported on. * * @param int $guid * @param string $uuid */ function add_uuid_to_guid($guid, $uuid) { $guid = (int)$guid; $uuid = sanitise_string($uuid); return create_metadata($guid, "import_uuid", $uuid); } /** * Export a GUID. * * This function exports a GUID and all information related to it in an XML format. * * This function makes use of the "serialise" plugin hook, which is passed an array to which plugins * should add data to be serialised to. * * @see ElggEntity for an example of its usage. * @param int $guid The GUID. * @return xml */ function export($guid) { $guid = (int)$guid; // Initialise the array $to_be_serialised = array(); // Set header $to_be_serialised[] = new ODDHeader(); // Trigger a hook to $to_be_serialised = trigger_plugin_hook("export", "all", array("guid" => $guid), $to_be_serialised); // Sanity check if ((!is_array($to_be_serialised)) || (count($to_be_serialised)==0)) throw new ExportException("No such entity GUID:$guid"); $output = "\n"; foreach ($to_be_serialised as $odd) $output .= "$odd"; $output .= "\n"; return $output; } $IMPORTED_DATA = array(); $IMPORTED_OBJECT_COUNTER = 0; /** * This function processes an element, passing elements to the plugin stack to see if someone will * process it. * If nobody processes the top level element, the sub level elements are processed. */ /* function __process_element(array $dom) { global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER; foreach ($dom as $element) { // See if anyone handles this element, return true if it is. $handled = trigger_plugin_hook("import", "all", array("name" => $element['name'], "element" => $element), $to_be_serialised); // If not, then see if any of its sub elements are handled if (!$handled) { if (isset($element['elements'])) __process_element($element['elements']); } else { $IMPORTED_OBJECT_COUNTER ++; // Increment validation counter $IMPORTED_DATA[] = $handled; // Return the constructed object } } } /** * Import an XML serialisation of an object. * This will make a best attempt at importing a given xml doc. * * @param string $xml * @return array An array of imported objects (these have already been saved). * @throws Exception if there was a problem importing the data. */ /* function import($xml) { global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER; $IMPORTED_DATA = array(); $IMPORTED_OBJECT_COUNTER = 0; $IMPORTED_GUID_MAP = array(); $dom = __xml2array($xml); __process_element($dom); if ($IMPORTED_OBJECT_COUNTER!= count($IMPORTED_DATA)) throw new ImportException("Not all elements were imported."); return $IMPORTED_DATA; } */ ?>