(function(window)
{
var Gitana = window.Gitana;
Gitana.Definition = Gitana.Node.extend(
/** @lends Gitana.Definition.prototype */
{
/**
* @constructs
* @augments Gitana.Node
*
* @class Definition
*
* @param {Gitana.Branch} branch
* @param [Object] object json object (if no callback required for populating)
*/
constructor: function(branch, object)
{
this.base(branch, object);
this.objectType = function() { return "Gitana.Definition"; };
},
/**
* @override
*/
clone: function()
{
return this.getFactory().definition(this.getBranch(), this);
},
/**
* Acquires a list of associations of type "a:has_form" for this definition.
*
* @chaining node map
*
* @public
*/
listFormAssociations: function()
{
var self = this;
var uriFunction = function()
{
return self.getUri() + "/forms";
};
var chainable = this.getFactory().nodeMap(this.getBranch());
return this.chainGet(chainable, uriFunction);
},
/**
* Reads a form by form key that is associated to this definition.
*
* @public
*
* @param {String} formKey the form key
*/
readForm: function(formKey)
{
var self = this;
var uriFunction = function()
{
return self.getUri() + "/forms/" + formKey;
};
var chainable = this.getFactory().form(this.getBranch());
return this.chainGet(chainable, uriFunction);
},
/**
* Creates a form and associates it to this definition.
*
* @public
*
* @param {String} formKey the form key
* @param [Object] object the object that constitutes the form
* @param [String] formPath optional formPath to pass to create node
*/
createForm: function(formKey, formObject, formPath)
{
var self = this;
if (typeof(formObject) === "string")
{
formPath = formObject;
formObject = null;
}
// set up form object
if (!formObject)
{
formObject = {};
}
formObject["_type"] = "n:form";
var chainable = this.getFactory().form(this.getBranch());
// subchain that want to hand back
var result = this.subchain(chainable);
// now push our logic into a subchain that is the first thing in the result
result.subchain(this.getBranch()).createNode(formObject, formPath).then(function() {
var formNode = this;
// switch to definition node
this.subchain(self).then(function() {
var associationObject = {
"_type": "a:has_form",
"form-key": formKey
};
this.associate(formNode, associationObject).then(function() {
var association = this;
// read back into the form chainable
var uri = "/repositories/" + formNode.getRepositoryId() + "/branches/" + formNode.getBranchId() + "/nodes/" + formNode.getId();
this.getDriver().gitanaGet(uri, null, {}, function(response) {
result.handleResponse(response);
association.next();
});
// we manually signal when this then() is done
return false;
});
});
});
return result;
},
/**
* Convenience function to remove a form linked to this definition.
* Note: This doesn't delete the form, it simply unlinks the association.
*
* @chained this
*
* @public
*
* @param {String} formKey the form key
*/
removeFormAssociation: function(formKey)
{
return this.subchain(this).then(function() {
var association = null;
this.listFormAssociations().each(function() {
if (this.getFormKey() == formKey)
{
association = this;
}
}).then(function() {
if (association)
{
this.subchain(association).del();
}
});
});
}
});
Gitana.ObjectFactory.register("d:type", Gitana.Definition);
Gitana.ObjectFactory.register("d:feature", Gitana.Definition);
Gitana.ObjectFactory.register("d:association", Gitana.Definition);
})(window);