Nohemi has a program which needs to apply role-based security. Due to their organizational needs, the rules for role names are a bit unusual. Some roles have to be a case-insensitive match. But some roles have a more flexible pattern they need to have. This is how her co-worker implemented this:
public static String decodeRole(String role) {
String decodedRole = "";
if (role != null && !role.trim().equals("")) {
if (role.trim().equalsIgnoreCase(ROLE_1_STRING))
decodedRole = CODE_ROLE_1;
else if (role.trim().equalsIgnoreCase(ROLE_2_STRING))
decodedRole = CODE_ROLE_2;
else if (role.trim().equalsIgnoreCase(ROLE_3_STRING))
decodedRole = CODE_ROLE_3;
else if (personalContains(role.trim(), ROLE_4_STRING))
decodedRole = CODE_ROLE_4;
}
return decodedRole;
}
Here's the key method which does this translation. Roles 1, 2 and 3 must be an exact match. Role 4, on the other hand, has to apply their special rule, a rule so complicated it can only be evaluated via a regular expression:
private static final String REGEXP_SUFFIX = ").*$";
private static final String REGEXP_PREFIX = "^.*(";
public static boolean personalContains(String fatherString,
String toSearchString) {
Pattern p = Pattern.compile(REGEXP_PREFIX + toSearchString.toLowerCase()
+ REGEXP_SUFFIX);
Matcher m = p.matcher(fatherString.toLowerCase());
boolean matchFound = m.matches();
if (matchFound)
return true;
else
return false;
}
It's a contains check. If your search string were, say, ROLE_4
, the constructed regex would be ^.*(ROLE_4).*$
, which is "the start of the string, followed by zero or more of any character, followed by ROLE_4
, followed by zero or more of any character, followed by the end of the string.
It's a contains check. This isn't even the right way to do this is regular expressions, since ROLE_4
would be a regex which matches if any substring is ROLE_4
, but regexes aren't the right way to do this in the first place, since Java has a lovely String.contains
method already. The entire personalContains
method could be removed.
The real WTF, though, is that instead of returning m.matches()
, they have to do this:
if (matchFound)
return true;
else
return false;