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>