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.
97 lines
3.4 KiB
97 lines
3.4 KiB
package com.fr.design.mainframe.authority; |
|
|
|
import com.fr.base.Formula; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.parser.FunctionCall; |
|
import com.fr.parser.StringLiteral; |
|
import com.fr.script.Calculator; |
|
import com.fr.stable.script.Node; |
|
import org.jetbrains.annotations.Nullable; |
|
|
|
import java.util.HashSet; |
|
import java.util.Set; |
|
|
|
public class FormulaAuthorityChecker extends ElementAuthorityChecker<Formula> { |
|
private static final Set<FormulaParser> CONNECTION_NAME_FORMULA_PARSER = new HashSet<>(); |
|
private static final Set<FormulaParser> DATASET_NAME_FORMULA_PARSER = new HashSet<>(); |
|
|
|
static { |
|
CONNECTION_NAME_FORMULA_PARSER.add(new FormulaParser("SQL", 0)); |
|
DATASET_NAME_FORMULA_PARSER.add(new FormulaParser("VALUE", 0)); |
|
} |
|
|
|
@Override |
|
@Nullable |
|
public Set<String> getNoAuthConnectionNames(Formula formula, Set<String> authConnectionNames) { |
|
return getNoAuthNames(formula, CONNECTION_NAME_FORMULA_PARSER, authConnectionNames); |
|
} |
|
|
|
|
|
@Override |
|
@Nullable |
|
Set<String> getNoAuthDatasetNames(Formula formula, Set<String> authDatasetNames) { |
|
return getNoAuthNames(formula, DATASET_NAME_FORMULA_PARSER, authDatasetNames); |
|
} |
|
|
|
private Set<String> getNoAuthNames(Formula formula, Set<FormulaParser> formulaParsers, Set<String> authNames) { |
|
Set<String> noAuthNames = new HashSet<>(); |
|
try { |
|
FunctionCall functionCall = (FunctionCall) Calculator.createCalculator().parse(formula.getContent()).getConditionalExpression(); |
|
handleNoAuthNames(functionCall, formulaParsers, authNames, noAuthNames); |
|
} catch (Exception ignore) { |
|
|
|
} finally { |
|
return noAuthNames; |
|
} |
|
} |
|
|
|
private void handleNoAuthNames(FunctionCall functionCall, Set<FormulaParser> formulaParsers, Set<String> authNames, Set<String> noAuthNames) { |
|
for (FormulaParser formulaPattern : formulaParsers) { |
|
String noAuthName = formulaPattern.getNoAuthName(functionCall, authNames); |
|
if (noAuthName != null) { |
|
noAuthNames.add(noAuthName); |
|
} |
|
} |
|
Node[] nodes = functionCall.getArguments(); |
|
if (nodes != null) { |
|
for (int i = 0; i < nodes.length; i++) { |
|
Node node = nodes[i]; |
|
if (node instanceof FunctionCall) { |
|
handleNoAuthNames((FunctionCall) node, formulaParsers, authNames, noAuthNames); |
|
} |
|
} |
|
} |
|
|
|
} |
|
|
|
|
|
static class FormulaParser { |
|
//函数的名称 |
|
public String name; |
|
//要检测的位置 |
|
public int index; |
|
|
|
|
|
FormulaParser(String name, int index) { |
|
this.name = name; |
|
this.index = index; |
|
} |
|
|
|
String getNoAuthName(FunctionCall functionCall, Set<String> authNames) { |
|
if (functionCall.getName() != null && ComparatorUtils.equals(functionCall.getName().toUpperCase(), name)) { |
|
Node node = functionCall.getArguments()[index]; |
|
if (node instanceof StringLiteral) { |
|
String stringLiteral = node.toString(); |
|
if (stringLiteral.length() > 2) { |
|
String value = stringLiteral.substring(1, stringLiteral.length() - 1); |
|
if (!authNames.contains(value)) { |
|
return value; |
|
} |
|
} |
|
} |
|
} |
|
return null; |
|
} |
|
} |
|
|
|
}
|
|
|