aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/opendd.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/opendd.php')
-rw-r--r--engine/lib/opendd.php306
1 files changed, 306 insertions, 0 deletions
diff --git a/engine/lib/opendd.php b/engine/lib/opendd.php
new file mode 100644
index 000000000..0f4955448
--- /dev/null
+++ b/engine/lib/opendd.php
@@ -0,0 +1,306 @@
+<?php
+ /**
+ * OpenDD PHP Library.
+ *
+ * @package Elgg
+ * @subpackage Core
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Marcus Povey
+ * @copyright Curverider Ltd 2008
+ * @link http://elgg.org/
+ */
+
+ /**
+ * @class ODDDocument ODD Document container.
+ * This class is used during import and export to construct.
+ * @author Marcus Povey
+ */
+ class ODDDocument implements Iterator
+ {
+ /**
+ * ODD Version
+ *
+ * @var string
+ */
+ private $ODDSupportedVersion = "1.0";
+
+ /**
+ * Elements of the document.
+ */
+ private $elements;
+
+ public function __construct(array $elements = NULL)
+ {
+ if ($elements)
+ $this->elements = $elements;
+ else
+ $this->elements = array();
+ }
+
+ /**
+ * Return the version of ODD being used.
+ *
+ * @return string
+ */
+ public function getVersion() { return $this->ODDSupportedVersion; }
+
+ public function addElement(ODD $element) { $this->elements[] = $element; }
+ public function addElements(array $elements)
+ {
+ foreach ($elements as $element)
+ $this->addElement($element);
+ }
+
+ public function getElements() { return $this->elements; }
+
+ /**
+ * Magic function to generate valid ODD XML for this item.
+ */
+ public function __toString()
+ {
+ $xml = "";
+
+ // Output begin tag
+ $generated = date("r");
+ $xml .= "<odd version=\"{$this->ODDSupportedVersion}\" generated=\"$generated\">\n";
+
+ // Get XML for elements
+ foreach ($this->elements as $element)
+ $xml .= "$element";
+
+ // Output end tag
+ $xml .= "</odd>\n";
+
+ return $xml;
+ }
+
+ // ITERATOR INTERFACE //////////////////////////////////////////////////////////////
+ /*
+ * This lets an entity's attributes be displayed using foreach as a normal array.
+ * Example: http://www.sitepoint.com/print/php5-standard-library
+ */
+
+ private $valid = FALSE;
+
+ function rewind()
+ {
+ $this->valid = (FALSE !== reset($this->elements));
+ }
+
+ function current()
+ {
+ return current($this->elements);
+ }
+
+ function key()
+ {
+ return key($this->elements);
+ }
+
+ function next()
+ {
+ $this->valid = (FALSE !== next($this->elements));
+ }
+
+ function valid()
+ {
+ return $this->valid;
+ }
+ }
+
+ /**
+ * Open Data Definition (ODD) superclass.
+ * @package Elgg
+ * @subpackage Core
+ * @author Marcus Povey
+ */
+ abstract class ODD
+ {
+ /**
+ * Attributes.
+ */
+ private $attributes = array();
+
+ /**
+ * Optional body.
+ */
+ private $body;
+
+ /**
+ * Construct an ODD document with initial values.
+ */
+ public function __construct()
+ {
+ $this->body = "";
+ }
+
+ public function setAttribute($key, $value) { $this->attributes[$key] = $value; }
+ public function getAttribute($key)
+ {
+ if (isset($this->attributes[$key]))
+ return $this->attributes[$key];
+
+ return NULL;
+ }
+ public function setBody($value) { $this->body = $value; }
+ public function getBody() { return $this->body; }
+
+ /**
+ * 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</{$tag}>";
+
+ return "<{$tag} $attr" . $end . "\n";
+ }
+ }
+
+ /**
+ * 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, $type, $uuid2)
+ {
+ parent::__construct();
+
+ $this->setAttribute('uuid1', $uuid1);
+ $this->setAttribute('type', $type);
+ $this->setAttribute('uuid2', $uuid2);
+ }
+
+ protected function getTagName() { return "relationship"; }
+ }
+
+ /**
+ * Attempt to construct an ODD object out of a XmlElement or sub-elements.
+ *
+ * @param XmlElement $element The element(s)
+ * @return mixed An ODD object if the element can be handled, or false.
+ */
+ function ODD_factory(XmlElement $element)
+ {
+ $name = $element->name;
+ $odd = false;
+
+ switch ($name)
+ {
+ case 'entity' : $odd = new ODDEntity("","",""); break;
+ case 'metadata' : $odd = new ODDMetaData("","","",""); break;
+ case 'relationship' : $odd = new ODDRelationship("","",""); break;
+ }
+
+ // Now populate values
+ if ($odd)
+ {
+ // Attributes
+ foreach ($element->attributes as $k => $v)
+ $odd->setAttribute($k,$v);
+
+ // Body
+ $odd->setBody($element->content);
+ }
+
+ return $odd;
+ }
+
+ /**
+ * Import an ODD document.
+ *
+ * @param string $xml The XML ODD.
+ * @return ODDDocument
+ */
+ function ODD_Import($xml)
+ {
+ // Parse XML to an array
+ $elements = xml_2_object($xml);
+
+ // Create ODDDocument
+ $document = new ODDDocument();
+
+ // Itterate through array of elements and construct ODD document
+ foreach ($elements->children as $child)
+ {
+ $odd = ODD_factory($child);
+
+ if ($odd)
+ $document->addElement($odd);
+ }
+
+ return $document;
+ }
+
+ /**
+ * Export an ODD Document.
+ *
+ * @param ODDDocument $document The Document.
+ */
+ function ODD_Export(ODDDocument $document)
+ {
+ return "$document";
+ }
+
+?> \ No newline at end of file