You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xap-commits@incubator.apache.org by mt...@apache.org on 2006/10/04 17:11:55 UTC

svn commit: r452940 - in /incubator/xap/trunk: WebContent/examples/dataBinding/ src/xap/data/bridge/ src/xap/data/datasource/

Author: mturyn
Date: Wed Oct  4 10:11:54 2006
New Revision: 452940

URL: http://svn.apache.org/viewvc?view=rev&rev=452940
Log:
Cleaned up code, tried to make difference between the "source" (the base object used as a data source) and additional script source brought in via na optional URI.

Modified:
    incubator/xap/trunk/WebContent/examples/dataBinding/Employees.js
    incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.html
    incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.xal
    incubator/xap/trunk/src/xap/data/bridge/DataSourceBridge.js
    incubator/xap/trunk/src/xap/data/bridge/JavascriptDataSourceBridge.js
    incubator/xap/trunk/src/xap/data/datasource/AbstractDataSource.js
    incubator/xap/trunk/src/xap/data/datasource/JavascriptDataSource.js

Modified: incubator/xap/trunk/WebContent/examples/dataBinding/Employees.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/WebContent/examples/dataBinding/Employees.js?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/WebContent/examples/dataBinding/Employees.js (original)
+++ incubator/xap/trunk/WebContent/examples/dataBinding/Employees.js Wed Oct  4 10:11:54 2006
@@ -52,7 +52,8 @@
 }
 
 
-					
+// for JSON's sake:
+new Employees() ;					
 							
 
 

Modified: incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.html
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.html?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.html (original)
+++ incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.html Wed Oct  4 10:11:54 2006
@@ -39,7 +39,7 @@
 							"xap.data.bridge.JavascriptDataSourceBridge",							
 							"xap.data.bridge.ObjectDataSourceBridge",
 							"xap.data.controller.ContextFrame",		
-							//"xap.data.controller.Iterator",
+							"xap.data.controller.Iterator",
 							"xap.data.datasource.AbstractDataSet",
 							"xap.data.datasource.AbstractDataSource",							
 							"xap.data.datasource.ArrayDataSet",
@@ -52,7 +52,8 @@
 							"xap.session.DeclarativeArgumentParser",
 							"xap.taghandling.AbstractTagImpl",							
 							"xap.taghandling.AttributeConverter",
-							"xap.xml.dom.Document"																							
+							"xap.xml.dom.Document",
+							"xap.Xap"																							
 							) ;
 		Xap._loadDebuggables() ;
 							

Modified: incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.xal
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.xal?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.xal (original)
+++ incubator/xap/trunk/WebContent/examples/dataBinding/javascriptDatasource.xal Wed Oct  4 10:11:54 2006
@@ -5,7 +5,7 @@
 		xmlns="http://www.openxal.org/data"
 		id="myDataSource"
 		source="new Employees()"
-		uri="Employees.js"
+		path="Employees.js"
 	/>	
 	
 	

Modified: incubator/xap/trunk/src/xap/data/bridge/DataSourceBridge.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/src/xap/data/bridge/DataSourceBridge.js?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/src/xap/data/bridge/DataSourceBridge.js (original)
+++ incubator/xap/trunk/src/xap/data/bridge/DataSourceBridge.js Wed Oct  4 10:11:54 2006
@@ -54,6 +54,7 @@
 };
 Xap.setupClassAsSubclassOf("xap.data.bridge.DataSourceBridge", "xap.data.bridge.DataFrameworkBridge");
 xap.data.bridge.DataSourceBridge.SOURCE_ATTRIBUTE = "source";
+xap.data.bridge.DataSourceBridge.PATH_ATTRIBUTE = "path";
 xap.data.bridge.DataSourceBridge.NULL_SOURCE_MSGID = "nullSourceObject";
 xap.data.bridge.DataSourceBridge.ID_IS_NOT_SPECIFIED_MSGID = "idNotSpecified";
 
