33import java .io .ByteArrayOutputStream ;
44import java .io .PrintStream ;
55import java .security .Permission ;
6+ import java .io .FileDescriptor ;
7+ import java .net .InetAddress ;
68
79public class MainRunner {
8-
910 private static class ExitException extends SecurityException {
1011 private static final long serialVersionUID = -9104651568237766642L ;
1112
@@ -21,24 +22,218 @@ public int getStatus() {
2122 }
2223 }
2324
24- private static class NoExitSecurityManager extends SecurityManager {
25+ /**
26+ * A {@code NoExitSecurityManager} throws a {@link ExitException} exception
27+ * whenever {@link #checkExit(int)} is called. All other method calls are
28+ * delegated to the original security manager.
29+ */
30+ public class NoExitSecurityManager extends SecurityManager {
31+ private final SecurityManager originalSecurityManager ;
32+
33+ public NoExitSecurityManager (SecurityManager originalSecurityManager ) {
34+ this .originalSecurityManager = originalSecurityManager ;
35+ }
36+
37+ @ Override
38+ public void checkExit (int status ) {
39+ throw new ExitException (status );
40+ }
41+
42+ @ Override
43+ public boolean getInCheck () {
44+ return (originalSecurityManager != null ) && originalSecurityManager .getInCheck ();
45+ }
46+
47+ @ Override
48+ public Object getSecurityContext () {
49+ return (originalSecurityManager == null ) ? super .getSecurityContext () : originalSecurityManager .getSecurityContext ();
50+ }
51+
2552 @ Override
2653 public void checkPermission (Permission perm ) {
27- // allow anything.
54+ if (originalSecurityManager != null )
55+ originalSecurityManager .checkPermission (perm );
2856 }
2957
3058 @ Override
3159 public void checkPermission (Permission perm , Object context ) {
32- // allow anything.
60+ if (originalSecurityManager != null )
61+ originalSecurityManager .checkPermission (perm , context );
3362 }
3463
3564 @ Override
36- public void checkExit (int status ) {
37- super .checkExit (status );
38- throw new ExitException (status );
65+ public void checkCreateClassLoader () {
66+ if (originalSecurityManager != null )
67+ originalSecurityManager .checkCreateClassLoader ();
68+ }
69+
70+ @ Override
71+ public void checkAccess (Thread t ) {
72+ if (originalSecurityManager != null )
73+ originalSecurityManager .checkAccess (t );
74+ }
75+
76+ @ Override
77+ public void checkAccess (ThreadGroup g ) {
78+ if (originalSecurityManager != null )
79+ originalSecurityManager .checkAccess (g );
80+ }
81+
82+ @ Override
83+ public void checkExec (String cmd ) {
84+ if (originalSecurityManager != null )
85+ originalSecurityManager .checkExec (cmd );
86+ }
87+
88+ @ Override
89+ public void checkLink (String lib ) {
90+ if (originalSecurityManager != null )
91+ originalSecurityManager .checkLink (lib );
92+ }
93+
94+ @ Override
95+ public void checkRead (FileDescriptor fd ) {
96+ if (originalSecurityManager != null )
97+ originalSecurityManager .checkRead (fd );
98+ }
99+
100+ @ Override
101+ public void checkRead (String file ) {
102+ if (originalSecurityManager != null )
103+ originalSecurityManager .checkRead (file );
104+ }
105+
106+ @ Override
107+ public void checkRead (String file , Object context ) {
108+ if (originalSecurityManager != null )
109+ originalSecurityManager .checkRead (file , context );
110+ }
111+
112+ @ Override
113+ public void checkWrite (FileDescriptor fd ) {
114+ if (originalSecurityManager != null )
115+ originalSecurityManager .checkWrite (fd );
116+ }
117+
118+ @ Override
119+ public void checkWrite (String file ) {
120+ if (originalSecurityManager != null )
121+ originalSecurityManager .checkWrite (file );
122+ }
123+
124+ @ Override
125+ public void checkDelete (String file ) {
126+ if (originalSecurityManager != null )
127+ originalSecurityManager .checkDelete (file );
128+ }
129+
130+ @ Override
131+ public void checkConnect (String host , int port ) {
132+ if (originalSecurityManager != null )
133+ originalSecurityManager .checkConnect (host , port );
39134 }
40- }
41135
136+ @ Override
137+ public void checkConnect (String host , int port , Object context ) {
138+ if (originalSecurityManager != null )
139+ originalSecurityManager .checkConnect (host , port , context );
140+ }
141+
142+ @ Override
143+ public void checkListen (int port ) {
144+ if (originalSecurityManager != null )
145+ originalSecurityManager .checkListen (port );
146+ }
147+
148+ @ Override
149+ public void checkAccept (String host , int port ) {
150+ if (originalSecurityManager != null )
151+ originalSecurityManager .checkAccept (host , port );
152+ }
153+
154+ @ Override
155+ public void checkMulticast (InetAddress maddr ) {
156+ if (originalSecurityManager != null )
157+ originalSecurityManager .checkMulticast (maddr );
158+ }
159+
160+ @ Override
161+ public void checkMulticast (InetAddress maddr , byte ttl ) {
162+ if (originalSecurityManager != null )
163+ originalSecurityManager .checkMulticast (maddr , ttl );
164+ }
165+
166+ @ Override
167+ public void checkPropertiesAccess () {
168+ if (originalSecurityManager != null )
169+ originalSecurityManager .checkPropertiesAccess ();
170+ }
171+
172+ @ Override
173+ public void checkPropertyAccess (String key ) {
174+ if (originalSecurityManager != null )
175+ originalSecurityManager .checkPropertyAccess (key );
176+ }
177+
178+ @ Override
179+ public boolean checkTopLevelWindow (Object window ) {
180+ return (originalSecurityManager == null ) ? super .checkTopLevelWindow (window ) : originalSecurityManager .checkTopLevelWindow (window );
181+ }
182+
183+ @ Override
184+ public void checkPrintJobAccess () {
185+ if (originalSecurityManager != null )
186+ originalSecurityManager .checkPrintJobAccess ();
187+ }
188+
189+ @ Override
190+ public void checkSystemClipboardAccess () {
191+ if (originalSecurityManager != null )
192+ originalSecurityManager .checkSystemClipboardAccess ();
193+ }
194+
195+ @ Override
196+ public void checkAwtEventQueueAccess () {
197+ if (originalSecurityManager != null )
198+ originalSecurityManager .checkAwtEventQueueAccess ();
199+ }
200+
201+ @ Override
202+ public void checkPackageAccess (String pkg ) {
203+ if (originalSecurityManager != null )
204+ originalSecurityManager .checkPackageAccess (pkg );
205+ }
206+
207+ @ Override
208+ public void checkPackageDefinition (String pkg ) {
209+ if (originalSecurityManager != null )
210+ originalSecurityManager .checkPackageDefinition (pkg );
211+ }
212+
213+ @ Override
214+ public void checkSetFactory () {
215+ if (originalSecurityManager != null )
216+ originalSecurityManager .checkSetFactory ();
217+ }
218+
219+ @ Override
220+ public void checkMemberAccess (Class <?> clazz , int which ) {
221+ if (originalSecurityManager != null )
222+ originalSecurityManager .checkMemberAccess (clazz , which );
223+ }
224+
225+ @ Override
226+ public void checkSecurityAccess (String target ) {
227+ if (originalSecurityManager != null )
228+ originalSecurityManager .checkSecurityAccess (target );
229+ }
230+
231+ @ Override
232+ public ThreadGroup getThreadGroup () {
233+ return (originalSecurityManager == null ) ? super .getThreadGroup () : originalSecurityManager .getThreadGroup ();
234+ }
235+ }
236+
42237 /**
43238 * Execute runnable.run(), preventing System.exit(). If System.exit() is called
44239 * in runnable.run(), the value is returned. If System.exit()
@@ -48,9 +243,9 @@ public void checkExit(int status) {
48243 * @return null if System.exit() is not called, Integer.valueof(status) if not
49244 */
50245 public Integer runWithCheckForSystemExit (Runnable runnable ) {
51- SecurityManager oldSecurityManager = System .getSecurityManager ();
52- System .setSecurityManager (new NoExitSecurityManager ());
53- PrintStream oldPrintStream = System .out ;
246+ SecurityManager oldSecurityManager = System .getSecurityManager ();
247+ System .setSecurityManager (new NoExitSecurityManager (oldSecurityManager ));
248+ PrintStream oldPrintStream = System .out ;
54249
55250 System .setOut (new PrintStream (new ByteArrayOutputStream ()));
56251 try {
@@ -65,5 +260,4 @@ public Integer runWithCheckForSystemExit(Runnable runnable) {
65260 System .setOut (oldPrintStream );
66261 }
67262 }
68-
69263}
0 commit comments