synchronizer jdbc & optimize

This commit is contained in:
MaxKey
2022-12-04 18:37:38 +08:00
parent 823383d95f
commit 7367666adc
20 changed files with 744 additions and 279 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
* Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,8 +19,12 @@ package org.maxkey.synchronizer.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.lang3.StringUtils;
import org.maxkey.constants.ConstsStatus;
import org.maxkey.entity.DbTableMetaData;
import org.maxkey.entity.Organizations;
import org.maxkey.synchronizer.AbstractSynchronizerService;
import org.maxkey.synchronizer.ISynchronizerService;
@@ -32,54 +36,131 @@ import org.springframework.stereotype.Service;
@Service
public class JdbcOrganizationService extends AbstractSynchronizerService implements ISynchronizerService{
final static Logger _logger = LoggerFactory.getLogger(JdbcOrganizationService.class);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String querySql = "select * from org";
public void sync() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.connect(
synchronizer.getProviderUrl(),
synchronizer.getPrincipal(),
synchronizer.getCredentials(),
synchronizer.getDriverClass());
stmt = conn.createStatement();
rs = stmt.executeQuery(querySql);
while(rs.next()) {
Organizations queryOrg = this.organizationsService.get(rs.getString("id"));
if(queryOrg == null) {
if(StringUtils.isNotBlank(synchronizer.getOrgFilters())){
_logger.info("Sync Org Filters {}",synchronizer.getOrgFilters());
conn = JdbcUtils.connect(
synchronizer.getProviderUrl(),
synchronizer.getPrincipal(),
synchronizer.getCredentials(),
synchronizer.getDriverClass());
stmt = conn.createStatement();
rs = stmt.executeQuery(synchronizer.getOrgFilters());
while(rs.next()) {
Organizations org = buildOrganization(rs);
organizationsService.insert(org);
}else{
//this.organizationsService.update(org);
Organizations queryOrg = this.organizationsService.get(org.getId());
if(queryOrg == null) {
organizationsService.insert(org);
}else{
this.organizationsService.update(org);
}
}
}
JdbcUtils.release(conn, stmt, rs);
} catch (Exception e) {
_logger.error("Exception " , e);
}finally {
JdbcUtils.release(conn, stmt, rs);
}
}
public Organizations buildOrganization(ResultSet rs) {
try {
Organizations org = new Organizations();
org.setId(org.generateId());
org.setOrgCode(rs.getString("code"));
org.setOrgName(rs.getString("orgname"));
org.setInstId(this.synchronizer.getInstId());
public Organizations buildOrganization(ResultSet rs) throws SQLException {
DbTableMetaData meta = JdbcUtils.getMetaData(rs);
Organizations org = new Organizations();
if(meta.getColumnsMap().containsKey("id")) {
org.setId(org.generateId());
}
if(meta.getColumnsMap().containsKey("orgcode")) {
org.setOrgCode(rs.getString("orgcode"));
}
if(meta.getColumnsMap().containsKey("orgname")) {
org.setOrgName(rs.getString("orgname"));
}
if(meta.getColumnsMap().containsKey("fullname")) {
org.setFullName(rs.getString("fullname"));
}
//parent
if(meta.getColumnsMap().containsKey("parentid")) {
org.setParentId(rs.getString("parentid"));
}
if(meta.getColumnsMap().containsKey("parentcode")) {
org.setParentCode(rs.getString("parentcode"));
}
if(meta.getColumnsMap().containsKey("parentname")) {
org.setParentName(rs.getString("parentname"));
}
//ex attr
if(meta.getColumnsMap().containsKey("type")) {
org.setType(rs.getString("type"));
}
if(meta.getColumnsMap().containsKey("codepath")) {
org.setCodePath(rs.getString("codepath"));
}
if(meta.getColumnsMap().containsKey("namepath")) {
org.setNamePath(rs.getString("namepath"));
}
if(meta.getColumnsMap().containsKey("level")) {
org.setLevel(rs.getInt("level"));
}
if(meta.getColumnsMap().containsKey("haschild")) {
org.setHasChild(rs.getString("haschild"));
}
if(meta.getColumnsMap().containsKey("division")) {
org.setDivision(rs.getString("division"));
}
if(meta.getColumnsMap().containsKey("country")) {
org.setCountry(rs.getString("country"));
}
if(meta.getColumnsMap().containsKey("region")) {
org.setRegion(rs.getString("region"));
}
if(meta.getColumnsMap().containsKey("locality")) {
org.setLocality(rs.getString("locality"));
}
if(meta.getColumnsMap().containsKey("street")) {
org.setStreet(rs.getString("street"));
}
if(meta.getColumnsMap().containsKey("address")) {
org.setAddress(rs.getString("address"));
}
if(meta.getColumnsMap().containsKey("contact")) {
org.setContact(rs.getString("contact"));
}
if(meta.getColumnsMap().containsKey("postalcode")) {
org.setPostalCode(rs.getString("postalcode"));
}
if(meta.getColumnsMap().containsKey("phone")) {
org.setPhone(rs.getString("phone"));
}
if(meta.getColumnsMap().containsKey("fax")) {
org.setFax(rs.getString("fax"));
}
if(meta.getColumnsMap().containsKey("email")) {
org.setEmail(rs.getString("email"));
}
if(meta.getColumnsMap().containsKey("sortindex")) {
org.setSortIndex(rs.getInt("sortindex"));
}
if(meta.getColumnsMap().containsKey("ldapdn")) {
org.setLdapDn(rs.getString("ldapdn"));
}
if(meta.getColumnsMap().containsKey("description")) {
org.setDescription(rs.getString("description"));
}
org.setInstId(this.synchronizer.getInstId());
if(meta.getColumnsMap().containsKey("status")) {
org.setStatus(rs.getInt("status"));
}else {
org.setStatus(ConstsStatus.ACTIVE);
_logger.debug("Organization " + org);
return org;
} catch (Exception e) {
_logger.error("NamingException " , e);
}
return null;
_logger.debug("Organization {}" , org);
return org;
}
}

View File

@@ -23,6 +23,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import org.maxkey.constants.ConstsStatus;
import org.maxkey.entity.DbTableMetaData;
import org.maxkey.entity.UserInfo;
import org.maxkey.synchronizer.AbstractSynchronizerService;
import org.maxkey.synchronizer.ISynchronizerService;
@@ -36,61 +37,248 @@ import org.springframework.stereotype.Service;
public class JdbcUsersService extends AbstractSynchronizerService implements ISynchronizerService{
final static Logger _logger = LoggerFactory.getLogger(JdbcUsersService.class);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String querySql = "select * from account";
public void sync() {
_logger.info("Sync Jdbc Users...");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.connect(
synchronizer.getProviderUrl(),
synchronizer.getPrincipal(),
synchronizer.getCredentials(),
synchronizer.getDriverClass());
stmt = conn.createStatement();
rs = stmt.executeQuery(querySql);
long insertCount = 0;
long updateCount = 0;
long readCount = 0;
while(rs.next()) {
UserInfo queryUser = this.userInfoService.findByUsername(rs.getString("mobile"));
readCount ++;
if(queryUser == null) {
if(StringUtils.isNotBlank(synchronizer.getOrgFilters())){
_logger.info("Sync User Filters {}",synchronizer.getOrgFilters());
conn = JdbcUtils.connect(
synchronizer.getProviderUrl(),
synchronizer.getPrincipal(),
synchronizer.getCredentials(),
synchronizer.getDriverClass());
stmt = conn.createStatement();
rs = stmt.executeQuery(synchronizer.getUserFilters());
long insertCount = 0;
long updateCount = 0;
long readCount = 0;
while(rs.next()) {
UserInfo user = buildUserInfo(rs);
if(StringUtils.isBlank(rs.getString("password"))) {
user.setPassword(rs.getString("mobile"));
userInfoService.insert(user,true);
}else {
user.setPassword("{bcrypt}"+rs.getString("password"));
userInfoService.insert(user,false);
UserInfo queryUser = this.userInfoService.findByUsername(user.getUsername());
readCount ++;
if(queryUser == null) {
if(user.getPassword().indexOf("{") > -1 && user.getPassword().indexOf("}") > -1) {
userInfoService.insert(user,false);
}else {
//passwordEncoder
userInfoService.insert(user,true);
}
user.setBadPasswordCount(1);
insertCount++;
}else{
//no need update password , set null
user.setPassword(null);
userInfoService.update(user);
updateCount++;
}
insertCount++;
}else{
//userInfoService.update(queryUser);
updateCount++;
_logger.trace("read Count {} , insert Count {} , updateCount {} " , readCount,insertCount,updateCount);
}
_logger.debug("read Count {} , insert Count {} , updateCount {} " , readCount,insertCount,updateCount);
_logger.info("read Count {} , insert Count {} , updateCount {} " , readCount,insertCount,updateCount);
}
_logger.info("read Count {} , insert Count {} , updateCount {} " , readCount,insertCount,updateCount);
JdbcUtils.release(conn, stmt, rs);
} catch (Exception e) {
_logger.error("Exception " , e);
}finally {
JdbcUtils.release(conn, stmt, rs);
}
}
public UserInfo buildUserInfo(ResultSet rs) throws SQLException {
DbTableMetaData meta = JdbcUtils.getMetaData(rs);
UserInfo user = new UserInfo();
user.setId(rs.getString("id"));
user.setUsername(rs.getString("mobile"));
user.setDisplayName(rs.getString("nickname"));
user.setNickName(rs.getString("nickname"));
user.setMobile(rs.getString("mobile"));
user.setEmail(rs.getString("email"));
//basic
if(meta.getColumnsMap().containsKey("id")) {
user.setId(rs.getString("id"));
}
if(meta.getColumnsMap().containsKey("username")) {
user.setUsername(rs.getString("username"));
}
if(meta.getColumnsMap().containsKey("picture")) {
user.setPicture(rs.getBytes("picture"));
}
if(meta.getColumnsMap().containsKey("displayname")) {
user.setDisplayName(rs.getString("displayname"));
}
if(meta.getColumnsMap().containsKey("nickname")) {
user.setNickName(rs.getString("nickname"));
}
if(meta.getColumnsMap().containsKey("mobile")) {
user.setMobile(rs.getString("mobile"));
}
if(meta.getColumnsMap().containsKey("email")) {
user.setEmail(rs.getString("email"));
}
if(meta.getColumnsMap().containsKey("birthdate")) {
user.setBirthDate(rs.getString("birthdate"));
}
if(meta.getColumnsMap().containsKey("usertype")) {
user.setUserType(rs.getString("usertype"));
}
if(meta.getColumnsMap().containsKey("userstate")) {
user.setUserState(rs.getString("userstate"));
}
if(meta.getColumnsMap().containsKey("windowsaccount")) {
user.setWindowsAccount(rs.getString("windowsaccount"));
}
if(meta.getColumnsMap().containsKey("givenname")) {
user.setGivenName(rs.getString("givenname"));
}
if(meta.getColumnsMap().containsKey("middlename")) {
user.setMiddleName(rs.getString("middlename"));
}
if(meta.getColumnsMap().containsKey("married")) {
user.setMarried(rs.getInt("married"));
}
if(meta.getColumnsMap().containsKey("gender")) {
user.setGender(rs.getInt("gender"));
}
if(meta.getColumnsMap().containsKey("idtype")) {
user.setIdType(rs.getInt("idtype"));
}
if(meta.getColumnsMap().containsKey("idcardno")) {
user.setIdCardNo(rs.getString("idcardno"));
}
if(meta.getColumnsMap().containsKey("website")) {
user.setWebSite(rs.getString("website"));
}
if(meta.getColumnsMap().containsKey("startworkdate")) {
user.setStartWorkDate(rs.getString("startworkdate"));
}
//work
if(meta.getColumnsMap().containsKey("workcountry")) {
user.setWorkCountry(rs.getString("workcountry"));
}
if(meta.getColumnsMap().containsKey("workregion")) {
user.setWorkRegion(rs.getString("workregion"));
}
if(meta.getColumnsMap().containsKey("worklocality")) {
user.setWorkLocality(rs.getString("worklocality"));
}
if(meta.getColumnsMap().containsKey("workstreetaddress")) {
user.setWorkStreetAddress(rs.getString("workstreetaddress"));
}
if(meta.getColumnsMap().containsKey("workaddressformatted")) {
user.setWorkAddressFormatted(rs.getString("workaddressformatted"));
}
if(meta.getColumnsMap().containsKey("workemail")) {
user.setWorkEmail(rs.getString("workemail"));
}
if(meta.getColumnsMap().containsKey("workphonenumber")) {
user.setWorkPhoneNumber(rs.getString("workphonenumber"));
}
if(meta.getColumnsMap().containsKey("workpostalcode")) {
user.setWorkPostalCode(rs.getString("workpostalcode"));
}
if(meta.getColumnsMap().containsKey("workfax")) {
user.setWorkFax(rs.getString("workfax"));
}
if(meta.getColumnsMap().containsKey("workofficename")) {
user.setWorkOfficeName(rs.getString("workofficename"));
}
//home
if(meta.getColumnsMap().containsKey("homecountry")) {
user.setHomeCountry(rs.getString("homecountry"));
}
if(meta.getColumnsMap().containsKey("homeregion")) {
user.setHomeRegion(rs.getString("homeregion"));
}
if(meta.getColumnsMap().containsKey("homelocality")) {
user.setHomeLocality(rs.getString("homelocality"));
}
if(meta.getColumnsMap().containsKey("homestreetaddress")) {
user.setHomeStreetAddress(rs.getString("homestreetaddress"));
}
if(meta.getColumnsMap().containsKey("homeaddressformatted")) {
user.setHomeAddressFormatted(rs.getString("homeaddressformatted"));
}
if(meta.getColumnsMap().containsKey("homeemail")) {
user.setHomeEmail(rs.getString("homeemail"));
}
if(meta.getColumnsMap().containsKey("homephonenumber")) {
user.setHomePhoneNumber(rs.getString("homephonenumber"));
}
if(meta.getColumnsMap().containsKey("homepostalcode")) {
user.setHomePostalCode(rs.getString("homepostalcode"));
}
if(meta.getColumnsMap().containsKey("homefax")) {
user.setHomeFax(rs.getString("homefax"));
}
//company
if(meta.getColumnsMap().containsKey("employeenumber")) {
user.setEmployeeNumber(rs.getString("employeenumber"));
}
if(meta.getColumnsMap().containsKey("costcenter")) {
user.setCostCenter(rs.getString("costcenter"));
}
if(meta.getColumnsMap().containsKey("organization")) {
user.setOrganization(rs.getString("organization"));
}
if(meta.getColumnsMap().containsKey("division")) {
user.setDivision(rs.getString("division"));
}
if(meta.getColumnsMap().containsKey("departmentid")) {
user.setDepartmentId(rs.getString("departmentid"));
}
if(meta.getColumnsMap().containsKey("department")) {
user.setDepartment(rs.getString("department"));
}
if(meta.getColumnsMap().containsKey("jobtitle")) {
user.setJobTitle(rs.getString("jobtitle"));
}
if(meta.getColumnsMap().containsKey("joblevel")) {
user.setJobLevel(rs.getString("joblevel"));
}
if(meta.getColumnsMap().containsKey("managerid")) {
user.setManagerId(rs.getString("managerid"));
}
if(meta.getColumnsMap().containsKey("manager")) {
user.setManager(rs.getString("manager"));
}
if(meta.getColumnsMap().containsKey("assistantid")) {
user.setAssistantId(rs.getString("assistantid"));
}
if(meta.getColumnsMap().containsKey("assistant")) {
user.setAssistant(rs.getString("assistant"));
}
if(meta.getColumnsMap().containsKey("entrydate")) {
user.setEntryDate(rs.getString("entrydate"));
}
if(meta.getColumnsMap().containsKey("quitdate")) {
user.setQuitDate(rs.getString("quitdate"));
}
//common
if(meta.getColumnsMap().containsKey("ldapdn")) {
user.setLdapDn(rs.getString("ldapdn"));
}
if(meta.getColumnsMap().containsKey("status")) {
user.setStatus(rs.getInt("status"));
}else {
user.setStatus(ConstsStatus.ACTIVE);
}
if(meta.getColumnsMap().containsKey("description")) {
user.setDescription(rs.getString("description"));
}
//password
if(meta.getColumnsMap().containsKey("password")) {
user.setPassword(rs.getString("password"));
}else {
//后4位
String last4Char = "6666";
if(StringUtils.isNotBlank(user.getIdCardNo())) {
last4Char = user.getIdCardNo().substring(user.getIdCardNo().length() - 4);
}else if(StringUtils.isNotBlank(user.getMobile())) {
last4Char = user.getMobile().substring(user.getMobile().length() - 4);
}else if(StringUtils.isNotBlank(user.getEmployeeNumber())) {
last4Char = user.getEmployeeNumber().substring(user.getEmployeeNumber().length() - 4);
}
user.setPassword(user.getUsername()+"@M"+last4Char);
}
user.setInstId(this.synchronizer.getInstId());
user.setStatus(ConstsStatus.ACTIVE);
_logger.debug("User {} " , user);
return user;
}