/** * * @param SimpleXMLElement $xml * @param PiBX_AST_Collection $ast * @param <type> $parentObject * @return mixed[] The collection entries */ private function parseAnonymCollection(SimpleXMLElement $xml, PiBX_AST_Collection $ast, $parentObject) { $count = $ast->countChildren(); $list = array(); for ($i = 0; $i < $count; $i++) { $child = $ast->get($i); if ($child instanceof PiBX_AST_Structure) { $name = $child->getName(); $structAst = $this->binding->getASTForName($name); $class = $structAst->getType(); // somehow xpath didn't work well with node names containing a dash // so fetch the nodes with "{}", e.g. "{'node-containing-a-dash'}" $itemCount = count($xml->{$name}); if ($itemCount > 0) { // collection items/nodes are directly in the current node for ($j = 0; $j < $itemCount; $j++) { $newObject = new $class(); $listNode = $xml->{$name}[$j]; $list[] = $this->parseXml($listNode, $structAst, $newObject); } } } else { throw new RuntimeException('Invalid <collection>'); } } return $list; }
private function marshalStructure($object, PiBX_AST_Structure $ast) { $lastNode = $this->parentDomNode; if ($ast->getStructureType() === PiBX_AST_StructureType::CHOICE()) { $this->parentDomNode = $this->currentDomNode; if ($ast->hasChildren()) { $childrenCount = $ast->countChildren(); $currentChoice = null; for ($i = 0; $i < $childrenCount; $i++) { $child = $ast->get($i); $testMethod = $child->getTestMethod(); if ($object->{$testMethod}()) { $currentChoice = $child; break; } } $this->marshalObject($object, $currentChoice); } } elseif ($ast->getStructureType() === PiBX_AST_StructureType::ORDERED()) { throw new RuntimeException('Currently not supported.'); } else { $this->parentDomNode->removeChild($this->currentDomNode); // when a structure has no type, it is a referenced complex-type // used as a type-attribute $getter = $ast->getGetMethod(); $obj = $object->{$getter}(); $classname = $this->binding->getClassnameForName($ast->getName()); $structureAst = $this->binding->getASTForClass($classname); $this->marshalObject($obj, $structureAst); } $this->parentDomNode = $lastNode; }
public function testBooksBinding() { $filepath = dirname(__FILE__) . '/../_files/Books'; $bindingFile = $filepath . '/binding.xml'; $expectedXml = file_get_contents($bindingFile); $binding = new PiBX_Runtime_Binding($bindingFile); $asts = $binding->parse(); $this->assertEquals(2, count($asts)); // first tree/type $expectedAst1 = new PiBX_AST_Type('Collection'); $expectedAst1->setType('Collection'); $expectedAst1->setAsRoot(); $collection = new PiBX_AST_Collection('books'); $collection->setGetMethod('getBooks'); $collection->setSetMethod('setBooks'); $structure = new PiBX_AST_Structure('book'); $structure->setType('BookType'); $expectedAst1->add($collection->add($structure)); $this->assertEquals($expectedAst1, $asts[0]); // second tree/type $expectedAst2 = new PiBX_AST_Type('bookType'); $expectedAst2->setType('BookType'); $value1 = new PiBX_AST_TypeAttribute('name'); $value1->setStyle('element'); $value1->setGetMethod('getName'); $value1->setSetMethod('setName'); $expectedAst2->add($value1); $value2 = new PiBX_AST_TypeAttribute('ISBN'); $value2->setStyle('element'); $value2->setGetMethod('getISBN'); $value2->setSetMethod('setISBN'); $expectedAst2->add($value2); $value3 = new PiBX_AST_TypeAttribute('price'); $value3->setStyle('element'); $value3->setGetMethod('getPrice'); $value3->setSetMethod('setPrice'); $expectedAst2->add($value3); $value4 = new PiBX_AST_Collection('authors'); $value4->setGetMethod('getAuthorNames'); $value4->setSetMethod('setAuthorNames'); $value4item = new PiBX_AST_CollectionItem('authorName'); $value4->add($value4item); $expectedAst2->add($value4); $value5 = new PiBX_AST_TypeAttribute('description'); $value5->setStyle('element'); $value5->setGetMethod('getDescription'); $value5->setSetMethod('setDescription'); $expectedAst2->add($value5); $value6 = new PiBX_AST_Structure('promotion'); $value6->setStructureType(PiBX_AST_StructureType::CHOICE()); $value6Item1 = new PiBX_AST_StructureElement('Discount'); $value6Item1->setTestMethod('ifPromotionDiscount'); $value6Item1->setGetMethod('getPromotionDiscount'); $value6Item1->setSetMethod('setPromotionDiscount'); $value6Item1->setStyle('element'); $value6Item2 = new PiBX_AST_StructureElement('None'); $value6Item2->setTestMethod('ifPromotionNone'); $value6Item2->setGetMethod('getPromotionNone'); $value6Item2->setSetMethod('setPromotionNone'); $value6Item2->setStyle('element'); $value6->add($value6Item1); $value6->add($value6Item2); $expectedAst2->add($value6); $value7 = new PiBX_AST_TypeAttribute('publicationDate'); $value7->setStyle('element'); $value7->setGetMethod('getPublicationDate'); $value7->setSetMethod('setPublicationDate'); $expectedAst2->add($value7); $value8 = new PiBX_AST_TypeAttribute('bookCategory'); $value8->setStyle('element'); $value8->setGetMethod('getBookCategory'); $value8->setSetMethod('setBookCategory'); $expectedAst2->add($value8); $value9 = new PiBX_AST_TypeAttribute('itemId'); $value9->setStyle('attribute'); $value9->setGetMethod('getItemId'); $value9->setSetMethod('setItemId'); $expectedAst2->add($value9); $this->assertEquals($expectedAst2, $asts[1]); }