You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
6.4 KiB
164 lines
6.4 KiB
package com.fr.design.mainframe.authority; |
|
|
|
|
|
import com.fr.base.CloneCollector; |
|
import com.fr.design.dialog.FineJOptionPane; |
|
|
|
import com.fr.design.i18n.Toolkit; |
|
import com.fr.design.mainframe.DesignerContext; |
|
import com.fr.design.mainframe.JTemplate; |
|
import com.fr.file.ConnectionConfig; |
|
import com.fr.file.TableDataConfig; |
|
|
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.workspace.WorkContext; |
|
import com.fr.workspace.server.authority.user.UserAuthority; |
|
|
|
|
|
import java.util.ArrayList; |
|
import java.util.HashMap; |
|
import java.util.HashSet; |
|
import java.util.List; |
|
import java.util.Map; |
|
import java.util.Set; |
|
|
|
|
|
import static javax.swing.JOptionPane.WARNING_MESSAGE; |
|
|
|
|
|
public class JTemplateAuthorityChecker { |
|
JTemplate<?, ?> jTemplate; |
|
Set<String> allConnectionNames; |
|
Set<String> authConnectionNames; |
|
Set<String> allDatasetNames; |
|
Set<String> authDatasetNames; |
|
Map<String, ElementAuthorityChecker> checkerMap = new HashMap<>(); |
|
Set<String> authFailConnectionNames = new HashSet<>(); |
|
Set<String> authFailDatasetNames = new HashSet<>(); |
|
|
|
|
|
public JTemplateAuthorityChecker(JTemplate<?, ?> jTemplate) { |
|
long s = System.currentTimeMillis(); |
|
this.jTemplate = jTemplate; |
|
this.initAuthNames(); |
|
this.initChecker(); |
|
FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker init time consume:" + (System.currentTimeMillis() - s)); |
|
} |
|
|
|
private void initAuthNames() { |
|
allDatasetNames = new HashSet<>(); |
|
for (String authServerDataSetName : TableDataConfig.getInstance().getTableDatas().keySet()) { |
|
allDatasetNames.add(authServerDataSetName); |
|
} |
|
|
|
allConnectionNames = ConnectionConfig.getInstance().getConnections().keySet(); |
|
|
|
UserAuthority templateAuthority = WorkContext.getCurrent().get(UserAuthority.class); |
|
Map<String, Set<String>> authNamesMap = templateAuthority.getAuthServerDataSetAndConnectionNames(); |
|
if (authNamesMap != null) { |
|
//有权限的数据连接名称 |
|
authConnectionNames = authNamesMap.get(UserAuthority.AUTH_CONNECTION_NAMES); |
|
//有权限的数据集名称 |
|
authDatasetNames = authNamesMap.get(UserAuthority.AUTH_SERVER_DATASET_NAMES); |
|
} |
|
} |
|
|
|
private void initChecker() { |
|
registerChecker(new NameDatabaseConnectionAuthorityChecker()); |
|
registerChecker(new DSColumnAuthorityChecker()); |
|
registerChecker(new FormulaAuthorityChecker()); |
|
registerChecker(new NameTableDataAuthorityChecker()); |
|
} |
|
|
|
private void registerChecker(ElementAuthorityChecker checker) { |
|
checkerMap.put(checker.getCheckClassName(), checker); |
|
} |
|
|
|
|
|
public boolean isAuthority() { |
|
long s = System.currentTimeMillis(); |
|
List<Object> targetObjects = getTargetObjects(); |
|
//找到对应的checker,对对象进行检查 |
|
for (Object targetObject : targetObjects) { |
|
String name = targetObject.getClass().getName(); |
|
ElementAuthorityChecker checker = checkerMap.get(name); |
|
if (authConnectionNames != null) { |
|
Set<String> noAuthName = checker.getNoAuthConnectionNames(targetObject, authConnectionNames); |
|
if (noAuthName != null) { |
|
authFailConnectionNames.addAll(noAuthName); |
|
} |
|
} |
|
if (authDatasetNames != null) { |
|
Set<String> noAuthName = checker.getNoAuthDatasetNames(targetObject, authDatasetNames); |
|
if (noAuthName != null) { |
|
authFailDatasetNames.addAll(noAuthName); |
|
} |
|
} |
|
} |
|
authFailConnectionNames.retainAll(allConnectionNames); |
|
authFailDatasetNames.retainAll(allDatasetNames); |
|
FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker check time consume:" + (System.currentTimeMillis() - s)); |
|
return authFailConnectionNames.size() == 0 && authFailDatasetNames.size() == 0; |
|
} |
|
|
|
private List<Object> getTargetObjects() { |
|
List<Object> targetObjects = new ArrayList<>(); |
|
try { |
|
AuthorityTargetObjectCollector authorityTargetObjectCollector |
|
= new AuthorityTargetObjectCollector(jTemplate.getTarget()); |
|
targetObjects = authorityTargetObjectCollector.collectTargetObject(); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e, e.getMessage()); |
|
} |
|
return targetObjects; |
|
} |
|
|
|
public void showAuthorityFailPromptDialog() { |
|
StringBuffer stringBuffer = new StringBuffer(); |
|
stringBuffer.append(Toolkit.i18nText("Fine-Design-Basic_Save_Failure")); |
|
stringBuffer.append("\n"); |
|
stringBuffer.append(getPromptInfo(authFailDatasetNames, |
|
Toolkit.i18nText("Fine-Design_Template_Authority_Check_Server_Dataset_Authority"))); |
|
stringBuffer.append(getPromptInfo(authFailConnectionNames, |
|
Toolkit.i18nText("Fine-Design_Template_Authority_Check_Data_Connection_Authority"))); |
|
FineJOptionPane.showMessageDialog( |
|
DesignerContext.getDesignerFrame(), |
|
stringBuffer.toString(), |
|
Toolkit.i18nText("Fine-Design_Basic_Alert"), |
|
WARNING_MESSAGE); |
|
} |
|
|
|
private String getPromptInfo(Set<String> authFailNames, String message) { |
|
StringBuffer stringBuffer = new StringBuffer(); |
|
if (authFailNames.size() > 0) { |
|
stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); |
|
stringBuffer.append(authFailNames.size()); |
|
stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); |
|
stringBuffer.append(message); |
|
stringBuffer.append("\n"); |
|
stringBuffer.append(getNoAuthNameSequence(authFailNames)); |
|
} |
|
return stringBuffer.toString(); |
|
} |
|
|
|
private String getNoAuthNameSequence(Set<String> names) { |
|
StringBuffer stringBuffer = new StringBuffer(); |
|
int showMaxCount = 3; |
|
int count = 0; |
|
for (String name : names) { |
|
if (count == showMaxCount) { |
|
stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Etc")); |
|
break; |
|
} |
|
stringBuffer.append(name); |
|
if (count != names.size() - 1 && count != showMaxCount - 1) { |
|
stringBuffer.append(";"); |
|
} |
|
count++; |
|
} |
|
stringBuffer.append("\n"); |
|
return stringBuffer.toString(); |
|
} |
|
|
|
} |
|
|
|
|