Quellcode durchsuchen

#538 add upgrade from 10.1

Shinsuke Sugaya vor 9 Jahren
Ursprung
Commit
9c37fd9925

+ 241 - 224
src/main/java/org/codelibs/fess/app/web/admin/upgrade/AdminUpgradeAction.java

@@ -64,6 +64,10 @@ public class AdminUpgradeAction extends FessAdminAction {
     //
     private static final Logger logger = LoggerFactory.getLogger(AdminUpgradeAction.class);
 
+    private static final String VERSION_10_1 = "10.1";
+
+    private static final String VERSION_10_0 = "10.0";
+
     // ===================================================================================
     //                                                                           Attribute
     //
@@ -136,14 +140,39 @@ public class AdminUpgradeAction extends FessAdminAction {
         });
         verifyToken(() -> asIndexHtml());
 
-        if ("10.0".equals(form.targetVersion)) {
-            upgradeFrom10_0();
+        if (VERSION_10_1.equals(form.targetVersion)) {
+            try {
+                upgradeFrom10_1();
+
+                saveInfo(messages -> messages.addSuccessUpgradeFrom(GLOBAL));
+
+                fessEsClient.refresh();
+            } catch (final Exception e) {
+                logger.warn("Failed to upgrade data.", e);
+                saveError(messages -> messages.addErrorsFailedToUpgradeFrom(GLOBAL, VERSION_10_1, e.getLocalizedMessage()));
+            }
+        } else if (VERSION_10_0.equals(form.targetVersion)) {
+            try {
+                upgradeFrom10_0();
+                upgradeFrom10_1();
+
+                saveInfo(messages -> messages.addSuccessUpgradeFrom(GLOBAL));
+
+                fessEsClient.refresh();
+            } catch (final Exception e) {
+                logger.warn("Failed to upgrade data.", e);
+                saveError(messages -> messages.addErrorsFailedToUpgradeFrom(GLOBAL, VERSION_10_0, e.getLocalizedMessage()));
+            }
         } else {
             saveError(messages -> messages.addErrorsUnknownVersionForUpgrade(GLOBAL));
         }
         return redirect(getClass());
     }
 
