blob: c9e7366392d67d630de83836ab1718b8d3ef2ebb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function (callback) {
if (typeof define === 'function' && define.amd) {
define(['core/Core'], callback);
}
else {
callback();
}
}(function () {
/**
* The Manager acts as the controller in a Model-View-Controller framework. All
* public calls should be performed on the manager object.
*
* @param properties A map of fields to set. Refer to the list of public fields.
* @class AbstractManager
*/
AjaxSolr.AbstractManager = AjaxSolr.Class.extend(
/** @lends AjaxSolr.AbstractManager.prototype */
{
/**
* @param {Object} [attributes]
* @param {String} [attributes.solrUrl] The fully-qualified URL of the Solr
* application. You must include the trailing slash. Do not include the path
* to any Solr servlet. Defaults to "http://localhost:8983/solr/"
* @param {String} [attributes.proxyUrl] If we want to proxy queries through a
* script, rather than send queries to Solr directly, set this field to the
* fully-qualified URL of the script.
* @param {String} [attributes.servlet] The default Solr servlet. You may
* prepend the servlet with a core if using multiple cores. Defaults to
* "servlet".
*/
constructor: function (attributes) {
AjaxSolr.extend(this, {
solrUrl: 'http://localhost:8983/solr/',
proxyUrl: null,
servlet: 'select',
// The most recent response from Solr.
response: {},
// A collection of all registered widgets.
widgets: {},
// The parameter store for the manager and its widgets.
store: null,
// Whether <tt>init()</tt> has been called yet.
initialized: false
}, attributes);
},
/**
* An abstract hook for child implementations.
*
* <p>This method should be called after the store and the widgets have been
* added. It should initialize the widgets and the store, and do any other
* one-time initializations, e.g., perform the first request to Solr.</p>
*
* <p>If no store has been set, it sets the store to the basic <tt>
* AjaxSolr.ParameterStore</tt>.</p>
*/
init: function () {
this.initialized = true;
if (this.store === null) {
this.setStore(new AjaxSolr.ParameterStore());
}
this.store.load(false);
for (var widgetId in this.widgets) {
this.widgets[widgetId].init();
}
this.store.init();
},
/**
* Set the manager's parameter store.
*
* @param {AjaxSolr.ParameterStore} store
*/
setStore: function (store) {
store.manager = this;
this.store = store;
},
/**
* Adds a widget to the manager.
*
* @param {AjaxSolr.AbstractWidget} widget
*/
addWidget: function (widget) {
widget.manager = this;
this.widgets[widget.id] = widget;
},
/**
* Stores the Solr parameters to be sent to Solr and sends a request to Solr.
*
* @param {Boolean} [start] The Solr start offset parameter.
* @param {String} [servlet] The Solr servlet to send the request to.
*/
doRequest: function (start, servlet) {
if (this.initialized === false) {
this.init();
}
// Allow non-pagination widgets to reset the offset parameter.
if (start !== undefined) {
this.store.get('start').val(start);
}
if (servlet === undefined) {
servlet = this.servlet;
}
this.store.save();
for (var widgetId in this.widgets) {
this.widgets[widgetId].beforeRequest();
}
this.executeRequest(servlet);
},
/**
* An abstract hook for child implementations.
*
* <p>Sends the request to Solr, i.e. to <code>this.solrUrl</code> or <code>
* this.proxyUrl</code>, and receives Solr's response. It should pass Solr's
* response to <code>handleResponse()</code> for handling.</p>
*
* <p>See <tt>managers/Manager.jquery.js</tt> for a jQuery implementation.</p>
*
* @param {String} servlet The Solr servlet to send the request to.
* @param {String} string The query string of the request. If not set, it
* should default to <code>this.store.string()</code>
* @throws If not defined in child implementation.
*/
executeRequest: function (servlet, string) {
throw 'Abstract method executeRequest must be overridden in a subclass.';
},
/**
* This method is executed after the Solr response data arrives. Allows each
* widget to handle Solr's response separately.
*
* @param {Object} data The Solr response.
*/
handleResponse: function (data) {
this.response = data;
for (var widgetId in this.widgets) {
this.widgets[widgetId].afterRequest();
}
},
/**
* This method is executed if Solr encounters an error.
*
* @param {String} message An error message.
*/
handleError: function (message) {
window.console && console.log && console.log(message);
}
});
}));