blob: 827554e782c93e9bae0297979f7e1b256e055fde [file] [log] [blame]
orion.Bundle = function(framework, bundleId, location, headers) {
this._framework = framework;
this._bundleId = bundleId;
this._location = location;
this._headers = headers || eval("(" + orion.Framework._fetch(location + "/META-INF/manifest.json") + ")"); //naughty
this._name = null;
this._version = null;
this._singleton = false;
this._imports = [];
this._exports = [];
this._resources = {};
this._globals = [];
this._state = orion.Bundle.INSTALLED;
this._scope = {};
this._bundleContext = null;
this._script = null;
this._parseName(this._headers.name);
this._parseVersion(this._headers.version);
this._parseSingleton(this._headers.singleton);
this._parseImports(this._headers.imports);
this._parseExports(this._headers.exports);
this._parseResources(this._headers.resources);
this._parsePath(this._headers.path);
this._parseGlobals(this._headers.globals);
};
orion.Bundle.UNINSTALLED = 1;
orion.Bundle.INSTALLED = 2;
orion.Bundle.RESOLVED = 4;
orion.Bundle.prototype = {
getName : function() {
return this._name;
},
getVersion : function() {
return this._version;
},
getBundleId : function() {
return this._bundleId;
},
getLocation : function() {
return this._location;
},
getHeaders : function() {
return this._headers;
},
getState : function() {
return this._state;
},
getEntry : function(path) {
if (!path || !path instanceof String || !this._resources[path])
return null;
return this.getLocation() + path;
},
getResource : function(path) {
if (!path || !path instanceof String)
return null;
var i = 0;
var resource;
for (i = 0; i < this._imports.length; i++) {
var jsImport = this._imports[i];
var jsExport = jsImport.getWiredExport();
if (!jsExport)
continue; // optional
var name = jsExport.getName();
if (name.charAt(0) != "/")
continue; // not a resource
if (path.indexOf(name)==0) {
resource = jsExport.getExportingBundle().getEntry(path);
if (resource)
return resource;
}
}
return this.getEntry(path);
},
getImports : function() {
return this._imports;
},
getExports : function() {
return this._exports;
},
equals : function(other) {
if (this === other)
return true;
if (!other instanceof orion.Bundle)
return false;
if (this._name !== other._name)
return false;
if (this._version === null) {
if (other._version !== null)
return false;
} else if (!this._version.equals(other._version))
return false;
return true;
},
uninstall : function() {
this._state = orion.Bundle.UNINSTALLED;
},
load : function(name) {
return this._framework._loader.load(this, name);
},
_isSingleton : function() {
return this._singleton;
},
_getImports : function() {
return this._imports;
},
_getExports : function() {
return this._exports;
},
_resolve : function() {
this._framework._loader.resolve(this);
this._state = orion.Bundle.RESOLVED;
},
_unresolve : function() {
this._framework._loader.unresolve(this);
if (this._state == orion.Bundle.RESOLVED)
this._state = orion.Bundle.INSTALLED;
},
_parseName : function(header) {
this._name = header;
},
_parseSingleton : function(header) {
if (typeof header == "boolean")
this._singleton = header;
},
_parseVersion : function(header) {
this._version = orion.Version.parseVersion(header);
},
_parseGlobals : function(header) {
if (!header)
return;
for ( var i = 0; i < header.length; i++) {
if (header[i]) {
this._globals.push(header[i]);
}
}
},
_parseResources : function(header) {
if (!header)
return;
for ( var i = 0; i < header.length; i++) {
if (header[i]) {
this._resources[header[i]] = true;
}
}
},
_parseExports : function(header) {
if (!header)
return;
for ( var i = 0; i < header.length; i++) {
var jsExport = new orion.Export(header[i], this);
if (jsExport !== null)
this._exports.push(jsExport);
}
},
_parseImports : function(header) {
if (!header)
return;
for ( var i = 0; i < header.length; i++) {
var jsImport = new orion.Import(header[i]);
if (jsImport !== null)
this._imports.push(jsImport);
}
},
_parsePath : function(header) {
if (!header) {
this._script = this._headers.script || "";
return;
}
var scripts = [];
for ( var i = 0; i < header.length; i++) {
var path = header[i];
if (path === ".") {
scripts[i] = this._headers.script || "";
} else {
var scriptURL = this.getResource(path);
scripts[i] = orion.Framework._fetch(scriptURL);
}
}
this._script = scripts.join("\n\n");
}
};