+    private void upgradeFrom10_1() {
+        // TODO close index, update analyzers, open index
+    }
+
     private void upgradeFrom10_0() {
 
         final IndicesAdminClient indicesClient = fessEsClient.admin().indices();
@@ -153,232 +182,220 @@ public class AdminUpgradeAction extends FessAdminAction {
         final String docIndex = fessConfig.getIndexDocumentUpdateIndex();
         final String docType = fessConfig.getIndexDocumentType();
 
-        try {
-            // file
-            uploadResource(indexConfigPath, docIndex, "ko/seunjeon.txt");
-
-            // alias
-            createAlias(indicesClient, indexConfigPath, configIndex, ".fess_basic_config");
-
-            // update mapping
-            addFieldMapping(indicesClient, configIndex, "label_type", "permissions",
-                    "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, configIndex, "web_config", "permissions",
-                    "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, configIndex, "file_config", "permissions",
-                    "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, configIndex, "data_config", "permissions",
-                    "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "group", "gidNumber", "{\"properties\":{\"gidNumber\":{\"type\":\"long\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "employeeNumber",
-                    "{\"properties\":{\"employeeNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "mail",
-                    "{\"properties\":{\"mail\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "telephoneNumber",
-                    "{\"properties\":{\"telephoneNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "homePhone",
-                    "{\"properties\":{\"homePhone\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "homePostalAddress",
-                    "{\"properties\":{\"homePostalAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "labeledURI",
-                    "{\"properties\":{\"labeledURI\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "roomNumber",
-                    "{\"properties\":{\"roomNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "description",
-                    "{\"properties\":{\"description\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "title",
-                    "{\"properties\":{\"title\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "pager",
-                    "{\"properties\":{\"pager\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "street",
-                    "{\"properties\":{\"street\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "postalCode",
-                    "{\"properties\":{\"postalCode\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "physicalDeliveryOfficeName",
-                    "{\"properties\":{\"physicalDeliveryOfficeName\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "destinationIndicator",
-                    "{\"properties\":{\"destinationIndicator\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "internationaliSDNNumber",
-                    "{\"properties\":{\"internationaliSDNNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "state",
-                    "{\"properties\":{\"state\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "employeeType",
-                    "{\"properties\":{\"employeeType\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "facsimileTelephoneNumber",
-                    "{\"properties\":{\"facsimileTelephoneNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "postOfficeBox",
-                    "{\"properties\":{\"postOfficeBox\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "initials",
-                    "{\"properties\":{\"initials\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "carLicense",
-                    "{\"properties\":{\"carLicense\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "mobile",
-                    "{\"properties\":{\"mobile\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "postalAddress",
-                    "{\"properties\":{\"postalAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "city",
-                    "{\"properties\":{\"city\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "teletexTerminalIdentifier",
-                    "{\"properties\":{\"teletexTerminalIdentifier\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "x121Address",
-                    "{\"properties\":{\"x121Address\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "businessCategory",
-                    "{\"properties\":{\"businessCategory\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "registeredAddress",
-                    "{\"properties\":{\"registeredAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "displayName",
-                    "{\"properties\":{\"displayName\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "preferredLanguage",
-                    "{\"properties\":{\"preferredLanguage\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "departmentNumber",
-                    "{\"properties\":{\"departmentNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "uidNumber", "{\"properties\":{\"uidNumber\":{\"type\":\"long\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "gidNumber", "{\"properties\":{\"gidNumber\":{\"type\":\"long\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "homeDirectory",
-                    "{\"properties\":{\"homeDirectory\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, userIndex, "user", "groups",
-                    "{\"properties\":{\"groups\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
-            addFieldMapping(indicesClient, docIndex, docType, "location", "{\"properties\":{\"location\":{\"type\":\"geo_point\"}}}");
-
-            // data migration
-            final Map<String, List<String>> mapping = new HashMap<>();
-            labelToRoleBhv.selectList(cb -> cb.query().addOrderBy_LabelTypeId_Asc()).forEach(e -> {
-                List<String> list = mapping.get(e.getLabelTypeId());
-                if (list == null) {
-                    list = new ArrayList<>();
-                    mapping.put(e.getLabelTypeId(), list);
-                }
-                list.add(e.getRoleTypeId());
-            });
-            mapping.entrySet().forEach(
-                    e -> {
-                        final String labelTypeId = e.getKey();
-                        final List<String> idList = e.getValue();
-                        labelTypeBhv.selectEntity(cb -> cb.acceptPK(labelTypeId)).ifPresent(
-                                entity -> {
-                                    final String[] permissions =
-                                            roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
-                                                    .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue())
-                                                    .toArray(n -> new String[n]);
-                                    entity.setPermissions(permissions);
-                                    labelTypeBhv.insertOrUpdate(entity);
-                                    labelToRoleBhv.queryDelete(cb -> cb.query().setLabelTypeId_Equal(labelTypeId));
-                                });
-                    });
-
-            mapping.clear();
-            webConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_WebConfigId_Asc()).forEach(e -> {
-                final String webConfigId = e.getWebConfigId();
-                List<String> list = mapping.get(webConfigId);
-                if (list == null) {
-                    list = new ArrayList<>();
-                    mapping.put(webConfigId, list);
-                }
-                list.add(e.getRoleTypeId());
-            });
-            mapping.entrySet().forEach(
-                    e -> {
-                        final String webConfigTypeId = e.getKey();
-                        final List<String> idList = e.getValue();
-                        webConfigBhv.selectEntity(cb -> cb.acceptPK(webConfigTypeId)).ifPresent(
-                                entity -> {
-                                    final String[] permissions =
-                                            roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
-                                                    .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue())
-                                                    .toArray(n -> new String[n]);
-                                    entity.setPermissions(permissions);
-                                    webConfigBhv.insertOrUpdate(entity);
-                                    webConfigToRoleBhv.queryDelete(cb -> cb.query().setWebConfigId_Equal(webConfigTypeId));
-                                });
-                    });
-
-            mapping.clear();
-            fileConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_FileConfigId_Asc()).forEach(e -> {
-                final String fileConfigId = e.getFileConfigId();
-                List<String> list = mapping.get(fileConfigId);
-                if (list == null) {
-                    list = new ArrayList<>();
-                    mapping.put(fileConfigId, list);
-                }
-                list.add(e.getRoleTypeId());
-            });
-            mapping.entrySet().forEach(
-                    e -> {
-                        final String fileConfigTypeId = e.getKey();
-                        final List<String> idList = e.getValue();
-                        fileConfigBhv.selectEntity(cb -> cb.acceptPK(fileConfigTypeId)).ifPresent(
-                                entity -> {
-                                    final String[] permissions =
-                                            roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
-                                                    .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue())
-                                                    .toArray(n -> new String[n]);
-                                    entity.setPermissions(permissions);
-                                    fileConfigBhv.insertOrUpdate(entity);
-                                    fileConfigToRoleBhv.queryDelete(cb -> cb.query().setFileConfigId_Equal(fileConfigTypeId));
-                                });
-                    });
-
-            mapping.clear();
-            dataConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_DataConfigId_Asc()).forEach(e -> {
-                final String dataConfigId = e.getDataConfigId();
-                List<String> list = mapping.get(dataConfigId);
-                if (list == null) {
-                    list = new ArrayList<>();
-                    mapping.put(dataConfigId, list);
-                }
-                list.add(e.getRoleTypeId());
-            });
-            mapping.entrySet().forEach(
-                    e -> {
-                        final String dataConfigTypeId = e.getKey();
-                        final List<String> idList = e.getValue();
-                        dataConfigBhv.selectEntity(cb -> cb.acceptPK(dataConfigTypeId)).ifPresent(
-                                entity -> {
-                                    final String[] permissions =
-                                            roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
-                                                    .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue())
-                                                    .toArray(n -> new String[n]);
-                                    entity.setPermissions(permissions);
-                                    dataConfigBhv.insertOrUpdate(entity);
-                                    dataConfigToRoleBhv.queryDelete(cb -> cb.query().setDataConfigId_Equal(dataConfigTypeId));
-                                });
-                    });
-
-            roleTypeBhv.queryDelete(cb -> {});
-
-            roleBhv.selectEntity(cb -> cb.query().setName_Equal("guest")).orElseGet(() -> {
-                Role entity = new Role();
-                entity.setName("guest");
-                roleBhv.insert(entity);
-                return entity;
-            });
-
-            final List<ElevateWord> elevateWordList =
-                    elevateWordBhv
-                            .selectList(cb -> cb.query().addOrderBy_CreatedBy_Asc())
-                            .stream()
-                            .filter(e -> StringUtil.isNotBlank(e.getTargetRole()))
-                            .map(e -> {
+        // file
+        uploadResource(indexConfigPath, docIndex, "ko/seunjeon.txt");
+
+        // alias
+        createAlias(indicesClient, indexConfigPath, configIndex, ".fess_basic_config");
+
+        // update mapping
+        addFieldMapping(indicesClient, configIndex, "label_type", "permissions",
+                "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, configIndex, "web_config", "permissions",
+                "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, configIndex, "file_config", "permissions",
+                "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, configIndex, "data_config", "permissions",
+                "{\"properties\":{\"permissions\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "group", "gidNumber", "{\"properties\":{\"gidNumber\":{\"type\":\"long\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "employeeNumber",
+                "{\"properties\":{\"employeeNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "mail",
+                "{\"properties\":{\"mail\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "telephoneNumber",
+                "{\"properties\":{\"telephoneNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "homePhone",
+                "{\"properties\":{\"homePhone\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "homePostalAddress",
+                "{\"properties\":{\"homePostalAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "labeledURI",
+                "{\"properties\":{\"labeledURI\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "roomNumber",
+                "{\"properties\":{\"roomNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "description",
+                "{\"properties\":{\"description\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "title",
+                "{\"properties\":{\"title\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "pager",
+                "{\"properties\":{\"pager\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "street",
+                "{\"properties\":{\"street\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "postalCode",
+                "{\"properties\":{\"postalCode\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "physicalDeliveryOfficeName",
+                "{\"properties\":{\"physicalDeliveryOfficeName\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "destinationIndicator",
+                "{\"properties\":{\"destinationIndicator\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "internationaliSDNNumber",
+                "{\"properties\":{\"internationaliSDNNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "state",
+                "{\"properties\":{\"state\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "employeeType",
+                "{\"properties\":{\"employeeType\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "facsimileTelephoneNumber",
+                "{\"properties\":{\"facsimileTelephoneNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "postOfficeBox",
+                "{\"properties\":{\"postOfficeBox\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "initials",
+                "{\"properties\":{\"initials\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "carLicense",
+                "{\"properties\":{\"carLicense\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "mobile",
+                "{\"properties\":{\"mobile\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "postalAddress",
+                "{\"properties\":{\"postalAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "city",
+                "{\"properties\":{\"city\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "teletexTerminalIdentifier",
+                "{\"properties\":{\"teletexTerminalIdentifier\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "x121Address",
+                "{\"properties\":{\"x121Address\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "businessCategory",
+                "{\"properties\":{\"businessCategory\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "registeredAddress",
+                "{\"properties\":{\"registeredAddress\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "displayName",
+                "{\"properties\":{\"displayName\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "preferredLanguage",
+                "{\"properties\":{\"preferredLanguage\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "departmentNumber",
+                "{\"properties\":{\"departmentNumber\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "uidNumber", "{\"properties\":{\"uidNumber\":{\"type\":\"long\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "gidNumber", "{\"properties\":{\"gidNumber\":{\"type\":\"long\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "homeDirectory",
+                "{\"properties\":{\"homeDirectory\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, userIndex, "user", "groups",
+                "{\"properties\":{\"groups\":{\"type\":\"string\",\"index\":\"not_analyzed\"}}}");
+        addFieldMapping(indicesClient, docIndex, docType, "location", "{\"properties\":{\"location\":{\"type\":\"geo_point\"}}}");
+
+        // data migration
+        final Map<String, List<String>> mapping = new HashMap<>();
+        labelToRoleBhv.selectList(cb -> cb.query().addOrderBy_LabelTypeId_Asc()).forEach(e -> {
+            List<String> list = mapping.get(e.getLabelTypeId());
+            if (list == null) {
+                list = new ArrayList<>();
+                mapping.put(e.getLabelTypeId(), list);
+            }
+            list.add(e.getRoleTypeId());
+        });
+        mapping.entrySet().forEach(
+                e -> {
+                    final String labelTypeId = e.getKey();
+                    final List<String> idList = e.getValue();
+                    labelTypeBhv.selectEntity(cb -> cb.acceptPK(labelTypeId)).ifPresent(
+                            entity -> {
                                 final String[] permissions =
-                                        StreamUtil
-                                                .stream(e.getTargetRole().split(","))
-                                                .get(stream -> stream.filter(StringUtil::isNotBlank).map(
-                                                        s -> fessConfig.getRoleSearchRolePrefix() + s)).toArray(n -> new String[n]);
-                                e.setPermissions(permissions);
-                                e.setTargetRole(null);
-                                return e;
-                            }).collect(Collectors.toList());
-            if (!elevateWordList.isEmpty()) {
-                elevateWordBhv.batchUpdate(elevateWordList);
+                                        roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
+                                                .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue()).toArray(n -> new String[n]);
+                                entity.setPermissions(permissions);
+                                labelTypeBhv.insertOrUpdate(entity);
+                                labelToRoleBhv.queryDelete(cb -> cb.query().setLabelTypeId_Equal(labelTypeId));
+                            });
+                });
+
+        mapping.clear();
+        webConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_WebConfigId_Asc()).forEach(e -> {
+            final String webConfigId = e.getWebConfigId();
+            List<String> list = mapping.get(webConfigId);
+            if (list == null) {
+                list = new ArrayList<>();
+                mapping.put(webConfigId, list);
             }
+            list.add(e.getRoleTypeId());
+        });
+        mapping.entrySet().forEach(
+                e -> {
+                    final String webConfigTypeId = e.getKey();
+                    final List<String> idList = e.getValue();
+                    webConfigBhv.selectEntity(cb -> cb.acceptPK(webConfigTypeId)).ifPresent(
+                            entity -> {
+                                final String[] permissions =
+                                        roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
+                                                .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue()).toArray(n -> new String[n]);
+                                entity.setPermissions(permissions);
+                                webConfigBhv.insertOrUpdate(entity);
+                                webConfigToRoleBhv.queryDelete(cb -> cb.query().setWebConfigId_Equal(webConfigTypeId));
+                            });
+                });
+
+        mapping.clear();
+        fileConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_FileConfigId_Asc()).forEach(e -> {
+            final String fileConfigId = e.getFileConfigId();
+            List<String> list = mapping.get(fileConfigId);
+            if (list == null) {
+                list = new ArrayList<>();
+                mapping.put(fileConfigId, list);
+            }
+            list.add(e.getRoleTypeId());
+        });
+        mapping.entrySet().forEach(
+                e -> {
+                    final String fileConfigTypeId = e.getKey();
+                    final List<String> idList = e.getValue();
+                    fileConfigBhv.selectEntity(cb -> cb.acceptPK(fileConfigTypeId)).ifPresent(
+                            entity -> {
+                                final String[] permissions =
+                                        roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
+                                                .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue()).toArray(n -> new String[n]);
+                                entity.setPermissions(permissions);
+                                fileConfigBhv.insertOrUpdate(entity);
+                                fileConfigToRoleBhv.queryDelete(cb -> cb.query().setFileConfigId_Equal(fileConfigTypeId));
+                            });
+                });
+
+        mapping.clear();
+        dataConfigToRoleBhv.selectList(cb -> cb.query().addOrderBy_DataConfigId_Asc()).forEach(e -> {
+            final String dataConfigId = e.getDataConfigId();
+            List<String> list = mapping.get(dataConfigId);
+            if (list == null) {
+                list = new ArrayList<>();
+                mapping.put(dataConfigId, list);
+            }
+            list.add(e.getRoleTypeId());
+        });
+        mapping.entrySet().forEach(
+                e -> {
+                    final String dataConfigTypeId = e.getKey();
+                    final List<String> idList = e.getValue();
+                    dataConfigBhv.selectEntity(cb -> cb.acceptPK(dataConfigTypeId)).ifPresent(
+                            entity -> {
+                                final String[] permissions =
+                                        roleTypeBhv.selectList(cb -> cb.query().setId_InScope(idList)).stream()
+                                                .map(r -> fessConfig.getRoleSearchRolePrefix() + r.getValue()).toArray(n -> new String[n]);
+                                entity.setPermissions(permissions);
+                                dataConfigBhv.insertOrUpdate(entity);
+                                dataConfigToRoleBhv.queryDelete(cb -> cb.query().setDataConfigId_Equal(dataConfigTypeId));
+                            });
+                });
+
+        roleTypeBhv.queryDelete(cb -> {});
+
+        roleBhv.selectEntity(cb -> cb.query().setName_Equal("guest")).orElseGet(() -> {
+            Role entity = new Role();
+            entity.setName("guest");
+            roleBhv.insert(entity);
+            return entity;
+        });
 
