use of org.apache.hop.core.IExtensionData in project hop by apache.
the class LocalPipelineEngine method prepareExecution.
@Override
public void prepareExecution() throws HopException {
if (!(pipelineRunConfiguration.getEngineRunConfiguration() instanceof LocalPipelineRunConfiguration)) {
throw new HopException("A local pipeline execution expects a local pipeline configuration, not an instance of class " + pipelineRunConfiguration.getEngineRunConfiguration().getClass().getName());
}
LocalPipelineRunConfiguration config = (LocalPipelineRunConfiguration) pipelineRunConfiguration.getEngineRunConfiguration();
int sizeRowsSet = Const.toInt(resolve(config.getRowSetSize()), Const.ROWS_IN_ROWSET);
setRowSetSize(sizeRowsSet);
setSafeModeEnabled(config.isSafeModeEnabled());
setSortingTransformsTopologically(config.isSortingTransformsTopologically());
setGatheringMetrics(config.isGatheringMetrics());
setFeedbackShown(config.isFeedbackShown());
setFeedbackSize(Const.toInt(resolve(config.getFeedbackSize()), Const.ROWS_UPDATE));
// See if we need to enable transactions...
//
IExtensionData parentExtensionData = getParentPipeline();
if (parentExtensionData == null) {
parentExtensionData = getParentWorkflow();
}
String connectionGroup = null;
if (parentExtensionData != null) {
connectionGroup = (String) parentExtensionData.getExtensionDataMap().get(Const.CONNECTION_GROUP);
}
//
if (config.isTransactional() && connectionGroup == null) {
// Store a value in the parent...
//
connectionGroup = getPipelineMeta().getName() + " - " + UUID.randomUUID();
// We also need to commit/rollback at the end of this pipeline...
// We only do this when we created a new group. Never in a child
//
addExecutionFinishedListener((IExecutionFinishedListener<IPipelineEngine>) pipeline -> {
String group = (String) pipeline.getExtensionDataMap().get(Const.CONNECTION_GROUP);
List<Database> databases = DatabaseConnectionMap.getInstance().getDatabases(group);
Result result = pipeline.getResult();
for (Database database : databases) {
try {
if (result.getResult() && !result.isStopped() && result.getNrErrors() == 0) {
try {
database.commit(true);
pipeline.getLogChannel().logBasic("All transactions of database connection '" + database.getDatabaseMeta().getName() + "' were committed at the end of the pipeline!");
} catch (HopDatabaseException e) {
throw new HopException("Error committing database connection " + database.getDatabaseMeta().getName(), e);
}
} else {
try {
database.rollback(true);
pipeline.getLogChannel().logBasic("All transactions of database connection '" + database.getDatabaseMeta().getName() + "' were rolled back at the end of the pipeline!");
} catch (HopDatabaseException e) {
throw new HopException("Error rolling back database connection " + database.getDatabaseMeta().getName(), e);
}
}
} finally {
try {
database.closeConnectionOnly();
pipeline.getLogChannel().logDebug("Database connection '" + database.getDatabaseMeta().getName() + "' closed successfully!");
} catch (HopDatabaseException hde) {
pipeline.getLogChannel().logError("Error disconnecting from database - closeConnectionOnly failed:" + Const.CR + hde.getMessage());
pipeline.getLogChannel().logError(Const.getStackTracker(hde));
}
}
DatabaseConnectionMap.getInstance().removeConnection(group, null, database);
}
});
}
//
if (connectionGroup != null && getExtensionDataMap() != null) {
// Set the connection group for this pipeline
//
getExtensionDataMap().put(Const.CONNECTION_GROUP, connectionGroup);
}
super.prepareExecution();
}
use of org.apache.hop.core.IExtensionData in project hop by apache.
the class DatabaseCreatedXp method callExtensionPoint.
@Override
public void callExtensionPoint(ILogChannel log, IVariables variables, Database database) throws HopException {
//
if (!(database.getParentObject() instanceof IExtensionData)) {
return;
}
IExtensionData extensionData = (IExtensionData) database.getParentObject();
String connectionGroup = (String) extensionData.getExtensionDataMap().get(Const.CONNECTION_GROUP);
if (connectionGroup != null) {
database.setConnectionGroup(connectionGroup);
}
}
use of org.apache.hop.core.IExtensionData in project hop by apache.
the class LocalWorkflowEngine method startExecution.
@Override
public Result startExecution() {
if (!(workflowRunConfiguration.getEngineRunConfiguration() instanceof LocalWorkflowRunConfiguration)) {
log.logError("Error starting workflow", new HopException("A local workflow execution expects a local workflow configuration, not an instance of class " + workflowRunConfiguration.getEngineRunConfiguration().getClass().getName()));
result = new Result();
result.setNrErrors(1L);
return result;
}
LocalWorkflowRunConfiguration config = (LocalWorkflowRunConfiguration) workflowRunConfiguration.getEngineRunConfiguration();
// See if we need to enable transactions...
//
IExtensionData parentExtensionData = getParentPipeline();
if (parentExtensionData == null) {
parentExtensionData = getParentWorkflow();
}
String connectionGroup = null;
if (parentExtensionData != null && parentExtensionData.getExtensionDataMap() != null) {
connectionGroup = (String) parentExtensionData.getExtensionDataMap().get(Const.CONNECTION_GROUP);
}
//
if (config.isTransactional() && connectionGroup == null) {
// Store a value in the parent...
//
connectionGroup = getWorkflowMeta().getName() + " - " + UUID.randomUUID();
// We also need to commit/rollback at the end of this workflow...
//
addWorkflowFinishedListener(workflow -> {
String group = (String) workflow.getExtensionDataMap().get(Const.CONNECTION_GROUP);
List<Database> databases = DatabaseConnectionMap.getInstance().getDatabases(group);
Result result = workflow.getResult();
for (Database database : databases) {
//
try {
if (result.getResult() && !result.isStopped() && result.getNrErrors() == 0) {
try {
database.commit(true);
workflow.getLogChannel().logBasic("All transactions of database connection '" + database.getDatabaseMeta().getName() + "' were committed at the end of the workflow!");
} catch (HopDatabaseException e) {
workflow.getLogChannel().logError("Error committing database connection " + database.getDatabaseMeta().getName(), e);
result.setNrErrors(result.getNrErrors() + 1);
}
} else {
// Error? Rollback!
try {
database.rollback(true);
workflow.getLogChannel().logBasic("All transactions of database connection '" + database.getDatabaseMeta().getName() + "' were rolled back at the end of the workflow!");
} catch (HopDatabaseException e) {
workflow.getLogChannel().logError("Error rolling back database connection " + database.getDatabaseMeta().getName(), e);
result.setNrErrors(result.getNrErrors() + 1);
}
}
} finally {
// Always close connection!
try {
database.closeConnectionOnly();
workflow.getLogChannel().logDebug("Database connection '" + database.getDatabaseMeta().getName() + "' closed successfully!");
} catch (HopDatabaseException hde) {
workflow.getLogChannel().logError("Error disconnecting from database - closeConnectionOnly failed:" + Const.CR + hde.getMessage());
workflow.getLogChannel().logError(Const.getStackTracker(hde));
}
// Definitely remove the connection reference the connections map
DatabaseConnectionMap.getInstance().removeConnection(group, null, database);
}
}
});
}
//
if (connectionGroup != null && getExtensionDataMap() != null) {
// Set the connection group for this workflow
//
getExtensionDataMap().put(Const.CONNECTION_GROUP, connectionGroup);
}
// Pass down the value of the connection group value to actions before they're executed...
//
addActionListener(new IActionListener() {
@Override
public void beforeExecution(IWorkflowEngine workflow, ActionMeta actionMeta, IAction action) {
String connectionGroup = (String) workflow.getExtensionDataMap().get(Const.CONNECTION_GROUP);
if (connectionGroup != null) {
action.getExtensionDataMap().put(Const.CONNECTION_GROUP, connectionGroup);
}
}
@Override
public void afterExecution(IWorkflowEngine workflow, ActionMeta actionMeta, IAction action, Result result) {
// Nothing
}
});
return super.startExecution();
}
Aggregations