void resolveSecurityAction(Ident<SecurityAction> x) {
// Are we declaring a verb?
ActionDefinition currentVerb = currentLocation(ActionDefinition.class);
if (currentVerb != null) {
SecurityAction a = SecurityAction.of(
currentVerb.getName().getSimpleName(), x.getSimpleName());
x.setReferent(a);
return;
}
// Otherwise, it must be a verb reference
if (x.isCompound()) {
// *.*, Foo.*, or Foo.bar
Ident<ActionDefinition> verbIdent = x.getCompoundName().get(0).cast(ActionDefinition.class);
if (verbIdent.isWildcard()) {
// Parser shouldn't allow *.foo, so we can ignore the second part
x.setReferent(SecurityAction.all());
return;
}
ActionDefinition verb = scope().get(verbIdent);
if (verb == null) {
error("Unknown verb: " + verbIdent.getSimpleName());
return;
}
verbIdent.setReferent(verb);
Ident<SecurityAction> actionIdent = x.getCompoundName().get(1).cast(SecurityAction.class);
if (actionIdent.isWildcard()) {
// Foo.*
SecurityAction action = SecurityAction.of(verbIdent.getSimpleName(), "*");
actionIdent.setReferent(action);
x.setReferent(action);
} else {
// Find matching verb declaration, e.g. Foo.bar
for (Ident<SecurityAction> action : verb.getActions()) {
if (action.equals(x.getCompoundName().get(1))) {
actionIdent.setReferent(action.getReferent());
x.setReferent(action.getReferent());
return;
}
}
error("Unknown verb " + x);