@@ -76,7 +77,7 @@
 /**
  * Implementation of the DataChangeListener interface,
  * fires the "onDataChanged" XML event.
- * @param source{DataSourceImpl}
+ * @param source{AbstractDataSource}
  */
 xap.data.bridge.DataSourceBridge.prototype.onDataChanged = function (source) {
 	this.fireEvent( "onDataChanged", null, null, null) 

Modified: incubator/xap/trunk/src/xap/data/bridge/JavascriptDataSourceBridge.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/src/xap/data/bridge/JavascriptDataSourceBridge.js?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/src/xap/data/bridge/JavascriptDataSourceBridge.js (original)
+++ incubator/xap/trunk/src/xap/data/bridge/JavascriptDataSourceBridge.js Wed Oct  4 10:11:54 2006
@@ -19,7 +19,7 @@
 //import java.net.MalformedURLException;
 Xap.provide("xap.data.bridge.JavascriptDataSourceBridge");
 //superclass:
-Xap.require("xap.data.datasource.AbstractDataSource") ;
+Xap.require("xap.data.bridge.DataSourceBridge") ;
 
 Xap.require("xap.session.EventHandler") ;
 // Xap.require("xap.mco.McoInvocationException") ;
@@ -71,15 +71,11 @@
 //protected DataSource
 xap.data.bridge.JavascriptDataSourceBridge.prototype.createDataSource = function () {
 	/*String*/
-    var uri = this.getElement().getAttribute( "uri" ) ;
+    var uri = this.getElement().getAttribute( xap.data.bridge.DataSourceBridge.PATH_ATTRIBUTE ) ;
 	/*DataSource*/
 	var dataSource = null;
 	try {
-		if( uri ){
-			dataSource = new xap.data.datasource.JavascriptDataSource(this,uri);		
-		} else {
-			dataSource = new xap.data.datasource.JavascriptDataSource(this);				
-		}
+		dataSource = new xap.data.datasource.JavascriptDataSource(this,uri);		
 	}
 	catch (e) { //AttributeConversionException
 //		this.reportInvalidXmlException( xap.data.XmlDataTokens.CLASS, className,
@@ -112,8 +108,19 @@
 		var dataSource = this.getDataSource();
 		/*String*/
 		var sourceString = dataSourceElement.getAttribute(xap.data.bridge.DataSourceBridge.SOURCE_ATTRIBUTE);
-		// Might not do this for this class: this.setRefreshOnPropertyChange(dataSource);
+		this.setRefreshOnPropertyChange(dataSource);
 		this.setSource(dataSource, sourceString);
+		
+		// Path to the script defining the object source references
+		// ---e.g. "source='theArray'" will only be resoluble in
+		// the context of the code from this path, or objects previously
+		// brought into scope some other way---the second possibility's
+		// existence makes this attribute optional:
+		var pathString = dataSourceElement.getAttribute(xap.data.bridge.DataSourceBridge.PATH_ATTRIBUTE);
+		if( pathString && pathString != null && pathString.length>0){
+			this.setRefreshOnPropertyChange(dataSource);
+			this.setPath(dataSource, pathString) ;
+		}
 	}
 	catch (e) {
 			// TODO: Decide what sort of exception 
@@ -141,9 +148,8 @@
  * @private
  * @param dataSource{ObjectDataSource}
  */
-/*  My guess is we won't need this for now (just ONE_TIME/ONE_WAY, but...
 xap.data.bridge.JavascriptDataSourceBridge.prototype.setRefreshOnPropertyChange = function (dataSource) {
-	var refreshOnPropertyChange = this.getElement().getAttribute(REFRESH_ON_PROPERTY_CHANGE_ATTRIBUTE);
+	var refreshOnPropertyChange = this.getElement().getAttribute(xap.data.bridge.JavascriptDataSourceBridge.REFRESH_ON_PROPERTY_CHANGE_ATTRIBUTE);
 	if (refreshOnPropertyChange != null) {
 		refreshOnPropertyChange = refreshOnPropertyChange.trim().toLowerCase();
 		if (refreshOnPropertyChange.equals("true")) {
@@ -157,7 +163,7 @@
 		}
 	}
 };
-*/
+
 /**
  * @private
  * @param dataSource{ObjectDataSource}
@@ -167,10 +173,6 @@
 xap.data.bridge.JavascriptDataSourceBridge.prototype.setSource = function (dataSource, sourceString) {
 	/*EventHandler*/
 	this.eventHandler = this.getSession().getEventHandler();
-	// If we needed to prepend with javascript: first, as we may well do 
-	// for ObjectDataSourceBridge, we'd add the following to the
-	// next condition:
-	//&& (sourceString.match(xap.data.datasource.JavascriptDataSource.JS_SOURCE_SIGNATURE) != null)	
 	if (sourceString != null 
 		&& sourceString.trim().length != 0 
 			) {
@@ -180,6 +182,29 @@
 	//var lock = this.getElement().getOwnerDocument().getDomSynchronizationObject();
 	//synchronized( lock ) {
 	this.getElement().setAttribute(xap.data.bridge.DataSourceBridge.SOURCE_ATTRIBUTE, sourceString);
+	//}
+};
+
+
+
+/**
+ * @private
+ * @param dataSource{ObjectDataSource}
+ * @param sourceString{String}
+ * @throws MalformedURLException, McoException, EscapeSyntaxException  
+**/
+xap.data.bridge.JavascriptDataSourceBridge.prototype.setPath = function (dataSource, pathString) {
+	/*EventHandler*/
+	this.eventHandler = this.getSession().getEventHandler();
+	if (pathString != null 
+		&& pathString.trim().length != 0 
+			) {
+		dataSource.setPath(pathString);
+	}
+	/*Object */
+	//var lock = this.getElement().getOwnerDocument().getDomSynchronizationObject();
+	//synchronized( lock ) {
+	this.getElement().setAttribute(xap.data.bridge.DataSourceBridge.PATH_ATTRIBUTE, pathString);
 	//}
 };
 

Modified: incubator/xap/trunk/src/xap/data/datasource/AbstractDataSource.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/src/xap/data/datasource/AbstractDataSource.js?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/src/xap/data/datasource/AbstractDataSource.js (original)
+++ incubator/xap/trunk/src/xap/data/datasource/AbstractDataSource.js Wed Oct  4 10:11:54 2006
@@ -580,6 +580,22 @@
 xap.data.datasource.AbstractDataSource.prototype.setSource = function (sourceObject) {
 	this._source = sourceObject;
 };
+
+
+/**
+ * Sets the path urifor this DataSource
+ * 
+ * @param sourceObject The new source object
+ * @protected
+ * @param pathString{String}
+ * @return {void}
+ **/
+xap.data.datasource.AbstractDataSource.prototype.setPath = function (pathString) {
+	this._path = pathString ;
+};
+
+
+
 /**
  * Adds a postponed query to this DataSource. This method can be used to
  * cache queries for later execution (for example if the source object is
@@ -597,11 +613,12 @@
  * @param context{ContextFrame}
  * @param listener{RetrievalListener  }
  **/
-xap.data.datasource.AbstractDataSource.prototype.addPostponedQuery = function (query, context, listener) {
-	/*QueryRecord*/
-	var queryRecord = new xap.data.datasource.QueryRecord(query, context, listener);
-	this._postponedQueries.addElement(queryRecord);
-};
+// Not doing this in this release:
+//xap.data.datasource.AbstractDataSource.prototype.addPostponedQuery = function (query, context, listener) {
+//	/*QueryRecord*/
+//	var queryRecord = new xap.data.datasource.QueryRecord(query, context, listener);
+//	this._postponedQueries.addElement(queryRecord);
+//};
 /**
  * Executes all posponed queries in order they came in.
  * At the end of this method the postponed query vector is cleared 
@@ -610,42 +627,42 @@
  * @protected
  * @synchronized
  **/
-xap.data.datasource.AbstractDataSource.prototype.executePostponedQueries = function () {
-	try {
-		for (var i = 0; i < this._postponedQueries.size(); i++) {
-			/*QueryRecord*/
-			var rec = this._postponedQueries.elementAt(i);
-			try {
-				this.handleQuery(rec.getQuery(), rec.getContext(), rec.getListener());
-			}
-			catch (e) { // DataAccessException,MalformedQueryException
-				this.getLog().exception(e);
-			}
-		}
-	}
-	finally {
-		this._postponedQueries.removeAllElements();
-	}
-};
+//xap.data.datasource.AbstractDataSource.prototype.executePostponedQueries = function () {
+//	try {
+//		for (var i = 0; i < this._postponedQueries.size(); i++) {
+//			/*QueryRecord*/
+//			var rec = this._postponedQueries.elementAt(i);
+//			try {
+//				this.handleQuery(rec.getQuery(), rec.getContext(), rec.getListener());
+//			}
+//			catch (e) { // DataAccessException,MalformedQueryException
+//				this.getLog().exception(e);
+//			}
+//		}
+//	}
+//	finally {
+//		this._postponedQueries.removeAllElements();
+//	}
+//};
 /**
  * Clears the posponed query vector. 
  *
  * @protected
  * @return {void}
  **/
-xap.data.datasource.AbstractDataSource.prototype.clearPostponedQueries = function () {
-	this._postponedQueries.removeAllElements();
-};
-/**
- * @return vector of postponed queries whose execution has been postponed 
- * for some reason (i.e. the source object was not available).
- *
- * @protected
- * @return {Vector}
- **/
-xap.data.datasource.AbstractDataSource.prototype.getPostponedQueries = function () {
-	return this._postponedQueries;
-};
+//xap.data.datasource.AbstractDataSource.prototype.clearPostponedQueries = function () {
+//	this._postponedQueries.removeAllElements();
+//};
+///**
+// * @return vector of postponed queries whose execution has been postponed 
+// * for some reason (i.e. the source object was not available).
+// *
+// * @protected
+// * @return {Vector}
+// **/
+//xap.data.datasource.AbstractDataSource.prototype.getPostponedQueries = function () {
+//	return this._postponedQueries;
+//};
 /**
  * @return vector of all bound queries (bound type != ONE_TIME)
  *
@@ -777,5 +794,21 @@
 		var rec = this._boundQueries.elementAt(i);
 		this.handleQuery(rec.getQuery(), rec.getContext(), rec.getListener());
 	}
+};
+
+/**
+ * Sets the _refreshOnPropertyChange to the newValue. If set to true,
+ * the datasource will be refreshed every time the source object fires
+ * property change events (granted the object contains methods for adding
+ * and removing PropertyChangeListener instances)
+ * 
+ * @param newValue - the new value for the setting
+ *
+ * @public
+ * @param newValue{boolean}
+ * @return {void}
+**/
+xap.data.datasource.AbstractDataSource.prototype.setRefreshOnPropertyChange = function (newValue) {
+	this._refreshOnPropertyChange = newValue;
 };
 

Modified: incubator/xap/trunk/src/xap/data/datasource/JavascriptDataSource.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/src/xap/data/datasource/JavascriptDataSource.js?view=diff&rev=452940&r1=452939&r2=452940
==============================================================================
--- incubator/xap/trunk/src/xap/data/datasource/JavascriptDataSource.js (original)
+++ incubator/xap/trunk/src/xap/data/datasource/JavascriptDataSource.js Wed Oct  4 10:11:54 2006
@@ -1,3 +1,4 @@
+
 /*
  * Copyright  2006 The Apache Software Foundation.
  *
@@ -15,31 +16,15 @@
  *
 **/
 Xap.provide("xap.data.datasource.JavascriptDataSource");
-Xap.require("xap.util.Vector");
-Xap.require("xap.data.events.GenericPropertyChangeListener") ;
-Xap.require("xap.data.datasource.AbstractDataSet") ;
-
-
-xap.data.datasource.JavascriptDataSource = function (handler,uri) {
+Xap.require("xap.util.Vector");
+Xap.require("xap.data.events.GenericPropertyChangeListener");
+Xap.require("xap.data.datasource.AbstractDataSet");
+xap.data.datasource.JavascriptDataSource = function (handler) {
 	//TODO: ? Most of what might be here seems to be in
-	// "initialize"
-	this._uri = uri ;
-	this._handler = handler ;
+	// "initialize"
+	this._handler = handler;
 };
 Xap.setupClassAsSubclassOf("xap.data.datasource.JavascriptDataSource", "xap.data.datasource.AbstractDataSource");
-xap.data.datasource.JavascriptDataSource.JS_SOURCE_SIGNATURE = /^javascript:/;
-/**
- * Removes the prepended "javascript:" from the source, if
- * necessary.  Would be nice if we could test for
- * syntactic validity here, but how?
- * TODO: any other escapes?
- * @param aString{String} the JS string to be eval'd when
- *	getting data:
-**/
-xap.data.datasource.JavascriptDataSource.setSource = function (aString) {
-	var stripped = aString.replace(xap.data.datasource.JavascriptDataSource.JS_SOURCE_SIGNATURE, "");
-	this.superclass.setSource.call(this, stripped);
-};
 /**
  * @see DataSource#initialize(String, ClientSession, Element)
  *
@@ -52,42 +37,39 @@
 **/
 xap.data.datasource.JavascriptDataSource.prototype.initialize = function (id, session, dataSourceElement) {
 	xap.data.datasource.AbstractDataSource.prototype.initialize.call(this, id, session, dataSourceElement);
-	this._propertyChangeListener = new xap.data.events.GenericPropertyChangeListener(this);
-	
-	if( this._uri ){
-		this.loadSource(this._uri) ;
-	}
-	
-};
-
+	this._propertyChangeListener = new xap.data.events.GenericPropertyChangeListener(this);
+};
+
+
+
 /**
  * Get the object source from a specified location:
-**/ 
-xap.data.datasource.JavascriptDataSource.prototype.loadSource = function(){
-	var sourceString = null ;
-	try {
-		sourceString = this._handler.getSession().getRequestService().retrieve( this._uri ).responseText;
-	} catch (eU){
-		throw new xap.util.Exception(
-						"Problem getting data from location "
-						+ this._uri
-						+";\n"+eU
-										) ;
-	}
-		
-	try {
-		eval(sourceString) ;
-	} catch (eO){
-		throw new xap.util.Exception(
-						"Problem evaluating:"+eO+" \n"
-						+ sourceString
-										) ;
-	}
-	
-}
-
-
-
+**/
+xap.data.datasource.JavascriptDataSource.prototype.loadScriptFromPath = function () {
+	if( !this._path 
+			|| typeof this._path != "string"
+				|| this._path.length==0
+		){
+		// Might not want to load anything this way---
+		// might have brought in necessary JS objects 
+		// in (e.g.) an HTML script tag:
+		return ;	
+	}
+
+	var sourceString = null;
+	try {
+		sourceString = this._handler.getSession().getRequestService().retrieve(this._path).responseText;
+	}
+	catch (eU) {
+		throw new xap.util.Exception("Problem getting data from location " + this._uri + ";\n" + eU);
+	}
+	try {
+		eval(sourceString);
+	}
+	catch (eO) {
+		throw new xap.util.Exception("Problem evaluating:" + eO + " \n" + sourceString);
+	}
+};
 /**
  * @see AbstractDataSource#handleDataQuery( String, Context, 
  *										  DataRetrievalListener )
@@ -98,58 +80,44 @@
  * @param listener{DataRetrievalListener}
  * @throws DataAccessException, MalformedQueryException   
  * @return {void}
-**/
-xap.data.datasource.JavascriptDataSource.prototype.handleDataQuery = function (query, context, listener) {
-	var contextObjectString = this.getSource();
-	var contextObject = contextObjectString ;
-// Objects we can use when evalling, maybe:
-	var currentIndex = null ;
-	var currentCount = null ;
-	var totalCount = null ;	
-	if (context != null) {
-		contextObjectString = context.getData();		
-		currentIndex = context.getIndex() ;
-		currentCount = currentIndex + 1;
-		totalCount = context.getDataSet().size() ;
-	}
-	if (contextObjectString == null) {
-		this.addPostponedQuery(query, context, listener);
-	} else {
-		try {
-			contextObject = eval(contextObjectString) ;
-		} catch(ex){
-			throw new xap.util.Exception(
-					"JavascriptDataSource.handleDataQuery::source: '"
-											+ theObject
-											+ theScript
-											+"'\n"
-											+anException
-											) ;					
-		}
-	
-	
-		/*Object*/
-		var theData = null ;
-// TODO:  do this right instead.  For the moment, all array
-// return values are treated as part of an iteration:
-		//var theScript = contextObject+"."+query ;
-		var theScript = this.constructor.resolveIteratorMacros(query) ; 	
-		try {			
-			theData = eval(theScript) ;
-		} catch (anException){
-			throw new xap.util.Exception(
-					"JavascriptDataSource.handleDataQuery::source and query: '"
-											+ theScript
-											+"'\n"
-											+anException
-											) ;
-		}
-			
-		listener.dataRetrieved(query, theData, context);
-	}
-};
+**/
+xap.data.datasource.JavascriptDataSource.prototype.handleDataQuery = function (query, context, listener) {
+	// Get any objects defined in the file
+	// indicated by this._path:
+	this.loadScriptFromPath() ;	
+	var contextObjectString = this.getSource();
+	var contextObject = contextObjectString;
+// Objects we can use when evalling, maybe:
+	var currentIndex = null;
+	var currentCount = null;
+	var totalCount = null;
+	if (context != null) {
+		contextObjectString = context.getData();
+		currentIndex = context.getIndex();
+		currentCount = currentIndex + 1;
+		totalCount = context.getDataSet().size();
+	}
+	try {
+		contextObject = eval(contextObjectString);
+	}
+	catch (ex) {
+		throw new xap.util.Exception("JavascriptDataSource.handleDataQuery::source: '" + theObject + theScript + "'\n" + anException);
+	}
+	/*Object*/
+	var theData = null;
+	// TODO:  do this right instead.  For the moment, all array
+	// return values are treated as part of an iteration:
+	//var theScript = contextObject+"."+query ;
+	var theScript = this.constructor.resolveIteratorMacros(query);
+	try {
+		theData = eval(theScript);
+	}
+	catch (anException) {
+		throw new xap.util.Exception("JavascriptDataSource.handleDataQuery::source and query: '" + theScript + "'\n" + anException);
+	}
+	listener.dataRetrieved(query, theData, context);
 
-
+};
 /**
  * @see AbstractDataSource#handleDataSetQuery( String, Context, 	 *											 DataSetRetrievalListener )
  *
@@ -160,49 +128,42 @@
  * @param context{Context}
  * @param listener{DataSetRetrievalListener  }
  * @throws DataAccessException, MalformedQueryException  
-**/
-xap.data.datasource.JavascriptDataSource.prototype.handleDataSetQuery = function (query, context, listener) {
-	/*Object*/
-	var contextObject = this.getSource();
-	if (context != null) {
-		contextObject = context.getData();
-	}
-	if (contextObject == null) {
-		this.addPostponedQuery(query, context, listener);
-	} else {
-		/*Object*/
-		var theData = null
-		var theScript = contextObject+"."+query ;
-		try {			
-			theData = eval(theScript) ;
-		} catch (anException){
-			throw new xap.util.Exception(
-			"JavascriptDataSource.handleDataSetQuery:Could not evaluate: '"
-											+ theScript
-											+"'"
-											) ;
-		}
-		/*DataSet*/
-		var dataset 
-			= xap.data.datasource.AbstractDataSet.getDataSet(query, this, theData);		
-		listener.dataSetRetrieved(query, dataset, context);
-	}
-};
-
+**/
+xap.data.datasource.JavascriptDataSource.prototype.handleDataSetQuery = function (query, context, listener) {
+	// Get any objects defined in the file
+	// indicated by this._path:
+	this.loadScriptFromPath() ;
+	/*Object*/
+	var contextObject = this.getSource();
+	if (context != null) {
+		contextObject = context.getData();
+	}
+	/*Object*/
+	var theData = null;
+	var theScript = contextObject + "." + query;
+	try {
+		theData = eval(theScript);
+	}
+	catch (anException) {
+		throw new xap.util.Exception("JavascriptDataSource.handleDataSetQuery:Could not evaluate: '" + theScript + "'");
+	}
+	/*DataSet*/
+	var dataset = xap.data.datasource.AbstractDataSet.getDataSet(query, this, theData);
+	listener.dataSetRetrieved(query, dataset, context);
+};
 /**
  * A very simple expression language
  * @see handleDataQuery
-**/ 
-xap.data.datasource.JavascriptDataSource.resolveIteratorMacros = function(str ){
-		var result = null ;
-		result = str.replace(/<currentElement>/g,"contextObject") ;
-		result = result.replace(/<currentIndex>/g,"currentIndex") ;		
-		result = result.replace(/<currentCount>/g,"currentCount") ;		
-		result = result.replace(/<totalCount>/g,"totalCount") ;	
-		
-		return result ;
-}
-
-
-
+**/
+xap.data.datasource.JavascriptDataSource.resolveIteratorMacros = function (str) {
+	var result = null;
+	result = str.replace(/<currentElement>/g, "contextObject");
+	result = result.replace(/<currentIndex>/g, "currentIndex");
+	result = result.replace(/<currentCount>/g, "currentCount");
+	result = result.replace(/<totalCount>/g, "totalCount");
+	return result;
+};
+
+
+