--- /dev/null
+<?php
+
+class BordereauImportAgapeAnnotation {
+
+ const XSD_SHEMA = "http://www.w3.org/2001/XMLSchema";
+
+ public function import($bordereau_content, $agape_content){
+ $bordereau = simplexml_load_string($bordereau_content);
+ $agape = simplexml_load_string($agape_content);
+
+ /** @var SimpleXMLElement $first_element */
+ $first_element = $agape->children(self::XSD_SHEMA)->{'element'};
+ $this->validationWalk($bordereau,$first_element);
+ return $bordereau->asXML();
+ }
+
+ private function validationWalk(SimpleXMLElement $bordereau_node,SimpleXMLElement $agape_node){
+ $agape_element_name = $agape_node->attributes()->{'name'};
+ $bordereau_element_name = $bordereau_node->getName();
+ if ($bordereau_element_name != $agape_element_name){
+ throw new Exception("Element {$agape_element_name} not found. {$bordereau_element_name} found instead");
+ }
+
+ $annotation = $agape_node->xpath("xsd:annotation");
+ if ($annotation) {
+ $bordereau_node->{0} = (string) $annotation[0];
+ }
+
+ $children = $bordereau_node->children();
+ /** @var SimpleXMLElement $child */
+ foreach($children as $child){
+ $node_name = $child->getName();
+ $agape_child_node = $agape_node->xpath("xsd:element[@name='$node_name']");
+ $result = false;
+ foreach($agape_child_node as $agape_child){
+ try {
+ $this->validationWalk($child, $agape_child);
+ $result = true;
+ break;
+ } catch(Exception $e){}
+ }
+ if (! $result){
+ throw new Exception("Element {$node_name} can't be validated against Agape Schema");
+ }
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+class BordereauImportAgapeAnnotationTest extends PHPUnit_Framework_TestCase {
+
+ /** @var BordereauImportAgapeAnnotation */
+ private $agapeValidation;
+
+ protected function setUp(){
+ $this->agapeValidation = new BordereauImportAgapeAnnotation();
+ }
+
+ public function generateXML($xml_string){
+ $xml = simplexml_load_string($xml_string);
+ $xml->addAttribute('xmlns',"fr:gouv:ae:archive:draft:standard_echange_v0.2");
+ return $xml->asXML();
+ }
+
+ public function generateAgape($xml_string){
+ $xml = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" attributeFormDefault=\"unqualified\" elementFormDefault=\"qualified\" targetNamespace=\"fr:gouv:ae:archive:draft:standard_echange_v0.2\" version=\"1.1\">";
+ $xml .= $xml_string;
+ $xml .= "</xsd:schema>";
+ return simplexml_load_string($xml)->asXML();
+ }
+
+ public function testValidateFirstElement(){
+ $xml = $this->generateXML("<ArchiveTransfer/>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"/>");
+ $this->assertEquals($xml,$this->agapeValidation->import($xml,$agape));
+ }
+
+ public function testValidateFirstElementFailed(){
+ $xml = $this->generateXML("<ArchiveTransfer2/>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"/>");
+ $this->setExpectedException("Exception","Element ArchiveTransfer not found. ArchiveTransfer2 found instead");
+ $this->agapeValidation->import($xml,$agape);
+ }
+
+ public function testValidateNestedElement(){
+ $xml = $this->generateXML("<ArchiveTransfer><Comment/></ArchiveTransfer>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"><xsd:element name='Comment'/></xsd:element>");
+ $this->assertEquals($xml,$this->agapeValidation->import($xml,$agape));
+ }
+
+ public function testValidateNestedElementFailed(){
+ $xml = $this->generateXML("<ArchiveTransfer><Toto/></ArchiveTransfer>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"><xsd:element name='Comment'/></xsd:element>");
+ $this->setExpectedException("Exception","Element Toto can't be validated against Agape Schema");
+ $this->agapeValidation->import($xml,$agape);
+ }
+
+ public function testValidateNestedNested(){
+ $xml = $this->generateXML("<ArchiveTransfer><TransferringAgency><Description/></TransferringAgency></ArchiveTransfer>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"><xsd:element name='TransferringAgency'><xsd:element name='Description'/></xsd:element></xsd:element>");
+ $this->assertEquals($xml,$this->agapeValidation->import($xml,$agape));
+ }
+
+ public function testAddAnnotation(){
+ $xml = $this->generateXML("<ArchiveTransfer></ArchiveTransfer>");
+ $agape = $this->generateAgape("<xsd:element name=\"ArchiveTransfer\"><xsd:annotation>Test annotation</xsd:annotation></xsd:element>");
+ $this->assertRegExp("#Test annotation#",$this->agapeValidation->import($xml,$agape));
+ }
+
+ public function testValidate(){
+ $relaxNgGenerateXML = new RelaxNgGenerateXML();
+ $relaxng_path = __DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1_schema.rng";
+ $xml = $relaxNgGenerateXML->generateFromRelaxNG($relaxng_path);
+ $agape_content = file_get_contents(__DIR__."/../../../fixtures/EMEG_PROFIL_PES_0002_v1.5.xml");
+ $result = $this->agapeValidation->import($xml,$agape_content);
+ $this->assertRegExp("#Transfert des flux comptables#",$result);
+ }
+}
\ No newline at end of file