/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.job.runner; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.metamodel.data.CachingDataSetHeader; import org.apache.metamodel.data.DefaultRow; import org.apache.metamodel.data.Row; import org.apache.metamodel.query.Query; import org.apache.metamodel.query.SelectItem; import org.datacleaner.api.HasOutputDataStreams; import org.datacleaner.api.OutputDataStream; import org.datacleaner.api.OutputRowCollector; import org.datacleaner.data.MetaModelInputRow; import org.datacleaner.job.OutputDataStreamJob; import org.datacleaner.job.concurrent.PreviousErrorsExistException; /** * The type of {@link OutputRowCollector} used for {@link OutputDataStreamJob} * execution. This instance will eventually be passed into the * {@link HasOutputDataStreams#initializeOutputDataStream(OutputDataStream, Query, OutputRowCollector)} */ public class OutputDataStreamRowCollector implements OutputRowCollector { private final CachingDataSetHeader _dataSetHeader; private final AtomicInteger _rowCounter; private final ConsumeRowHandler _consumeRowHandler; private final RowProcessingPublisher _publisher; public OutputDataStreamRowCollector(final RowProcessingPublisher publisher, final List<SelectItem> selectItems, final ConsumeRowHandler consumeRowHandler) { _publisher = publisher; _dataSetHeader = new CachingDataSetHeader(selectItems); _consumeRowHandler = consumeRowHandler; _rowCounter = new AtomicInteger(); } @Override public void putValues(final Object... values) { final DefaultRow row = new DefaultRow(_dataSetHeader, values); putRow(row); } @Override public void putRow(final Row row) { final ErrorAware errorAware = _publisher.getErrorAware(); if (errorAware.isCancelled() || errorAware.isErrornous()) { throw new PreviousErrorsExistException(); } final int rowNumber = _rowCounter.incrementAndGet(); final MetaModelInputRow inputRow = new MetaModelInputRow(rowNumber, row); _consumeRowHandler.consumeRow(inputRow); _publisher.getAnalysisListener() .rowProcessingProgress(_publisher.getAnalysisJob(), _publisher.getRowProcessingMetrics(), inputRow, rowNumber); } }