(function(window) {
/**
* @ignore
*/
var Gitana = window.Gitana;
Gitana.Context = Gitana.Chainable.extend(
/** @lends Gitana.Context.prototype */
{
/**
* @constructs
* @augments Gitana.Chainable
*
* @class Utility class for providing Gitana context
*
* @param [Object] configs Configuration parameters
*/
constructor: function(configs) {
this.base(new Gitana(configs['driver'] ? configs['driver'] : {}));
// cache
if (!this.cache) {
this.cache = {};
}
this.cache["repository"] = null;
this.cache["branch"] = null;
this.cache["platform"] = null;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//
// privileged methods
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
this.getConfigs = function() {
return configs;
};
this.getRepositoryConfigs = function() {
var repositoryConfigs = configs['repository'];
if (typeof repositoryConfigs == "string") {
repositoryConfigs = {
"repository" : repositoryConfigs
};
}
return repositoryConfigs;
};
this.getBranchConfigs = function() {
var branchConfigs = configs['branch'] ? configs['branch'] : 'master';
if (typeof branchConfigs == "string") {
if (branchConfigs == 'master') {
branchConfigs = {
'type' : 'MASTER'
};
} else {
branchConfigs = {
"_doc" : branchConfigs
};
}
}
return branchConfigs;
};
this.getUserConfigs = function() {
return configs['user'];
};
this.getDriverConfigs = function() {
return configs['driver'];
};
},
platform: function(platform)
{
if (platform || platform === null) {
this.cache.platform = platform;
}
return this.cache.platform ? Chain(this.cache.platform) : null;
},
repository: function(repository)
{
if (repository || repository === null) {
this.cache.repository = repository;
}
return this.cache.repository ? Chain(this.cache.repository) : null;
},
branch: function(branch)
{
if (branch || branch === null) {
this.cache.branch = branch;
}
return this.cache.branch ? Chain(this.cache.branch) : null;
},
/**
* Hands back an initialized version of the Gitana Context object
*
* @chained gitana context
*/
init: function () {
var self = this;
var loadPlatform = function(successCallback, errorCallback)
{
if (!self.platform())
{
var authentication = self.getConfigs()["authentication"];
self.getDriver().authenticate(authentication, function(http) {
if (errorCallback) {
errorCallback({
'message': 'Failed to login Gitana.',
'reason': 'INVALID_LOGIN',
'error': http
});
}
}).then(function() {
self.platform(this);
// now move on to repository
loadRepository(successCallback, errorCallback);
});
}
else
{
loadRepository(successCallback, errorCallback);
}
};
var loadRepository = function(successCallback, errorCallback)
{
if (!self.repository())
{
self.platform().trap(function(error) {
if (errorCallback) {
errorCallback({
'message': 'Failed to get repository',
'error': error
});
}
}).queryRepositories(self.getRepositoryConfigs()).count(function(count) {
if (errorCallback) {
if (count == 0) {
errorCallback({
'message': 'Cannot find any repository'
});
}
if (count > 1) {
errorCallback({
'message': 'Found more than one repository'
});
}
}
}).keepOne().then(function() {
self.repository(this);
// now move on to branch
loadBranch(successCallback, errorCallback);
});
}
else
{
loadBranch(successCallback, errorCallback);
}
};
var loadBranch = function(successCallback, errorCallback)
{
if (!self.branch())
{
self.repository().trap(function(error) {
if (errorCallback) {
errorCallback({
'message': 'Failed to get branch',
'error': error
});
}
}).queryBranches(self.getBranchConfigs()).count(function(count) {
if (errorCallback) {
if (count == 0) {
errorCallback({
'message': 'Cannot find any branch'
});
}
if (count > 1) {
errorCallback({
'message': 'Found more than one branch'
});
}
}
}).keepOne().then(function() {
self.branch(this);
// now fire the success callback
successCallback.call();
});
}
else
{
// fire the success callback
successCallback.call();
}
};
// we hand back a chained version of ourselves
var result = Chain(this);
// preload work onto the chain
return result.subchain().then(function() {
var chain = this;
loadPlatform(function() {
// success, advance chain manually
chain.next();
}, function(err) {
var errorCallback = self.getConfigs()['error'];
if (errorCallback)
{
errorCallback.call(self, err);
}
});
// return false so that the chain doesn't complete until we manually complete it
return false;
});
}
});
/**
* Static helper function to build and init a new context.
*
* @param config
*/
Gitana.Context.create = function(config)
{
var context = new Gitana.Context(config);
return context.init();
};
})(window);