package cn.silence;
import org.apache.commons.lang.StringUtils;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.util.CollectionUtils;
import java.util.NavigableSet;
import java.util.concurrent.ConcurrentSkipListSet;
/**
* @author mzq
* @date 2022/9/29 9:48
*/
public class ConcurrentSkipListSetTest {
@Test
public void test() {
ConcurrentSkipListSet<String> set = new ConcurrentSkipListSet<>();
set.add("/aa/bb/cc/ee/list");
set.add("/aa/bb/cc/gg/sync");
set.add("/aa/bb/cc/gg/list");
set.add("/aa/bb/cc/gg23/sync");
set.add("/aa/bb/cc/ef/list");
set.add("/aa/bb/cc/stockOut/sync");
set.add("/aa/cc/*");
set.add("/aa/cc/11/check");
set.add("/aa/cc/22/*");
set.add("/aa/cc/33/*");
set.add("/aa/cc/44/sync");
set.forEach(System.out::println);
System.out.println();
//true /aa/cc/*
havePermission("/aa/cc/44/sync/rege",set);
//true /aa/cc/44/sync
havePermission("/aa/cc/44/sync",set);
//true /aa/cc/33/*
havePermission("/aa/cc/33/156156",set);
//false
havePermission("/aa/cc222222/33/156156",set);
//true /aa/cc/33/*
havePermission("/aa/cc/33/15156",set);
//true /aa/cc/11/check
havePermission("/aa/cc/11/check",set);
//aa/cc/*
havePermission("/aa/cc/11/1111",set);
//aa/cc/*
havePermission("/aa/cc",set);
//false
havePermission("/aa/222",set);
}
private boolean havePermission(String requestUri, ConcurrentSkipListSet<String> set) {
int index = org.apache.commons.lang3.StringUtils.ordinalIndexOf(requestUri, "/", 3);
String pre = index == -1 ? requestUri : requestUri.substring(0, index);
NavigableSet<String> navigableSet = set.subSet(pre, true, requestUri, true);
if (CollectionUtils.isEmpty(navigableSet)) {
return false;
}
navigableSet = navigableSet.descendingSet();
String wildcard = "/*";
for (String uri : navigableSet) {
if (org.apache.commons.lang3.StringUtils.equals(uri, requestUri)) {
return true;
}
if (!uri.endsWith(wildcard)) {
continue;
}
uri = org.apache.commons.lang3.StringUtils.substring(uri, 0, uri.length() - wildcard.length());
if (requestUri.startsWith(uri)) {
return true;
}
}
return false;
}
@Test
public void stringTest(){
String str="/aa/cc/44/sync";
int index = StringUtils.ordinalIndexOf(str, "/", 3);
System.out.println("index = " + index);
System.out.println(str.substring(0,index));
}
}