      1 /*
      2  *  Copyright (C) 2008-2009 WaveMaker Software, Inc.
      3  *
      4  *  This file is part of the WaveMaker Client Runtime.
      5  *
      6  *  Licensed under the Apache License, Version 2.0 (the "License");
      7  *  you may not use this file except in compliance with the License.
      8  *  You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  *  Unless required by applicable law or agreed to in writing, software
     13  *  distributed under the License is distributed on an "AS IS" BASIS,
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  */
     18 dojo.provide("wm.base.components.ServiceQueue");
     19
     20 dojo.declare("wm.ServiceQueue", wm.Component, {
     21 	services: "",
     22 	init: function() {
     23 		this._services = [];
     24 		this._serviceConnections = [];
     25 		this.inherited(arguments);
     26 	},
     27 	getServicesCount: function() {
     28 		return this._services && this._services.length;
     29 	},
     30 	getServicesList: function() {
     31 		for (var i=0, l=[], ss=this.services.split(","), s, v; (s=ss[i]); i++) {
     32 			v = this.getValueById(dojo.string.trim(s));
     33 			if (v)
     34 				l.push(v);
     35 		}
     36 		return l;
     37 	},
     38 	update: function() {
     39 		this.beginUpdate();
     40 	},
     41 	beginUpdate: function() {
     42 		this._services = this.getServicesList();
     43 		this.connectServices();
     44 		this._currentService = 0;
     45 		this.updateNextService();
     46 	},
     47 	getCurrentService: function() {
     48 		return this._services[this._currentService];
     49 	},
     50 	updateNextService: function() {
     51 		if (this._currentService < this.getServicesCount()) {
     52 			var s = this.getCurrentService();
     53 			this._currentService++;
     54 			s.update();
     55 		} else
     56 			this.completeUpdate();
     57 	},
     58 	completeUpdate: function() {
     59 		this.disconnectServices();
     60 	},
     61 	abortUpdate: function() {
     62 		this.disconnectServices();
     63 	},
     64 	connectServices: function() {
     65 		this.disconnectServices();
     66 		dojo.forEach(this._services, dojo.hitch(this, function(s) {
     67 			this._serviceConnections.push(dojo.connect(s, "onResult", this, "updateNextService"));
     68 			this._serviceConnections.push(dojo.connect(s, "onError", this, "abortUpdate"));
     69 		}));
     70 	},
     71 	disconnectServices: function() {
     72 		dojo.forEach(this._serviceConnections, function(s) {
     73 			dojo.disconnect(s);
     74 		});
     75 	}
     76 });
     77
     78 wm.ServiceQueue.extend({
     79 	getAvailableServicesList: function() {
     80 		var d = wm.listComponentIds([studio.application, studio.page], wm.ServiceVariable);
     81 		d = d.concat(wm.listComponentIds([studio.application, studio.page], wm.NavigationCall));
     82 		// don't show this!
     83 		var i = dojo.indexOf(d, this.owner.getId());
     84 		if (i != -1)
     85 			d.splice(i, 1);
     86 		return d;
     87 	},
     88 	write: function(inIndent) {
     89 		return this.services ? this.inherited(arguments): null;
     90 	}
     91 });
     92