package com.parse.utils;
import com.parse.entity.ProtocolCondition;
import com.parse.entity.ProtocolEntity;
import com.parse.entity.ProtocolEntity;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
/**
* Created by admin on 2017/8/22.
*/
public class CompareCondition {
/**
* 传入数据:规则,被比较参数
*/
private static <T> List<ProtocolCondition> comareTo(List<ProtocolCondition> conditions, T protocolEntity) {
Map<String, String> map = getField(protocolEntity);
List<ProtocolCondition> returnCondition = new ArrayList<ProtocolCondition>();
int i = -1;
for (ProtocolCondition condition : conditions) {
String variable = condition.getVariable();
String operator = condition.getOperator();
String value = condition.getValue();
String connector = condition.getConnector();
String fieldType = condition.getFieldType();//根据实验得知:判断String要比,string转换integer进行compareTo块数倍
ProtocolCondition next = condition.getNext();
for (Map.Entry<String, String> ite : map.entrySet()) {
if (variable.equalsIgnoreCase(ite.getKey())) {
if (operator.equals("==")) {
i = value.compareTo(ite.getValue()) == 0 ? 1 : 0;
if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;
} else if (operator.equals("!=")) {
i = value.compareTo(ite.getValue()) != 0 ? 1 : 0;
if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;
} else if (operator.equals(">")) {
i = value.compareTo(ite.getValue()) > 0 ? 1 : 0;
if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;
} else if (operator.equals("<")) {
i = value.compareTo(ite.getValue()) < 0 ? 1 : 0;
if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;
}
}
}
}
return returnCondition;
}
/**
* 解析连接符
* @param returnCondition
* @param i
* @param condition
* @param connector
* @return
*/
private static boolean parseConnectCondition(List<ProtocolCondition> returnCondition, int i, ProtocolCondition condition, String connector) {
if (connector.equals("|") && i == 1 || connector.equals("")) {
returnCondition.add(condition);
return true;
} else if (connector.equals("&") && i == 1) {
returnCondition.add(condition);
} else if (connector.equals("&") && i == 0) {
return true;
}
return false;
}
/**
* 获取字段名称
* @param clazz
* @param <T>
* @return
*/
public static <T> Map<String, String> getField(T clazz) {
Map<String, String> fieldMap = new HashMap<String, String>();
Field[] fields = clazz.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
fieldMap.put(field.getName(), (String) field.get(clazz));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return fieldMap;
}
/**
* 测试类
* @param args
*/
public static void main(String[] args) {
ProtocolEntity p = new ProtocolEntity();
p.setDiff("ipasdf");
p.setIp("192.168.101.141");
p.setName("c");
p.setPort("8081");
ProtocolCondition protocolCondition = new ProtocolCondition();
protocolCondition.setVariable("ip");
protocolCondition.setOperator("!=");
protocolCondition.setValue("192.168.101.140");
protocolCondition.setConnector("|");
ProtocolCondition next = new ProtocolCondition();
next.setVariable("port");
next.setOperator(">");
next.setValue("8080");
protocolCondition.setNext(next);
List<ProtocolCondition> conditions = new ArrayList<ProtocolCondition>();
conditions.add(protocolCondition);
List<ProtocolCondition> protocolConditions = comareTo(conditions, p);
for (ProtocolCondition condition : protocolConditions) {
System.out.println(condition);
}
}
}
package com.parse.entity;
/**
* Created by admin on 2017/8/21.
* ip.xttl==11&ip.diffrence>1111&ip.proto>44
*/
public class ProtocolCondition {
public String variable;//变量
public String operator;//运算符
public String value;//变量值
public String fieldType;//0标识Integer 1标识String
public String connector;//连接符
public ProtocolCondition next;//连接符下一个条件
public String getVariable() {
return variable;
}
public void setVariable(String variable) {
this.variable = variable;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getConnector() {
return connector;
}
public void setConnector(String connector) {
this.connector = connector;
}
public String getFieldType() {
return fieldType;
}
public void setFieldType(String fieldType) {
this.fieldType = fieldType;
}
public ProtocolCondition getNext() {
return next;
}
public void setNext(ProtocolCondition next) {
this.next = next;
}
@Override
public String toString() {
return "ProtocolCondition{" +
"variable='" + variable + '\'' +
", operator='" + operator + '\'' +
", value='" + value + '\'' +
", fieldType='" + fieldType + '\'' +
", connector='" + connector + '\'' +
", next=" + next +
'}';
}
}
package com.parse.entity;
/**
* Created by admin on 2017/8/22.
*/
public class ProtocolEntity {
private String ip;
private String port;
private String diff;
private String name;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getDiff() {
return diff;
}
public void setDiff(String diff) {
this.diff = diff;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
自定义规则比较器
最新推荐文章于 2023-03-11 14:03:40 发布