diff --git a/src/Report.php b/src/Report.php new file mode 100644 index 00000000..93fc9046 --- /dev/null +++ b/src/Report.php @@ -0,0 +1,96 @@ +row = $row; + $this->messages = array(); + } + + /** + * @return integer + */ + public function getRow() + { + return $this->row; + } + + /** + * @param integer $row + * @return Report + */ + public function setRow($row) + { + $this->row = $row; + return $this; + } + + /** + * @return mixed + */ + public function getMessages($severity = null) + { + if($severity === null) { + return $this->messages; + } + + $messages = array(); + foreach($this->messages as $message) { + if($message->getSeverity() == $severity) { + $messages[] = $message; + } + } + + return $messages; + } + + /** + * @param mixed $messages + * @return Report + */ + public function setMessages(array $messages) + { + $this->messages = $messages; + return $this; + } + + /** + * @param ReportMessage $message + */ + public function addMessage(ReportMessage $message) + { + $this->messages[] = $message; + } + + /** + * @return boolean + */ + public function hasMessages() + { + return (!empty($this->messages)); + } +} + diff --git a/src/ReportMessage.php b/src/ReportMessage.php new file mode 100644 index 00000000..b7111981 --- /dev/null +++ b/src/ReportMessage.php @@ -0,0 +1,86 @@ +message = $message; + $this->severity = $severity; + $this->column = $column; + } + + /** + * @return mixed + */ + public function getColumn() + { + return $this->column; + } + + /** + * @param mixed $column + * @return ReportMessage + */ + public function setColumn($column) + { + $this->column = $column; + return $this; + } + + /** + * @return mixed + */ + public function getMessage() + { + return $this->message; + } + + /** + * @return mixed + */ + public function getSeverity() + { + return $this->severity; + } + + /** + * @param integer $severity + * @return ReportMessage + */ + public function setSeverity($severity) + { + $this->severity = $severity; + return $this; + } + + /** + * @param mixed $message + * @return ReportMessage + */ + public function setMessage($message) + { + $this->message = $message; + return $this; + } + + /** + * @return mixed + */ + public function isException() + { + return ($this->message instanceof Exception); + } +} \ No newline at end of file diff --git a/src/ReporterInterface.php b/src/ReporterInterface.php new file mode 100644 index 00000000..633422fa --- /dev/null +++ b/src/ReporterInterface.php @@ -0,0 +1,21 @@ +name = $name; $this->startTime = $startTime; @@ -70,6 +76,7 @@ public function __construct($name, \DateTime $startTime, \DateTime $endTime, $to $this->errorCount = count($exceptions); $this->successCount = $totalCount - $this->errorCount; $this->exceptions = $exceptions; + $this->reports = $reports; } /** @@ -143,4 +150,12 @@ public function getExceptions() { return $this->exceptions; } + + /** + * @return \SplObjectStorage + */ + public function getReports() + { + return $this->reports; + } } diff --git a/src/Step.php b/src/Step.php index fb1a9b98..5f2e404b 100644 --- a/src/Step.php +++ b/src/Step.php @@ -14,5 +14,5 @@ interface Step * * @return boolean False return value means the item should be skipped */ - public function process(&$item); + public function process(&$item, Report $report = null); } diff --git a/src/Step/ConverterStep.php b/src/Step/ConverterStep.php index 974fd809..151d618d 100644 --- a/src/Step/ConverterStep.php +++ b/src/Step/ConverterStep.php @@ -2,8 +2,11 @@ namespace Ddeboer\DataImport\Step; +use Ddeboer\DataImport\Report; use Ddeboer\DataImport\Step; use Ddeboer\DataImport\Exception\UnexpectedTypeException; +use Ddeboer\DataImport\ReporterInterface; +use Ddeboer\DataImport\ReportMessage; /** * @author Markus Bachmann @@ -40,10 +43,14 @@ public function add(callable $converter) /** * {@inheritdoc} */ - public function process(&$item) + public function process(&$item, Report $report = null) { foreach ($this->converters as $converter) { $item = call_user_func($converter, $item); + + if($report !== null && $converter instanceof ReporterInterface && $converter->hasMessage()) { + $report->addMessage(new ReportMessage($converter->getMessage(),$converter->getSeverity())); + } } return true; diff --git a/src/Step/FilterStep.php b/src/Step/FilterStep.php index 847b24a4..78da0e18 100644 --- a/src/Step/FilterStep.php +++ b/src/Step/FilterStep.php @@ -2,7 +2,10 @@ namespace Ddeboer\DataImport\Step; +use Ddeboer\DataImport\Report; use Ddeboer\DataImport\Step; +use Ddeboer\DataImport\ReporterInterface; +use Ddeboer\DataImport\ReportMessage; /** * @author Markus Bachmann @@ -35,10 +38,14 @@ public function add(callable $filter, $priority = null) /** * {@inheritdoc} */ - public function process(&$item) + public function process(&$item, Report $report = null) { foreach (clone $this->filters as $filter) { if (false === call_user_func($filter, $item)) { + if($report !== null && $filter instanceof ReporterInterface && $filter->hasMessage()) { + $report->addMessage(new ReportMessage($filter->getMessage(),$filter->getSeverity())); + } + return false; } } @@ -46,3 +53,4 @@ public function process(&$item) return true; } } + diff --git a/src/Step/MappingStep.php b/src/Step/MappingStep.php index d98fb275..656b4a3a 100644 --- a/src/Step/MappingStep.php +++ b/src/Step/MappingStep.php @@ -3,6 +3,7 @@ namespace Ddeboer\DataImport\Step; use Ddeboer\DataImport\Exception\MappingException; +use Ddeboer\DataImport\Report; use Ddeboer\DataImport\Step; use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException; use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException; @@ -51,7 +52,7 @@ public function map($from, $to) * * @throws MappingException */ - public function process(&$item) + public function process(&$item, Report $report = null) { try { foreach ($this->mappings as $from => $to) { diff --git a/src/Step/ValidatorStep.php b/src/Step/ValidatorStep.php index 43cbda23..225c9a18 100644 --- a/src/Step/ValidatorStep.php +++ b/src/Step/ValidatorStep.php @@ -2,6 +2,7 @@ namespace Ddeboer\DataImport\Step; +use Ddeboer\DataImport\Report; use Symfony\Component\Validator\ValidatorInterface; use Symfony\Component\Validator\Constraints; use Symfony\Component\Validator\Constraint; @@ -81,7 +82,7 @@ public function getViolations() /** * {@inheritdoc} */ - public function process(&$item) + public function process(&$item, Report $report = null) { $constraints = new Constraints\Collection($this->constraints); $list = $this->validator->validateValue($item, $constraints); diff --git a/src/Step/ValueConverterStep.php b/src/Step/ValueConverterStep.php index 3855f11f..87164a73 100644 --- a/src/Step/ValueConverterStep.php +++ b/src/Step/ValueConverterStep.php @@ -2,6 +2,9 @@ namespace Ddeboer\DataImport\Step; +use Ddeboer\DataImport\Report; +use Ddeboer\DataImport\ReporterInterface; +use Ddeboer\DataImport\ReportMessage; use Ddeboer\DataImport\Step; use Symfony\Component\PropertyAccess\PropertyAccessor; @@ -31,7 +34,7 @@ public function add($property, callable $converter) /** * {@inheritdoc} */ - public function process(&$item) + public function process(&$item, Report $report = null) { $accessor = new PropertyAccessor(); @@ -40,6 +43,9 @@ public function process(&$item) $orgValue = $accessor->getValue($item, $property); $value = call_user_func($converter, $orgValue); $accessor->setValue($item,$property,$value); + if($report !== null && $converter instanceof ReporterInterface && $converter->hasMessage()) { + $report->addMessage(new ReportMessage($converter->getMessage(),$converter->getSeverity(),$property)); + } } } diff --git a/src/Workflow/StepAggregator.php b/src/Workflow/StepAggregator.php index db319b83..9c865acb 100644 --- a/src/Workflow/StepAggregator.php +++ b/src/Workflow/StepAggregator.php @@ -5,6 +5,7 @@ use Ddeboer\DataImport\Exception; use Ddeboer\DataImport\Exception\UnexpectedTypeException; use Ddeboer\DataImport\Reader; +use Ddeboer\DataImport\Report; use Ddeboer\DataImport\Result; use Ddeboer\DataImport\Step; use Ddeboer\DataImport\Step\PriorityStep; @@ -109,6 +110,7 @@ public function process() { $count = 0; $exceptions = new \SplObjectStorage(); + $reports = new \SplObjectStorage(); $startTime = new \DateTime; foreach ($this->writers as $writer) { @@ -132,8 +134,13 @@ public function process() } try { + $report = new Report($index); + foreach (clone $this->steps as $step) { - if (false === $step->process($item)) { + if (false === $step->process($item, $report)) { + if ($report->hasMessages()) { + $reports->attach($report,$index); + } continue 2; } } @@ -152,6 +159,15 @@ public function process() $exceptions->attach($e, $index); $this->logger->error($e->getMessage()); + + if ($report->hasMessages()) { + $reports->attach($report,$index); + } + continue; + } + + if ($report->hasMessages()) { + $reports->attach($report,$index); } $count++; @@ -161,7 +177,7 @@ public function process() $writer->finish(); } - return new Result($this->name, $startTime, new \DateTime, $count, $exceptions); + return new Result($this->name, $startTime, new \DateTime, $count, $exceptions, $reports); } /**