| orion.Loader = function(framework){}; |
| orion.Loader.prototype = { |
| resolve : function(bundle){}, |
| unresolve : function(bundle){}, |
| load : function(bundle, name){} |
| }; |
| |
| orion.ModuleLoader = function(framework) { |
| this._framework = framework; |
| this._bundleScopes = {}; |
| }; |
| |
| orion.ModuleLoader.prototype = { |
| resolve : function(bundle) { |
| var namedExports = {}; |
| var jsExport = null; |
| var i = 0; |
| // process imports (first) |
| var imports = bundle.getImports(); |
| for (i = 0; i < imports.length; i++) { |
| var jsImport = imports[i]; |
| var jsExport = jsImport.getWiredExport(); |
| if (!jsExport) |
| continue; // optional |
| var name = jsExport.getName(); |
| if (name.charAt(0) == "/") |
| continue; // resource |
| if (!namedExports.hasOwnProperty(name)) |
| namedExports[name] = jsImport.getWiredExport(); |
| } |
| |
| var names = []; |
| var exportName = null; |
| for (exportName in namedExports) { |
| if (namedExports.hasOwnProperty(exportName)) |
| names.push(exportName); |
| } |
| |
| // this sorts the set of names we'll be importing alphabetically and |
| // perhaps more importantly will allow us to create the shorter/parent dotted entries first |
| names.sort(); |
| |
| var importScope = {}; |
| for (i = 0; i < names.length; i++) { |
| exportName = names[i]; |
| jsExport = namedExports[exportName]; |
| this._addToScope(importScope, jsExport); |
| } |
| |
| this._evalScript(importScope, bundle); |
| }, |
| _evalScript : function(importScope, bundle) { |
| var parameterNames = ["bundleContext"]; |
| var parameterValues = [this._framework._getBundleContext(bundle)]; |
| var parameterName = null; |
| for (parameterName in importScope) { |
| if (importScope.hasOwnProperty(parameterName)) { |
| parameterNames.push(parameterName); |
| parameterValues.push(importScope[parameterName]); |
| } |
| } |
| |
| var exportNames = []; |
| var exports = bundle.getExports(); |
| for (var i = 0; i < exports.length; i++) { |
| var exportName = exports[i].getName(); |
| if (exportName.charAt(0) == "/") |
| continue; // resource |
| var dotIndex = exportName.indexOf("."); |
| if (dotIndex !== -1) |
| exportName = exportName.substring(0,dotIndex); |
| |
| if (! exportNames.hasOwnProperty(exportName)) { |
| exportNames[exportName] = true; |
| exportNames.push(exportName + ":" + exportName); |
| } |
| } |
| |
| var parameterStatement = parameterNames.join(","); |
| var returnStatement = "\n\nreturn {" + exportNames.join(",") + "};"; |
| |
| var finalScript = bundle._script + returnStatement; |
| // var load = new Function(parameterStatement, finalScript); |
| var load = orion.Framework._eval("(function("+parameterStatement+") {\n" + finalScript + "\n})//@ sourceURL=" + bundle.getLocation()); |
| this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()] = load.apply(null, parameterValues); |
| }, |
| _addToScope: function(scope, jsExport) { |
| var value = this.load(jsExport.getExportingBundle(), jsExport.getName()); |
| var tokens = jsExport.getName().split("."); |
| var _Wrapper = function() {}; |
| var i = 0; |
| while (true) { |
| var token = tokens[i++]; |
| var current = null; |
| if (scope.hasOwnProperty(token)) { |
| current = scope[token]; |
| } |
| if (i === tokens.length) { |
| if (current === null || current === undefined) { |
| if (typeof value === "object") { |
| _Wrapper.prototype = value; |
| value = new _Wrapper(); |
| } |
| scope[token]= value; |
| return; |
| } |
| throw "Resolve error: " + jsExport.getName() + " already exists."; |
| } |
| if (current === null || current === undefined) { |
| current = scope[token]; |
| if (current === null || current === undefined) { |
| current = {}; |
| } else if (typeof current === "object") { |
| _Wrapper.prototype = current; |
| current = new _Wrapper(); |
| } else |
| throw "Resolve error: " + jsExport.getName() + "-" + token + " already exists."; |
| scope[token] = current; |
| } |
| scope = current; |
| } |
| }, |
| unresolve : function (bundle) { |
| delete this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()]; |
| }, |
| load : function(bundle, name) { |
| var value = this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()]; |
| if (value === null || value === undefined) { |
| return undefined; |
| } |
| var names = name.split("."); |
| for ( var i = 0; i < names.length; i++) { |
| if (value === null || value === undefined) { |
| return undefined; |
| } |
| value = value[names[i]]; |
| } |
| return value; |
| } |
| }; |