Beispiel #1
0
 /**
  * 
  * @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;
 }
Beispiel #2
0
 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;
 }
Beispiel #3
0
 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]);
 }