blob: 921dc02a066c4c9a203b4b34b36f28509b108020 [file] [log] [blame]
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;
}
};