001    package sysModel;
002    
003    import sysModel.classFile.ClassFile;
004    import sysModel.classFile.MethodInfo;
005    import sysModel.classFile.attributes.CodeAttributeInfo;
006    import sysModel.classFile.constantPool.APoolInfo;
007    import sysModel.classFile.constantPool.ClassPoolInfo;
008    import sysModel.classFile.constantPool.visitors.ADefaultPoolInfoVisitor;
009    
010    import java.io.File;
011    import java.io.FileInputStream;
012    import java.io.IOException;
013    import java.io.InputStream;
014    import java.util.ArrayList;
015    import java.util.HashMap;
016    import java.util.jar.JarEntry;
017    import java.util.jar.JarFile;
018    
019    /**
020     * Class loader used for loading fish classes.
021     * @author Mathias Ricken
022     */
023    public class MBSClassLoader extends ClassLoader {
024        /**
025         * Classes already loaded.
026         */
027        HashMap<String,Class<?>> _classes = new HashMap<String,Class<?>>();
028    
029        /**
030         * String with class path.
031         */
032        private String _classPathString;
033    
034        /**
035         * String with the Java home directory.
036         */
037        private static final String JAVA_HOME_STRING = System.getProperty("java.home");
038    
039        /**
040         * Character with separator character.
041         */
042        private static final char SEPARATOR_CHAR = File.separatorChar;
043    
044        /**
045         * String with path separator character.
046         */
047        private static final String PATH_SEPARATOR_STRING = File.pathSeparator;
048    
049        /**
050         * Security manager in use.
051         */
052        private MBSSecurityManager _securityManager;
053    
054        /**
055         * List of built-in classes that should not be checked and be loaded with the regular class loader.
056         */
057        private ArrayList<String> _buildinClasses = new ArrayList<String>();
058    
059        /**
060         * Create a new class loader.
061         * @param securityManager security manager that lets us enable and disable security measures
062         */
063        public MBSClassLoader(MBSSecurityManager securityManager) {
064            // prefix with rt.jar
065            _classPathString = JAVA_HOME_STRING + SEPARATOR_CHAR + "lib" + SEPARATOR_CHAR + "rt.jar" + PATH_SEPARATOR_STRING +
066                               System.getProperty("java.class.path");
067            if (!_classPathString.endsWith(PATH_SEPARATOR_STRING)) {
068                _classPathString += PATH_SEPARATOR_STRING;
069            }
070            _classPathString += '.';
071            _securityManager = securityManager;
072            for(String className: BUILTIN_CLASSES) {
073                _buildinClasses.add(className);
074            }
075        }
076    
077        /**
078         * Load a class.
079         * @param name class name
080         * @param resolveIt resolve class?
081         * @return class object
082         * @throws ClassNotFoundException
083         */
084        public synchronized Class<?> loadClass(String name, boolean resolveIt) throws ClassNotFoundException {
085            try {
086                _securityManager.pushProtected(false);
087                Class<?> result = null;
088    
089                if (!_buildinClasses.contains(name)) {
090                    // Check our local cache of classes
091                    result = _classes.get(name);
092                    if (null != result) {
093                        return result;
094                    }
095    
096                    result = loadFromClassPath(name, resolveIt);
097                }
098    
099                if (null == result) {
100                    // Check with the primordial class loader
101                    try {
102                        result = getParent().loadClass(name);
103                        return result;
104                    }
105                    catch (ClassNotFoundException e) {
106                        throw new ClassNotFoundException(e.toString());
107                    }
108                }
109    
110                return result;
111            }
112            finally {
113                _securityManager.popProtected();
114            }
115        }
116    
117        /**
118         * Load class from class path.
119         * @param name class name
120         * @param resolveIt
121         * @return loaded class or null if not found
122         */
123        private Class<?> loadFromClassPath(String name, boolean resolveIt) {
124            // Try to load it from our repository
125            String[] classPath = _classPathString.split(PATH_SEPARATOR_STRING);
126    
127            byte[] classData = null;
128            String sourceClassPathEntry = "";
129            for(String classPathEntry: classPath) {
130                classData = loadBytes(name.replace('.','/'), classPathEntry);
131                if (null != classData) {
132                    sourceClassPathEntry = classPathEntry;
133                    break;
134                }
135            }
136            if ((null == classData) || (sourceClassPathEntry.startsWith(JAVA_HOME_STRING)) ) {
137                // not found or found from rt.jar; try system loader
138                return null;
139            }
140    
141            // Perform the check
142            checkClass(name, classData);
143    
144            // Define it (parse the class file)
145            Class<?> result = defineClass(name, classData, 0, classData.length);
146            if (null == result) {
147                throw new ClassFormatError();
148            }
149    
150            if (resolveIt) {
151                resolveClass(result);
152            }
153    
154            _classes.put(name, result);
155    
156            return result;
157        }
158    
159        /**
160         * Load byte array from name and path.
161         * @param name class file name (without .class)
162         * @param path path to look in (or jar file)
163         * @return byte array
164         */
165        private byte[] loadBytes(String name, String path) {
166            byte[] classData;
167            try {
168                InputStream fi = null;
169                if (path.toLowerCase().endsWith(".jar")) {
170                    JarFile jar = new JarFile(path);
171                    JarEntry entry = jar.getJarEntry(name+".class");
172                    if (null == entry) {
173                        return null;
174                    }
175                    fi = jar.getInputStream(entry);
176                }
177                else {
178                    fi = new FileInputStream(path+SEPARATOR_CHAR+name+".class");
179                }
180                classData = loadFromStream(fi);
181            }
182            catch (IOException e) {
183                return null;
184            }
185    
186            return classData;
187        }
188    
189        /**
190         * Load byte array from stream.
191         * @param fi input stream
192         * @return byte array
193         * @throws IOException
194         */
195        private byte[] loadFromStream(InputStream fi) throws IOException {
196            byte[] classData;
197            classData = new byte[fi.available()];
198            fi.read(classData);
199            return classData;
200        }
201    
202        /**
203         * Check if the class is safe to load.
204         * @param name class name
205         * @param classData bytes of the class file
206         */
207        public void checkClass(final String name, byte[] classData) {
208            try {
209                ClassFile cf = new ClassFile(classData);
210    
211                // scan constant pool
212                Boolean found = false;
213                ADefaultPoolInfoVisitor<Boolean, Object> checkClassUsageVisitor = new ADefaultPoolInfoVisitor<Boolean, Object>() {
214                    public Boolean classCase(ClassPoolInfo host, Object param) {
215                        return (("java/lang/Throwable".equals(host.getName().toString())) ||
216                                ("java/lang/Error".equals(host.getName().toString())) ||
217                                ("java/lang/ThreadDeath".equals(host.getName().toString())));
218                    }
219    
220                    public Boolean defaultCase(APoolInfo host, Object param) {
221                        return false;
222                    }
223                };
224                for (APoolInfo pi: cf.getConstantPool()) {
225                    found |= pi.execute(checkClassUsageVisitor, null);
226                }
227                if (!found) {
228                    // if none of these classes are referenced, then nothing in this class
229                    // can catch ThreadDeath, so the class is safe
230                    return;
231                }
232    
233    
234                ADefaultPoolInfoVisitor<Object, MethodInfo> checkThrowVisitor = new ADefaultPoolInfoVisitor<Object, MethodInfo>() {
235                    public Object classCase(ClassPoolInfo host, MethodInfo param) {
236                        if (("java/lang/Throwable".equals(host.getName().toString())) ||
237                            ("java/lang/Error".equals(host.getName().toString())) ||
238                            ("java/lang/ThreadDeath".equals(host.getName().toString()))) {
239                            throw new ClassFormatError("Class " + name + " is potentially unsafe: catch clause in " + param
240                                                       + " too general");
241                        }
242                        return null;
243                    }
244    
245                    public Object defaultCase(APoolInfo host, MethodInfo param) {
246                        // not a class, should never happen
247                        throw new ClassFormatError("Exception table entry's catch type in " + name + '.' + param
248                                                   + " references non-class constant pool item.");
249                    }
250                };
251    
252                // scan methods
253                for (final MethodInfo mi: cf.getMethods()) {
254                    if (0 != (mi.getAccessFlags() & (ClassFile.ACC_ABSTRACT | ClassFile.ACC_NATIVE))) {
255                        continue;
256                    }
257    
258                    CodeAttributeInfo ca;
259    
260                    try {
261                        ca = mi.getCodeAttributeInfo();
262                    }
263                    catch (ClassFormatError cfe) {
264                        continue;
265                    }
266    
267                    // check all exception table entries
268                    for (CodeAttributeInfo.ExceptionTableEntry eta: ca.getExceptionTableEntries()) {
269                        if (0 != eta.catchType) {
270                            // if it's not a catch-all from the implementation of finally, we need
271                            // to check the type of exception caught
272                            cf.getConstantPoolItem(eta.catchType).execute(checkThrowVisitor, null);
273                        }
274                    }
275                }
276    
277            }
278            catch (IOException e) {
279                throw new ClassFormatError("Could not check class "+name+"for safety: "+e);
280            }
281        }
282    
283        /**
284         * Array of built-in classes that should not be checked and be loaded with the regular class loader.
285         */
286        private static final String[] BUILTIN_CLASSES = new String[] {
287            "controller.IDisplayAdapter",
288            "controller.IEditAdapter",
289            "controller.IEnvAdapter",
290            "controller.IScrollAdapter",
291            "controller.ISimAdapter",
292            "controller.MBSController$1",
293            "controller.MBSController$2",
294            "controller.MBSController$3",
295            "controller.MBSController$4",
296            "controller.MBSController",
297            "lrs.ANode$1$1",
298            "lrs.ANode$1",
299            "lrs.ANode",
300            "lrs.EmptyNode",
301            "lrs.IAlgo",
302            "lrs.LRStruct",
303            "lrs.NENode",
304            "lrs.visitor.Apply",
305            "lrs.visitor.Clear",
306            "lrs.visitor.GetLength$1",
307            "lrs.visitor.GetLength",
308            "lrs.visitor.GetNth",
309            "lrs.visitor.Remove",
310            "model.ILambda",
311            "model.RandNumGenerator",
312            "sysModel.env.AEnvFactory",
313            "sysModel.env.AGlobalEnv$1",
314            "sysModel.env.AGlobalEnv$2",
315            "sysModel.env.AGlobalEnv$3",
316            "sysModel.env.AGlobalEnv$4",
317            "sysModel.env.AGlobalEnv$5$1",
318            "sysModel.env.AGlobalEnv$5$2",
319            "sysModel.env.AGlobalEnv$5$3",
320            "sysModel.env.AGlobalEnv$5$4",
321            "sysModel.env.AGlobalEnv$5",
322            "sysModel.env.AGlobalEnv$6",
323            "sysModel.env.AGlobalEnv$ALocalEnv$1",
324            "sysModel.env.AGlobalEnv$ALocalEnv$2",
325            "sysModel.env.AGlobalEnv$ALocalEnv",
326            "sysModel.env.AGlobalEnv$BreedLambda",
327            "sysModel.env.AGlobalEnv$ILocalEnvVisitor",
328            "sysModel.env.AGlobalEnv",
329            "sysModel.env.ASquareEnv$1",
330            "sysModel.env.ASquareEnv$2",
331            "sysModel.env.ASquareEnv$3$1",
332            "sysModel.env.ASquareEnv$3$2$1",
333            "sysModel.env.ASquareEnv$3$2",
334            "sysModel.env.ASquareEnv$3",
335            "sysModel.env.ASquareEnv$ASquareLocalEnvironment",
336            "sysModel.env.ASquareEnv$Direction$1$1$1$1$1",
337            "sysModel.env.ASquareEnv$Direction$1$1$1$1",
338            "sysModel.env.ASquareEnv$Direction$1$1$1",
339            "sysModel.env.ASquareEnv$Direction$1$1",
340            "sysModel.env.ASquareEnv$Direction$1",
341            "sysModel.env.ASquareEnv$Direction",
342            "sysModel.env.ASquareEnv$Location$1$1$1$1$1",
343            "sysModel.env.ASquareEnv$Location$1$1$1$1",
344            "sysModel.env.ASquareEnv$Location$1$1$1",
345            "sysModel.env.ASquareEnv$Location$1$1",
346            "sysModel.env.ASquareEnv$Location$1",
347            "sysModel.env.ASquareEnv$Location",
348            "sysModel.env.ASquareEnv",
349            "sysModel.env.BoundedEnv$1",
350            "sysModel.env.BoundedEnv$2$1",
351            "sysModel.env.BoundedEnv$2",
352            "sysModel.env.BoundedEnv$3",
353            "sysModel.env.BoundedEnv$EmptyField",
354            "sysModel.env.BoundedEnv$IField",
355            "sysModel.env.BoundedEnv$IFieldVisitor",
356            "sysModel.env.BoundedEnv$LocalEnvironment$MoveLambda",
357            "sysModel.env.BoundedEnv$LocalEnvironment",
358            "sysModel.env.BoundedEnv$NonEmptyField",
359            "sysModel.env.BoundedEnv$Test_BoundedEnv$1",
360            "sysModel.env.BoundedEnv$Test_BoundedEnv$2",
361            "sysModel.env.BoundedEnv$Test_BoundedEnv$3",
362            "sysModel.env.BoundedEnv$Test_BoundedEnv$4",
363            "sysModel.env.BoundedEnv$Test_BoundedEnv$5",
364            "sysModel.env.BoundedEnv$Test_BoundedEnv$6",
365            "sysModel.env.BoundedEnv$Test_BoundedEnv$7",
366            "sysModel.env.BoundedEnv$Test_BoundedEnv",
367            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$1",
368            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$10",
369            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$11",
370            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$12",
371            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$13",
372            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$14",
373            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$15",
374            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$16",
375            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$17",
376            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$18",
377            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$19",
378            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$2",
379            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$20",
380            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$21",
381            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$22",
382            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$23",
383            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$24",
384            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$25",
385            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$26",
386            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$27",
387            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$28",
388            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$29",
389            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$3",
390            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$30",
391            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$31",
392            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$32",
393            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$33",
394            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$34",
395            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$35",
396            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$36",
397            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$37",
398            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$38",
399            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$39",
400            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$4",
401            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$40",
402            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$41",
403            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$42",
404            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$43",
405            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$44",
406            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$45",
407            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$46",
408            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$47",
409            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$48",
410            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$49",
411            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$5",
412            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$50",
413            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$51",
414            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$52",
415            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$6",
416            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$7",
417            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$8",
418            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$9",
419            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv$SuccessException",
420            "sysModel.env.BoundedEnv$Test_BoundedEnv_LocalEnv",
421            "sysModel.env.BoundedEnv",
422            "sysModel.env.DeactivatableLambda",
423            "sysModel.env.EmptyLocalEnvState",
424            "sysModel.env.FishApplyParams",
425            "sysModel.env.IBlockedCommand",
426            "sysModel.env.ILocalEnvState",
427            "sysModel.env.IOpenCommand",
428            "sysModel.env.NoGridEnv$1",
429            "sysModel.env.NoGridEnv$2",
430            "sysModel.env.NoGridEnv$3$1$1$1",
431            "sysModel.env.NoGridEnv$3$1$1",
432            "sysModel.env.NoGridEnv$3$1",
433            "sysModel.env.NoGridEnv$3",
434            "sysModel.env.NoGridEnv$4",
435            "sysModel.env.NoGridEnv$5",
436            "sysModel.env.NoGridEnv$6$1",
437            "sysModel.env.NoGridEnv$6$2$1",
438            "sysModel.env.NoGridEnv$6$2",
439            "sysModel.env.NoGridEnv$6",
440            "sysModel.env.NoGridEnv$Direction$1$1$1$1$1",
441            "sysModel.env.NoGridEnv$Direction$1$1$1$1",
442            "sysModel.env.NoGridEnv$Direction$1$1$1",
443            "sysModel.env.NoGridEnv$Direction$1$1",
444            "sysModel.env.NoGridEnv$Direction$1",
445            "sysModel.env.NoGridEnv$Direction",
446            "sysModel.env.NoGridEnv$LocalEnvironment$MoveLambda",
447            "sysModel.env.NoGridEnv$LocalEnvironment",
448            "sysModel.env.NoGridEnv$Location$1$1$1$1$1",
449            "sysModel.env.NoGridEnv$Location$1$1$1$1",
450            "sysModel.env.NoGridEnv$Location$1$1$1",
451            "sysModel.env.NoGridEnv$Location$1$1",
452            "sysModel.env.NoGridEnv$Location$1",
453            "sysModel.env.NoGridEnv$Location",
454            "sysModel.env.NoGridEnv$Test_NoGridEnv$1",
455            "sysModel.env.NoGridEnv$Test_NoGridEnv$2",
456            "sysModel.env.NoGridEnv$Test_NoGridEnv$3",
457            "sysModel.env.NoGridEnv$Test_NoGridEnv$4",
458            "sysModel.env.NoGridEnv$Test_NoGridEnv$5",
459            "sysModel.env.NoGridEnv$Test_NoGridEnv$6",
460            "sysModel.env.NoGridEnv$Test_NoGridEnv",
461            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$1",
462            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$10",
463            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$11",
464            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$12",
465            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$13",
466            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$14",
467            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$15",
468            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$16",
469            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$17",
470            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$18",
471            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$19",
472            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$2",
473            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$20",
474            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$21",
475            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$22",
476            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$23",
477            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$24",
478            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$25",
479            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$26",
480            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$27",
481            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$28",
482            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$29",
483            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$3",
484            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$30",
485            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$31",
486            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$32",
487            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$33",
488            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$34",
489            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$35",
490            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$36",
491            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$37",
492            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$38",
493            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$39",
494            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$4",
495            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$40",
496            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$41",
497            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$42",
498            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$43",
499            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$44",
500            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$45",
501            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$46",
502            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$47",
503            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$48",
504            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$49",
505            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$5",
506            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$50",
507            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$51",
508            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$52",
509            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$6",
510            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$7",
511            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$8",
512            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$9",
513            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv$SuccessException",
514            "sysModel.env.NoGridEnv$Test_NoGridEnv_LocalEnv",
515            "sysModel.env.NoGridEnv",
516            "sysModel.env.NonEmptyLocalEnvState",
517            "sysModel.env.NullEnv$1",
518            "sysModel.env.NullEnv$2",
519            "sysModel.env.NullEnv",
520            "sysModel.env.tests.Test_ASquareEnv_Direction$1",
521            "sysModel.env.tests.Test_ASquareEnv_Direction$2",
522            "sysModel.env.tests.Test_ASquareEnv_Direction$3",
523            "sysModel.env.tests.Test_ASquareEnv_Direction$4",
524            "sysModel.env.tests.Test_ASquareEnv_Direction$5",
525            "sysModel.env.tests.Test_ASquareEnv_Direction$6",
526            "sysModel.env.tests.Test_ASquareEnv_Direction",
527            "sysModel.env.tests.Test_ASquareEnv_Location$1",
528            "sysModel.env.tests.Test_ASquareEnv_Location$2",
529            "sysModel.env.tests.Test_ASquareEnv_Location$3",
530            "sysModel.env.tests.Test_ASquareEnv_Location$4",
531            "sysModel.env.tests.Test_ASquareEnv_Location$5",
532            "sysModel.env.tests.Test_ASquareEnv_Location$6",
533            "sysModel.env.tests.Test_ASquareEnv_Location",
534            "sysModel.env.tests.Test_DeactivatableLambda$1",
535            "sysModel.env.tests.Test_DeactivatableLambda$2",
536            "sysModel.env.tests.Test_DeactivatableLambda$3",
537            "sysModel.env.tests.Test_DeactivatableLambda",
538            "sysModel.env.UnboundedEnv$1",
539            "sysModel.env.UnboundedEnv$2",
540            "sysModel.env.UnboundedEnv$LocalEnvironment$MoveLambda",
541            "sysModel.env.UnboundedEnv$LocalEnvironment",
542            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$1",
543            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$2",
544            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$3",
545            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$4",
546            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$5",
547            "sysModel.env.UnboundedEnv$Test_UnboundedEnv$6",
548            "sysModel.env.UnboundedEnv$Test_UnboundedEnv",
549            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$1",
550            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$10",
551            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$11",
552            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$12",
553            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$13",
554            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$14",
555            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$15",
556            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$16",
557            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$17",
558            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$18",
559            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$19",
560            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$2",
561            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$20",
562            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$21",
563            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$22",
564            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$23",
565            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$24",
566            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$25",
567            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$26",
568            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$27",
569            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$28",
570            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$29",
571            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$3",
572            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$30",
573            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$31",
574            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$32",
575            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$33",
576            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$34",
577            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$35",
578            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$36",
579            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$37",
580            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$38",
581            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$39",
582            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$4",
583            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$40",
584            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$41",
585            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$42",
586            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$43",
587            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$44",
588            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$45",
589            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$46",
590            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$47",
591            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$48",
592            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$49",
593            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$5",
594            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$50",
595            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$6",
596            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$7",
597            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$8",
598            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$9",
599            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv$SuccessException",
600            "sysModel.env.UnboundedEnv$Test_UnboundedEnv_LocalEnv",
601            "sysModel.env.UnboundedEnv",
602            "sysModel.env.WrappingEnv$1",
603            "sysModel.env.WrappingEnv$2$1",
604            "sysModel.env.WrappingEnv$2",
605            "sysModel.env.WrappingEnv$Location",
606            "sysModel.env.WrappingEnv$Test_WrappingEnv$1",
607            "sysModel.env.WrappingEnv$Test_WrappingEnv$2",
608            "sysModel.env.WrappingEnv$Test_WrappingEnv$3",
609            "sysModel.env.WrappingEnv$Test_WrappingEnv$4",
610            "sysModel.env.WrappingEnv$Test_WrappingEnv$5",
611            "sysModel.env.WrappingEnv$Test_WrappingEnv$6",
612            "sysModel.env.WrappingEnv$Test_WrappingEnv$7",
613            "sysModel.env.WrappingEnv$Test_WrappingEnv",
614            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$1",
615            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$10",
616            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$11",
617            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$12",
618            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$13",
619            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$14",
620            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$15",
621            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$16",
622            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$17",
623            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$18",
624            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$19",
625            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$2",
626            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$20",
627            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$21",
628            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$22",
629            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$23",
630            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$24",
631            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$25",
632            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$26",
633            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$27",
634            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$28",
635            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$29",
636            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$3",
637            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$30",
638            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$31",
639            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$32",
640            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$33",
641            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$34",
642            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$35",
643            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$36",
644            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$37",
645            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$38",
646            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$39",
647            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$4",
648            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$40",
649            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$41",
650            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$42",
651            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$43",
652            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$44",
653            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$45",
654            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$46",
655            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$47",
656            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$48",
657            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$49",
658            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$5",
659            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$50",
660            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$51",
661            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$52",
662            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$6",
663            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$7",
664            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$8",
665            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$9",
666            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv$SuccessException",
667            "sysModel.env.WrappingEnv$Test_WrappingEnv_LocalEnv",
668            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location$1",
669            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location$2",
670            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location$3",
671            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location$4",
672            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location$5",
673            "sysModel.env.WrappingEnv$Test_WrappingEnv_Location",
674            "sysModel.env.WrappingEnv",
675            "sysModel.fish.DynamicFishFactory",
676            "sysModel.fish.AFish",
677            "sysModel.fish.FishException",
678            "sysModel.fish.AFish$1",
679            "sysModel.fish.AFish$2$1",
680            "sysModel.fish.AFish$2",
681            "sysModel.fish.AFish$3$1",
682            "sysModel.fish.AFish$3",
683            "sysModel.fish.AFish$4$1",
684            "sysModel.fish.AFish$4",
685            "sysModel.fish.AFish$5",
686            "sysModel.fish.IFishBehavior",
687            "sysModel.fish.IFishDisplay",
688            "sysModel.fish.IFishFactory",
689            "sysModel.fish.tests.Test_Fish$1",
690            "sysModel.fish.tests.Test_Fish$2",
691            "sysModel.fish.tests.Test_Fish$3",
692            "sysModel.fish.tests.Test_Fish$4",
693            "sysModel.fish.tests.Test_Fish$5",
694            "sysModel.fish.tests.Test_Fish$6",
695            "sysModel.fish.tests.Test_Fish$7",
696            "sysModel.fish.tests.Test_Fish$TestFish$1",
697            "sysModel.fish.tests.Test_Fish$TestFish$2",
698            "sysModel.fish.tests.Test_Fish$TestFish",
699            "sysModel.fish.tests.Test_Fish$TestGlobalEnv$1",
700            "sysModel.fish.tests.Test_Fish$TestGlobalEnv",
701            "sysModel.fish.tests.Test_Fish",
702            "sysModel.ICmdFactory",
703            "sysModel.ISecurityAdapter",
704            "sysModel.MBSClassLoader",
705            "sysModel.MBSSecurityManager",
706            "sysModel.NoOpLambda",
707            "sysModel.parser.CloseToken",
708            "sysModel.parser.CommaToken",
709            "sysModel.parser.DefaultTokenVisitor",
710            "sysModel.parser.EndOfStreamToken",
711            "sysModel.parser.IToken",
712            "sysModel.parser.ITokenVisitor",
713            "sysModel.parser.Lexer",
714            "sysModel.parser.NumberToken",
715            "sysModel.parser.OpenToken",
716            "sysModel.parser.Parser$1",
717            "sysModel.parser.Parser",
718            "sysModel.parser.ParserException",
719            "sysModel.parser.WordToken",
720            "sysModel.PolicyFile$1",
721            "sysModel.PolicyFile",
722            "sysModel.SimDriver$1$1",
723            "sysModel.SimDriver$1$2",
724            "sysModel.SimDriver$1$3",
725            "sysModel.SimDriver$1",
726            "sysModel.SimDriver$2",
727            "sysModel.SimDriver$3",
728            "sysModel.SimDriver$4",
729            "sysModel.SimDriver",
730            "sysModel.SimEngine$1",
731            "sysModel.SimEngine",
732            "tests.DrJava_Test_BoundedEnv",
733            "tests.DrJava_Test_BoundedEnv_LocalEnv",
734            "tests.DrJava_Test_NoGridEnv",
735            "tests.DrJava_Test_NoGridEnv_LocalEnv",
736            "tests.DrJava_Test_UnboundedEnv",
737            "tests.DrJava_Test_UnboundedEnv_LocalEnv",
738            "tests.DrJava_Test_WrappingEnv",
739            "tests.DrJava_Test_WrappingEnv_LocalEnv",
740            "tests.DrJava_Test_WrappingEnv_Location",
741            "view.CreateEnvDialog$1",
742            "view.CreateEnvDialog$2",
743            "view.CreateEnvDialog$3",
744            "view.CreateEnvDialog$AddEnvChoice",
745            "view.CreateEnvDialog$ConcreteEnvChoice",
746            "view.CreateEnvDialog$IEnvChoice",
747            "view.CreateEnvDialog",
748            "view.DisplayPanel$1",
749            "view.DisplayPanel",
750            "view.DisplayViewport$1",
751            "view.DisplayViewport$Pannable",
752            "view.DisplayViewport",
753            "view.EditToolbar$1",
754            "view.EditToolbar$2",
755            "view.EditToolbar$3",
756            "view.EditToolbar$4",
757            "view.EditToolbar$5",
758            "view.EditToolbar$ChoiceWithIcon",
759            "view.EditToolbar$ChoiceWithIconRenderer",
760            "view.EditToolbar$ColorChoice",
761            "view.EditToolbar$ColorIcon",
762            "view.EditToolbar$FishChoice",
763            "view.EditToolbar$FishIcon",
764            "view.EditToolbar",
765            "view.EnvFileChooser$1",
766            "view.EnvFileChooser",
767            "view.InputStringDialog$1",
768            "view.InputStringDialog$2",
769            "view.InputStringDialog",
770            "view.IRunIdleAdapter",
771            "view.MBSView$1",
772            "view.MBSView$10$1",
773            "view.MBSView$10",
774            "view.MBSView$11$1",
775            "view.MBSView$11",
776            "view.MBSView$12$1",
777            "view.MBSView$12",
778            "view.MBSView$13$1",
779            "view.MBSView$13",
780            "view.MBSView$14$1",
781            "view.MBSView$14",
782            "view.MBSView$15",
783            "view.MBSView$16",
784            "view.MBSView$17",
785            "view.MBSView$18",
786            "view.MBSView$19",
787            "view.MBSView$2",
788            "view.MBSView$20",
789            "view.MBSView$21",
790            "view.MBSView$3",
791            "view.MBSView$4",
792            "view.MBSView$5",
793            "view.MBSView$6",
794            "view.MBSView$7",
795            "view.MBSView$8",
796            "view.MBSView$9",
797            "view.MBSView$GUIExceptionHandler",
798            "view.MBSView$StepItLambda",
799            "view.MBSView",
800            "view.SimToolbar$1",
801            "view.SimToolbar$2",
802            "view.SimToolbar$3",
803            "view.SimToolbar$4",
804            "view.SimToolbar"
805        };
806    }