com.feilong.lib.xstream.security.WildcardTypePermission Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of feilong Show documentation
Show all versions of feilong Show documentation
feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.
/*
* Copyright (C) 2014 XStream Committers.
* All rights reserved.
*
* Created on 09. January 2014 by Joerg Schaible
*/
package com.feilong.lib.xstream.security;
/**
* Permission for any type with a name matching one of the provided wildcard expressions.
*
*
* Supported are patterns with path expressions using dot as separator:
*
*
* - ?: one non-control character except separator, e.g. for 'java.net.Inet?Address'
* - *: arbitrary number of non-control characters except separator, e.g. for types in a package like 'java.lang.*'
* - **: arbitrary number of non-control characters including separator, e.g. for types in a package and subpackages like
* 'java.lang.**'
*
*
* The complete range of UTF-8 characters is supported except control characters.
*
*
* @author Jörg Schaible
* @since 1.4.7
*/
public class WildcardTypePermission extends RegExpTypePermission{
/**
* @since 1.4.7
*/
public WildcardTypePermission(final String[] patterns){
super(getRegExpPatterns(patterns));
}
private static String[] getRegExpPatterns(final String[] wildcards){
if (wildcards == null){
return null;
}
final String[] regexps = new String[wildcards.length];
for (int i = 0; i < wildcards.length; ++i){
final String wildcardExpression = wildcards[i];
final StringBuffer result = new StringBuffer(wildcardExpression.length() * 2);
result.append("(?u)");
final int length = wildcardExpression.length();
for (int j = 0; j < length; j++){
final char ch = wildcardExpression.charAt(j);
switch (ch) {
case '\\':
case '.':
case '+':
case '|':
case '[':
case ']':
case '(':
case ')':
case '^':
case '$':
result.append('\\').append(ch);
break;
case '?':
result.append('.');
break;
case '*':
// see "General Category Property" in http://www.unicode.org/reports/tr18/
if (j + 1 < length && wildcardExpression.charAt(j + 1) == '*'){
result.append("[\\P{C}]*");
j++;
}else{
result.append("[\\P{C}&&[^").append('.').append("]]*");
}
break;
default:
result.append(ch);
break;
}
}
regexps[i] = result.toString();
}
return regexps;
}
}