1 /*!
  2  * 
  3  * JavaLikeScript
  4  * 
  5  */
  6 /**
  7  * jls Base framework.
  8  * All the framework objects are created under the jls namespace.
  9  * The default objects are extended using prototype like behaviors.
 10  * 
 11  * @namespace
 12  * @see jls.lang
 13  */
 14 var jls = {};
 15 
 16 /**
 17  * @namespace Provides base classes for the jls language.
 18  * @see jls.lang.Exception
 19  * @see jls.lang.Logger
 20  * @see jls.lang.ClassLoader
 21  */
 22 jls.lang = {};
 23 
 24 // Load prototype light
 25 _native.core.evalScript('plight.js');
 26 
 27 // Load base classes
 28 _native.core.evalScript('jls/lang/Exception.js');
 29 _native.core.evalScript('jls/lang/Logger.js');
 30 
 31 /**
 32  * Logger.
 33  * 
 34  * @type jls.lang.Logger
 35  * @memberOf jls
 36  */
 37 jls.logger = new jls.lang.Logger(jls.lang.Logger.WARN);
 38 
 39 if ('jls.logger.logLevel' in _native.core.properties) {
 40     jls.logger.setLogLevel(_native.core.properties['jls.logger.logLevel']);
 41 }
 42 
 43 _native.core.evalScript('jls/lang/ClassLoader.js');
 44 
 45 /**
 46  * ClassLoader.
 47  * 
 48  * @type jls.lang.ClassLoader
 49  * @memberOf jls
 50  */
 51 jls.loader = new jls.lang.ClassLoader();
 52 
 53 // Register base classes
 54 jls.loader.provide('jls.lang.Exception', true);
 55 jls.loader.provide('jls.lang.Logger', true);
 56 jls.loader.provide('jls.lang.ClassLoader', true);
 57 
 58 /*
 59  * Provide all lang classes
 60  */
 61 jls.loader.require('jls.lang.Buffer');
 62 jls.loader.require('jls.lang.Process');
 63 jls.loader.require('jls.lang.Runtime');
 64 jls.loader.require('jls.lang.System');
 65 
 66 jls.lang.System._initialize();
 67 
 68 jls.loader.require('jls.lang.Thread');
 69 jls.loader.require('jls.lang.Signal');
 70 jls.loader.require('jls.lang.Lock');
 71 jls.loader.require('jls.lang.Monitor');
 72 //jls.loader.require('jls.lang.ProcessBuilder');
 73 jls.loader.require('jls.lang.Struct');
 74 //jls.loader.require('jls.lang.AssertionError');
 75 
 76 if ('jls.disableDefaultExceptionHandler' in _native.core.properties) {
 77     jls.logger.info('Default exception handler disabled');
 78 } else {
 79     /*
 80      * Override exception handler
 81      */
 82     _native.core.exceptionHandler = function(e) {
 83         jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.err);
 84     }
 85 }
 86 
 87 if ('jls.disableDefaultSignalHandler' in _native.core.properties) {
 88     jls.logger.info('Default signal handlers disabled');
 89 } else {
 90     /*
 91      * Register default signal handlers.
 92      */
 93     jls.lang.Signal.handle(jls.lang.Signal.SIGINT, function() {
 94         jls.lang.Runtime.exit(0);
 95     });
 96     /*
 97      * Don't know how to dump javascript thread stacktraces
 98      */
 99     /*jls.lang.Signal.handle(jls.lang.Signal.SIGBREAK, function() {
100         //jls.lang.System.out.println('... Dump stack trace ...');
101         //new jls.lang.Exception().printStackTrace(jls.lang.System.out);
102         var name = 'jlsdump.' + new Date().getTime() + '.log';
103         jls.lang.System.out.println('... Dump head to ' + name + '...');
104         _native.core.dumpHead(name);
105     });*/
106 }
107 
108 if ('jls.enableCommonJSModule' in _native.core.properties) {
109     jls.loader.require('jls.lang.ModuleLoader');
110     require = jls.lang.ModuleLoader.getInstance().require.bind(jls.lang.ModuleLoader.getInstance());
111 }
112 
113 if (_native.core.arguments.length > 0) {
114     var args = Array.from(_native.core.arguments);
115     var arg = args.shift();
116     
117     if ((arg == null) || (arg == '-help')) {
118         _native.core.boot = function() {
119             var lines = [
120                 'Usage: jls [options] classname [args...]',
121                 'where options include:',
122                 '\t-bs <bootstrap script file name>',
123                 '\t\tThe file name of the script to use for bootstrap.',
124                 '\t-ep <extension path>',
125                 '\t\tA directory to search for native library files,',
126                 '\t\tscript ZIP files and directories.',
127                 '\t-lp <library search path of directories>',
128                 '\t\tA ; separated list of directories to search for native library files.',
129                 '\t-sp <script search path of directories and ZIP files>',
130                 '\t\tA ; separated list of directories and ZIP archives',
131                 '\t\tto search for script files.',
132                 '\t-D<name>=<value>',
133                 '\t\tSet a system property.',
134                 '\t-logLevel <level>',
135                 '\t\tSet the native log level.',
136                 '\t--',
137                 '\t\tStop the jls options parsing.',
138                 'where system properties include:',
139                 '\t-Djls.logger.logLevel=<level>',
140                 '\t\tSet the log level.',
141                 '\t-Djls.disableDefaultExceptionHandler',
142                 '\t\tDisable uncaught exception default handler.',
143                 '\t-Djls.disableDefaultSignalHandler',
144                 '\t\tDisable default signal handlers.',
145                 '\t-Djls.keep',
146                 '\t\tWaits Ctrl-C if an exception occurs at boot phase.',
147                 '\t-Djls.interactive',
148                 '\t\tEnables interactive boot mode.',
149                 'See http://javalikescript.free.fr/ for more details.'
150             ];
151             for (var i = 0; i < lines.length; i++) {
152                 jls.lang.System.out.println(lines[i]);
153             }
154         }
155     } else if (! arg.endsWith('.js')) {
156         /*
157          * Override boot function
158          */
159         _native.core.boot = function() {
160             jls.loader.require(arg);
161             var mainclass = eval(arg);
162             if (! ('main' in mainclass)) {
163                 throw new jls.lang.Exception('The class ' + arg + ' does not have a main method.');
164             }
165             mainclass['main'](args);
166         };
167     }
168 } else {
169     if ('jls.interactive' in _native.core.properties) {
170         // TODO
171     }
172 }
173 
174 if ('jls.keep' in _native.core.properties) {
175     var previousBoot = _native.core.boot;
176     _native.core.boot = function() {
177         try {
178             previousBoot.apply(this, arguments);
179         } catch (e) {
180             jls.lang.System.err.println('Error during boot, hit ctrl-c to end.');
181             jls.lang.Exception.wrap(e).printStackTrace(jls.lang.System.err);
182             // Start an infinite non daemon thread
183             var thread = new jls.lang.Thread();
184             thread.run = function() {
185                 while (true) {
186                     jls.lang.Thread.sleep(500);
187                 }
188             };
189             thread.start();
190         }
191     };
192 }
193