function ExportPackage(header, exportingBundle) {
	if (header === null)
		throw "header cannot be null";

	if (exportingBundle === null)
		throw "exportingBundle cannot be null";

	this._name = null;
	this._version = Version.EMPTY_VERSION;
	this._attributes = {};
	this._directives = {};
	this._mandatory = [];
	this._exportingBundle = exportingBundle;

	_parseExport(header);
}

ExportPackage.prototype = {
	_parseExport : function(header) {
		var tokens = header.split(Constants.PARAMETER_DELIMITER);
		this._name = tokens[0].replace(/^\s+|\s+$/g, '');
		for ( var i = 1; i < tokens.length; i++) {
			var token = tokens[i];
			if (token.indexOf(Constants.DIRECTIVE_EQUALS) !== -1)
				this._parseDirective(token);
			else if (token.indexOf(Constants.ATTRIBUTE_EQUALS) !== -1)
				this._parseAttribute(token);
			else
				throw "bad export syntax: " + token + " in " + header;
		}
	},
	_parseAttribute : function(token) {
		var index = token.indexOf(Constants.ATTRIBUTE_EQUALS);
		var attributeName = token.substring(0, index).replace(/^\s+|\s+$/g, '');
		if (attributeName.length === 0)
			return;

		var value = token.substring(index + Constants.ATTRIBUTE_EQUALS.length).replace(/^\s+|\s+$/g, '');

		if (attributeName === Constants.VERSION_ATTRIBUTE)
			this._version = Version.parseVersion(value);

		this._attributes[attributeName] = value;
	},
	_parseDirective : function(token) {
		var index = token.indexOf(Constants.DIRECTIVE_EQUALS);
		var directiveName = token.substring(0, index).replace(/^\s+|\s+$/g, '');
		if (directiveName.length === 0)
			return;

		var value = token.substring(index + Constants.DIRECTIVE_EQUALS.length).replace(/^\s+|\s+$/g, '');
		if (directiveName === Constants.MANDATORY_DIRECTIVE)
			this._parseMandatory(value);

		this._directives[directiveName] = value;
	},
	_parseMandatory : function(value) {
		var tokens = value.split(Constants.MANDATORY_DELIMITER);
		for ( var i = 0; i < tokens.length; i++) {
			var token = tokens[i].replace(/^\s+|\s+$/g, '');
			if (token.length > 0)
				this._mandatory.push(token);
		}
	},
	getName : function() {
		return this._name;
	},
	getVersion : function() {
		return this._version;
	},
	getBundleId : function() {
		return this._exportingBundle.getBundleId();
	},
	getBundleSymbolicName : function() {
		return this._exportingBundle.getSymbolicName();
	},
	getBundleVersion : function() {
		return this._exportingBundle.getVersion();
	},
	getAttributes : function() {
		this._attributes;
	},
	getDirectives : function() {
		return this._directives;
	},
	getExportingbundle : function() {
		return this._exportingBundle;
	},
	getMandatory : function() {
		return this._mandatory;
	},
	_addToScope : function (scope) {
		var value = this._exportingBundle.lookup(this._name);
		var tokens = this._name.split(".");
		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 === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
					if (typeof value === "object") {
						var wrappedValue = {};
						wrappedValue.prototype = value;
						value = wrappedValue;
					}
					scope[token]= value;
					return;
				}
				throw "Resolve error: " + this._name + " already exists for " + this.toString();				
			}
			if (current === null || current === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
				current = scope[token];
				if (current === null || current === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
					current = {};
				} else if (typeof current === "object") {
					var wrappedCurrent = {};
					wrappedCurrent.prototype = current;
					current = wrappedCurrent;
				} else
					throw "Resolve error: " + this._name + "-" + token + " already exists for " + this.toString(); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
				scope[token] = current;
			}
			scope = current;
		}
	}
};
