mirror of
https://github.com/SociallyDev/Spaces-API.git
synced 2025-07-06 04:51:32 -07:00
* Simplifies & beautifies everything * Introduces a new Class system. * Errors are defaulted to AWS's handler. * New function names & more efficient handling. * Should fix a majority of the errors. Please read the README for more!
220 lines
5.8 KiB
PHP
220 lines
5.8 KiB
PHP
<?php
|
|
namespace Aws\Api\Serializer;
|
|
|
|
use Aws\Api\MapShape;
|
|
use Aws\Api\Service;
|
|
use Aws\Api\Shape;
|
|
use Aws\Api\StructureShape;
|
|
use Aws\Api\ListShape;
|
|
use Aws\Api\TimestampShape;
|
|
use XMLWriter;
|
|
|
|
/**
|
|
* @internal Formats the XML body of a REST-XML services.
|
|
*/
|
|
class XmlBody
|
|
{
|
|
/** @var \Aws\Api\Service */
|
|
private $api;
|
|
|
|
/**
|
|
* @param Service $api API being used to create the XML body.
|
|
*/
|
|
public function __construct(Service $api)
|
|
{
|
|
$this->api = $api;
|
|
}
|
|
|
|
/**
|
|
* Builds the XML body based on an array of arguments.
|
|
*
|
|
* @param Shape $shape Operation being constructed
|
|
* @param array $args Associative array of arguments
|
|
*
|
|
* @return string
|
|
*/
|
|
public function build(Shape $shape, array $args)
|
|
{
|
|
$xml = new XMLWriter();
|
|
$xml->openMemory();
|
|
$xml->startDocument('1.0', 'UTF-8');
|
|
$this->format($shape, $shape['locationName'] ?: $shape['name'], $args, $xml);
|
|
$xml->endDocument();
|
|
|
|
return $xml->outputMemory();
|
|
}
|
|
|
|
private function startElement(Shape $shape, $name, XMLWriter $xml)
|
|
{
|
|
$xml->startElement($name);
|
|
|
|
if ($ns = $shape['xmlNamespace']) {
|
|
$xml->writeAttribute(
|
|
isset($ns['prefix']) ? "xmlns:{$ns['prefix']}" : 'xmlns',
|
|
$shape['xmlNamespace']['uri']
|
|
);
|
|
}
|
|
}
|
|
|
|
private function format(Shape $shape, $name, $value, XMLWriter $xml)
|
|
{
|
|
// Any method mentioned here has a custom serialization handler.
|
|
static $methods = [
|
|
'add_structure' => true,
|
|
'add_list' => true,
|
|
'add_blob' => true,
|
|
'add_timestamp' => true,
|
|
'add_boolean' => true,
|
|
'add_map' => true,
|
|
'add_string' => true
|
|
];
|
|
|
|
$type = 'add_' . $shape['type'];
|
|
if (isset($methods[$type])) {
|
|
$this->{$type}($shape, $name, $value, $xml);
|
|
} else {
|
|
$this->defaultShape($shape, $name, $value, $xml);
|
|
}
|
|
}
|
|
|
|
private function defaultShape(Shape $shape, $name, $value, XMLWriter $xml)
|
|
{
|
|
$this->startElement($shape, $name, $xml);
|
|
$xml->text($value);
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function add_structure(
|
|
StructureShape $shape,
|
|
$name,
|
|
array $value,
|
|
\XMLWriter $xml
|
|
) {
|
|
$this->startElement($shape, $name, $xml);
|
|
|
|
foreach ($this->getStructureMembers($shape, $value) as $k => $definition) {
|
|
$this->format(
|
|
$definition['member'],
|
|
$definition['member']['locationName'] ?: $k,
|
|
$definition['value'],
|
|
$xml
|
|
);
|
|
}
|
|
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function getStructureMembers(StructureShape $shape, array $value)
|
|
{
|
|
$members = [];
|
|
|
|
foreach ($value as $k => $v) {
|
|
if ($v !== null && $shape->hasMember($k)) {
|
|
$definition = [
|
|
'member' => $shape->getMember($k),
|
|
'value' => $v,
|
|
];
|
|
|
|
if ($definition['member']['xmlAttribute']) {
|
|
// array_unshift_associative
|
|
$members = [$k => $definition] + $members;
|
|
} else {
|
|
$members[$k] = $definition;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $members;
|
|
}
|
|
|
|
private function add_list(
|
|
ListShape $shape,
|
|
$name,
|
|
array $value,
|
|
XMLWriter $xml
|
|
) {
|
|
$items = $shape->getMember();
|
|
|
|
if ($shape['flattened']) {
|
|
$elementName = $name;
|
|
} else {
|
|
$this->startElement($shape, $name, $xml);
|
|
$elementName = $items['locationName'] ?: 'member';
|
|
}
|
|
|
|
foreach ($value as $v) {
|
|
$this->format($items, $elementName, $v, $xml);
|
|
}
|
|
|
|
if (!$shape['flattened']) {
|
|
$xml->endElement();
|
|
}
|
|
}
|
|
|
|
private function add_map(
|
|
MapShape $shape,
|
|
$name,
|
|
array $value,
|
|
XMLWriter $xml
|
|
) {
|
|
$xmlEntry = $shape['flattened'] ? $shape['locationName'] : 'entry';
|
|
$xmlKey = $shape->getKey()['locationName'] ?: 'key';
|
|
$xmlValue = $shape->getValue()['locationName'] ?: 'value';
|
|
|
|
$this->startElement($shape, $name, $xml);
|
|
|
|
foreach ($value as $key => $v) {
|
|
$this->startElement($shape, $xmlEntry, $xml);
|
|
$this->format($shape->getKey(), $xmlKey, $key, $xml);
|
|
$this->format($shape->getValue(), $xmlValue, $v, $xml);
|
|
$xml->endElement();
|
|
}
|
|
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function add_blob(Shape $shape, $name, $value, XMLWriter $xml)
|
|
{
|
|
$this->startElement($shape, $name, $xml);
|
|
$xml->writeRaw(base64_encode($value));
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function add_timestamp(
|
|
TimestampShape $shape,
|
|
$name,
|
|
$value,
|
|
XMLWriter $xml
|
|
) {
|
|
$this->startElement($shape, $name, $xml);
|
|
$timestampFormat = !empty($shape['timestampFormat'])
|
|
? $shape['timestampFormat']
|
|
: 'iso8601';
|
|
$xml->writeRaw(TimestampShape::format($value, $timestampFormat));
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function add_boolean(
|
|
Shape $shape,
|
|
$name,
|
|
$value,
|
|
XMLWriter $xml
|
|
) {
|
|
$this->startElement($shape, $name, $xml);
|
|
$xml->writeRaw($value ? 'true' : 'false');
|
|
$xml->endElement();
|
|
}
|
|
|
|
private function add_string(
|
|
Shape $shape,
|
|
$name,
|
|
$value,
|
|
XMLWriter $xml
|
|
) {
|
|
if ($shape['xmlAttribute']) {
|
|
$xml->writeAttribute($shape['locationName'] ?: $name, $value);
|
|
} else {
|
|
$this->defaultShape($shape, $name, $value, $xml);
|
|
}
|
|
}
|
|
}
|