Ejemplo n.º 1
0
 /**
  * 
  */
 function compare(Alternc_Diagnostic_Data $source, Alternc_Diagnostic_Data $target)
 {
     $sourceIndex = $source->getIndex();
     $targetIndex = $target->getIndex();
     // Check diagnostics are same level
     $source_type = $source->getType();
     $target_type = $target->getType();
     if ($source_type != $target_type) {
         throw new \Exception("Invalid type comparison requested: {$source_type} vs {$target_type}");
     }
     $diffInstance = new Alternc_Diagnostic_Data($source_type);
     #echo "type $source_type\n";
     // Compare general data
     if ($source->getMetadata() != $target->getMetadata()) {
         $diffInstance->setMetadata(array_diff($source->getMetadata(), $target->getMetadata()));
     }
     if ($source->getIndex() != $target->getIndex()) {
         $diffInstance->setIndex(array_diff($source->getIndex(), $target->getIndex()));
     }
     // If section content ie. no subsections
     if ($source_type == Alternc_Diagnostic_Data::TYPE_SECTION) {
         #echo "Real section\n";
         if (is_array($source->getData()) && is_array($target->getData())) {
             $diff = array_diff($source->getData(), $target->getData());
             if ($diff) {
                 $diffInstance->setData(array_diff($source->getData(), $target->getData()));
             }
         } else {
             if ($source->getData() != $target->getData()) {
                 $diffInstance->setData(array("source" => $source->getData(), "target" => $target->getData()));
             }
         }
     } else {
         $sourceData = $source->getData();
         $targetData = $target->getData();
         $seenSections = array();
         foreach ($sourceData as $section_name => $sectionData) {
             #echo "section_name $section_name\n";
             $section_data_type = $sectionData->getType();
             if (!isset($targetData[$section_name])) {
                 #echo "section_name not in target\n";
                 $tempDataInstance = new Alternc_Diagnostic_Data($section_data_type);
                 $tempDataInstance->setMetadata(array("Not in target"));
             } else {
                 #echo "section_name for diff\n";
                 $tempDataInstance = $this->compare($sectionData, $targetData[$section_name]);
             }
             if (!is_null($tempDataInstance)) {
                 $diffInstance->addData($section_name, $tempDataInstance);
             }
         }
     }
     if (count($diffInstance->getData()) || count($diffInstance->getIndex()) || count($diffInstance->getMetadata())) {
         return $diffInstance;
     }
     return null;
 }