@Override public StoredWorkflowDefinition mapRow(ResultSet rs, int rowNum) throws SQLException { return deserializeDefinition(rs.getString("definition")); } });
/** * Add workflow definitions from the nflowNonSpringWorkflowsListing resource and persist * all loaded workflow definitions. * @throws IOException when workflow definitions can not be read from the resource. * @throws ReflectiveOperationException when the workflow definition can not be instantiated. */ @PostConstruct public void postProcessWorkflowDefinitions() throws IOException, ReflectiveOperationException { if (nonSpringWorkflowsListing == null) { logger.info("No non-Spring workflow definitions"); } else { initNonSpringWorkflowDefinitions(); } if (persistWorkflowDefinitions) { for (AbstractWorkflowDefinition<?> definition : workflowDefitions.values()) { workflowDefinitionDao.storeWorkflowDefinition(definition); } } }
public void storeWorkflowDefinition(AbstractWorkflowDefinition<? extends WorkflowState> definition) { StoredWorkflowDefinition storedDefinition = convert(definition); MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("type", definition.getType()); String serializedDefinition = serializeDefinition(storedDefinition); params.addValue("definition_sha1", sha1(serializedDefinition)); params.addValue("definition", serializedDefinition, sqlVariants.longTextType()); params.addValue("modified_by", executorInfo.getExecutorId()); params.addValue("executor_group", executorInfo.getExecutorGroup()); String sql = "update nflow_workflow_definition " + "set definition = :definition, modified_by = :modified_by, definition_sha1 = :definition_sha1 " + "where type = :type and executor_group = :executor_group and definition_sha1 <> :definition_sha1"; int updatedRows = namedJdbc.update(sql, params); if (updatedRows == 0) { sql = "insert into nflow_workflow_definition(type, definition_sha1, definition, modified_by, executor_group) " + "values (:type, :definition_sha1, :definition, :modified_by, :executor_group)"; try { namedJdbc.update(sql, params); } catch (DataIntegrityViolationException dex) { logger.debug("Another executor already stored the definition.", dex); } } }
@GET @ApiOperation(value = "List workflow definitions", response = ListWorkflowDefinitionResponse.class, responseContainer = "List", notes = "Returns workflow definition(s): all possible states, transitions between states and other setting metadata." + "The workflow definition can deployed in nFlow engine or historical workflow definition stored in the database.") public List<ListWorkflowDefinitionResponse> listWorkflowDefinitions( @QueryParam("type") @ApiParam(value = "Included workflow types") List<String> types) { List<AbstractWorkflowDefinition<? extends WorkflowState>> definitions = workflowDefinitions.getWorkflowDefinitions(); Set<String> reqTypes = new HashSet<>(types); Set<String> foundTypes = new HashSet<>(); List<ListWorkflowDefinitionResponse> response = new ArrayList<>(); for (AbstractWorkflowDefinition<? extends WorkflowState> definition : definitions) { if (reqTypes.isEmpty() || reqTypes.contains(definition.getType())) { foundTypes.add(definition.getType()); response.add(converter.convert(definition)); } } if (reqTypes.isEmpty() || foundTypes.size() < reqTypes.size()) { reqTypes.removeAll(foundTypes); List<StoredWorkflowDefinition> storedDefinitions = workflowDefinitionDao.queryStoredWorkflowDefinitions(reqTypes); for (StoredWorkflowDefinition storedDefinition : storedDefinitions) { if (!foundTypes.contains(storedDefinition.type)) { response.add(converter.convert(storedDefinition)); } } } sort(response); return response; } }