/********************************************************************************************************************* | |
* Copyright (c) 2008, 2012 Attensity Europe GmbH and brox IT Solutions GmbH. All rights reserved. This program and the | |
* accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this | |
* distribution, and is available at http://www.eclipse.org/legal/epl-v10.html | |
**********************************************************************************************************************/ | |
package org.eclipse.smila.processing.util; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import org.apache.commons.logging.Log; | |
import org.eclipse.smila.processing.ProcessingException; | |
import org.eclipse.smila.processing.parameters.ParameterAccessor; | |
/** | |
* Helper class that can/should be used by pipelets for collecting their processed record results. | |
* | |
* Takes into account that error results may cause an exception ("_failOnError" parameter) or may be dropped from | |
* pipelet result (see dropRecordOnError). | |
* | |
* @author aweber | |
*/ | |
public class ResultCollector { | |
/** needed to access failOnError parameter. */ | |
private final ParameterAccessor _paramAccessor; | |
/** Logger to use. */ | |
private Log _log; | |
/** whether record(id)s processed with error should appear in result ids or not. */ | |
private final boolean _dropRecordOnError; | |
/** record ids that should be used as pipelet result. */ | |
private final Collection<String> _results = new ArrayList<>(); | |
/** | |
* @param paramAccessor | |
* of the hosting config, needed to access failOnError parameter | |
* @param log | |
* the log for which to log the error results | |
* @param dropRecordOnError | |
*/ | |
public ResultCollector(final ParameterAccessor paramAccessor, final Log log, final boolean dropRecordOnError) { | |
if (paramAccessor == null) { | |
throw new IllegalArgumentException("Parameter 'paramAccessor' is null"); | |
} | |
_paramAccessor = paramAccessor; | |
if (log != null) { | |
_log = log; | |
} | |
_dropRecordOnError = dropRecordOnError; | |
} | |
/** | |
* @param recordId | |
* record id of successful result | |
*/ | |
public void addResult(final String recordId) { | |
_results.add(recordId); | |
} | |
/** | |
* @param recordId | |
* record id of failed result | |
* @param ex | |
* exception that will be logged resp. thrown if failOnError=true | |
* @throws ProcessingException | |
* will be thrown if failOnError=true | |
*/ | |
public void addFailedResult(final String recordId, final Exception ex) throws ProcessingException { | |
_paramAccessor.setCurrentRecord(recordId); | |
final boolean failOnError = _paramAccessor.getBooleanParameter(ProcessingConstants.KEY_FAIL_ON_ERROR, | |
ProcessingConstants.FAIL_ON_ERROR_DEFAULT); | |
if (failOnError) { | |
if (ex instanceof ProcessingException) { | |
throw (ProcessingException) ex; | |
} else { | |
throw new ProcessingException(ex); | |
} | |
} | |
String errorMessage = "Error while processing record with id '" + recordId + "'."; | |
if (_dropRecordOnError) { | |
errorMessage += errorMessage + " Record will be removed from pipelet result."; | |
} else { | |
_results.add(recordId); | |
} | |
if (_log != null) { | |
final String message = | |
String.format("%s cause: %s; messsage: %s", errorMessage, ex.getCause(), ex.getMessage()); | |
_log.warn(message); | |
} | |
} | |
/** | |
* @return record ids that should be used as pipelet result | |
*/ | |
public String[] getResultIds() { | |
return _results.toArray(new String[_results.size()]); | |
} | |
} |