this.min_granularity = this.default_granularity;
// the data contains slice names, and lease_id, we need this to find our own leases (mine)
- this.paper=null;
+ this._paper=null;
/* XXX Events */
* All resources
* ------------------------------------------------------------------ */
+ on_all_resources_query_in_progress: function() {
+ console.log("all resources query in progress");
+ },
+
on_all_resources_new_record: function(record)
{
if ((typeof record.exclusive != 'undefined') && (record.exclusive)) {
// this.initial_leases=leases;
},
+ on_lease_field_state_changed: function(data)
+ {
+ var lease = data.value;
+ var urn = lease[0];
+ var start_time = lease[1];
+
+ var lease_element = this._lease_element_find(urn, start_time);
+ if (!lease_element) {
+ console.log("Alert: lease element not found");
+ return;
+ }
+
+ switch(data.request) {
+ case FIELD_REQUEST_ADD:
+ case FIELD_REQUEST_ADD_RESET:
+ this._leases.push(data.value);
+ this._lease_init_mine(lease_element);
+ break;
+ case FIELD_REQUEST_REMOVE:
+ case FIELD_REQUEST_REMOVE_RESET:
+ // We remove data.value (aka keep those leases different from data.value
+ this._leases = $.grep(this._leases, function(x) { return x != data.value; });
+ this._lease_init_free(lease_element);
+ break;
+ default:
+ break;
+
+ }
+ },
+
on_lease_query_done: function(record)
{
/* We have received all resources */
return result;
},
+ /* Iterative search through raphael.js objects, no forEach, no getById in the current version */
+ _lease_element_find: function(urn, start_time)
+ {
+ var date = new Date(start_time*1000);
+ var pos = this._paper.top;
+ while (pos) {
+ if (pos.key == urn + "-" + date)
+ return pos;
+ pos = pos.prev;
+ }
+ return null;
+ },
+
/**
* @brief Draw
*/
/* reuse for paper if exists with same size, or (re-)create otherwise */
var paper;
- if (this.paper == null) {
+ if (this._paper == null) {
paper = Raphael (canvas_id, total_width + o.x_sep, total_height);
- } else if (this.paper.width==total_width && this.paper.height==total_height) {
- paper=this.paper;
+ } else if (this._paper.width==total_width && this._paper.height==total_height) {
+ paper=this._paper;
paper.clear();
} else {
$("#"+canvas_id)[0].innerHTML="";
//this.elmt().html();
paper = Raphael (canvas_id, total_width + o.x_sep, total_height);
}
- this.paper = paper;
+ this._paper = paper;
/* the path for the triangle-shaped buttons */
var timebutton_path = "M1,0L"+(this.options.leases_w-1)+",0L"+(this.options.leases_w/2)+","+o.y_header+"L1,0";
lease.initial = "other";
this._lease_init_other(lease, slicename);
}
+
lease.from_time = axisx[grain % this.nb_grains()][0];
grain += duration;
lease.until_time = axisx[grain % this.nb_grains()][0];
+
+ /* We set a key to the lease element to find it later in the paper thanks to this._lease_element_find() */
+ lease.key = urn + '-' + lease.from_time;
+
// and vice versa
this._lease_elements.push(lease);
// move on with the loop
//this.urn
//this.until_time
var urn = this.urn
- var start_time = new Date(this.from_time).getTime() / 1000;
- var end_time = new Date(this.until_time).getTime() / 1000;
+ var start_time = this.from_time.getTime() / 1000;
+ var end_time = this.until_time.getTime() / 1000;
var duration = (end_time - start_time) / 1800; // XXX HARDCODED LEASE GRAIN
/* Add a new lease : XXX should be replaced by a dictionary */
+ /*
// Do we have a lease with the same urn just before or just after ?
- var removeIdBefore = null;
- var removeIdAfter = null;
+ //var removeIdBefore = null;
+ //var removeIdAfter = null;
+ var remove_lease_before = null;
+ var remove_lease_after = null;
+ // It is important to group leases, while this is technically
+ // equivalent, some testbeds such as IotLab limit the number of
+ // leases a user can have.
+ // XXX we might have several leases before or after if they have
+ // XXX not been grouped like this tool does
$.each(scheduler._leases, function(i, lease) {
if (lease[0] == urn) {
if (lease[1] + lease[2] * 1800 == start_time) { // XXX HARDCODED LEASE GRAIN
// Merge with previous lease
- removeIdBefore = i;
- start_time = lease[1];
- duration += lease[2];
+ // removeIdBefore = i;
+ remove_lease_before = lease;
+ start_time = lease[1];
+ duration += lease[2];
}
if (lease[1] == end_time) {
// Merge with following lease
- removeIdAfter = i;
- duration += lease[2];
+ // removeIdAfter = i;
+ remove_lease_after = lease;
+ duration += lease[2];
}
}
});
- if (removeIdBefore != null) {
- scheduler._leases.splice(removeIdBefore , 1);
- if (removeIdAfter != null)
- removeIdAfter -= 1;
- }
- if (removeIdAfter != null) {
- scheduler._leases.splice(removeIdAfter , 1);
- }
-
- scheduler._leases.push([this.urn, start_time, duration]);
+ //if (removeIdBefore != null) {
+ // scheduler._leases.splice(removeIdBefore , 1);
+ // if (removeIdAfter != null)
+ // removeIdAfter -= 1;
+ //}
+ //if (removeIdAfter != null) {
+ // scheduler._leases.splice(removeIdAfter , 1);
+ //}
+
+ // We add the new lease, no need to push
+ var new_lease = [this.urn, start_time, duration];
+
+ // We send events, manifold will inform us about the change and we will react accordingly
+ /*
+ if (remove_lease_before != null)
+ manifold.raise_event(scheduler.options.query_lease_uuid, SET_REMOVED, remove_lease_before);
+ if (remove_lease_after != null)
+ manifold.raise_event(scheduler.options.query_lease_uuid, SET_REMOVED, remove_lease_after);
+ */
+ manifold.raise_event(scheduler.options.query_lease_uuid, SET_ADD, new_lease);
+ //scheduler._leases.push([this.urn, start_time, duration]);
//console.log(scheduler._leases);
//jQuery.publish('/update-set/' + scheduler.options.query_uuid, [scheduler._leases]);
/* We need to inform manifold about the whole diff, in addition to maintaining our own structure */
- jQuery.publish('/update-set/' + scheduler.options.lease_query_uuid, [scheduler._leases]);
+ event.preventDefault();
},
_lease_init_mine: function (lease, unclick)
// we free just this lease
//console.log('this is mine');
scheduler._lease_init_free(this, scheduler._lease_click_mine);
+ event.preventDefault();
},