-            saveInfo(messages -> messages.addSuccessUpgradeFrom(GLOBAL));
-
-            fessEsClient.refresh();
-        } catch (final Exception e) {
-            logger.warn("Failed to upgrade data.", e);
-            saveError(messages -> messages.addErrorsFailedToUpgradeFrom(GLOBAL, "10.0", e.getLocalizedMessage()));
+        final List<ElevateWord> elevateWordList =
+                elevateWordBhv
+                        .selectList(cb -> cb.query().addOrderBy_CreatedBy_Asc())
+                        .stream()
+                        .filter(e -> StringUtil.isNotBlank(e.getTargetRole()))
+                        .map(e -> {
+                            final String[] permissions =
+                                    StreamUtil
+                                            .stream(e.getTargetRole().split(","))
+                                            .get(stream -> stream.filter(StringUtil::isNotBlank).map(
+                                                    s -> fessConfig.getRoleSearchRolePrefix() + s)).toArray(n -> new String[n]);
+                            e.setPermissions(permissions);
+                            e.setTargetRole(null);
+                            return e;
+                        }).collect(Collectors.toList());
+        if (!elevateWordList.isEmpty()) {
+            elevateWordBhv.batchUpdate(elevateWordList);
         }
+
     }
 
     private void uploadResource(final String indexConfigPath, final String indexName, final String path) {