public function testResolveQName() { $schemaId = SchemaId::fromString('pbj:acme:blog:node:article:1-0-0'); MessageResolver::register($schemaId, 'Fake'); $curie = MessageResolver::resolveQName(SchemaQName::fromString('acme:article')); $this->assertSame($schemaId->getCurie(), $curie); }
/** * @param SchemaId|string $id * @param string $className * @param Field[] $fields * @param Mixin[] $mixins */ public function __construct($id, $className, array $fields = [], array $mixins = []) { Assertion::classExists($className, null, 'className'); Assertion::allIsInstanceOf($fields, 'Gdbots\\Pbj\\Field', null, 'fields'); Assertion::allIsInstanceOf($mixins, 'Gdbots\\Pbj\\Mixin', null, 'mixins'); $this->id = $id instanceof SchemaId ? $id : SchemaId::fromString($id); $this->className = $className; $this->classShortName = ClassUtils::getShortName($this->className); $this->addField(FieldBuilder::create(self::PBJ_FIELD_NAME, Type\StringType::create())->required()->pattern(SchemaId::VALID_PATTERN)->withDefault($this->id->toString())->build()); foreach ($mixins as $mixin) { $this->addMixin($mixin); } foreach ($fields as $field) { $this->addField($field); } $this->mixinIds = array_keys($this->mixins); $this->mixinCuries = array_keys($this->mixinsByCurie); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:node-scheduled:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:expire-node:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:get-node-request:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:pbjx:mixin:request:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:get-node-batch-response:1-0-0'); }
/** * @param array $data * @return Message * * @throws \Exception * @throws GdbotsPbjException */ private function doDeserialize(array $data) { $schemaId = SchemaId::fromString((string) $data[Schema::PBJ_FIELD_NAME]); $className = MessageResolver::resolveId($schemaId); /** @var Message $message */ $message = new $className(); Assertion::isInstanceOf($message, 'Gdbots\\Pbj\\Message'); if ($message::schema()->getCurieMajor() !== $schemaId->getCurieMajor()) { throw new InvalidResolvedSchema($message::schema(), $schemaId, $className); } $schema = $message::schema(); foreach ($data as $fieldName => $value) { if (!$schema->hasField($fieldName)) { continue; } if (null === $value) { $message->clear($fieldName); continue; } $field = $schema->getField($fieldName); $type = $field->getType(); switch ($field->getRule()->getValue()) { case FieldRule::A_SINGLE_VALUE: $message->set($fieldName, $type->decode($value, $field, $this)); break; case FieldRule::A_SET: case FieldRule::A_LIST: Assertion::isArray($value, sprintf('Field [%s] must be an array.', $fieldName), $fieldName); $values = []; foreach ($value as $v) { $values[] = $type->decode($v, $field, $this); } if ($field->isASet()) { $message->addToSet($fieldName, $values); } else { $message->addToList($fieldName, $values); } break; case FieldRule::A_MAP: Assertion::true(ArrayUtils::isAssoc($value), sprintf('Field [%s] must be an associative array.', $fieldName), $fieldName); foreach ($value as $k => $v) { $message->addToMap($fieldName, $k, $type->decode($v, $field, $this)); } break; default: break; } } return $message->set(Schema::PBJ_FIELD_NAME, $schema->getId()->toString())->populateDefaults(); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:index-node-batch:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:ncr:mixin:publishable:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:enrichments:mixin:ip-to-geo:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:gdbots:enrichments:mixin:time-parting:1-0-0'); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:eme:collector:mixin:collectable:1-0-0'); }
/** * @param array $data * @return Message * * @throws \Exception * @throws GdbotsPbjException */ private function doUnmarshal(array $data) { Assertion::keyIsset($data['M'], Schema::PBJ_FIELD_NAME, sprintf('[%s::%s] Array provided must contain the [%s] key.', get_called_class(), __FUNCTION__, Schema::PBJ_FIELD_NAME)); $schemaId = SchemaId::fromString((string) $data['M'][Schema::PBJ_FIELD_NAME]['S']); $className = MessageResolver::resolveId($schemaId); /** @var Message $message */ $message = new $className(); Assertion::isInstanceOf($message, 'Gdbots\\Pbj\\Message'); if ($message::schema()->getCurieMajor() !== $schemaId->getCurieMajor()) { throw new InvalidResolvedSchema($message::schema(), $schemaId, $className); } $schema = $message::schema(); foreach ($data['M'] as $fieldName => $dynamoValue) { if (!$schema->hasField($fieldName)) { continue; } $dynamoType = key($dynamoValue); $value = current($dynamoValue); if ('NULL' === $dynamoType) { $message->clear($fieldName); continue; } $field = $schema->getField($fieldName); $type = $field->getType(); switch ($field->getRule()->getValue()) { case FieldRule::A_SINGLE_VALUE: $message->set($fieldName, $type->decode($value, $field, $this)); break; case FieldRule::A_SET: case FieldRule::A_LIST: $values = []; if ('L' === $dynamoType) { foreach ($value as $v) { $values[] = $type->decode(isset($v['M']) ? $v['M'] : current($v), $field, $this); } } else { foreach ($value as $v) { $values[] = $type->decode($v, $field, $this); } } if ($field->isASet()) { $message->addToSet($fieldName, $values); } else { $message->addToList($fieldName, $values); } break; case FieldRule::A_MAP: foreach ($value as $k => $v) { $message->addToMap($fieldName, $k, $type->decode(current($v), $field, $this)); } break; default: break; } } return $message->set(Schema::PBJ_FIELD_NAME, $schema->getId()->toString())->populateDefaults(); }
/** * {@inheritdoc} */ public function getId() { return SchemaId::fromString('pbj:eme:accounts:mixin:account-ref:1-0-0'); }