(function(window)
{
var Gitana = window.Gitana;
Gitana.Association = Gitana.AbstractNode.extend(
/** @lends Gitana.Association.prototype */
{
/**
* @constructs
* @augments Gitana.AbstractNode
*
* @class Association
*
* @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.Association"; };
},
/**
* @OVERRIDE
*/
getType: function()
{
return Gitana.TypedIDConstants.TYPE_ASSOCIATION;
},
/**
* @override
*/
isAssociation: function()
{
return true;
},
/**
* @returns {String} the directionality of the association
*/
getDirectionality: function()
{
return this.get("directionality");
},
/**
* Gets the source node id for this association.
*
* @public
*
* @returns {String} source node id
*/
getSourceNodeId: function()
{
return this.get("source");
},
/**
* Gets the source node changeset id for this association.
*
* @public
*
* @returns {String} source node changeset id
*/
getSourceNodeChangesetId: function()
{
return this.get("source_changeset");
},
/**
* Gets the source node type for this association.
*
* @public
*
* @returns {String} source node type qname
*/
getSourceNodeType: function()
{
return this.get("source_type");
},
/**
* Gets the target node id for this association.
*
* @public
*
* @returns {String} target node id
*/
getTargetNodeId: function()
{
return this.get("target");
},
/**
* Gets the target node changeset id for this association.
*
* @public
*
* @returns {String} target node changeset id
*/
getTargetNodeChangesetId: function()
{
return this.get("target_changeset");
},
/**
* Gets the target node type for this association.
*
* @public
*
* @returns {String} target node type qname
*/
getTargetNodeType: function()
{
return this.get("target_type");
},
/**
* Reads the source node.
*
* @chained source node
*
* @public
*/
readSourceNode: function()
{
var self = this;
var result = this.subchain(this.getFactory().node(this.getBranch()));
return result.then(function() {
var chain = this;
this.subchain(self.getBranch()).readNode(self.getSourceNodeId()).then(function() {
chain.loadFrom(this);
});
});
},
/**
* Reads the target node.
*
* @chained target node
*
* @public
*/
readTargetNode: function()
{
var self = this;
var result = this.subchain(this.getFactory().node(this.getBranch()));
return result.then(function() {
var chain = this;
this.subchain(self.getBranch()).readNode(self.getTargetNodeId()).then(function() {
chain.loadFrom(this);
});
});
},
/**
* Given a node, reads back the other node of the association.
*
* @param {Object} node either a Gitana.Node or a string with the node id
*
* @chained other node
*
* @param node
*/
readOtherNode: function(node)
{
var self = this;
var nodeId = null;
if (Gitana.isString(node))
{
nodeId = node;
}
else
{
nodeId = node.getId();
}
var result = this.subchain(this.getFactory().node(this.getBranch()));
result.then(function() {
var chain = this;
this.subchain(self).then(function() {
if (nodeId == this.getSourceNodeId())
{
this.readTargetNode().then(function() {
chain.loadFrom(this);
});
}
else if (nodeId == this.getTargetNodeId())
{
this.readSourceNode().then(function() {
chain.loadFrom(this);
});
}
else
{
var err = new Gitana.Error();
err.name = "No node on association";
err.message = "The node: " + nodeId + " was not found on this association";
this.error(err);
return false;
}
});
});
return result;
},
/**
* NOTE: this is not a chained function
*
* Given a node, determines what direction this association describes.
*
* If the association's directionality is UNDIRECTED, the direction is MUTUAL.
*
* If the association's directionality is DIRECTED...
* If the node is the source, the direction is OUTGOING.
* If the node is the target, the direction is INCOMING.
*
* @param {Object} node either a Gitana.Node or a string with the node id
*
* @returns {String} the direction or null if the node isn't on the association
*/
getDirection: function(node)
{
var nodeId = null;
if (Gitana.isString(node))
{
nodeId = node;
}
else
{
nodeId = node.getId();
}
var direction = null;
if (this.getDirectionality() == "UNDIRECTED")
{
direction = "MUTUAL";
}
else
{
if (this.getSourceNodeId() == nodeId)
{
direction = "OUTGOING";
}
else if (this.getTargetNodeId() == nodeId)
{
direction = "INCOMING";
}
}
return direction;
},
/**
* NOTE: this is not a chained function.
*
* Determines the node id of the other node.
*
* @param {Object} node either a Gitana.Node or a string with the node id
*
* @returns {String} the id of the other node
*/
getOtherNodeId: function(node)
{
var nodeId = null;
if (Gitana.isString(node))
{
nodeId = node;
}
else
{
nodeId = node.getId();
}
var otherNodeId = null;
if (this.getSourceNodeId() == nodeId)
{
otherNodeId = this.getTargetNodeId();
}
else if (this.getTargetNodeId() == nodeId)
{
otherNodeId = this.getSourceNodeId();
}
return otherNodeId;
}
});
})(window);