protected function checkSingleEvent($expected, Event $event, &$eventsByInternalId, &$unmatchedParentEvents)
 {
     /* @var $event NodeEvent */
     $rowId = null;
     foreach ($expected as $rowName => $rowValue) {
         switch ($rowName) {
             case 'ID':
                 if ($rowValue === '') {
                     break;
                 }
                 $rowId = $rowValue;
                 break;
             case 'Parent Event':
                 if ($rowValue === '') {
                     break;
                 }
                 if (isset($eventsByInternalId[$rowValue])) {
                     Assert::assertSame($eventsByInternalId[$rowValue], $event->getParentEvent(), 'Parent event does not match. (1)');
                 } elseif (isset($unmatchedParentEvents[$rowValue]) && $unmatchedParentEvents[$rowValue] !== $event->getParentEvent()) {
                     Assert::fail(sprintf('Parent event "%s" does not match another parent event with the same identifier.', $rowValue));
                 } else {
                     $unmatchedParentEvents[$rowValue] = $event->getParentEvent();
                 }
                 break;
             case 'Event Type':
                 Assert::assertEquals($rowValue, $event->getEventType(), 'Event Type does not match. Expected: ' . $rowValue . '. Actual: ' . $event->getEventType());
                 break;
             case 'Node Identifier':
                 if ($rowValue === '') {
                     break;
                 }
                 Assert::assertEquals($rowValue, $event->getNodeIdentifier(), 'Node Identifier does not match.');
                 break;
             case 'Document Node Identifier':
                 Assert::assertEquals($rowValue, $event->getDocumentNodeIdentifier(), 'Document Node Identifier does not match.');
                 break;
             case 'Workspace':
                 Assert::assertEquals($rowValue, $event->getWorkspaceName(), 'Workspace does not match.');
                 break;
             case 'Explanation':
                 break;
             default:
                 throw new \Exception('Row Name ' . $rowName . ' not supported.');
         }
     }
     if ($rowId !== null) {
         $eventsByInternalId[$rowId] = $event;
         if (isset($unmatchedParentEvents[$rowId])) {
             Assert::assertSame($eventsByInternalId[$rowId], $event, 'Parent event does not match. (2)');
             unset($unmatchedParentEvents[$rowId]);
         }
     }
 }
 /**
  * Create a new event
  *
  * @param string $eventType
  * @param array $data
  * @param string $user
  * @param Event $parentEvent
  */
 public function __construct($eventType, $data, $user = null, Event $parentEvent = null)
 {
     $this->timestamp = new \DateTime();
     $this->eventType = $eventType;
     $this->data = $data;
     $this->accountIdentifier = $user;
     $this->parentEvent = $parentEvent;
     $this->childEvents = new ArrayCollection();
     if ($this->parentEvent !== null) {
         $parentEvent->addChildEvent($this);
     }
 }
 /**
  * Add the passed event (which has been generated by generate()) to persistence.
  *
  * This only happens for top-level-events. All events which are attached to some parent event are persisted
  * together with the parent.
  *
  * @param Event $nodeEvent
  * @return void
  * @see emit()
  */
 public function add(Event $nodeEvent)
 {
     if (!$this->isEnabled()) {
         throw new Exception('Event log not enabled', 1418464935);
     }
     if ($nodeEvent->getParentEvent() === null) {
         $this->eventRepository->add($nodeEvent);
     }
 }