1import java.lang.reflect.Member;
2import java.security.Permission;
3
4public class Enforcer extends SecurityManager {
5    public static final Enforcer THE_ONE = new Enforcer();
6
7    /** whether to deny the next request */
8    private boolean deny;
9
10    /**
11     * Not publicly constructable. Use {@link #THE_ONE}.
12     */
13    private Enforcer() {
14        deny = false;
15    }
16
17    /**
18     * Deny the next request.
19     */
20    public void denyNext() {
21        deny = true;
22    }
23
24    /**
25     * Throw an exception if the instance had been asked to deny a request.
26     */
27    private void denyIfAppropriate() {
28        if (deny) {
29            deny = false;
30            throw new SecurityException("Denied!");
31        }
32    }
33
34    public void checkPackageAccess(String pkg) {
35        System.out.println("checkPackageAccess: " + pkg);
36        denyIfAppropriate();
37        super.checkPackageAccess(pkg);
38    }
39
40    public void checkMemberAccess(Class c, int which) {
41        String member;
42
43        switch (which) {
44            case Member.DECLARED: member = "DECLARED"; break;
45            case Member.PUBLIC:   member = "PUBLIC";   break;
46            default:              member = "<" + which + ">?"; break;
47        }
48
49        System.out.println("checkMemberAccess: " + c.getName() + ", " +
50                member);
51        denyIfAppropriate();
52        super.checkMemberAccess(c, which);
53    }
54
55    public void checkPermission(Permission perm) {
56        System.out.println("checkPermission: " + perm);
57        denyIfAppropriate();
58        super.checkPermission(perm);
59    }
60
61    public void checkPermission(Permission perm, Object context) {
62        System.out.println("checkPermission: " + perm + ", " + context);
63        denyIfAppropriate();
64        super.checkPermission(perm, context);
65    }
66}
67