You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2018/10/11 15:28:32 UTC
[1/2] syncope git commit: [SYNCOPE-1369] Special support to upgrade
to Flowable in 2.1.2 added
Repository: syncope
Updated Branches:
refs/heads/2_1_X 5f55de6b5 -> 395a4fe15
refs/heads/master 4492950f3 -> 41816c850
[SYNCOPE-1369] Special support to upgrade to Flowable in 2.1.2 added
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/395a4fe1
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/395a4fe1
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/395a4fe1
Branch: refs/heads/2_1_X
Commit: 395a4fe15b8ae5999d0d7b1c0556e1a2e3e65357
Parents: 5f55de6
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Oct 11 17:28:07 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Oct 11 17:28:14 2018 +0200
----------------------------------------------------------------------
.../core/upgrade/GenerateUpgradeSQL.java | 778 ++++++++++---------
.../core/upgrade/GeneratedUpgradeSQLTest.java | 28 +
core/upgrade/src/test/resources/syncopedb20.sql | 13 +-
core/upgrade/src/test/resources/testJDBCEnv.xml | 4 +-
4 files changed, 441 insertions(+), 382 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/395a4fe1/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
----------------------------------------------------------------------
diff --git a/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java b/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
index ccbf6e6..37d7062 100644
--- a/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
+++ b/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
@@ -26,6 +26,7 @@ import java.io.PrintWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.ResultSet;
+import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.UUID;
@@ -45,12 +46,385 @@ public final class GenerateUpgradeSQL {
GenerateUpgradeSQL.OUT = out;
}
+ private static void upgrade(final Connection conn) throws SQLException, IOException {
+ // User
+ OUT.write("UPDATE SyncopeUser SET mustChangePassword=0 WHERE mustChangePassword IS NULL;\n");
+
+ // VirSchema
+ OUT.write("UPDATE VirSchema SET readonly=0 WHERE readonly IS NULL;\n");
+
+ // ExternalResource
+ OUT.write("UPDATE ExternalResource SET overrideCapabilities=0 WHERE overrideCapabilities IS NULL;\n");
+
+ // OrgUnit
+ OUT.write("UPDATE OrgUnit SET ignoreCaseMatch=0;\n");
+
+ // OrgUnitItemTransformer
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT orgUnitItem_id,transformerClassName FROM OrgUnitItem_Transformer")) {
+
+ while (rs.next()) {
+ String itemId = rs.getString(1);
+ String transformerClassName = rs.getString(2);
+
+ String implementationId = "OrgUnitItemTransformer_" + transformerClassName + "_" + itemId;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ITEM_TRANSFORMER',"
+ + "'JAVA',"
+ + "'" + transformerClassName + "');\n");
+ OUT.write("INSERT INTO OrgUnitItemTransformer(item_id,implementation_id) VALUES("
+ + "'" + itemId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE OrgUnitItem_Transformer;\n");
+
+ // PlainSchema
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT validatorClass FROM PlainSchema WHERE validatorClass IS NOT NULL")) {
+
+ while (rs.next()) {
+ String validatorClass = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + validatorClass + "',"
+ + "'VALIDATOR',"
+ + "'JAVA',"
+ + "'" + validatorClass + "');\n");
+ }
+ }
+ OUT.write("UPDATE PlainSchema SET validator_id=validatorClass;\n");
+ OUT.write("ALTER TABLE PlainSchema DROP COLUMN validatorClass;\n");
+
+ // Provision
+ OUT.write("UPDATE Provision SET ignoreCaseMatch=0;\n");
+
+ // PullPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,specification FROM PullPolicy WHERE specification IS NOT NULL")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ ObjectNode specification = (ObjectNode) MAPPER.readTree(rs.getString(2));
+
+ if (specification.has("conflictResolutionAction")) {
+ OUT.write("UPDATE PullPolicy SET "
+ + "conflictResolutionAction='"
+ + specification.get("conflictResolutionAction").asText() + "' "
+ + "WHERE id='" + id + "';\n");
+ }
+ if (specification.has("correlationRules")) {
+ specification.get("correlationRules").fields().forEachRemaining(entry -> {
+ ObjectNode body = MAPPER.createObjectNode();
+ body.put("@class", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
+ body.put("name", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
+ body.set("schemas", entry.getValue());
+
+ try {
+ String implementationId = "PullCorrelationRule_" + entry.getKey() + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'PULL_CORRELATION_RULE',"
+ + "'JAVA',"
+ + "'" + MAPPER.writeValueAsString(body) + "');\n");
+
+ OUT.write("INSERT INTO PullCorrelationRuleEntity"
+ + "(id,pullPolicy_id,anyType_id,implementation_id) VALUES("
+ + "'" + UUID.randomUUID().toString() + "',"
+ + "'" + id + "',"
+ + "'" + entry.getKey() + "',"
+ + "'" + implementationId + "');\n");
+ } catch (IOException e) {
+ System.err.println("Unexpected error: " + e.getMessage());
+ System.exit(2);
+ }
+ });
+ }
+ }
+ OUT.write("ALTER TABLE PullPolicy DROP COLUMN specification;\n");
+ }
+
+ // AccountPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,accountPolicy_id,serializedInstance FROM AccountRuleConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String accountPolicyId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "AccountRule_" + accountPolicyId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ACCOUNT_RULE',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO AccountPolicyRule(policy_id,implementation_id) VALUES("
+ + "'" + accountPolicyId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE AccountRuleConfInstance;\n");
+
+ // PasswordPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,passwordPolicy_id,serializedInstance FROM PasswordRuleConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String passwordPolicyId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "PasswordRule_" + passwordPolicyId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ACCOUNT_RULE',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO PasswordPolicyRule(policy_id,implementation_id) VALUES("
+ + "'" + passwordPolicyId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PasswordRuleConfInstance;\n");
+
+ // Task
+ OUT.write("UPDATE Task SET remediation=0;\n");
+ OUT.write("UPDATE Task SET active=0 WHERE active IS NULL;\n");
+
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'PullJobDelegate',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate');\n");
+ OUT.write("UPDATE Task SET jobDelegate_id='PullJobDelegate' WHERE DTYPE='PullTask';\n");
+
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'PushJobDelegate',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate');\n");
+ OUT.write("UPDATE Task SET jobDelegate_id='PushJobDelegate' WHERE DTYPE='PushTask';\n");
+
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT jobDelegateClassName FROM Task WHERE jobDelegateClassName IS NOT NULL")) {
+
+ while (rs.next()) {
+ String jobDelegateClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + jobDelegateClassName + "',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'" + jobDelegateClassName + "');\n");
+ }
+ }
+ OUT.write("UPDATE Task SET jobDelegate_id=jobDelegateClassName;\n");
+ OUT.write("ALTER TABLE Task DROP COLUMN jobDelegateClassName;\n");
+
+ // PullActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM PullTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PULL_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT pullTask_id,actionClassName FROM PullTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String pullTaskId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO PullTaskAction(task_id,implementation_id) VALUES("
+ + "'" + pullTaskId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PullTask_actionsClassNames;\n");
+
+ // PushActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM PushTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PUSH_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT pushTask_id,actionClassName FROM PushTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String pushTaskId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO PushTaskAction(task_id,implementation_id) VALUES("
+ + "'" + pushTaskId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PushTask_actionsClassNames;\n");
+
+ // PropagationActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM ExternalResource_PropActions")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PROPAGATION_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT resource_id,actionClassName FROM ExternalResource_PropActions")) {
+
+ while (rs.next()) {
+ String resourceId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO ExternalResourcePropAction(resource_id,implementation_id) VALUES("
+ + "'" + resourceId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE ExternalResource_PropActions;\n");
+
+ // LogicActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM Realm_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'LOGIC_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT realm_id,actionClassName FROM Realm_actionsClassNames")) {
+
+ while (rs.next()) {
+ String realmId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO RealmAction(realm_id,implementation_id) VALUES("
+ + "'" + realmId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE Realm_actionsClassNames;\n");
+
+ // Reportlet
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,report_id,serializedInstance FROM ReportletConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String reportId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "Reportlet_" + reportId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'REPORTLET',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO ReportReportlet(report_id,implementation_id) VALUES("
+ + "'" + reportId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE ReportletConfInstance;\n");
+
+ // MappingItemTransformer
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT mappingItem_id,transformerClassName FROM MappingItem_Transformer")) {
+
+ while (rs.next()) {
+ String itemId = rs.getString(1);
+ String transformerClassName = rs.getString(2);
+
+ String implementationId = "MappingItemTransformer_" + transformerClassName + "_" + itemId;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ITEM_TRANSFORMER',"
+ + "'JAVA',"
+ + "'" + transformerClassName + "');\n");
+ OUT.write("INSERT INTO MappingItemTransformer(item_id,implementation_id) VALUES("
+ + "'" + itemId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE MappingItem_Transformer;\n");
+
+ // Notification
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT recipientsProviderClassName "
+ + "FROM Notification WHERE recipientsProviderClassName IS NOT NULL")) {
+
+ while (rs.next()) {
+ String recipientsProviderClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + recipientsProviderClassName + "',"
+ + "'RECIPIENTS_PROVIDER',"
+ + "'JAVA',"
+ + "'" + recipientsProviderClassName + "');\n");
+ }
+ }
+ OUT.write("UPDATE Notification SET recipientsProvider_id=recipientsProviderClassName;\n");
+ OUT.write("ALTER TABLE Notification DROP COLUMN recipientsProviderClassName;\n");
+ }
+
+ private static void upgradeFlowableTo212(final Connection conn) throws IOException, SQLException {
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT id,workflowId FROM SyncopeUser")) {
+
+ while (rs.next()) {
+ OUT.write("UPDATE ACT_RU_EXECUTION "
+ + "SET BUSINESS_KEY_='userWorkflow:" + rs.getString(1) + "' "
+ + "WHERE ID_='" + rs.getString(2) + "';\n");
+ }
+ }
+
+ OUT.write("DROP VIEW user_search;\n");
+ OUT.write("ALTER TABLE SyncopeUser DROP COLUMN workflowId;\n");
+ OUT.write("CREATE VIEW user_search AS SELECT u.id as any_id, u.* FROM SyncopeUser u;\n");
+ }
+
public static void main(final String[] args) throws Exception {
// parse args
- if (args.length < 5 || args.length > 6) {
+ if (args.length < 5 || args.length > 7) {
System.err.println("Unexpected arguments: " + Arrays.asList(args));
System.out.println("Usage: <driverClassName> <jdbcURL> <username> <password>"
- + "<h2|mariadb|mysql|oracle|postgres|sqlserver> [filename]");
+ + "<h2|mariadb|mysql|oracle|postgres|sqlserver> [-flowable-2.1.2] [filename]");
System.exit(1);
}
@@ -59,8 +433,12 @@ public final class GenerateUpgradeSQL {
String username = args[2];
String password = args[3];
String dbDictionary = args[4];
- if (args.length == 6) {
- setWriter(new FileWriter(args[5]));
+ boolean flowableTo212 = false;
+ if (args.length >= 6) {
+ flowableTo212 = "-flowable-2.1.2".equals(args[5]);
+ if (!flowableTo212) {
+ setWriter(new FileWriter(args[args.length - 1]));
+ }
}
// setup DataSource
@@ -70,383 +448,35 @@ public final class GenerateUpgradeSQL {
dataSource.setConnectionUserName(username);
dataSource.setConnectionPassword(password);
- // setup OpenJPA
- JDBCConfiguration jdbcConf = new JDBCConfigurationImpl();
- jdbcConf.setConnection2DriverName(driverClassName);
- jdbcConf.setConnection2UserName(username);
- jdbcConf.setConnection2Password(password);
- jdbcConf.setDBDictionary(dbDictionary);
- jdbcConf.setConnectionFactory2(dataSource);
-
- FileSchemaFactory schemaFactory = new FileSchemaFactory();
- schemaFactory.setConfiguration(jdbcConf);
- schemaFactory.setFile("schema.xml");
- jdbcConf.setSchemaFactory(schemaFactory);
-
- WiserSchemaTool schemaTool = new WiserSchemaTool(jdbcConf, SchemaTool.ACTION_ADD);
- schemaTool.setSchemaGroup(schemaFactory.readSchema());
- schemaTool.setWriter(OUT);
try {
- // run OpenJPA's SchemaTool to get the update statements
- schemaTool.run();
+ // setup OpenJPA
+ JDBCConfiguration jdbcConf = new JDBCConfigurationImpl();
+ jdbcConf.setConnection2DriverName(driverClassName);
+ jdbcConf.setConnection2UserName(username);
+ jdbcConf.setConnection2Password(password);
+ jdbcConf.setDBDictionary(dbDictionary);
+ jdbcConf.setConnectionFactory2(dataSource);
+
+ FileSchemaFactory schemaFactory = new FileSchemaFactory();
+ schemaFactory.setConfiguration(jdbcConf);
+ schemaFactory.setFile("schema.xml");
+ jdbcConf.setSchemaFactory(schemaFactory);
+
+ WiserSchemaTool schemaTool = new WiserSchemaTool(jdbcConf, SchemaTool.ACTION_ADD);
+ schemaTool.setSchemaGroup(schemaFactory.readSchema());
+ schemaTool.setWriter(OUT);
// now proceed with manual update statements...
Connection conn = jdbcConf.getDataSource2(null).getConnection();
- // User
- OUT.write("UPDATE SyncopeUser SET mustChangePassword=0 WHERE mustChangePassword IS NULL;\n");
-
- // VirSchema
- OUT.write("UPDATE VirSchema SET readonly=0 WHERE readonly IS NULL;\n");
-
- // ExternalResource
- OUT.write("UPDATE ExternalResource SET overrideCapabilities=0 WHERE overrideCapabilities IS NULL;\n");
-
- // OrgUnit
- OUT.write("UPDATE OrgUnit SET ignoreCaseMatch=0;\n");
+ if (flowableTo212) {
+ upgradeFlowableTo212(conn);
+ } else {
+ // run OpenJPA's SchemaTool to get the update statements
+ schemaTool.run();
- // OrgUnitItemTransformer
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT orgUnitItem_id,transformerClassName FROM OrgUnitItem_Transformer")) {
-
- while (rs.next()) {
- String itemId = rs.getString(1);
- String transformerClassName = rs.getString(2);
-
- String implementationId = "OrgUnitItemTransformer_" + transformerClassName + "_" + itemId;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ITEM_TRANSFORMER',"
- + "'JAVA',"
- + "'" + transformerClassName + "');\n");
- OUT.write("INSERT INTO OrgUnitItemTransformer(item_id,implementation_id) VALUES("
- + "'" + itemId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE OrgUnitItem_Transformer;\n");
-
- // PlainSchema
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT validatorClass FROM PlainSchema WHERE validatorClass IS NOT NULL")) {
-
- while (rs.next()) {
- String validatorClass = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + validatorClass + "',"
- + "'VALIDATOR',"
- + "'JAVA',"
- + "'" + validatorClass + "');\n");
- }
- }
- OUT.write("UPDATE PlainSchema SET validator_id=validatorClass;\n");
- OUT.write("ALTER TABLE PlainSchema DROP COLUMN validatorClass;\n");
-
- // Provision
- OUT.write("UPDATE Provision SET ignoreCaseMatch=0;\n");
-
- // PullPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,specification FROM PullPolicy WHERE specification IS NOT NULL")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- ObjectNode specification = (ObjectNode) MAPPER.readTree(rs.getString(2));
-
- if (specification.has("conflictResolutionAction")) {
- OUT.write("UPDATE PullPolicy SET "
- + "conflictResolutionAction='"
- + specification.get("conflictResolutionAction").asText() + "' "
- + "WHERE id='" + id + "';\n");
- }
- if (specification.has("correlationRules")) {
- specification.get("correlationRules").fields().forEachRemaining(entry -> {
- ObjectNode body = MAPPER.createObjectNode();
- body.put("@class", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
- body.put("name", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
- body.set("schemas", entry.getValue());
-
- try {
- String implementationId = "PullCorrelationRule_" + entry.getKey() + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'PULL_CORRELATION_RULE',"
- + "'JAVA',"
- + "'" + MAPPER.writeValueAsString(body) + "');\n");
-
- OUT.write("INSERT INTO PullCorrelationRuleEntity"
- + "(id,pullPolicy_id,anyType_id,implementation_id) VALUES("
- + "'" + UUID.randomUUID().toString() + "',"
- + "'" + id + "',"
- + "'" + entry.getKey() + "',"
- + "'" + implementationId + "');\n");
- } catch (IOException e) {
- System.err.println("Unexpected error: " + e.getMessage());
- System.exit(2);
- }
- });
- }
- }
- OUT.write("ALTER TABLE PullPolicy DROP COLUMN specification;\n");
- }
-
- // AccountPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,accountPolicy_id,serializedInstance FROM AccountRuleConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String accountPolicyId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "AccountRule_" + accountPolicyId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ACCOUNT_RULE',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO AccountPolicyRule(policy_id,implementation_id) VALUES("
- + "'" + accountPolicyId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE AccountRuleConfInstance;\n");
-
- // PasswordPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,passwordPolicy_id,serializedInstance FROM PasswordRuleConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String passwordPolicyId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "PasswordRule_" + passwordPolicyId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ACCOUNT_RULE',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO PasswordPolicyRule(policy_id,implementation_id) VALUES("
- + "'" + passwordPolicyId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE PasswordRuleConfInstance;\n");
-
- // Task
- OUT.write("UPDATE Task SET remediation=0;\n");
- OUT.write("UPDATE Task SET active=0 WHERE active IS NULL;\n");
-
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'PullJobDelegate',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate');\n");
- OUT.write("UPDATE Task SET jobDelegate_id='PullJobDelegate' WHERE DTYPE='PullTask';\n");
-
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'PushJobDelegate',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate');\n");
- OUT.write("UPDATE Task SET jobDelegate_id='PushJobDelegate' WHERE DTYPE='PushTask';\n");
-
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT jobDelegateClassName FROM Task WHERE jobDelegateClassName IS NOT NULL")) {
-
- while (rs.next()) {
- String jobDelegateClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + jobDelegateClassName + "',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'" + jobDelegateClassName + "');\n");
- }
- }
- OUT.write("UPDATE Task SET jobDelegate_id=jobDelegateClassName;\n");
- OUT.write("ALTER TABLE Task DROP COLUMN jobDelegateClassName;\n");
-
- // PullActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM PullTask_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PULL_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT pullTask_id,actionClassName FROM PullTask_actionsClassNames")) {
-
- while (rs.next()) {
- String pullTaskId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO PullTaskAction(task_id,implementation_id) VALUES("
- + "'" + pullTaskId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE PullTask_actionsClassNames;\n");
-
- // PushActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM PushTask_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PUSH_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT pushTask_id,actionClassName FROM PushTask_actionsClassNames")) {
-
- while (rs.next()) {
- String pushTaskId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO PushTaskAction(task_id,implementation_id) VALUES("
- + "'" + pushTaskId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE PushTask_actionsClassNames;\n");
-
- // PropagationActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM ExternalResource_PropActions")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PROPAGATION_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT resource_id,actionClassName FROM ExternalResource_PropActions")) {
-
- while (rs.next()) {
- String resourceId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO ExternalResourcePropAction(resource_id,implementation_id) VALUES("
- + "'" + resourceId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE ExternalResource_PropActions;\n");
-
- // LogicActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM Realm_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'LOGIC_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT realm_id,actionClassName FROM Realm_actionsClassNames")) {
-
- while (rs.next()) {
- String realmId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO RealmAction(realm_id,implementation_id) VALUES("
- + "'" + realmId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE Realm_actionsClassNames;\n");
-
- // Reportlet
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,report_id,serializedInstance FROM ReportletConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String reportId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "Reportlet_" + reportId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'REPORTLET',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO ReportReportlet(report_id,implementation_id) VALUES("
- + "'" + reportId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE ReportletConfInstance;\n");
-
- // MappingItemTransformer
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT mappingItem_id,transformerClassName FROM MappingItem_Transformer")) {
-
- while (rs.next()) {
- String itemId = rs.getString(1);
- String transformerClassName = rs.getString(2);
-
- String implementationId = "MappingItemTransformer_" + transformerClassName + "_" + itemId;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ITEM_TRANSFORMER',"
- + "'JAVA',"
- + "'" + transformerClassName + "');\n");
- OUT.write("INSERT INTO MappingItemTransformer(item_id,implementation_id) VALUES("
- + "'" + itemId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE MappingItem_Transformer;\n");
-
- // Notification
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT recipientsProviderClassName "
- + "FROM Notification WHERE recipientsProviderClassName IS NOT NULL")) {
-
- while (rs.next()) {
- String recipientsProviderClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + recipientsProviderClassName + "',"
- + "'RECIPIENTS_PROVIDER',"
- + "'JAVA',"
- + "'" + recipientsProviderClassName + "');\n");
- }
+ upgrade(conn);
}
- OUT.write("UPDATE Notification SET recipientsProvider_id=recipientsProviderClassName;\n");
- OUT.write("ALTER TABLE Notification DROP COLUMN recipientsProviderClassName;\n");
} finally {
OUT.flush();
OUT.close();
http://git-wip-us.apache.org/repos/asf/syncope/blob/395a4fe1/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java b/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
index 42de069..148797b 100644
--- a/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
+++ b/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
@@ -117,4 +117,32 @@ public class GeneratedUpgradeSQLTest {
assertNotNull(pushCorrelationRuleEntities);
assertEquals(0, pushCorrelationRuleEntities.intValue());
}
+
+ @Test
+ public void upgradeFlowableTo212() throws Exception {
+ StringWriter out = new StringWriter();
+ GenerateUpgradeSQL.setWriter(out);
+
+ String[] args = new String[] { driverClassName, jdbcURL, username, password, "h2", "-flowable-2.1.2" };
+ GenerateUpgradeSQL.main(args);
+
+ String upgradeSQL = out.toString();
+
+ try {
+ DataSourceInitializer adminUsersInit = new DataSourceInitializer();
+ adminUsersInit.setDataSource(syncope20DataSource);
+ adminUsersInit.setDatabasePopulator(
+ new ResourceDatabasePopulator(new ByteArrayResource(upgradeSQL.getBytes(StandardCharsets.UTF_8))));
+ adminUsersInit.afterPropertiesSet();
+ } catch (Exception e) {
+ fail("Unexpected error while upgrading Flowable to 2.1.2", e);
+ }
+
+ JdbcTemplate jdbcTemplate = new JdbcTemplate(syncope20DataSource);
+
+ Integer processInstances = jdbcTemplate.queryForObject(
+ "SELECT COUNT(*) FROM ACT_RU_EXECUTION WHERE BUSINESS_KEY_ IS NOT NULL", Integer.class);
+ assertNotNull(processInstances);
+ assertEquals(5, processInstances.intValue());
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/395a4fe1/core/upgrade/src/test/resources/syncopedb20.sql
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/resources/syncopedb20.sql b/core/upgrade/src/test/resources/syncopedb20.sql
index 59a2df0..4575cf2 100644
--- a/core/upgrade/src/test/resources/syncopedb20.sql
+++ b/core/upgrade/src/test/resources/syncopedb20.sql
@@ -1614,6 +1614,7 @@ CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER(
LASTCHANGEDATE TIMESTAMP,
LASTMODIFIER VARCHAR(255),
STATUS VARCHAR(255),
+ WORKFLOWID VARCHAR(255),
CHANGEPWDDATE TIMESTAMP,
CIPHERALGORITHM VARCHAR(20),
FAILEDLOGINS INTEGER,
@@ -1630,12 +1631,12 @@ CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER(
);
ALTER TABLE PUBLIC.SYNCOPEUSER ADD CONSTRAINT PUBLIC.CONSTRAINT_6FFB PRIMARY KEY(ID);
-- 5 +/- SELECT COUNT(*) FROM PUBLIC.SYNCOPEUSER;
-INSERT INTO PUBLIC.SYNCOPEUSER(ID, CREATIONDATE, CREATOR, LASTCHANGEDATE, LASTMODIFIER, STATUS, CHANGEPWDDATE, CIPHERALGORITHM, FAILEDLOGINS, LASTLOGINDATE, MUSTCHANGEPASSWORD, PASSWORD, SECURITYANSWER, SUSPENDED, TOKEN, TOKENEXPIRETIME, USERNAME, REALM_ID, SECURITYQUESTION_ID) VALUES
-('1417acbe-cbf6-4277-9372-e75e04f97000', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'rossini', 'c5b75db1-fce7-470f-b780-3b9934d82a9d', NULL),
-('74cd8ece-715a-44a4-a736-e17b46c4e7e6', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'verdi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'vivaldi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('c9b2dec2-00a7-4855-97c0-d854842b4b24', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'bellini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('823074dc-d280-436d-a7dd-07399fae48ec', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'puccini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL);
+INSERT INTO PUBLIC.SYNCOPEUSER(ID, CREATIONDATE, CREATOR, LASTCHANGEDATE, LASTMODIFIER, STATUS, WORKFLOWID, CHANGEPWDDATE, CIPHERALGORITHM, FAILEDLOGINS, LASTLOGINDATE, MUSTCHANGEPASSWORD, PASSWORD, SECURITYANSWER, SUSPENDED, TOKEN, TOKENEXPIRETIME, USERNAME, REALM_ID, SECURITYQUESTION_ID) VALUES
+('1417acbe-cbf6-4277-9372-e75e04f97000', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '4', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'rossini', 'c5b75db1-fce7-470f-b780-3b9934d82a9d', NULL),
+('74cd8ece-715a-44a4-a736-e17b46c4e7e6', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '6', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'verdi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '8', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'vivaldi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('c9b2dec2-00a7-4855-97c0-d854842b4b24', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '10', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'bellini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('823074dc-d280-436d-a7dd-07399fae48ec', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '12', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'puccini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL);
CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER_ANYTYPECLASS(
USER_ID VARCHAR(36),
ANYTYPECLASS_ID VARCHAR(255)
http://git-wip-us.apache.org/repos/asf/syncope/blob/395a4fe1/core/upgrade/src/test/resources/testJDBCEnv.xml
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/resources/testJDBCEnv.xml b/core/upgrade/src/test/resources/testJDBCEnv.xml
index daa2597..173ffd4 100644
--- a/core/upgrade/src/test/resources/testJDBCEnv.xml
+++ b/core/upgrade/src/test/resources/testJDBCEnv.xml
@@ -46,8 +46,8 @@ under the License.
<property name="dataSource" ref="syncope20DataSource"/>
<property name="databasePopulator">
<bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
- <property name="continueOnError" value="true"/>
- <property name="ignoreFailedDrops" value="true"/>
+ <property name="continueOnError" value="false"/>
+ <property name="ignoreFailedDrops" value="false"/>
<property name="sqlScriptEncoding" value="UTF-8"/>
<property name="scripts">
<array>
[2/2] syncope git commit: [SYNCOPE-1369] Special support to upgrade
to Flowable in 2.1.2 added
Posted by il...@apache.org.
[SYNCOPE-1369] Special support to upgrade to Flowable in 2.1.2 added
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/41816c85
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/41816c85
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/41816c85
Branch: refs/heads/master
Commit: 41816c85027bbed8407be1a365a3f2381632811e
Parents: 4492950
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Oct 11 17:28:07 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Oct 11 17:28:24 2018 +0200
----------------------------------------------------------------------
.../core/upgrade/GenerateUpgradeSQL.java | 778 ++++++++++---------
.../core/upgrade/GeneratedUpgradeSQLTest.java | 28 +
core/upgrade/src/test/resources/syncopedb20.sql | 13 +-
core/upgrade/src/test/resources/testJDBCEnv.xml | 4 +-
4 files changed, 441 insertions(+), 382 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/41816c85/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
----------------------------------------------------------------------
diff --git a/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java b/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
index ccbf6e6..37d7062 100644
--- a/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
+++ b/core/upgrade/src/main/java/org/apache/syncope/core/upgrade/GenerateUpgradeSQL.java
@@ -26,6 +26,7 @@ import java.io.PrintWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.ResultSet;
+import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.UUID;
@@ -45,12 +46,385 @@ public final class GenerateUpgradeSQL {
GenerateUpgradeSQL.OUT = out;
}
+ private static void upgrade(final Connection conn) throws SQLException, IOException {
+ // User
+ OUT.write("UPDATE SyncopeUser SET mustChangePassword=0 WHERE mustChangePassword IS NULL;\n");
+
+ // VirSchema
+ OUT.write("UPDATE VirSchema SET readonly=0 WHERE readonly IS NULL;\n");
+
+ // ExternalResource
+ OUT.write("UPDATE ExternalResource SET overrideCapabilities=0 WHERE overrideCapabilities IS NULL;\n");
+
+ // OrgUnit
+ OUT.write("UPDATE OrgUnit SET ignoreCaseMatch=0;\n");
+
+ // OrgUnitItemTransformer
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT orgUnitItem_id,transformerClassName FROM OrgUnitItem_Transformer")) {
+
+ while (rs.next()) {
+ String itemId = rs.getString(1);
+ String transformerClassName = rs.getString(2);
+
+ String implementationId = "OrgUnitItemTransformer_" + transformerClassName + "_" + itemId;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ITEM_TRANSFORMER',"
+ + "'JAVA',"
+ + "'" + transformerClassName + "');\n");
+ OUT.write("INSERT INTO OrgUnitItemTransformer(item_id,implementation_id) VALUES("
+ + "'" + itemId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE OrgUnitItem_Transformer;\n");
+
+ // PlainSchema
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT validatorClass FROM PlainSchema WHERE validatorClass IS NOT NULL")) {
+
+ while (rs.next()) {
+ String validatorClass = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + validatorClass + "',"
+ + "'VALIDATOR',"
+ + "'JAVA',"
+ + "'" + validatorClass + "');\n");
+ }
+ }
+ OUT.write("UPDATE PlainSchema SET validator_id=validatorClass;\n");
+ OUT.write("ALTER TABLE PlainSchema DROP COLUMN validatorClass;\n");
+
+ // Provision
+ OUT.write("UPDATE Provision SET ignoreCaseMatch=0;\n");
+
+ // PullPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,specification FROM PullPolicy WHERE specification IS NOT NULL")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ ObjectNode specification = (ObjectNode) MAPPER.readTree(rs.getString(2));
+
+ if (specification.has("conflictResolutionAction")) {
+ OUT.write("UPDATE PullPolicy SET "
+ + "conflictResolutionAction='"
+ + specification.get("conflictResolutionAction").asText() + "' "
+ + "WHERE id='" + id + "';\n");
+ }
+ if (specification.has("correlationRules")) {
+ specification.get("correlationRules").fields().forEachRemaining(entry -> {
+ ObjectNode body = MAPPER.createObjectNode();
+ body.put("@class", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
+ body.put("name", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
+ body.set("schemas", entry.getValue());
+
+ try {
+ String implementationId = "PullCorrelationRule_" + entry.getKey() + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'PULL_CORRELATION_RULE',"
+ + "'JAVA',"
+ + "'" + MAPPER.writeValueAsString(body) + "');\n");
+
+ OUT.write("INSERT INTO PullCorrelationRuleEntity"
+ + "(id,pullPolicy_id,anyType_id,implementation_id) VALUES("
+ + "'" + UUID.randomUUID().toString() + "',"
+ + "'" + id + "',"
+ + "'" + entry.getKey() + "',"
+ + "'" + implementationId + "');\n");
+ } catch (IOException e) {
+ System.err.println("Unexpected error: " + e.getMessage());
+ System.exit(2);
+ }
+ });
+ }
+ }
+ OUT.write("ALTER TABLE PullPolicy DROP COLUMN specification;\n");
+ }
+
+ // AccountPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,accountPolicy_id,serializedInstance FROM AccountRuleConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String accountPolicyId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "AccountRule_" + accountPolicyId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ACCOUNT_RULE',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO AccountPolicyRule(policy_id,implementation_id) VALUES("
+ + "'" + accountPolicyId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE AccountRuleConfInstance;\n");
+
+ // PasswordPolicy
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,passwordPolicy_id,serializedInstance FROM PasswordRuleConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String passwordPolicyId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "PasswordRule_" + passwordPolicyId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ACCOUNT_RULE',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO PasswordPolicyRule(policy_id,implementation_id) VALUES("
+ + "'" + passwordPolicyId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PasswordRuleConfInstance;\n");
+
+ // Task
+ OUT.write("UPDATE Task SET remediation=0;\n");
+ OUT.write("UPDATE Task SET active=0 WHERE active IS NULL;\n");
+
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'PullJobDelegate',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate');\n");
+ OUT.write("UPDATE Task SET jobDelegate_id='PullJobDelegate' WHERE DTYPE='PullTask';\n");
+
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'PushJobDelegate',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate');\n");
+ OUT.write("UPDATE Task SET jobDelegate_id='PushJobDelegate' WHERE DTYPE='PushTask';\n");
+
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT jobDelegateClassName FROM Task WHERE jobDelegateClassName IS NOT NULL")) {
+
+ while (rs.next()) {
+ String jobDelegateClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + jobDelegateClassName + "',"
+ + "'TASKJOB_DELEGATE',"
+ + "'JAVA',"
+ + "'" + jobDelegateClassName + "');\n");
+ }
+ }
+ OUT.write("UPDATE Task SET jobDelegate_id=jobDelegateClassName;\n");
+ OUT.write("ALTER TABLE Task DROP COLUMN jobDelegateClassName;\n");
+
+ // PullActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM PullTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PULL_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT pullTask_id,actionClassName FROM PullTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String pullTaskId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO PullTaskAction(task_id,implementation_id) VALUES("
+ + "'" + pullTaskId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PullTask_actionsClassNames;\n");
+
+ // PushActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM PushTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PUSH_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT pushTask_id,actionClassName FROM PushTask_actionsClassNames")) {
+
+ while (rs.next()) {
+ String pushTaskId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO PushTaskAction(task_id,implementation_id) VALUES("
+ + "'" + pushTaskId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE PushTask_actionsClassNames;\n");
+
+ // PropagationActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM ExternalResource_PropActions")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'PROPAGATION_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT resource_id,actionClassName FROM ExternalResource_PropActions")) {
+
+ while (rs.next()) {
+ String resourceId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO ExternalResourcePropAction(resource_id,implementation_id) VALUES("
+ + "'" + resourceId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE ExternalResource_PropActions;\n");
+
+ // LogicActions
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT actionClassName FROM Realm_actionsClassNames")) {
+
+ while (rs.next()) {
+ String actionClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + actionClassName + "',"
+ + "'LOGIC_ACTIONS',"
+ + "'JAVA',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT realm_id,actionClassName FROM Realm_actionsClassNames")) {
+
+ while (rs.next()) {
+ String realmId = rs.getString(1);
+ String actionClassName = rs.getString(2);
+ OUT.write("INSERT INTO RealmAction(realm_id,implementation_id) VALUES("
+ + "'" + realmId + "',"
+ + "'" + actionClassName + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE Realm_actionsClassNames;\n");
+
+ // Reportlet
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT id,report_id,serializedInstance FROM ReportletConfInstance")) {
+
+ while (rs.next()) {
+ String id = rs.getString(1);
+ String reportId = rs.getString(2);
+ String serializedInstance = rs.getString(3);
+
+ String implementationId = "Reportlet_" + reportId + "_" + id;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'REPORTLET',"
+ + "'JAVA',"
+ + "'" + serializedInstance + "');\n");
+ OUT.write("INSERT INTO ReportReportlet(report_id,implementation_id) VALUES("
+ + "'" + reportId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE ReportletConfInstance;\n");
+
+ // MappingItemTransformer
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT mappingItem_id,transformerClassName FROM MappingItem_Transformer")) {
+
+ while (rs.next()) {
+ String itemId = rs.getString(1);
+ String transformerClassName = rs.getString(2);
+
+ String implementationId = "MappingItemTransformer_" + transformerClassName + "_" + itemId;
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + implementationId + "',"
+ + "'ITEM_TRANSFORMER',"
+ + "'JAVA',"
+ + "'" + transformerClassName + "');\n");
+ OUT.write("INSERT INTO MappingItemTransformer(item_id,implementation_id) VALUES("
+ + "'" + itemId + "',"
+ + "'" + implementationId + "');\n");
+ }
+ }
+ OUT.write("DROP TABLE MappingItem_Transformer;\n");
+
+ // Notification
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(
+ "SELECT DISTINCT recipientsProviderClassName "
+ + "FROM Notification WHERE recipientsProviderClassName IS NOT NULL")) {
+
+ while (rs.next()) {
+ String recipientsProviderClassName = rs.getString(1);
+ OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
+ + "'" + recipientsProviderClassName + "',"
+ + "'RECIPIENTS_PROVIDER',"
+ + "'JAVA',"
+ + "'" + recipientsProviderClassName + "');\n");
+ }
+ }
+ OUT.write("UPDATE Notification SET recipientsProvider_id=recipientsProviderClassName;\n");
+ OUT.write("ALTER TABLE Notification DROP COLUMN recipientsProviderClassName;\n");
+ }
+
+ private static void upgradeFlowableTo212(final Connection conn) throws IOException, SQLException {
+ try (Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT id,workflowId FROM SyncopeUser")) {
+
+ while (rs.next()) {
+ OUT.write("UPDATE ACT_RU_EXECUTION "
+ + "SET BUSINESS_KEY_='userWorkflow:" + rs.getString(1) + "' "
+ + "WHERE ID_='" + rs.getString(2) + "';\n");
+ }
+ }
+
+ OUT.write("DROP VIEW user_search;\n");
+ OUT.write("ALTER TABLE SyncopeUser DROP COLUMN workflowId;\n");
+ OUT.write("CREATE VIEW user_search AS SELECT u.id as any_id, u.* FROM SyncopeUser u;\n");
+ }
+
public static void main(final String[] args) throws Exception {
// parse args
- if (args.length < 5 || args.length > 6) {
+ if (args.length < 5 || args.length > 7) {
System.err.println("Unexpected arguments: " + Arrays.asList(args));
System.out.println("Usage: <driverClassName> <jdbcURL> <username> <password>"
- + "<h2|mariadb|mysql|oracle|postgres|sqlserver> [filename]");
+ + "<h2|mariadb|mysql|oracle|postgres|sqlserver> [-flowable-2.1.2] [filename]");
System.exit(1);
}
@@ -59,8 +433,12 @@ public final class GenerateUpgradeSQL {
String username = args[2];
String password = args[3];
String dbDictionary = args[4];
- if (args.length == 6) {
- setWriter(new FileWriter(args[5]));
+ boolean flowableTo212 = false;
+ if (args.length >= 6) {
+ flowableTo212 = "-flowable-2.1.2".equals(args[5]);
+ if (!flowableTo212) {
+ setWriter(new FileWriter(args[args.length - 1]));
+ }
}
// setup DataSource
@@ -70,383 +448,35 @@ public final class GenerateUpgradeSQL {
dataSource.setConnectionUserName(username);
dataSource.setConnectionPassword(password);
- // setup OpenJPA
- JDBCConfiguration jdbcConf = new JDBCConfigurationImpl();
- jdbcConf.setConnection2DriverName(driverClassName);
- jdbcConf.setConnection2UserName(username);
- jdbcConf.setConnection2Password(password);
- jdbcConf.setDBDictionary(dbDictionary);
- jdbcConf.setConnectionFactory2(dataSource);
-
- FileSchemaFactory schemaFactory = new FileSchemaFactory();
- schemaFactory.setConfiguration(jdbcConf);
- schemaFactory.setFile("schema.xml");
- jdbcConf.setSchemaFactory(schemaFactory);
-
- WiserSchemaTool schemaTool = new WiserSchemaTool(jdbcConf, SchemaTool.ACTION_ADD);
- schemaTool.setSchemaGroup(schemaFactory.readSchema());
- schemaTool.setWriter(OUT);
try {
- // run OpenJPA's SchemaTool to get the update statements
- schemaTool.run();
+ // setup OpenJPA
+ JDBCConfiguration jdbcConf = new JDBCConfigurationImpl();
+ jdbcConf.setConnection2DriverName(driverClassName);
+ jdbcConf.setConnection2UserName(username);
+ jdbcConf.setConnection2Password(password);
+ jdbcConf.setDBDictionary(dbDictionary);
+ jdbcConf.setConnectionFactory2(dataSource);
+
+ FileSchemaFactory schemaFactory = new FileSchemaFactory();
+ schemaFactory.setConfiguration(jdbcConf);
+ schemaFactory.setFile("schema.xml");
+ jdbcConf.setSchemaFactory(schemaFactory);
+
+ WiserSchemaTool schemaTool = new WiserSchemaTool(jdbcConf, SchemaTool.ACTION_ADD);
+ schemaTool.setSchemaGroup(schemaFactory.readSchema());
+ schemaTool.setWriter(OUT);
// now proceed with manual update statements...
Connection conn = jdbcConf.getDataSource2(null).getConnection();
- // User
- OUT.write("UPDATE SyncopeUser SET mustChangePassword=0 WHERE mustChangePassword IS NULL;\n");
-
- // VirSchema
- OUT.write("UPDATE VirSchema SET readonly=0 WHERE readonly IS NULL;\n");
-
- // ExternalResource
- OUT.write("UPDATE ExternalResource SET overrideCapabilities=0 WHERE overrideCapabilities IS NULL;\n");
-
- // OrgUnit
- OUT.write("UPDATE OrgUnit SET ignoreCaseMatch=0;\n");
+ if (flowableTo212) {
+ upgradeFlowableTo212(conn);
+ } else {
+ // run OpenJPA's SchemaTool to get the update statements
+ schemaTool.run();
- // OrgUnitItemTransformer
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT orgUnitItem_id,transformerClassName FROM OrgUnitItem_Transformer")) {
-
- while (rs.next()) {
- String itemId = rs.getString(1);
- String transformerClassName = rs.getString(2);
-
- String implementationId = "OrgUnitItemTransformer_" + transformerClassName + "_" + itemId;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ITEM_TRANSFORMER',"
- + "'JAVA',"
- + "'" + transformerClassName + "');\n");
- OUT.write("INSERT INTO OrgUnitItemTransformer(item_id,implementation_id) VALUES("
- + "'" + itemId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE OrgUnitItem_Transformer;\n");
-
- // PlainSchema
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT validatorClass FROM PlainSchema WHERE validatorClass IS NOT NULL")) {
-
- while (rs.next()) {
- String validatorClass = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + validatorClass + "',"
- + "'VALIDATOR',"
- + "'JAVA',"
- + "'" + validatorClass + "');\n");
- }
- }
- OUT.write("UPDATE PlainSchema SET validator_id=validatorClass;\n");
- OUT.write("ALTER TABLE PlainSchema DROP COLUMN validatorClass;\n");
-
- // Provision
- OUT.write("UPDATE Provision SET ignoreCaseMatch=0;\n");
-
- // PullPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,specification FROM PullPolicy WHERE specification IS NOT NULL")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- ObjectNode specification = (ObjectNode) MAPPER.readTree(rs.getString(2));
-
- if (specification.has("conflictResolutionAction")) {
- OUT.write("UPDATE PullPolicy SET "
- + "conflictResolutionAction='"
- + specification.get("conflictResolutionAction").asText() + "' "
- + "WHERE id='" + id + "';\n");
- }
- if (specification.has("correlationRules")) {
- specification.get("correlationRules").fields().forEachRemaining(entry -> {
- ObjectNode body = MAPPER.createObjectNode();
- body.put("@class", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
- body.put("name", "org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf");
- body.set("schemas", entry.getValue());
-
- try {
- String implementationId = "PullCorrelationRule_" + entry.getKey() + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'PULL_CORRELATION_RULE',"
- + "'JAVA',"
- + "'" + MAPPER.writeValueAsString(body) + "');\n");
-
- OUT.write("INSERT INTO PullCorrelationRuleEntity"
- + "(id,pullPolicy_id,anyType_id,implementation_id) VALUES("
- + "'" + UUID.randomUUID().toString() + "',"
- + "'" + id + "',"
- + "'" + entry.getKey() + "',"
- + "'" + implementationId + "');\n");
- } catch (IOException e) {
- System.err.println("Unexpected error: " + e.getMessage());
- System.exit(2);
- }
- });
- }
- }
- OUT.write("ALTER TABLE PullPolicy DROP COLUMN specification;\n");
- }
-
- // AccountPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,accountPolicy_id,serializedInstance FROM AccountRuleConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String accountPolicyId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "AccountRule_" + accountPolicyId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ACCOUNT_RULE',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO AccountPolicyRule(policy_id,implementation_id) VALUES("
- + "'" + accountPolicyId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE AccountRuleConfInstance;\n");
-
- // PasswordPolicy
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,passwordPolicy_id,serializedInstance FROM PasswordRuleConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String passwordPolicyId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "PasswordRule_" + passwordPolicyId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ACCOUNT_RULE',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO PasswordPolicyRule(policy_id,implementation_id) VALUES("
- + "'" + passwordPolicyId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE PasswordRuleConfInstance;\n");
-
- // Task
- OUT.write("UPDATE Task SET remediation=0;\n");
- OUT.write("UPDATE Task SET active=0 WHERE active IS NULL;\n");
-
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'PullJobDelegate',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate');\n");
- OUT.write("UPDATE Task SET jobDelegate_id='PullJobDelegate' WHERE DTYPE='PullTask';\n");
-
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'PushJobDelegate',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate');\n");
- OUT.write("UPDATE Task SET jobDelegate_id='PushJobDelegate' WHERE DTYPE='PushTask';\n");
-
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT jobDelegateClassName FROM Task WHERE jobDelegateClassName IS NOT NULL")) {
-
- while (rs.next()) {
- String jobDelegateClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + jobDelegateClassName + "',"
- + "'TASKJOB_DELEGATE',"
- + "'JAVA',"
- + "'" + jobDelegateClassName + "');\n");
- }
- }
- OUT.write("UPDATE Task SET jobDelegate_id=jobDelegateClassName;\n");
- OUT.write("ALTER TABLE Task DROP COLUMN jobDelegateClassName;\n");
-
- // PullActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM PullTask_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PULL_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT pullTask_id,actionClassName FROM PullTask_actionsClassNames")) {
-
- while (rs.next()) {
- String pullTaskId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO PullTaskAction(task_id,implementation_id) VALUES("
- + "'" + pullTaskId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE PullTask_actionsClassNames;\n");
-
- // PushActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM PushTask_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PUSH_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT pushTask_id,actionClassName FROM PushTask_actionsClassNames")) {
-
- while (rs.next()) {
- String pushTaskId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO PushTaskAction(task_id,implementation_id) VALUES("
- + "'" + pushTaskId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE PushTask_actionsClassNames;\n");
-
- // PropagationActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM ExternalResource_PropActions")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'PROPAGATION_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT resource_id,actionClassName FROM ExternalResource_PropActions")) {
-
- while (rs.next()) {
- String resourceId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO ExternalResourcePropAction(resource_id,implementation_id) VALUES("
- + "'" + resourceId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE ExternalResource_PropActions;\n");
-
- // LogicActions
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT actionClassName FROM Realm_actionsClassNames")) {
-
- while (rs.next()) {
- String actionClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + actionClassName + "',"
- + "'LOGIC_ACTIONS',"
- + "'JAVA',"
- + "'" + actionClassName + "');\n");
- }
- }
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT realm_id,actionClassName FROM Realm_actionsClassNames")) {
-
- while (rs.next()) {
- String realmId = rs.getString(1);
- String actionClassName = rs.getString(2);
- OUT.write("INSERT INTO RealmAction(realm_id,implementation_id) VALUES("
- + "'" + realmId + "',"
- + "'" + actionClassName + "');\n");
- }
- }
- OUT.write("DROP TABLE Realm_actionsClassNames;\n");
-
- // Reportlet
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT id,report_id,serializedInstance FROM ReportletConfInstance")) {
-
- while (rs.next()) {
- String id = rs.getString(1);
- String reportId = rs.getString(2);
- String serializedInstance = rs.getString(3);
-
- String implementationId = "Reportlet_" + reportId + "_" + id;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'REPORTLET',"
- + "'JAVA',"
- + "'" + serializedInstance + "');\n");
- OUT.write("INSERT INTO ReportReportlet(report_id,implementation_id) VALUES("
- + "'" + reportId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE ReportletConfInstance;\n");
-
- // MappingItemTransformer
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT mappingItem_id,transformerClassName FROM MappingItem_Transformer")) {
-
- while (rs.next()) {
- String itemId = rs.getString(1);
- String transformerClassName = rs.getString(2);
-
- String implementationId = "MappingItemTransformer_" + transformerClassName + "_" + itemId;
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + implementationId + "',"
- + "'ITEM_TRANSFORMER',"
- + "'JAVA',"
- + "'" + transformerClassName + "');\n");
- OUT.write("INSERT INTO MappingItemTransformer(item_id,implementation_id) VALUES("
- + "'" + itemId + "',"
- + "'" + implementationId + "');\n");
- }
- }
- OUT.write("DROP TABLE MappingItem_Transformer;\n");
-
- // Notification
- try (Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(
- "SELECT DISTINCT recipientsProviderClassName "
- + "FROM Notification WHERE recipientsProviderClassName IS NOT NULL")) {
-
- while (rs.next()) {
- String recipientsProviderClassName = rs.getString(1);
- OUT.write("INSERT INTO Implementation(id,type,engine,body) VALUES("
- + "'" + recipientsProviderClassName + "',"
- + "'RECIPIENTS_PROVIDER',"
- + "'JAVA',"
- + "'" + recipientsProviderClassName + "');\n");
- }
+ upgrade(conn);
}
- OUT.write("UPDATE Notification SET recipientsProvider_id=recipientsProviderClassName;\n");
- OUT.write("ALTER TABLE Notification DROP COLUMN recipientsProviderClassName;\n");
} finally {
OUT.flush();
OUT.close();
http://git-wip-us.apache.org/repos/asf/syncope/blob/41816c85/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java b/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
index 42de069..148797b 100644
--- a/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
+++ b/core/upgrade/src/test/java/org/apache/syncope/core/upgrade/GeneratedUpgradeSQLTest.java
@@ -117,4 +117,32 @@ public class GeneratedUpgradeSQLTest {
assertNotNull(pushCorrelationRuleEntities);
assertEquals(0, pushCorrelationRuleEntities.intValue());
}
+
+ @Test
+ public void upgradeFlowableTo212() throws Exception {
+ StringWriter out = new StringWriter();
+ GenerateUpgradeSQL.setWriter(out);
+
+ String[] args = new String[] { driverClassName, jdbcURL, username, password, "h2", "-flowable-2.1.2" };
+ GenerateUpgradeSQL.main(args);
+
+ String upgradeSQL = out.toString();
+
+ try {
+ DataSourceInitializer adminUsersInit = new DataSourceInitializer();
+ adminUsersInit.setDataSource(syncope20DataSource);
+ adminUsersInit.setDatabasePopulator(
+ new ResourceDatabasePopulator(new ByteArrayResource(upgradeSQL.getBytes(StandardCharsets.UTF_8))));
+ adminUsersInit.afterPropertiesSet();
+ } catch (Exception e) {
+ fail("Unexpected error while upgrading Flowable to 2.1.2", e);
+ }
+
+ JdbcTemplate jdbcTemplate = new JdbcTemplate(syncope20DataSource);
+
+ Integer processInstances = jdbcTemplate.queryForObject(
+ "SELECT COUNT(*) FROM ACT_RU_EXECUTION WHERE BUSINESS_KEY_ IS NOT NULL", Integer.class);
+ assertNotNull(processInstances);
+ assertEquals(5, processInstances.intValue());
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/41816c85/core/upgrade/src/test/resources/syncopedb20.sql
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/resources/syncopedb20.sql b/core/upgrade/src/test/resources/syncopedb20.sql
index 59a2df0..4575cf2 100644
--- a/core/upgrade/src/test/resources/syncopedb20.sql
+++ b/core/upgrade/src/test/resources/syncopedb20.sql
@@ -1614,6 +1614,7 @@ CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER(
LASTCHANGEDATE TIMESTAMP,
LASTMODIFIER VARCHAR(255),
STATUS VARCHAR(255),
+ WORKFLOWID VARCHAR(255),
CHANGEPWDDATE TIMESTAMP,
CIPHERALGORITHM VARCHAR(20),
FAILEDLOGINS INTEGER,
@@ -1630,12 +1631,12 @@ CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER(
);
ALTER TABLE PUBLIC.SYNCOPEUSER ADD CONSTRAINT PUBLIC.CONSTRAINT_6FFB PRIMARY KEY(ID);
-- 5 +/- SELECT COUNT(*) FROM PUBLIC.SYNCOPEUSER;
-INSERT INTO PUBLIC.SYNCOPEUSER(ID, CREATIONDATE, CREATOR, LASTCHANGEDATE, LASTMODIFIER, STATUS, CHANGEPWDDATE, CIPHERALGORITHM, FAILEDLOGINS, LASTLOGINDATE, MUSTCHANGEPASSWORD, PASSWORD, SECURITYANSWER, SUSPENDED, TOKEN, TOKENEXPIRETIME, USERNAME, REALM_ID, SECURITYQUESTION_ID) VALUES
-('1417acbe-cbf6-4277-9372-e75e04f97000', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'rossini', 'c5b75db1-fce7-470f-b780-3b9934d82a9d', NULL),
-('74cd8ece-715a-44a4-a736-e17b46c4e7e6', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'verdi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'vivaldi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('c9b2dec2-00a7-4855-97c0-d854842b4b24', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'bellini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
-('823074dc-d280-436d-a7dd-07399fae48ec', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', NULL, 'SHA1', NULL, NULL, NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'puccini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL);
+INSERT INTO PUBLIC.SYNCOPEUSER(ID, CREATIONDATE, CREATOR, LASTCHANGEDATE, LASTMODIFIER, STATUS, WORKFLOWID, CHANGEPWDDATE, CIPHERALGORITHM, FAILEDLOGINS, LASTLOGINDATE, MUSTCHANGEPASSWORD, PASSWORD, SECURITYANSWER, SUSPENDED, TOKEN, TOKENEXPIRETIME, USERNAME, REALM_ID, SECURITYQUESTION_ID) VALUES
+('1417acbe-cbf6-4277-9372-e75e04f97000', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '4', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'rossini', 'c5b75db1-fce7-470f-b780-3b9934d82a9d', NULL),
+('74cd8ece-715a-44a4-a736-e17b46c4e7e6', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '6', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'verdi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '8', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'vivaldi', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('c9b2dec2-00a7-4855-97c0-d854842b4b24', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '10', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'bellini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL),
+('823074dc-d280-436d-a7dd-07399fae48ec', TIMESTAMP '2010-10-20 11:00:00', 'admin', TIMESTAMP '2010-10-20 11:00:00', 'admin', 'active', '12', NULL, 'SHA1', NULL, NULL, NULL, '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', NULL, 0, NULL, NULL, 'puccini', 'e4c28e7a-9dbf-4ee7-9441-93812a0d4a28', NULL);
CREATE MEMORY TABLE PUBLIC.SYNCOPEUSER_ANYTYPECLASS(
USER_ID VARCHAR(36),
ANYTYPECLASS_ID VARCHAR(255)
http://git-wip-us.apache.org/repos/asf/syncope/blob/41816c85/core/upgrade/src/test/resources/testJDBCEnv.xml
----------------------------------------------------------------------
diff --git a/core/upgrade/src/test/resources/testJDBCEnv.xml b/core/upgrade/src/test/resources/testJDBCEnv.xml
index daa2597..173ffd4 100644
--- a/core/upgrade/src/test/resources/testJDBCEnv.xml
+++ b/core/upgrade/src/test/resources/testJDBCEnv.xml
@@ -46,8 +46,8 @@ under the License.
<property name="dataSource" ref="syncope20DataSource"/>
<property name="databasePopulator">
<bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
- <property name="continueOnError" value="true"/>
- <property name="ignoreFailedDrops" value="true"/>
+ <property name="continueOnError" value="false"/>
+ <property name="ignoreFailedDrops" value="false"/>
<property name="sqlScriptEncoding" value="UTF-8"/>
<property name="scripts">
<array>