package com.mossle.auth.support; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; public class Importer { private static Logger logger = LoggerFactory.getLogger(Importer.class); private JdbcTemplate jdbcTemplate; private Map<String, Object> tenantMap = new HashMap<String, Object>(); private List<Map<String, Object>> permTypeList = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> permList = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> methodList = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> urlList = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> roleList = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> userList = new ArrayList<Map<String, Object>>(); public void execute(String text) { parse(text); executeSql(); } public void parse(String text) { String step = "start"; String[] array = text.split("\n"); for (int i = 0; i < array.length; i++) { String line = array[i].trim(); if ("".equals(line)) { step = "start"; continue; } if ("start".equals(step)) { if ("ref:".equals(line)) { step = "ref"; } if ("code:".equals(line)) { step = "code"; } if ("userRepoRef:".equals(line)) { step = "userRepoRef"; } if ("permType:".equals(line)) { step = "permType"; } if ("perm:".equals(line)) { step = "perm"; } if ("method:".equals(line)) { step = "method"; } if ("url:".equals(line)) { step = "url"; } if ("role:".equals(line)) { step = "role"; } if ("user:".equals(line)) { step = "user"; } continue; } if ("ref".equals(step)) { tenantMap.put("ref", line); } if ("code".equals(step)) { tenantMap.put("code", line); } if ("userRepoRef".equals(step)) { tenantMap.put("userRepoRef", line); } if ("permType".equals(step)) { String[] tmp = line.split(","); Map<String, Object> permType = new HashMap<String, Object>(); permType.put("name", tmp[0]); permType.put("type", tmp[1]); permTypeList.add(permType); } if ("perm".equals(step)) { String[] tmp = line.split(","); Map<String, Object> perm = new HashMap<String, Object>(); perm.put("code", tmp[0]); perm.put("type", tmp[1]); permList.add(perm); } if ("method".equals(step)) { String[] tmp = line.split(","); Map<String, Object> method = new HashMap<String, Object>(); method.put("resc", tmp[0]); method.put("perm", tmp[1]); methodList.add(method); } if ("url".equals(step)) { String[] tmp = line.split(","); Map<String, Object> url = new HashMap<String, Object>(); url.put("resc", tmp[0]); url.put("perm", tmp[1]); urlList.add(url); } if ("role".equals(step)) { String[] tmp = line.split(","); Map<String, Object> role = new HashMap<String, Object>(); role.put("name", tmp[0]); role.put("perm", tmp[1]); role.put("tenant", tmp[2]); roleList.add(role); } if ("user".equals(step)) { String[] tmp = line.split(","); Map<String, Object> user = new HashMap<String, Object>(); user.put("username", tmp[0]); user.put("ref", tmp[1]); user.put("role", tmp[2]); userList.add(user); } } } public void executeSql() { String tenantId = createOrGetTenantId(); for (Map<String, Object> permType : permTypeList) { if (jdbcTemplate .queryForObject( "select count(*) from auth_perm_type where name=? and tenant_id=?", Integer.class, permType.get("name"), tenantId) == 0) { jdbcTemplate .update("insert into auth_perm_type(name,type,tenant_id) values(?,?,?)", permType.get("name"), permType.get("type"), tenantId); } } for (Map<String, Object> perm : permList) { Long permTypeId = jdbcTemplate .queryForObject( "select id from auth_perm_type where name=? and tenant_id=?", Long.class, perm.get("type"), tenantId); jdbcTemplate .update("insert into auth_perm(code,name,perm_type_id,tenant_id) values(?,?,?,?)", perm.get("code"), perm.get("code"), permTypeId, tenantId); } Map<String, Long> permCache = buildPermCache(tenantId); for (Map<String, Object> method : methodList) { jdbcTemplate .update("insert into auth_access(value,perm_id,type,tenant_id) values(?,?,'METHOD',?)", method.get("resc"), permCache.get(method.get("perm")), tenantId); } for (Map<String, Object> url : urlList) { jdbcTemplate .update("insert into auth_access(value,perm_id,type,tenant_id) values(?,?,'URL',?)", url.get("resc"), permCache.get(url.get("perm")), tenantId); } for (Map<String, Object> role : roleList) { Long roleDefId = createOrGetRoleDefId((String) role.get("name"), (String) role.get("tenant"), tenantId); if (tenantMap.get("ref").equals(role.get("tenant"))) { Long permId = permCache.get(role.get("perm")); if (permId == null) { logger.info("permId is null - {}", role); } else { jdbcTemplate .update("insert into auth_perm_role_def(perm_id,role_def_id) values(?,?)", permId, roleDefId); } } } Map<String, Long> roleCache = buildRoleCache(tenantId); for (Map<String, Object> user : userList) { Long userId = createOrGetUserId((String) user.get("username"), (String) user.get("ref"), tenantId); try { jdbcTemplate .update("insert into auth_user_role(user_status_id,role_id) values(?,?)", userId, roleCache.get(user.get("role"))); } catch (Exception ex) { logger.warn("{} - {}", user, ex.getMessage(), ex); } } } public Map<String, Long> buildPermCache(String tenantId) { Map<String, Long> permCache = new HashMap<String, Long>(); List<Map<String, Object>> list = jdbcTemplate.queryForList( "select id,code from auth_perm where tenant_id=?", tenantId); for (Map<String, Object> map : list) { permCache.put((String) map.get("code"), (Long) map.get("id")); } return permCache; } public Map<String, Long> buildRoleCache(String tenantId) { Map<String, Long> permCache = new HashMap<String, Long>(); List<Map<String, Object>> list = jdbcTemplate.queryForList( "select id,name from auth_role where tenant_id=?", tenantId); for (Map<String, Object> map : list) { permCache.put((String) map.get("name"), (Long) map.get("id")); } return permCache; } public String createOrGetTenantId() { if (this.notExists("select count(*) from tenant_info where ref=?", tenantMap.get("ref"))) { jdbcTemplate .update("insert into tenant_info(NAME,CODE,REF,SHARED,USER_REPO_REF) values(?,?,?,0,?)", tenantMap.get("code"), tenantMap.get("code"), tenantMap.get("ref"), tenantMap.get("userRepoRef")); } return jdbcTemplate.queryForObject( "select id from tenant_info where ref=?", String.class, tenantMap.get("ref")); } public Long createOrGetRoleDefId(String name, String tenantRef, String tenantId) { String roleDefTenantId = jdbcTemplate.queryForObject( "select id from tenant_info where ref=?", String.class, tenantRef); Long roleDefId = null; if (this.notExists( "select count(*) from auth_role_def where name=? and tenant_id=?", name, roleDefTenantId)) { jdbcTemplate.update( "insert into auth_role_def(name,tenant_id) values(?,?)", name, roleDefTenantId); } roleDefId = jdbcTemplate.queryForObject( "select id from auth_role_def where name=? and tenant_id=?", Long.class, name, roleDefTenantId); if (this.notExists( "select count(*) from auth_role where role_def_id=? and tenant_id=?", roleDefId, tenantId)) { jdbcTemplate .update("insert into auth_role(name,role_def_id,tenant_id) values(?,?,?)", name, roleDefId, tenantId); } return roleDefId; } public Long createOrGetUserId(String username, String reference, String tenantId) { if (this.notExists( "select count(*) form auth_user_status where reference=? and tenant_id=?", reference, tenantId)) { jdbcTemplate .update("insert into auth_user_status(username,reference,status,tenant_id) values(?,?,1,?)", username, reference, tenantId); } return jdbcTemplate .queryForObject( "select id from auth_user_status where reference=? and tenant_id=?", Long.class, reference, tenantId); } public boolean notExists(String sql, Object... values) { return jdbcTemplate.queryForObject(sql, Integer.class, values) == 0; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }