2012-03-07 11:30:20 -05:00
|
|
|
/*
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
2012-02-23 14:23:10 -05:00
|
|
|
var loader = {
|
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
show : function( element )
|
|
|
|
{
|
|
|
|
$( element )
|
|
|
|
.addClass( 'loader' );
|
|
|
|
},
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
hide : function( element )
|
|
|
|
{
|
|
|
|
$( element )
|
|
|
|
.removeClass( 'loader' );
|
|
|
|
}
|
2012-02-23 14:23:10 -05:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
Number.prototype.esc = function()
|
|
|
|
{
|
2012-03-07 11:30:20 -05:00
|
|
|
return new String( this ).esc();
|
2012-02-23 14:23:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
String.prototype.esc = function()
|
|
|
|
{
|
2012-03-07 11:30:20 -05:00
|
|
|
return this.replace( /</g, '<' ).replace( />/g, '>' );
|
|
|
|
}
|
|
|
|
|
|
|
|
SolrDate = function( date )
|
|
|
|
{
|
|
|
|
// ["Sat Mar 03 11:00:00 CET 2012", "Sat", "Mar", "03", "11:00:00", "CET", "2012"]
|
|
|
|
var parts = date.match( /^(\w+)\s+(\w+)\s+(\d+)\s+(\d+\:\d+\:\d+)\s+(\w+)\s+(\d+)$/ );
|
|
|
|
|
|
|
|
// "Sat Mar 03 2012 10:37:33"
|
|
|
|
return new Date( parts[1] + ' ' + parts[2] + ' ' + parts[3] + ' ' + parts[6] + ' ' + parts[4] );
|
2012-02-23 14:23:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
var sammy = $.sammy
|
|
|
|
(
|
2012-03-07 11:30:20 -05:00
|
|
|
function()
|
|
|
|
{
|
|
|
|
this.bind
|
|
|
|
(
|
|
|
|
'run',
|
|
|
|
function( event, config )
|
|
|
|
{
|
|
|
|
if( 0 === config.start_url.length )
|
|
|
|
{
|
|
|
|
location.href = '#/';
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
2012-03-21 05:36:59 -04:00
|
|
|
|
|
|
|
this.bind
|
|
|
|
(
|
|
|
|
'error',
|
|
|
|
function( message, original_error )
|
|
|
|
{
|
|
|
|
alert( original_error.message );
|
|
|
|
}
|
|
|
|
);
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
// activate_core
|
|
|
|
this.before
|
|
|
|
(
|
|
|
|
{},
|
|
|
|
function( context )
|
|
|
|
{
|
2012-05-07 15:13:24 -04:00
|
|
|
if( app.timeout )
|
|
|
|
{
|
|
|
|
console.debug( 'Clearing Timeout #' + app.timeout );
|
|
|
|
clearTimeout( app.timeout );
|
|
|
|
}
|
|
|
|
|
2012-03-21 05:36:59 -04:00
|
|
|
var menu_wrapper = $( '#menu-wrapper' );
|
|
|
|
|
|
|
|
$( 'li[id].active', menu_wrapper )
|
2012-03-07 11:30:20 -05:00
|
|
|
.removeClass( 'active' );
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-21 05:36:59 -04:00
|
|
|
$( 'li.active', menu_wrapper )
|
2012-03-07 11:30:20 -05:00
|
|
|
.removeClass( 'active' );
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
if( this.params.splat )
|
|
|
|
{
|
2012-05-07 15:39:22 -04:00
|
|
|
var selector = '~' === this.params.splat[0][0]
|
|
|
|
? '#' + this.params.splat[0].replace( /^~/, '' ) + '.global'
|
2013-01-05 05:57:21 -05:00
|
|
|
: '#menu-selector #' + this.params.splat[0].replace( /\./g, '__' );
|
2012-05-07 15:39:22 -04:00
|
|
|
|
|
|
|
var active_element = $( selector, menu_wrapper );
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
if( 0 === active_element.size() )
|
|
|
|
{
|
2012-03-21 05:36:59 -04:00
|
|
|
this.app.error( 'There exists no core with name "' + this.params.splat[0] + '"' );
|
2012-03-07 11:30:20 -05:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
active_element
|
|
|
|
.addClass( 'active' );
|
|
|
|
|
|
|
|
if( this.params.splat[1] )
|
|
|
|
{
|
|
|
|
$( '.' + this.params.splat[1], active_element )
|
|
|
|
.addClass( 'active' );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !active_element.hasClass( 'global' ) )
|
|
|
|
{
|
|
|
|
this.active_core = active_element;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2012-02-23 14:23:10 -05:00
|
|
|
);
|
|
|
|
|
|
|
|
var solr_admin = function( app_config )
|
|
|
|
{
|
2013-01-08 17:39:10 -05:00
|
|
|
that = this,
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
menu_element = null,
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
is_multicore = null,
|
|
|
|
cores_data = null,
|
|
|
|
active_core = null,
|
|
|
|
environment_basepath = null,
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
config = app_config,
|
|
|
|
params = null,
|
|
|
|
dashboard_values = null,
|
|
|
|
schema_browser_data = null,
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
plugin_data = null,
|
2012-02-23 14:23:10 -05:00
|
|
|
|
2012-03-21 05:36:59 -04:00
|
|
|
this.menu_element = $( '#menu-selector' );
|
2012-03-07 11:30:20 -05:00
|
|
|
this.config = config;
|
|
|
|
|
2012-05-07 15:13:24 -04:00
|
|
|
this.timeout = null;
|
|
|
|
|
2013-01-05 05:57:21 -05:00
|
|
|
this.core_regex_base = '^#\\/([\\w\\d-\\.]+)';
|
|
|
|
|
2012-07-30 19:11:35 -04:00
|
|
|
show_global_error = function( error )
|
|
|
|
{
|
|
|
|
var main = $( '#main' );
|
|
|
|
|
|
|
|
$( 'div[id$="-wrapper"]', main )
|
|
|
|
.remove();
|
|
|
|
|
|
|
|
main
|
|
|
|
.addClass( 'error' )
|
|
|
|
.append( error );
|
|
|
|
|
|
|
|
var pre_tags = $( 'pre', main );
|
|
|
|
if( 0 !== pre_tags.size() )
|
|
|
|
{
|
|
|
|
hljs.highlightBlock( pre_tags.get(0) );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-01-05 09:21:28 -05:00
|
|
|
sort_cores_data = function sort_cores_data( cores_status )
|
|
|
|
{
|
|
|
|
// build array of core-names for sorting
|
|
|
|
var core_names = [];
|
|
|
|
for( var core_name in cores_status )
|
|
|
|
{
|
|
|
|
core_names.push( core_name );
|
|
|
|
}
|
|
|
|
core_names.sort();
|
|
|
|
|
|
|
|
var core_count = core_names.length;
|
|
|
|
var cores = {};
|
|
|
|
|
|
|
|
for( var i = 0; i < core_count; i++ )
|
|
|
|
{
|
|
|
|
var core_name = core_names[i];
|
|
|
|
cores[core_name] = cores_status[core_name];
|
|
|
|
}
|
|
|
|
|
|
|
|
return cores;
|
|
|
|
};
|
|
|
|
|
|
|
|
this.set_cores_data = function set_cores_data( cores )
|
|
|
|
{
|
2013-01-08 17:39:10 -05:00
|
|
|
that.cores_data = sort_cores_data( cores.status );
|
2013-01-05 09:21:28 -05:00
|
|
|
|
2013-01-08 17:39:10 -05:00
|
|
|
that.menu_element
|
2013-01-05 09:21:28 -05:00
|
|
|
.empty();
|
|
|
|
|
|
|
|
var core_count = 0;
|
2013-01-08 17:39:10 -05:00
|
|
|
for( var core_name in that.cores_data )
|
2013-01-05 09:21:28 -05:00
|
|
|
{
|
|
|
|
core_count++;
|
|
|
|
var core_path = config.solr_path + '/' + core_name;
|
|
|
|
var classes = [];
|
|
|
|
|
|
|
|
if( !environment_basepath )
|
|
|
|
{
|
|
|
|
environment_basepath = core_path;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( cores.status[core_name]['isDefaultCore'] )
|
|
|
|
{
|
|
|
|
classes.push( 'default' );
|
|
|
|
}
|
|
|
|
|
|
|
|
var core_tpl = '<li id="' + core_name.replace( /\./g, '__' ) + '" '
|
|
|
|
+ ' class="' + classes.join( ' ' ) + '"'
|
|
|
|
+ ' data-basepath="' + core_path + '"'
|
|
|
|
+ ' schema="' + cores.status[core_name]['schema'] + '"'
|
|
|
|
+ ' config="' + cores.status[core_name]['config'] + '"'
|
|
|
|
+ '>' + "\n"
|
2013-01-05 09:36:33 -05:00
|
|
|
+ ' <p><a href="#/' + core_name + '" title="' + core_name + '">' + core_name + '</a></p>' + "\n"
|
2013-01-05 09:21:28 -05:00
|
|
|
+ ' <ul>' + "\n"
|
|
|
|
|
|
|
|
+ ' <li class="ping"><a rel="' + core_path + '/admin/ping"><span>Ping</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="query"><a href="#/' + core_name + '/query"><span>Query</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="schema"><a href="#/' + core_name + '/schema"><span>Schema</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="config"><a href="#/' + core_name + '/config"><span>Config</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="replication"><a href="#/' + core_name + '/replication"><span>Replication</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="analysis"><a href="#/' + core_name + '/analysis"><span>Analysis</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="schema-browser"><a href="#/' + core_name + '/schema-browser"><span>Schema Browser</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="plugins"><a href="#/' + core_name + '/plugins"><span>Plugins / Stats</span></a></li>' + "\n"
|
|
|
|
+ ' <li class="dataimport"><a href="#/' + core_name + '/dataimport"><span>Dataimport</span></a></li>' + "\n"
|
|
|
|
|
|
|
|
+ ' </ul>' + "\n"
|
|
|
|
+ '</li>';
|
|
|
|
|
2013-01-08 17:39:10 -05:00
|
|
|
that.menu_element
|
2013-01-05 09:21:28 -05:00
|
|
|
.append( core_tpl );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( cores.initFailures )
|
|
|
|
{
|
|
|
|
var failures = [];
|
|
|
|
for( var core_name in cores.initFailures )
|
|
|
|
{
|
|
|
|
failures.push
|
|
|
|
(
|
|
|
|
'<li>' +
|
|
|
|
'<strong>' + core_name.esc() + ':</strong>' + "\n" +
|
|
|
|
cores.initFailures[core_name].esc() + "\n" +
|
|
|
|
'</li>'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if( 0 !== failures.length )
|
|
|
|
{
|
|
|
|
var init_failures = $( '#init-failures' );
|
|
|
|
|
|
|
|
init_failures.show();
|
|
|
|
$( 'ul', init_failures ).html( failures.join( "\n" ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( 0 === core_count )
|
|
|
|
{
|
|
|
|
show_global_error
|
|
|
|
(
|
|
|
|
'<div class="message">There are no SolrCores running. <br/> Using the Solr Admin UI currently requires at least one SolrCore.</div>'
|
|
|
|
);
|
|
|
|
} // else: we have at least one core....
|
|
|
|
};
|
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
this.run = function()
|
|
|
|
{
|
|
|
|
$.ajax
|
|
|
|
(
|
|
|
|
{
|
|
|
|
url : config.solr_path + config.core_admin_path + '?wt=json',
|
|
|
|
dataType : 'json',
|
|
|
|
beforeSend : function( arr, form, options )
|
|
|
|
{
|
|
|
|
$( '#content' )
|
|
|
|
.html( '<div id="index"><div class="loader">Loading ...</div></div>' );
|
|
|
|
},
|
|
|
|
success : function( response )
|
|
|
|
{
|
2013-01-08 17:39:10 -05:00
|
|
|
that.set_cores_data( response );
|
2012-03-21 05:36:59 -04:00
|
|
|
|
2012-03-07 11:30:20 -05:00
|
|
|
for( var core_name in response.status )
|
|
|
|
{
|
|
|
|
var core_path = config.solr_path + '/' + core_name;
|
|
|
|
if( !environment_basepath )
|
2012-02-23 14:23:10 -05:00
|
|
|
{
|
2012-03-07 11:30:20 -05:00
|
|
|
environment_basepath = core_path;
|
|
|
|
}
|
2012-07-30 19:26:11 -04:00
|
|
|
}
|
|
|
|
|
2012-07-30 19:11:35 -04:00
|
|
|
var system_url = environment_basepath + '/admin/system?wt=json';
|
2012-03-07 11:30:20 -05:00
|
|
|
$.ajax
|
|
|
|
(
|
|
|
|
{
|
2012-07-30 19:11:35 -04:00
|
|
|
url : system_url,
|
2012-03-07 11:30:20 -05:00
|
|
|
dataType : 'json',
|
|
|
|
beforeSend : function( arr, form, options )
|
|
|
|
{
|
|
|
|
},
|
|
|
|
success : function( response )
|
|
|
|
{
|
2013-01-08 17:39:10 -05:00
|
|
|
that.dashboard_values = response;
|
2012-03-07 11:30:20 -05:00
|
|
|
|
|
|
|
var environment_args = null;
|
|
|
|
var cloud_args = null;
|
|
|
|
|
|
|
|
if( response.jvm && response.jvm.jmx && response.jvm.jmx.commandLineArgs )
|
2012-02-23 14:23:10 -05:00
|
|
|
{
|
2012-03-07 11:30:20 -05:00
|
|
|
var command_line_args = response.jvm.jmx.commandLineArgs.join( ' | ' );
|
|
|
|
|
|
|
|
environment_args = command_line_args.match( /-Dsolr.environment=((dev|test|prod)?[\w\d]*)/i );
|
|
|
|
cloud_args = command_line_args.match( /-Dzk/i );
|
|
|
|
}
|
|
|
|
|
|
|
|
// title
|
|
|
|
|
|
|
|
$( 'title', document )
|
|
|
|
.append( ' (' + response.core.host + ')' );
|
|
|
|
|
|
|
|
// environment
|
|
|
|
|
2012-09-06 03:42:24 -04:00
|
|
|
var wrapper = $( '#wrapper' );
|
2012-03-07 11:30:20 -05:00
|
|
|
var environment_element = $( '#environment' );
|
|
|
|
if( environment_args )
|
2012-02-23 14:23:10 -05:00
|
|
|
{
|
2012-09-06 03:42:24 -04:00
|
|
|
wrapper
|
|
|
|
.addClass( 'has-environment' );
|
2012-03-07 11:30:20 -05:00
|
|
|
|
|
|
|
if( environment_args[1] )
|
|
|
|
{
|
|
|
|
environment_element
|
|
|
|
.html( environment_args[1] );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( environment_args[2] )
|
|
|
|
{
|
|
|
|
environment_element
|
|
|
|
.addClass( environment_args[2] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2012-02-23 14:23:10 -05:00
|
|
|
{
|
2012-09-06 03:42:24 -04:00
|
|
|
wrapper
|
|
|
|
.removeClass( 'has-environment' );
|
2012-02-23 14:23:10 -05:00
|
|
|
}
|
2012-03-07 11:30:20 -05:00
|
|
|
|
|
|
|
// cloud
|
|
|
|
|
|
|
|
var cloud_nav_element = $( '#menu #cloud' );
|
|
|
|
if( cloud_args )
|
|
|
|
{
|
|
|
|
cloud_nav_element
|
|
|
|
.show();
|
|
|
|
}
|
|
|
|
|
|
|
|
// sammy
|
|
|
|
|
|
|
|
sammy.run( location.hash );
|
|
|
|
},
|
|
|
|
error : function()
|
|
|
|
{
|
2012-07-30 19:11:35 -04:00
|
|
|
show_global_error
|
|
|
|
(
|
|
|
|
'<div class="message"><p>Unable to load environment info from <code>' + system_url.esc() + '</code>.</p>' +
|
|
|
|
'<p>This interface requires that you activate the admin request handlers in all SolrCores by adding the ' +
|
|
|
|
'following configuration to your <code>solrconfig.xml</code>:</p></div>' + "\n" +
|
|
|
|
|
|
|
|
'<div class="code"><pre class="syntax language-xml"><code>' +
|
|
|
|
'<!-- Admin Handlers - This will register all the standard admin RequestHandlers. -->'.esc() + "\n" +
|
|
|
|
'<requestHandler name="/admin/" class="solr.admin.AdminHandlers" />'.esc() +
|
|
|
|
'</code></pre></div>'
|
|
|
|
);
|
2012-03-07 11:30:20 -05:00
|
|
|
},
|
|
|
|
complete : function()
|
|
|
|
{
|
|
|
|
loader.hide( this );
|
|
|
|
}
|
2012-02-23 14:23:10 -05:00
|
|
|
}
|
2012-03-07 11:30:20 -05:00
|
|
|
);
|
|
|
|
},
|
|
|
|
error : function()
|
|
|
|
{
|
|
|
|
},
|
|
|
|
complete : function()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2012-02-23 14:23:10 -05:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-07-30 19:11:35 -04:00
|
|
|
var app = new solr_admin( app_config );
|