 			cache[name][CACHE_OUTPUT_STATE] = getSessionState(source.outputCSV);
 			var bytes:ByteArray = new ByteArray();
 			bytes.writeObject(cache);
-			WeaveAPI.URLRequestUtils.saveLocalFile(cacheFileName, bytes);
+			WeaveAPI.URLRequestUtils.saveLocalFile(CACHE_FILE_NAME, bytes);
 		}
 		
 		public const url:LinkableString = registerLinkableChild(this, new LinkableString('/WeaveAnalystServices/ComputationalServlet'), handleURLChange);

			// if callbacks are delayed, we assume that hierarchyRefresh will be explicitly triggered later.
			if (getCallbackCollection(this).callbacksAreDelayed)
				return;
			
			// read from cache if present
			var currentState:Object = getSessionState(this);
			var name:String = WeaveAPI.globalHashMap.getName(this);
			if (cache && cache[name])
			{
				if (WeaveAPI.SessionManager.computeDiff(currentState, cache[name][CACHE_STATE]) === undefined)
				{
					setSessionState(outputCSV, cache[name][CACHE_OUTPUT_STATE]);
					return;
				}
			}
			
			// force retrieval of referenced columns
			for each (var refCol:ReferencedColumn in getLinkableDescendants(inputs, ReferencedColumn))

			promise.depend(url, scriptName, inputs, hierarchyRefresh);
			if (!cacheFile)
			{
				// register static LinkableFile as a child of the globalHashMap so it will not be disposed when an instance of this data source is disposed.
				cacheFile = registerLinkableChild(WeaveAPI.globalHashMap, new LinkableFile(URLRequestUtils.LOCAL_FILE_URL_SCHEME + CACHE_FILE_NAME), parseCacheFile);
			}
			registerLinkableChild(this, cacheFile, runScript);
		}
		
		private static const CACHE_STATE:String = 'sessionState';
		private static const CACHE_OUTPUT_STATE:String = 'outputCSV';
		private static const CACHE_FILE_NAME:String = 'WeaveAnalystDataSource.cache';
		private static var cacheFile:LinkableFile = null;
		private static var cache:Object;
		private static function parseCacheFile():void
