From 9caa09ee888d7884e22cc46089e6e0fb6579732c Mon Sep 17 00:00:00 2001 From: icewing Date: Tue, 20 May 2008 11:38:25 +0000 Subject: Marcus Povey * Committed abortive Atom wrapper... we need to support different import/export git-svn-id: https://code.elgg.org/elgg/trunk@657 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/atom.php | 170 ++++++++++++++++++++++++++++++++++++ engine/lib/export.php | 5 +- engine/lib/opendd.php | 95 +++++++++++++++++--- views/atom/export/entity.php | 17 ++++ views/atom/export/metadata.php | 21 +++++ views/atom/export/relationship.php | 21 +++++ views/atom/pageshells/pageshell.php | 16 ++++ 7 files changed, 330 insertions(+), 15 deletions(-) create mode 100644 engine/lib/atom.php create mode 100644 views/atom/export/entity.php create mode 100644 views/atom/export/metadata.php create mode 100644 views/atom/export/relationship.php create mode 100644 views/atom/pageshells/pageshell.php diff --git a/engine/lib/atom.php b/engine/lib/atom.php new file mode 100644 index 000000000..684ae0946 --- /dev/null +++ b/engine/lib/atom.php @@ -0,0 +1,170 @@ +\n"; + $wrapped .= "".urlencode(current_page_url())."\n"; + $wrapped .= "".date(DATE_ATOM)."\n"; + $wrapped .= "".$_SESSION['user']->name."\n"; + $wrapped .= "OpenDD-over-Atom feed\n"; + + // Itterate + foreach ($element as $e) + { + $wrapper = $factory->getElementWrapper($e); + $wrapped .= $wrapper->wrap($e); + } + + // Tail + $wrapped .= "\n"; + + return $wrapped; + } + } + + /** + * Atom entity wrapper + */ + class ODDAtomEntityWrapper extends ODDEntityWrapper + { + function wrap($element) + { + $wrapped = ""; + + // Sanity check + if (!($element instanceof ODDEntity)) + throw new DataFormatException("Element being wrapped is not an ODDEntity"); + + $wrapped .= "\n"; + + $wrapped .= "".$element->getAttribute('uuid')."?view=atom"."\n"; + $wrapped .= "".date(DATE_ATOM)."\n"; + $wrapped .= "Entity\n"; + $wrapped .= "".$_SESSION['user']->name."\n"; + + $wrapped .= "\n"; + $wrapped .= "$element\n"; + $wrapped .= "\n"; + + $wrapped .= "\n"; + + return $wrapped; + } + + } + + /** + * Atom metadata wrapper + */ + class ODDAtomMetaDataWrapper extends ODDMetaDataWrapper + { + function wrap($element) + { + $wrapped = ""; + + // Sanity check + if (!($element instanceof ODDMetaData)) + throw new DataFormatException("Element being wrapped is not an ODDMetaData"); + + $wrapped .= "\n"; + + $wrapped .= "".$element->getAttribute('uuid')."?view=atom"."\n"; + $wrapped .= "".date(DATE_ATOM)."\n"; + $wrapped .= "Entity\n"; + $wrapped .= "".$_SESSION['user']->name."\n"; + + $wrapped .= "\n"; + $wrapped .= "$element\n"; + $wrapped .= "\n"; + + $wrapped .= "\n"; + + return $wrapped; + } + } + + /** + * Atom Relationship wrapper. + */ + class ODDAtomRelationshipWrapper extends ODDRelationshipWrapper + { + function wrap($element) + { + $wrapped = ""; + + // Sanity check + if (!($element instanceof ODDRelationship)) + throw new DataFormatException("Element being wrapped is not an ODDRelationship"); + + $wrapped .= "\n"; + + $wrapped .= "\n"; + $wrapped .= "".date(DATE_ATOM)."\n"; + $wrapped .= "Entity\n"; + $wrapped .= "".$_SESSION['user']->name."\n"; + + $wrapped .= "\n"; + $wrapped .= "$element\n"; + $wrapped .= "\n"; + + $wrapped .= "\n"; + + return $wrapped; + } + } +?> \ No newline at end of file diff --git a/engine/lib/export.php b/engine/lib/export.php index e389613e8..815fc5819 100644 --- a/engine/lib/export.php +++ b/engine/lib/export.php @@ -161,9 +161,10 @@ * * @see ElggEntity for an example of its usage. * @param int $guid The GUID. + * @param ODDWrapperFactory $wrapper Optional wrapper permitting the export process to embed ODD in other document formats. * @return xml */ - function export($guid) + function export($guid, ODDWrapperFactory $wrapper = null) { $guid = (int)$guid; @@ -178,7 +179,7 @@ $odd = new ODDDocument($to_be_serialised); - return "$odd"; + return ODD_Export($odd, $wrapper); } /** diff --git a/engine/lib/opendd.php b/engine/lib/opendd.php index 2c87f3265..96c18bbea 100644 --- a/engine/lib/opendd.php +++ b/engine/lib/opendd.php @@ -6,7 +6,7 @@ * @subpackage Core * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 * @author Marcus Povey - * @version 0.2 + * @version 0.3 * @copyright Curverider Ltd 2008 * @link http://elgg.org/ */ @@ -32,6 +32,11 @@ */ private $elements; + /** + * Optional wrapper factory. + */ + private $wrapperfactory; + public function __construct(array $elements = NULL) { if ($elements) @@ -56,6 +61,11 @@ public function getElements() { return $this->elements; } + /** + * Set an optional wrapper factory to optionally embed the ODD document in another format. + */ + public function setWrapperFactory(ODDWrapperFactory $factory) { $this->wrapperfactory = $factory; } + /** * Magic function to generate valid ODD XML for this item. */ @@ -63,17 +73,27 @@ { $xml = ""; - // Output begin tag - $generated = date("r"); - $xml .= "ODDSupportedVersion}\" generated=\"$generated\">\n"; - - // Get XML for elements - foreach ($this->elements as $element) - $xml .= "$element"; - - // Output end tag - $xml .= "\n"; - + if ($this->wrapperfactory) + { + // A wrapper has been provided + $wrapper = $this->wrapperfactory->getElementWrapper($this); // Get the wrapper for this element + + $xml = $wrapper->wrap($this); // Wrap this element (and subelements) + } + else + { + // Output begin tag + $generated = date("r"); + $xml .= "ODDSupportedVersion}\" generated=\"$generated\">\n"; + + // Get XML for elements + foreach ($this->elements as $element) + $xml .= "$element"; + + // Output end tag + $xml .= "\n"; + } + return $xml; } @@ -157,6 +177,7 @@ { $this->attributes['published'] = date("r", $time); } + /** * For serialisation, implement to return a string name of the tag eg "header" or "metadata". * @return string @@ -182,6 +203,7 @@ return "<{$tag} $attr" . $end . "\n"; } + } /** @@ -247,6 +269,46 @@ protected function getTagName() { return "relationship"; } } + /** + * A wrapper factory is used to construct the appropriate wrappers that permit ODD documents to be embedded + * as a payload in other formats. + */ + abstract class ODDWrapperFactory + { + abstract function getElementWrapper($element); + } + + /** + * Element wrapper superclass. + */ + abstract class ODDWrapper + { + /** + * Wrap an element and return the encoded string. + */ + abstract function wrap($element); + } + + /** + * Document wrapper superclass + */ + abstract class ODDDocumentWrapper extends ODDWrapper { } + + /** + * Entity wrapper superclass + */ + abstract class ODDEntityWrapper extends ODDWrapper { } + + /** + * Metadata wrapper superclass + */ + abstract class ODDMetaDataWrapper extends ODDWrapper { } + + /** + * Relationship wrapper superclass. + */ + abstract class ODDRelationshipWrapper extends ODDWrapper { } + /** * Attempt to construct an ODD object out of a XmlElement or sub-elements. * @@ -309,10 +371,17 @@ * Export an ODD Document. * * @param ODDDocument $document The Document. + * @param ODDWrapperFactory $wrapper Optional wrapper permitting the export process to embed ODD in other document formats. */ - function ODD_Export(ODDDocument $document) + function ODD_Export(ODDDocument $document, ODDWrapperFactory $wrapper = null) { + if ($wrapper) + $document->setWrapperFactory($wrapper); + return "$document"; } + + + // input - how? root element handler? ?> \ No newline at end of file diff --git a/views/atom/export/entity.php b/views/atom/export/entity.php new file mode 100644 index 000000000..c89a73fc4 --- /dev/null +++ b/views/atom/export/entity.php @@ -0,0 +1,17 @@ +guid, new ODDAtomWrapperFactory()); +?> \ No newline at end of file diff --git a/views/atom/export/metadata.php b/views/atom/export/metadata.php new file mode 100644 index 000000000..2c943cd4d --- /dev/null +++ b/views/atom/export/metadata.php @@ -0,0 +1,21 @@ +addElement($m->export()); + $odd->setWrapperFactory(new ODDAtomWrapperFactory()); + + echo $odd; +?> \ No newline at end of file diff --git a/views/atom/export/relationship.php b/views/atom/export/relationship.php new file mode 100644 index 000000000..d0ad62385 --- /dev/null +++ b/views/atom/export/relationship.php @@ -0,0 +1,21 @@ +addElement($r->export()); + $odd->setWrapperFactory(new ODDAtomWrapperFactory()); + + echo $odd; +?> \ No newline at end of file diff --git a/views/atom/pageshells/pageshell.php b/views/atom/pageshells/pageshell.php new file mode 100644 index 000000000..f5c7a4ce0 --- /dev/null +++ b/views/atom/pageshells/pageshell.php @@ -0,0 +1,16 @@ + \ No newline at end of file -- cgit v1.2.3