@Override public DataContainer call() throws Exception { for (DataBuilderExecutionListener listener : dataBuilderExecutionListener) { try { listener.beforeExecute(dataFlowInstance, builderMeta, dataDelta, responseData); } catch (Throwable t) { logger.error("Error running pre-execution execution listener: ", t); } } try { Data response = builder.process( dataBuilderContext.immutableCopy( dataSet.accessor().getAccesibleDataSetFor(builder))); // logger.debug("Ran " + builderMeta.getName()); procesedBuilders.add(builderMeta); for (DataBuilderExecutionListener listener : dataBuilderExecutionListener) { try { listener.afterExecute(dataFlowInstance, builderMeta, dataDelta, responseData, response); } catch (Throwable t) { logger.error("Error running post-execution listener: ", t); } } if (null != response) { Preconditions.checkArgument( response.getData().equalsIgnoreCase(builderMeta.getProduces()), String.format( "Builder is supposed to produce %s but produces %s", builderMeta.getProduces(), response.getData())); response.setGeneratedBy(builderMeta.getName()); } return new DataContainer(builderMeta, response); } catch (DataBuilderException e) { logger.error("Error running builder: " + builderMeta.getName()); for (DataBuilderExecutionListener listener : dataBuilderExecutionListener) { try { listener.afterException(dataFlowInstance, builderMeta, dataDelta, responseData, e); } catch (Throwable error) { logger.error("Error running post-execution listener: ", error); } } return new DataContainer( builderMeta, new DataBuilderFrameworkException( DataBuilderFrameworkException.ErrorCode.BUILDER_EXECUTION_ERROR, "Error running builder: " + builderMeta.getName(), e.getDetails(), e)); } catch (DataValidationException e) { logger.error("Validation error in data produced by builder" + builderMeta.getName()); for (DataBuilderExecutionListener listener : dataBuilderExecutionListener) { try { listener.afterException(dataFlowInstance, builderMeta, dataDelta, responseData, e); } catch (Throwable error) { logger.error("Error running post-execution listener: ", error); } } return new DataContainer( builderMeta, new DataValidationException( DataValidationException.ErrorCode.DATA_VALIDATION_EXCEPTION, "Error running builder: " + builderMeta.getName(), new DataExecutionResponse(responseData), e.getDetails(), e)); } catch (Throwable t) { logger.error("Error running builder: " + builderMeta.getName()); for (DataBuilderExecutionListener listener : dataBuilderExecutionListener) { try { listener.afterException(dataFlowInstance, builderMeta, dataDelta, responseData, t); } catch (Throwable error) { logger.error("Error running post-execution listener: ", error); } } Map<String, Object> objectMap = new HashMap<String, Object>(); objectMap.put("MESSAGE", t.getMessage()); return new DataContainer( builderMeta, new DataBuilderFrameworkException( DataBuilderFrameworkException.ErrorCode.BUILDER_EXECUTION_ERROR, "Error running builder: " + builderMeta.getName() + t.getMessage(), objectMap, t)); } }