in framework/src/main/java/org/osgi/framework/AdminPermission.java [339:545]
private static int parseActions(String actions) {
if ((actions == null) || actions.equals("*")) {
return ACTION_ALL;
}
boolean seencomma = false;
int mask = ACTION_NONE;
char[] a = actions.toCharArray();
int i = a.length - 1;
if (i < 0)
return mask;
while (i != -1) {
char c;
// skip whitespace
while ((i != -1) && ((c = a[i]) == ' ' || c == '\r' || c == '\n' || c == '\f' || c == '\t'))
i--;
// check for the known strings
int matchlen;
if (i >= 4 && (a[i - 4] == 'c' || a[i - 4] == 'C')
&& (a[i - 3] == 'l' || a[i - 3] == 'L')
&& (a[i - 2] == 'a' || a[i - 2] == 'A')
&& (a[i - 1] == 's' || a[i - 1] == 'S')
&& (a[i] == 's' || a[i] == 'S')) {
matchlen = 5;
mask |= ACTION_CLASS | ACTION_RESOLVE;
} else
if (i >= 6 && (a[i - 6] == 'e' || a[i - 6] == 'E')
&& (a[i - 5] == 'x' || a[i - 5] == 'X')
&& (a[i - 4] == 'e' || a[i - 4] == 'E')
&& (a[i - 3] == 'c' || a[i - 3] == 'C')
&& (a[i - 2] == 'u' || a[i - 2] == 'U')
&& (a[i - 1] == 't' || a[i - 1] == 'T')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 7;
mask |= ACTION_EXECUTE | ACTION_RESOLVE;
} else
if (i >= 17 && (a[i - 17] == 'e' || a[i - 17] == 'E')
&& (a[i - 16] == 'x' || a[i - 16] == 'X')
&& (a[i - 15] == 't' || a[i - 15] == 'T')
&& (a[i - 14] == 'e' || a[i - 14] == 'E')
&& (a[i - 13] == 'n' || a[i - 13] == 'N')
&& (a[i - 12] == 's' || a[i - 12] == 'S')
&& (a[i - 11] == 'i' || a[i - 11] == 'I')
&& (a[i - 10] == 'o' || a[i - 10] == 'O')
&& (a[i - 9] == 'n' || a[i - 9] == 'N')
&& (a[i - 8] == 'l' || a[i - 8] == 'L')
&& (a[i - 7] == 'i' || a[i - 7] == 'I')
&& (a[i - 6] == 'f' || a[i - 6] == 'F')
&& (a[i - 5] == 'e' || a[i - 5] == 'E')
&& (a[i - 4] == 'c' || a[i - 4] == 'C')
&& (a[i - 3] == 'y' || a[i - 3] == 'Y')
&& (a[i - 2] == 'c' || a[i - 2] == 'C')
&& (a[i - 1] == 'l' || a[i - 1] == 'L')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 18;
mask |= ACTION_EXTENSIONLIFECYCLE;
} else
if (i >= 8 && (a[i - 8] == 'l' || a[i - 8] == 'L')
&& (a[i - 7] == 'i' || a[i - 7] == 'I')
&& (a[i - 6] == 'f' || a[i - 6] == 'F')
&& (a[i - 5] == 'e' || a[i - 5] == 'E')
&& (a[i - 4] == 'c' || a[i - 4] == 'C')
&& (a[i - 3] == 'y' || a[i - 3] == 'Y')
&& (a[i - 2] == 'c' || a[i - 2] == 'C')
&& (a[i - 1] == 'l' || a[i - 1] == 'L')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 9;
mask |= ACTION_LIFECYCLE;
} else
if (i >= 7 && (a[i - 7] == 'l' || a[i - 7] == 'L')
&& (a[i - 6] == 'i' || a[i - 6] == 'I')
&& (a[i - 5] == 's' || a[i - 5] == 'S')
&& (a[i - 4] == 't' || a[i - 4] == 'T')
&& (a[i - 3] == 'e' || a[i - 3] == 'E')
&& (a[i - 2] == 'n' || a[i - 2] == 'N')
&& (a[i - 1] == 'e' || a[i - 1] == 'E')
&& (a[i] == 'r' || a[i] == 'R')) {
matchlen = 8;
mask |= ACTION_LISTENER;
} else
if (i >= 7
&& (a[i - 7] == 'm' || a[i - 7] == 'M')
&& (a[i - 6] == 'e' || a[i - 6] == 'E')
&& (a[i - 5] == 't' || a[i - 5] == 'T')
&& (a[i - 4] == 'a' || a[i - 4] == 'A')
&& (a[i - 3] == 'd' || a[i - 3] == 'D')
&& (a[i - 2] == 'a' || a[i - 2] == 'A')
&& (a[i - 1] == 't' || a[i - 1] == 'T')
&& (a[i] == 'a' || a[i] == 'A')) {
matchlen = 8;
mask |= ACTION_METADATA;
} else
if (i >= 6
&& (a[i - 6] == 'r' || a[i - 6] == 'R')
&& (a[i - 5] == 'e' || a[i - 5] == 'E')
&& (a[i - 4] == 's' || a[i - 4] == 'S')
&& (a[i - 3] == 'o' || a[i - 3] == 'O')
&& (a[i - 2] == 'l' || a[i - 2] == 'L')
&& (a[i - 1] == 'v' || a[i - 1] == 'V')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 7;
mask |= ACTION_RESOLVE;
} else
if (i >= 7
&& (a[i - 7] == 'r' || a[i - 7] == 'R')
&& (a[i - 6] == 'e' || a[i - 6] == 'E')
&& (a[i - 5] == 's' || a[i - 5] == 'S')
&& (a[i - 4] == 'o' || a[i - 4] == 'O')
&& (a[i - 3] == 'u' || a[i - 3] == 'U')
&& (a[i - 2] == 'r' || a[i - 2] == 'R')
&& (a[i - 1] == 'c' || a[i - 1] == 'C')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 8;
mask |= ACTION_RESOURCE
| ACTION_RESOLVE;
} else
if (i >= 9
&& (a[i - 9] == 's' || a[i - 9] == 'S')
&& (a[i - 8] == 't' || a[i - 8] == 'T')
&& (a[i - 7] == 'a' || a[i - 7] == 'A')
&& (a[i - 6] == 'r' || a[i - 6] == 'R')
&& (a[i - 5] == 't' || a[i - 5] == 'T')
&& (a[i - 4] == 'l' || a[i - 4] == 'L')
&& (a[i - 3] == 'e' || a[i - 3] == 'E')
&& (a[i - 2] == 'v' || a[i - 2] == 'V')
&& (a[i - 1] == 'e' || a[i - 1] == 'E')
&& (a[i] == 'l' || a[i] == 'L')) {
matchlen = 10;
mask |= ACTION_STARTLEVEL;
} else
if (i >= 6
&& (a[i - 6] == 'c' || a[i - 6] == 'C')
&& (a[i - 5] == 'o' || a[i - 5] == 'O')
&& (a[i - 4] == 'n' || a[i - 4] == 'N')
&& (a[i - 3] == 't' || a[i - 3] == 'T')
&& (a[i - 2] == 'e' || a[i - 2] == 'E')
&& (a[i - 1] == 'x' || a[i - 1] == 'X')
&& (a[i] == 't' || a[i] == 'T')) {
matchlen = 7;
mask |= ACTION_CONTEXT;
} else
if (i >= 4
&& (a[i - 4] == 'w' || a[i - 4] == 'W')
&& (a[i - 3] == 'e' || a[i - 3] == 'E')
&& (a[i - 2] == 'a' || a[i - 2] == 'A')
&& (a[i - 1] == 'v' || a[i - 1] == 'V')
&& (a[i] == 'e' || a[i] == 'E')) {
matchlen = 5;
mask |= ACTION_WEAVE;
} else
if (i >= 0 && (a[i] == '*')) {
matchlen = 1;
mask |= ACTION_ALL;
} else {
// parse error
throw new IllegalArgumentException("invalid permission: " + actions);
}
// make sure we didn't just match the tail of a word
// like "ackbarfstartlevel". Also, skip to the comma.
seencomma = false;
while (i >= matchlen && !seencomma) {
switch (a[i - matchlen]) {
case ',' :
seencomma = true;
/* FALLTHROUGH */
case ' ' :
case '\r' :
case '\n' :
case '\f' :
case '\t' :
break;
default :
throw new IllegalArgumentException("invalid permission: " + actions);
}
i--;
}
// point i at the location of the comma minus one (or -1).
i -= matchlen;
}
if (seencomma) {
throw new IllegalArgumentException("invalid permission: " + actions);
}
return mask;
}