Skip to content

Instantly share code, notes, and snippets.

@qbosen
Created July 22, 2020 09:26
Show Gist options
  • Save qbosen/d27a38b35df3f980994f650aa2d22487 to your computer and use it in GitHub Desktop.
Save qbosen/d27a38b35df3f980994f650aa2d22487 to your computer and use it in GitHub Desktop.
ipv6 matching
package top.abosen.toys.ipv6.match;
import inet.ipaddr.IPAddress;
import inet.ipaddr.IPAddressString;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author qiubaisen
* @date 2020/7/21
*/
public class MatcherBuilder<T> {
private final List<MatcherInfo<T>> matchers;
public MatcherBuilder() {
matchers = new ArrayList<>();
}
public MatcherBuilder<T> register(String pattern, T value) {
return register(pattern, value, Integer.MAX_VALUE);
}
public MatcherBuilder<T> register(String pattern, T value, int order) {
IPAddress address = new IPAddressString(pattern).getAddress();
if (address == null) throw new IllegalArgumentException("非法的IP pattern:" + pattern);
matchers.add(new MatcherInfo<>(pattern, address, value, order));
return this;
}
public RouteMatcher<T> build() {
List<MatcherInfo<T>> sorts = new ArrayList<>(matchers);
Collections.sort(sorts);
return new RouteMatcher<>(sorts);
}
}
package top.abosen.toys.ipv6.match;
import inet.ipaddr.IPAddress;
import org.jetbrains.annotations.NotNull;
/**
* @author qiubaisen
* @date 2020/7/21
*/
public class MatcherInfo<T> implements Comparable<MatcherInfo<T>>{
private int order;
private String pattern;
private T value;
private IPAddress address;
protected MatcherInfo(String pattern, IPAddress address, T value, int order) {
this.pattern = pattern;
this.value = value;
this.order = order;
this.address = address;
}
public boolean matches(IPAddress ip) {
return ip != null && address.contains(ip);
}
@Override
public int compareTo(@NotNull MatcherInfo<T> o) {
return order - o.order;
}
// region getter or setter
public int getOrder() {
return order;
}
public String getPattern() {
return pattern;
}
public T getValue() {
return value;
}
// endregion getter or setter
}
package top.abosen.toys.ipv6.match;
import inet.ipaddr.IPAddress;
import inet.ipaddr.IPAddressString;
import java.util.List;
/**
* @author qiubaisen
* @date 2020/7/21
*/
public class RouteMatcher<T> {
private final List<MatcherInfo<T>> sortedList;
public RouteMatcher(List<MatcherInfo<T>> sortedList) {
this.sortedList = sortedList;
}
public T matching(String ip) {
IPAddress otherIp = new IPAddressString(ip).getAddress();
if (otherIp == null) return null;
for (MatcherInfo<T> matcher : sortedList) {
if (matcher.matches(otherIp)) {
return matcher.getValue();
}
}
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment