/**
  * Handle
  *
  * @param Transaction                         $transaction Transaction
  * @param CrudEntityInterface|ArrayCollection $data        Data
  * @param ConstraintViolationList|null        $violations  Violations
  *
  * @throws FeatureNotImplementedException
  *
  * @return CrudEntityInterface|CollectionResponse
  */
 public function handle(Transaction $transaction, $data, ConstraintViolationList $violations = null)
 {
     $this->errorBuilder->processViolations($violations);
     $this->errorBuilder->setTransactionErrors($transaction);
     $success = !$this->errorBuilder->hasErrors();
     $status = $success ? Transaction::STATUS_CREATED : Transaction::STATUS_CONFLICT;
     $transaction->setStatus($status);
     $transaction->setSuccess($success);
     $transaction->setRelatedIds(null);
     if ($data instanceof ArrayCollection) {
         if ($data->isEmpty()) {
             $data = $this->handleEmptyCollection($transaction, $data);
         } else {
             $data = $this->handleCollection($transaction, $data);
         }
     } elseif ($data instanceof CrudEntityInterface) {
         $this->handleEntity($transaction, $data);
     } else {
         throw new FeatureNotImplementedException(get_class($data) . ' class is not supported by transactions (POST). Instance of ArrayCollection needed.');
     }
     if (!$transaction->getSuccess()) {
         if ($data instanceof ArrayCollection) {
             $data->clear();
         } else {
             $data = new CollectionResponse(new ArrayCollection(array()));
         }
     }
     return $data;
 }
 /**
  * Handle collection
  *
  * @param Transaction $transaction transaction
  * @param mixed       $data        data
  *
  * @return CollectionResponse
  */
 private function handleCollection(Transaction $transaction, $data)
 {
     $data = new CollectionResponse($data);
     if ($this->errorBuilder->hasErrors()) {
         $this->errorBuilder->setTransactionErrors($transaction);
         foreach ($this->errorBuilder->getErrors() as $error) {
             $errorCode = $error->getCode();
         }
     }
     $status = !$this->errorBuilder->hasErrors() ? Transaction::STATUS_OK : $errorCode;
     $transaction->setStatus($status);
     $transaction->setSuccess(!$this->errorBuilder->hasErrors());
     return $data;
 }