Index: src/main/webapp/application/engageConfig.json =================================================================== --- src/main/webapp/application/engageConfig.json (revision 9122) +++ src/main/webapp/application/engageConfig.json (working copy) @@ -28,6 +28,14 @@ "fluid.catalogueService.initBrowseCatalogueDataFeed", "fluid.engage.initImportService" ], +services: { + "browse": { + "queryURLTemplate": "http://titan.atrc.utoronto.ca:5984/%db/_fti/lucene/%view?include_docs=true&q=%q", + "view": "by_collection_category", + "params": ["q", "db"], + "mapper": "mccord" + } +}, views: { all: "all", byCollectionCategory: "by_collection_category", Index: src/main/webapp/kettle/KettleIncludes.json =================================================================== --- src/main/webapp/kettle/KettleIncludes.json (revision 9122) +++ src/main/webapp/kettle/KettleIncludes.json (working copy) @@ -13,6 +13,7 @@ "js/kettle.js", "js/servletJSGI.js", "../application/js/EngageApp.js", + "../services/utils/js/ServicesUtils.js", "../services/home/js/HomeService.js", "../services/artifactView/js/artifactView.js", "../services/exhibition/js/exhibition.js", Index: src/main/webapp/services/browse/js/browse.js =================================================================== --- src/main/webapp/services/browse/js/browse.js (revision 9122) +++ src/main/webapp/services/browse/js/browse.js (working copy) @@ -17,10 +17,6 @@ fluid.browseDemo = fluid.browseDemo || {}; (function ($) { - var compileDatabaseURL = function (params, config) { - return fluid.stringTemplate(config.queryURLTemplate, - {dbName: params.db || "", view: config.views.byCollectionCategory, query: params.q || ""}); - }; var compileTargetURL = function (URLBase, params) { return URLBase + "?" + $.param(params); @@ -39,8 +35,7 @@ artifacts: [] } ] - }; - + }; // TODO: Address the issue here that we're hard baking the data feed to a single category model.categories[0].artifacts = fluid.transform(data, function (artifact) { return { @@ -52,39 +47,10 @@ title: artifact.linkTitle, description: artifact.linkDescription }; - }); - + }); return model; }; - var errorCallback = function (XMLHttpRequest, textStatus, errorThrown) { - fluid.log("XMLHttpRequest: " + XMLHttpRequest); - fluid.log("Status: " + textStatus); - fluid.log("Error: " + errorThrown); - return [500, {"Content-Type": "text/plain"}, errorThrown]; - }; - - var ajaxCall = function (url, success, error) { - $.ajax({ - url: url, - dataType: "json", - asyn: false, - success: success, - error: error - }); - }; - - var getAjax = function (url, error) { - var data; - var success = function (returnedData) { - data = returnedData; - }; - - ajaxCall(url, success, error); - - return JSON.parse(data); - }; - var getArtifactData = function (rawData, database) { var dataRows = rawData.rows || []; return fluid.transform(dataRows, function (row) { @@ -93,19 +59,18 @@ }); }; - var getData = function (error, params, config) { - var url = compileDatabaseURL(params, config); - var db = params.db; - var rawData = getAjax(url, error); - - var dataSet = getArtifactData(rawData, db); - - return compileData(dataSet, db); + var provideHandlerService = function (env, config, reshapers) { + return fluid.servicesUtils.provideService("browse", config, env.urlState.params, reshapers); }; fluid.browseDemo.initBrowseDataFeed = function (config, app) { + var browseDataHandler = function (env) { - return [200, {"Content-Type": "text/plain"}, JSON.stringify(getData(errorCallback, env.urlState.params, config))]; + var dataFeedResponse = provideHandlerService(env, config, [ + getArtifactData, compileData + ]); + dataFeedResponse[2] = JSON.stringify(dataFeedResponse[2]); + return dataFeedResponse; }; var acceptor = fluid.engage.makeAcceptorForResource("browse", "json", browseDataHandler); @@ -137,9 +102,11 @@ }); handler.registerProducer("browse", function (context, env) { - var data = getData(errorCallback, context.urlState.params, config); + var response = provideHandlerService(context, config, [ + getArtifactData, compileData, afterMap + ]); var options = { - model: afterMap(data) + model: response[2] }; return { Index: src/main/webapp/services/utils/js/ServicesUtils.js =================================================================== --- src/main/webapp/services/utils/js/ServicesUtils.js (revision 0) +++ src/main/webapp/services/utils/js/ServicesUtils.js (revision 0) @@ -0,0 +1,68 @@ +/* +Copyright 2009-2010 University of Toronto + +Licensed under the Educational Community License (ECL), Version 2.0 or the New +BSD license. You may not use this file except in compliance with one these +Licenses. + +You may obtain a copy of the ECL 2.0 License and BSD License at +https://source.fluidproject.org/svn/LICENSE.txt +*/ + +// Declare dependencies. +/*global jQuery, fluid*/ +"use strict"; + +fluid = fluid || {}; +fluid.servicesUtils = fluid.servicesUtils || {}; + +(function ($) { + var ajaxCall = function (url, success, error) { + $.ajax({ + url: url, + dataType: "json", + asyn: false, + success: success, + error: error + }); + }; + var getAjax = function (url) { + var response; + var success = function (returnedData) { + response = JSON.parse(returnedData); + }; + var errorCallback = function (XMLHttpRequest, textStatus, errorThrown) { + fluid.log("XMLHttpRequest: " + XMLHttpRequest); + fluid.log("Status: " + textStatus); + fluid.log("Error: " + errorThrown); + response = [500, {"Content-Type": "text/plain"}, errorThrown]; + }; + ajaxCall(url, success, errorCallback); + return response; + }; + var compileDatabaseURL = function (service, params, template) { + var opts = { + view: service.view + }; + fluid.transform(service.params, function (param) { + opts[param] = params[param] || ""; + }); + return fluid.stringTemplate(template, opts); + }; + var reshapeData = function (data, reshapers, mapper) { + $.each(reshapers, function (index, reshaper) { + data = reshaper(data, mapper); + }); + return data; + }; + + fluid.servicesUtils.provideService = function (serviceName, config, params, reshapers) { + var service = config.services[serviceName]; + var url = compileDatabaseURL(service, params, service.queryURLTemplate); + var data = getAjax(url); + if (data[0] && data[0] === 500) { + return data; + } + return [200, {"Content-Type": "text/plain"}, reshapeData(data, reshapers, service.mapper)]; + }; +})(jQuery); \ No newline at end of file