This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit b764f567b5900b707431467ccbc8c18b1cac5a36 Author: Francesco Chicchiriccò <[email protected]> AuthorDate: Tue Sep 15 14:54:25 2020 +0200 [SYNCOPE-1591] Introducing support for fetch statements, used by archetype to populate Flowable tables for test users --- .../src/test/resources/addFlowableToContent.xsl | 28 ++-- .../jpa/content/ContentLoaderHandler.java | 141 +++++++++++---------- 2 files changed, 89 insertions(+), 80 deletions(-) diff --git a/archetype/src/main/resources/archetype-resources/core/src/test/resources/addFlowableToContent.xsl b/archetype/src/main/resources/archetype-resources/core/src/test/resources/addFlowableToContent.xsl index 7bb0d1e..70aa21b 100644 --- a/archetype/src/main/resources/archetype-resources/core/src/test/resources/addFlowableToContent.xsl +++ b/archetype/src/main/resources/archetype-resources/core/src/test/resources/addFlowableToContent.xsl @@ -23,28 +23,30 @@ <xsl:template match="/dataset"> <dataset> <xsl:apply-templates/> - - <ACT_RU_EXECUTION ID_="4" REV_="2" PROC_INST_ID_="4" BUSINESS_KEY_="userWorkflow:1417acbe-cbf6-4277-9372-e75e04f97000" PROC_DEF_ID_="userWorkflow:1:4" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> - <ACT_RU_TASK ID_="5" REV_="2" EXECUTION_ID_="4" PROC_INST_ID_="4" PROC_DEF_ID_="userWorkflow:1:4" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> - <ACT_RU_EXECUTION ID_="6" REV_="2" PROC_INST_ID_="6" BUSINESS_KEY_="userWorkflow:74cd8ece-715a-44a4-a736-e17b46c4e7e6" PROC_DEF_ID_="userWorkflow:1:4" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> - <ACT_RU_TASK ID_="7" REV_="2" EXECUTION_ID_="6" PROC_INST_ID_="6" PROC_DEF_ID_="userWorkflow:1:4" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + <fetch key="procDef" query="SELECT ID_ FROM ACT_RE_PROCDEF WHERE KEY_='userWorkflow'"/> - <ACT_RU_EXECUTION ID_="8" REV_="2" PROC_INST_ID_="8" BUSINESS_KEY_="userWorkflow:b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee" PROC_DEF_ID_="userWorkflow:1:4" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> - <ACT_RU_TASK ID_="9" REV_="2" EXECUTION_ID_="8" PROC_INST_ID_="8" PROC_DEF_ID_="userWorkflow:1:4" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + <ACT_RU_EXECUTION ID_="4" REV_="2" PROC_INST_ID_="4" BUSINESS_KEY_="userWorkflow:1417acbe-cbf6-4277-9372-e75e04f97000" PROC_DEF_ID_="${{procDef}}" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> + <ACT_RU_TASK ID_="5" REV_="2" EXECUTION_ID_="4" PROC_INST_ID_="4" PROC_DEF_ID_="${{procDef}}" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> - <ACT_RU_EXECUTION ID_="10" REV_="2" PROC_INST_ID_="10" BUSINESS_KEY_="userWorkflow:c9b2dec2-00a7-4855-97c0-d854842b4b24" PROC_DEF_ID_="userWorkflow:1:4" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> - <ACT_RU_TASK ID_="11" REV_="2" EXECUTION_ID_="10" PROC_INST_ID_="10" PROC_DEF_ID_="userWorkflow:1:4" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + <ACT_RU_EXECUTION ID_="6" REV_="2" PROC_INST_ID_="6" BUSINESS_KEY_="userWorkflow:74cd8ece-715a-44a4-a736-e17b46c4e7e6" PROC_DEF_ID_="${{procDef}}" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> + <ACT_RU_TASK ID_="7" REV_="2" EXECUTION_ID_="6" PROC_INST_ID_="6" PROC_DEF_ID_="${{procDef}}" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> - <ACT_RU_EXECUTION ID_="12" REV_="2" PROC_INST_ID_="12" BUSINESS_KEY_="userWorkflow:823074dc-d280-436d-a7dd-07399fae48ec" PROC_DEF_ID_="userWorkflow:1:4" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> - <ACT_RU_TASK ID_="13" REV_="2" EXECUTION_ID_="12" PROC_INST_ID_="12" PROC_DEF_ID_="userWorkflow:1:4" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + <ACT_RU_EXECUTION ID_="8" REV_="2" PROC_INST_ID_="8" BUSINESS_KEY_="userWorkflow:b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee" PROC_DEF_ID_="${{procDef}}" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> + <ACT_RU_TASK ID_="9" REV_="2" EXECUTION_ID_="8" PROC_INST_ID_="8" PROC_DEF_ID_="${{procDef}}" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + + <ACT_RU_EXECUTION ID_="10" REV_="2" PROC_INST_ID_="10" BUSINESS_KEY_="userWorkflow:c9b2dec2-00a7-4855-97c0-d854842b4b24" PROC_DEF_ID_="${{procDef}}" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> + <ACT_RU_TASK ID_="11" REV_="2" EXECUTION_ID_="10" PROC_INST_ID_="10" PROC_DEF_ID_="${{procDef}}" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> + + <ACT_RU_EXECUTION ID_="12" REV_="2" PROC_INST_ID_="12" BUSINESS_KEY_="userWorkflow:823074dc-d280-436d-a7dd-07399fae48ec" PROC_DEF_ID_="${{procDef}}" ACT_ID_="active" IS_ACTIVE_="1" IS_CONCURRENT_="0" IS_SCOPE_="1" IS_EVENT_SCOPE_="0" SUSPENSION_STATE_="1"/> + <ACT_RU_TASK ID_="13" REV_="2" EXECUTION_ID_="12" PROC_INST_ID_="12" PROC_DEF_ID_="${{procDef}}" NAME_="Active" TASK_DEF_KEY_="active" PRIORITY_="50" CREATE_TIME_="2013-02-25T17:19:03+0100"/> </dataset> </xsl:template> - + <xsl:template match="node()|@*|comment()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> -</xsl:stylesheet> \ No newline at end of file +</xsl:stylesheet> diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java index 15f9e04..1673e9b 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java @@ -51,7 +51,9 @@ public class ContentLoaderHandler extends DefaultHandler { private final boolean continueOnError; - private final StringSubstitutor envParamSubstitutor; + private final Map<String, String> fetches = new HashMap<>(); + + private final StringSubstitutor paramSubstitutor; public ContentLoaderHandler( final DataSource dataSource, @@ -62,8 +64,8 @@ public class ContentLoaderHandler extends DefaultHandler { this.jdbcTemplate = new JdbcTemplate(dataSource); this.rootElement = rootElement; this.continueOnError = continueOnError; - this.envParamSubstitutor = new StringSubstitutor(key -> { - String value = env.getProperty(key); + this.paramSubstitutor = new StringSubstitutor(key -> { + String value = env.getProperty(key, fetches.get(key)); return StringUtils.isBlank(value) ? null : value; }); } @@ -86,7 +88,7 @@ public class ContentLoaderHandler extends DefaultHandler { colType = Types.VARCHAR; } - String value = envParamSubstitutor.replace(attrs.getValue(i)); + String value = paramSubstitutor.replace(attrs.getValue(i)); if (value == null) { LOG.warn("Variable ${} could not be resolved", attrs.getValue(i)); value = attrs.getValue(i); @@ -97,53 +99,53 @@ public class ContentLoaderHandler extends DefaultHandler { case Types.TINYINT: case Types.SMALLINT: try { - parameters[i] = Integer.valueOf(value); - } catch (NumberFormatException e) { - LOG.error("Unparsable Integer '{}'", value); - parameters[i] = value; - } - break; + parameters[i] = Integer.valueOf(value); + } catch (NumberFormatException e) { + LOG.error("Unparsable Integer '{}'", value); + parameters[i] = value; + } + break; case Types.NUMERIC: case Types.DECIMAL: case Types.BIGINT: try { - parameters[i] = Long.valueOf(value); - } catch (NumberFormatException e) { - LOG.error("Unparsable Long '{}'", value); - parameters[i] = value; - } - break; + parameters[i] = Long.valueOf(value); + } catch (NumberFormatException e) { + LOG.error("Unparsable Long '{}'", value); + parameters[i] = value; + } + break; case Types.DOUBLE: try { - parameters[i] = Double.valueOf(value); - } catch (NumberFormatException e) { - LOG.error("Unparsable Double '{}'", value); - parameters[i] = value; - } - break; + parameters[i] = Double.valueOf(value); + } catch (NumberFormatException e) { + LOG.error("Unparsable Double '{}'", value); + parameters[i] = value; + } + break; case Types.REAL: case Types.FLOAT: try { - parameters[i] = Float.valueOf(value); - } catch (NumberFormatException e) { - LOG.error("Unparsable Float '{}'", value); - parameters[i] = value; - } - break; + parameters[i] = Float.valueOf(value); + } catch (NumberFormatException e) { + LOG.error("Unparsable Float '{}'", value); + parameters[i] = value; + } + break; case Types.DATE: case Types.TIME: case Types.TIMESTAMP: try { - parameters[i] = FormatUtils.parseDate(value); - } catch (ParseException e) { - LOG.error("Unparsable Date '{}'", value); - parameters[i] = value; - } - break; + parameters[i] = FormatUtils.parseDate(value); + } catch (ParseException e) { + LOG.error("Unparsable Date '{}'", value); + parameters[i] = value; + } + break; case Types.BIT: case Types.BOOLEAN: @@ -154,22 +156,22 @@ public class ContentLoaderHandler extends DefaultHandler { case Types.VARBINARY: case Types.LONGVARBINARY: try { - parameters[i] = DatatypeConverter.parseHexBinary(value); - } catch (IllegalArgumentException e) { - parameters[i] = value; - } - break; + parameters[i] = DatatypeConverter.parseHexBinary(value); + } catch (IllegalArgumentException e) { + parameters[i] = value; + } + break; case Types.BLOB: try { - parameters[i] = DatatypeConverter.parseHexBinary(value); - } catch (IllegalArgumentException e) { - LOG.warn("Error decoding hex string to specify a blob parameter", e); - parameters[i] = value; - } catch (Exception e) { - LOG.warn("Error creating a new blob parameter", e); - } - break; + parameters[i] = DatatypeConverter.parseHexBinary(value); + } catch (IllegalArgumentException e) { + LOG.warn("Error decoding hex string to specify a blob parameter", e); + parameters[i] = value; + } catch (Exception e) { + LOG.warn("Error creating a new blob parameter", e); + } + break; default: parameters[i] = value; @@ -187,27 +189,32 @@ public class ContentLoaderHandler extends DefaultHandler { if (rootElement.equals(qName)) { return; } - - StringBuilder query = new StringBuilder("INSERT INTO ").append(qName).append('('); - - StringBuilder values = new StringBuilder(); - - for (int i = 0; i < atts.getLength(); i++) { - query.append(atts.getQName(i)); - values.append('?'); - if (i < atts.getLength() - 1) { - query.append(','); - values.append(','); + if ("fetch".equalsIgnoreCase(qName)) { + String value = jdbcTemplate.queryForObject(atts.getValue("query"), String.class); + String key = atts.getValue("key"); + fetches.put(key, value); + } else { + StringBuilder query = new StringBuilder("INSERT INTO ").append(qName).append('('); + + StringBuilder values = new StringBuilder(); + + for (int i = 0; i < atts.getLength(); i++) { + query.append(atts.getQName(i)); + values.append('?'); + if (i < atts.getLength() - 1) { + query.append(','); + values.append(','); + } } - } - query.append(") VALUES (").append(values).append(')'); - - try { - jdbcTemplate.update(query.toString(), getParameters(qName, atts)); - } catch (DataAccessException e) { - LOG.error("While trying to perform {} with params {}", query, getParameters(qName, atts), e); - if (!continueOnError) { - throw e; + query.append(") VALUES (").append(values).append(')'); + + try { + jdbcTemplate.update(query.toString(), getParameters(qName, atts)); + } catch (DataAccessException e) { + LOG.error("While trying to perform {} with params {}", query, getParameters(qName, atts), e); + if (!continueOnError) { + throw e; + } } } }
