You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by sh...@apache.org on 2015/08/30 15:27:14 UTC

svn commit: r1700119 [22/26] - in /ofbiz/trunk: ./ runtime/indexes/ specialpurpose/ specialpurpose/solr/ specialpurpose/solr/conf/ specialpurpose/solr/config/ specialpurpose/solr/entitydef/ specialpurpose/solr/lib/ specialpurpose/solr/lib/compile/ spec...

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/require.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/require.js
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/require.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js?rev=1700119&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js (added)
+++ ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js Sun Aug 30 13:27:07 2015
@@ -0,0 +1,545 @@
+/*
+ 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.
+*/
+
+// #/:core/analysis
+sammy.get
+(
+  new RegExp( app.core_regex_base + '\\/(analysis)$' ),
+  function( context )
+  {
+    var active_core = this.active_core;
+    var core_basepath = active_core.attr( 'data-basepath' );
+    var content_element = $( '#content' );
+ 
+    $.get
+    (
+      'tpl/analysis.html',
+      function( template )
+      {
+        content_element
+          .html( template );
+                
+        var analysis_element = $( '#analysis', content_element );
+        var analysis_form = $( 'form', analysis_element );
+        var analysis_result = $( '#analysis-result', analysis_element );
+        analysis_result.hide();
+
+        var verbose_link = $( '.verbose_output a', analysis_element );
+
+        var type_or_name = $( '#type_or_name', analysis_form );
+        var schema_browser_element = $( '#tor_schema' );
+        var schema_browser_path = app.core_menu.find( '.schema-browser a' ).attr( 'href' );
+        var schema_browser_map = { 'fieldname' : 'field', 'fieldtype' : 'type' };
+
+        type_or_name
+          .die( 'change' )
+          .live
+          (
+            'change',
+            function( event )
+            {
+              var info = $( this ).val().split( '=' );
+
+              schema_browser_element
+                .attr( 'href', schema_browser_path + '?' + schema_browser_map[info[0]] + '=' + info[1] );
+            }
+          );
+
+        $.ajax
+        (
+          {
+            url : core_basepath + '/admin/luke?wt=json&show=schema',
+            dataType : 'json',
+            context : type_or_name,
+            beforeSend : function( xhr, settings )
+            {
+              this
+                .html( '<option value="">Loading ... </option>' )
+                .addClass( 'loader' );
+            },
+            success : function( response, text_status, xhr )
+            {
+              var content = '';
+                            
+              var fields = [];
+              for( var field_name in response.schema.fields )
+              {
+                fields.push
+                (
+                  '<option value="fieldname=' + field_name + '">' + field_name + '</option>'
+                );
+              }
+              if( 0 !== fields.length )
+              {
+                content += '<optgroup label="Fields">' + "\n";
+                content += fields.sort().join( "\n" ) + "\n";
+                content += '</optgroup>' + "\n";
+              }
+                            
+              var types = [];
+              for( var type_name in response.schema.types )
+              {
+                types.push
+                (
+                  '<option value="fieldtype=' + type_name + '">' + type_name + '</option>'
+                );
+              }
+              if( 0 !== types.length )
+              {
+                content += '<optgroup label="Types">' + "\n";
+                content += types.sort().join( "\n" ) + "\n";
+                content += '</optgroup>' + "\n";
+              }
+                            
+              this
+                .html( content );
+
+              var defaultSearchField = 'fieldname\=' + ( context.params['analysis.fieldname'] || response.schema.defaultSearchField );
+
+              if( context.params['analysis.fieldtype'] )
+              {
+                defaultSearchField = 'fieldtype\=' + context.params['analysis.fieldtype'];
+              }
+
+              $( 'option[value="' + defaultSearchField + '"]', this )
+                .attr( 'selected', 'selected' );
+
+              this
+                .chosen()
+                .trigger( 'change' );
+
+              var fields = 0;
+              for( var key in context.params )
+              {
+                if( 'string' === typeof context.params[key] && 0 !== context.params[key].length )
+                {
+                  fields++;
+                  $( '[name="' + key + '"]', analysis_form )
+                    .val( context.params[key] );
+                }
+              }
+
+              if( 'undefined' !== typeof context.params.verbose_output )
+              {
+                verbose_link.trigger( 'toggle', !!context.params.verbose_output.match( /^(1|true)$/ ) );
+              }
+
+              if( 0 !== fields )
+              {
+                analysis_form
+                  .trigger( 'execute' );
+              }
+            },
+            error : function( xhr, text_status, error_thrown)
+            {
+            },
+            complete : function( xhr, text_status )
+            {
+              this
+                .removeClass( 'loader' );
+            }
+          }
+        );
+                        
+        $( '.analysis-error .head a', analysis_element )
+          .die( 'click' )
+          .live
+          (
+            'click',
+            function( event )
+            {
+              $( this ).parents( '.analysis-error' )
+                .toggleClass( 'expanded' );
+            }
+          );
+                        
+        var check_empty_spacer = function()
+        {
+          var spacer_holder = $( 'td.part.data.spacer .holder', analysis_result );
+
+          if( 0 === spacer_holder.size() )
+          {
+            return false;
+          }
+
+          var verbose_output = analysis_result.hasClass( 'verbose_output' );
+
+          spacer_holder
+            .each
+            (
+              function( index, element )
+              {
+                element = $( element );
+
+                if( verbose_output )
+                {
+                  var cell = element.parent();
+                  element.height( cell.height() );
+                }
+                else
+                {
+                  element.removeAttr( 'style' );
+                }
+              }
+            );
+        }
+                        
+        verbose_link
+          .die( 'toggle' )
+          .live
+          (
+            'toggle',
+            function( event, state )
+            {
+              $( this ).parent()
+                .toggleClass( 'active', state );
+                            
+              analysis_result
+                .toggleClass( 'verbose_output', state );
+                            
+              check_empty_spacer();
+            }
+          )
+          .die( 'click' )
+          .live
+          (
+            'click',
+            function( event )
+            {
+              $( this ).parent()
+                .toggleClass( 'active' );
+
+              analysis_form.trigger( 'submit' );
+            }
+          );
+
+        var button = $( 'button', analysis_form )
+
+        var compute_analysis_params = function()
+        {
+          var params = analysis_form.formToArray();
+                          
+          var type_or_name = $( '#type_or_name', analysis_form ).val().split( '=' );
+          params.push( { name: 'analysis.' + type_or_name[0], value: type_or_name[1] } );
+          params.push( { name: 'verbose_output', value: $( '.verbose_output', analysis_element ).hasClass( 'active' ) ? 1 : 0 } );
+
+          return params;
+        }
+                
+        analysis_form
+          .die( 'submit' )
+          .live
+          (
+            'submit',
+            function( event )
+            {
+              var params = $.param( compute_analysis_params() )
+                            .replace( /[\w\.]+=\+*(&)/g, '$1' ) // remove empty parameters
+                            .replace( /(&)+/, '$1' )            // reduce multiple ampersands
+                            .replace( /^&/, '' )                // remove leading ampersand
+                            .replace( /\+/g, '%20' );           // replace plus-signs with encoded whitespaces
+
+              context.redirect( context.path.split( '?' ).shift() + '?' + params );
+              return false;
+            }
+          )
+          .die( 'execute' )
+          .live
+          (
+            'execute',
+            function( event )
+            {
+              var url = core_basepath + '/analysis/field?wt=json&analysis.showmatch=true&' + context.path.split( '?' ).pop();
+              url = url.replace( /&verbose_output=\d/, '' );
+
+              $.ajax
+              (
+                {
+                  url : url,
+                  dataType : 'json',
+                  beforeSend : function( xhr, settings )
+                  {
+                    loader.show( $( 'span', button ) );
+                    button.attr( 'disabled', true );
+                  },
+                  success : function( response, status_text, xhr, form )
+                  {
+                    $( '.analysis-error', analysis_element )
+                      .hide();
+                                    
+                    analysis_result
+                      .empty()
+                      .show();
+                                    
+                    for( var name in response.analysis.field_names )
+                    {
+                      build_analysis_table( 'name', name, response.analysis.field_names[name] );
+                    }
+                                    
+                    for( var name in response.analysis.field_types )
+                    {
+                      build_analysis_table( 'type', name, response.analysis.field_types[name] );
+                    }
+
+                    check_empty_spacer();
+                  },
+                  error : function( xhr, text_status, error_thrown )
+                  {
+                    analysis_result
+                      .empty()
+                      .hide();
+
+                    if( 404 === xhr.status )
+                    {
+                      $( '#analysis-handler-missing', analysis_element )
+                        .show();
+                    }
+                    else
+                    {
+                      $( '#analysis-error', analysis_element )
+                        .show();
+
+                      var response = null;
+                      try
+                      {
+                        eval( 'response = ' + xhr.responseText + ';' );
+                      }
+                      catch( e )
+                      {
+                        console.error( e );
+                      }
+
+                      $( '#analysis-error .body', analysis_element )
+                        .text( response ? response.error.msg : xhr.responseText );
+                    }
+                  },
+                  complete : function()
+                  {
+                    loader.hide( $( 'span', button ) );
+                    button.removeAttr( 'disabled' );
+                  }
+                }
+              );
+            }
+          );
+
+          var generate_class_name = function( type )
+          {
+            var classes = [type];
+            if( 'text' !== type )
+            {
+              classes.push( 'verbose_output' );
+            }
+            return classes.join( ' ' );
+          }
+                    
+          var build_analysis_table = function( field_or_name, name, analysis_data )
+          {        
+            for( var type in analysis_data )
+            {
+              var type_length = analysis_data[type].length;
+              if( 0 !== type_length )
+              {
+                var global_elements_count = 0;
+                if( 'string' === typeof analysis_data[type][1] )
+                {
+                  analysis_data[type][1] = [{ 'text': analysis_data[type][1] }]
+                }
+
+                for( var i = 1; i < type_length; i += 2 )
+                {
+                  var tmp_type_length = analysis_data[type][i].length;
+                  for( var j = 0; j < tmp_type_length; j++ )
+                  {
+                    global_elements_count = Math.max
+                    (
+                      ( analysis_data[type][i][j].positionHistory || [] )[0] || 1,
+                      global_elements_count
+                    );
+                  }
+                }
+
+                var content = '<div class="' + type + '">' + "\n";
+                content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
+                                
+                for( var i = 0; i < analysis_data[type].length; i += 2 )
+                {
+                  var colspan = 1;
+                  var elements = analysis_data[type][i+1];
+                  var elements_count = global_elements_count;
+                  
+                  if( !elements[0] || !elements[0].positionHistory )
+                  {
+                    colspan = elements_count;
+                    elements_count = 1;
+                  }
+
+                  var legend = [];
+                  for( var key in elements[0] )
+                  {
+                    var key_parts = key.split( '#' );
+                    var used_key = key_parts.pop();
+                    var short_key = used_key;
+
+                    if( 1 === key_parts.length )
+                    {
+                      used_key = '<abbr title="' + key + '">' + used_key + '</abbr>';
+                    }
+
+                    if( 'positionHistory' === short_key || 'match' === short_key )
+                    {
+                      continue;
+                    }
+
+                    legend.push
+                    (
+                      '<tr class="' + generate_class_name( short_key ) + '">' +
+                      '<td>' + used_key + '</td>' +
+                      '</tr>'
+                    );
+                  }
+
+                  content += '<tbody>' + "\n";
+                  content += '<tr class="step">' + "\n";
+
+                    // analyzer
+                    var analyzer_name = analysis_data[type][i].replace( /(\$1)+$/g, '' );
+
+                    var analyzer_short = -1 !== analyzer_name.indexOf( '$' )
+                                       ? analyzer_name.split( '$' )[1]
+                                       : analyzer_name.split( '.' ).pop();
+                    analyzer_short = analyzer_short.match( /[A-Z]/g ).join( '' );
+
+                    content += '<td class="part analyzer"><div>' + "\n";
+                    content += '<abbr title="' + analysis_data[type][i].esc() + '">' + "\n";
+                    content += analyzer_short.esc() + '</abbr></div></td>' + "\n";
+
+                    // legend
+                    content += '<td class="part legend"><div class="holder">' + "\n";
+                    content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
+                    content += '<tr><td>' + "\n";
+                    content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
+                    content += legend.join( "\n" ) + "\n";
+                    content += '</table></td></tr></table></td>' + "\n";
+
+                    // data
+                    var cell_content = '<td class="part data spacer" colspan="' + colspan + '"><div class="holder">&nbsp;</div></td>';
+                    var cells = new Array( elements_count + 1 ).join( cell_content );
+                    content += cells + "\n";
+
+                  content += '</tr>' + "\n";
+                  content += '</tbody>' + "\n";
+                }
+                content += '</table>' + "\n";
+                content += '</div>' + "\n";
+
+                $( '.' + type, analysis_result )
+                  .remove();
+
+                analysis_result
+                  .append( content );
+                                
+                var analysis_result_type = $( '.' + type, analysis_result );
+
+                for( var i = 0; i < analysis_data[type].length; i += 2 )
+                {
+                  for( var j = 0; j < analysis_data[type][i+1].length; j += 1 )
+                  {
+                    var pos = analysis_data[type][i+1][j].positionHistory
+                        ? analysis_data[type][i+1][j].positionHistory[0]
+                        : 1;
+                    var selector = 'tr.step:eq(' + ( i / 2 ) +') '
+                                 + 'td.data:eq(' + ( pos - 1 ) + ') '
+                                 + '.holder';
+                    var cell = $( selector, analysis_result_type );
+
+                    cell.parent()
+                      .removeClass( 'spacer' );
+
+                    var table = $( 'table tr.details', cell );
+                    if( 0 === table.size() )
+                    {
+                      cell
+                        .html
+                        (
+                          '<table border="0" cellspacing="0" cellpadding="0">' + 
+                          '<tr class="details"></tr></table>'
+                        );
+                      var table = $( 'table tr.details', cell );
+                    }
+
+                    var tokens = [];
+                    for( var key in analysis_data[type][i+1][j] )
+                    {
+                      var short_key = key.split( '#' ).pop();
+                                            
+                      if( 'positionHistory' === short_key || 'match' === short_key )
+                      {
+                        continue;
+                      }
+
+                      var classes = [];
+                      classes.push( generate_class_name( short_key ) );
+
+                      var data = analysis_data[type][i+1][j][key];
+                      if( 'object' === typeof data && data instanceof Array )
+                      {
+                        data = data.join( ' ' );
+                      }
+                      if( 'string' === typeof data )
+                      {
+                        data = data.esc();
+                      }
+
+                      if( null === data || 0 === data.length )
+                      {
+                        classes.push( 'empty' );
+                        data = '&empty;';
+                      }
+
+                      if( analysis_data[type][i+1][j].match && 
+                        ( 'text' === short_key || 'raw_bytes' === short_key ) )
+                      {
+                        classes.push( 'match' );
+                      }
+
+                      tokens.push
+                      (
+                        '<tr class="' + classes.join( ' ' ) + '">' +
+                        '<td>' + data + '</td>' +
+                        '</tr>'
+                      );
+                    }
+                    table
+                      .append
+                      (
+                        '<td class="details">' +
+                        '<table border="0" cellspacing="0" cellpadding="0">' +
+                        tokens.join( "\n" ) +
+                        '</table></td>'
+                      );
+                  }
+                }
+                
+              }
+            }
+          }
+                    
+      }
+    );
+  }
+);

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/analysis.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js?rev=1700119&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js (added)
+++ ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js Sun Aug 30 13:27:07 2015
@@ -0,0 +1,669 @@
+/*
+ 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.
+*/
+
+var loader = {
+    
+  show : function( element )
+  {
+    $( element )
+      .addClass( 'loader' );
+  },
+    
+  hide : function( element )
+  {
+    $( element )
+      .removeClass( 'loader' );
+  }
+    
+};
+
+Number.prototype.esc = function()
+{
+  return new String( this ).esc();
+}
+
+String.prototype.esc = function()
+{
+  return this.replace( /</g, '&lt;' ).replace( />/g, '&gt;' );
+}
+
+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] );
+}
+
+var sammy = $.sammy
+(
+  function()
+  {
+    this.bind
+    (
+      'run',
+      function( event, config )
+      {
+        if( 0 === config.start_url.length )
+        {
+          location.href = '#/';
+          return false;
+        }
+      }
+    );
+
+    this.bind
+    (
+      'error',
+      function( message, original_error )
+      {
+        alert( original_error.message );
+      }
+    );
+        
+    // activate_core
+    this.before
+    (
+      {},
+      function( context )
+      {
+        app.clear_timeout();
+
+        var menu_wrapper = $( '#menu-wrapper' );
+
+        $( 'li[id].active', menu_wrapper )
+          .removeClass( 'active' );
+                
+        $( 'li.active', menu_wrapper )
+          .removeClass( 'active' );
+
+        // global dashboard doesn't have params.splat
+        if( !this.params.splat )
+        {
+          this.params.splat = [ '~index' ];
+        }
+
+        var selector = '~' === this.params.splat[0][0]
+                     ? '#' + this.params.splat[0].replace( /^~/, '' ) + '.global'
+                     : '#core-selector #' + this.params.splat[0].replace( /\./g, '__' );
+
+        var active_element = $( selector, menu_wrapper );
+                  
+        if( 0 === active_element.size() )
+        {
+          this.app.error( 'There exists no core with name "' + this.params.splat[0] + '"' );
+          return false;
+        }
+
+        if( active_element.hasClass( 'global' ) )
+        {
+          active_element
+            .addClass( 'active' );
+
+          if( this.params.splat[1] )
+          {
+            $( '.' + this.params.splat[1], active_element )
+              .addClass( 'active' );
+          }
+
+          $( '#core-selector option[selected]' )
+            .removeAttr( 'selected' )
+            .trigger( 'liszt:updated' );
+
+          $( '#core-selector .chzn-container > a' )
+            .addClass( 'chzn-default' );
+        }
+        else
+        {
+          active_element
+            .attr( 'selected', 'selected' )
+            .trigger( 'liszt:updated' );
+
+          if( !this.params.splat[1] )
+          {
+            this.params.splat[1] = 'overview';
+          }
+
+          $( '#core-menu .' + this.params.splat[1] )
+            .addClass( 'active' );
+
+          this.active_core = active_element;
+        }
+      }
+    );
+  }
+);
+
+var solr_admin = function( app_config )
+{
+  that = this,
+
+  menu_element = null,
+
+  is_multicore = null,
+  cores_data = null,
+  active_core = null,
+    
+  config = app_config,
+  params = null,
+  dashboard_values = null,
+  schema_browser_data = null,
+
+  plugin_data = null,
+    
+  this.menu_element = $( '#core-selector select' );
+  this.core_menu = $( '#core-menu ul' );
+
+  this.config = config;
+  this.timeout = null;
+
+  this.core_regex_base = '^#\\/([\\w\\d-\\.]+)';
+
+  browser = {
+    locale : null,
+    language : null,
+    country : null
+  };
+
+  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) ); 
+    }
+  };
+
+  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 )
+  {
+    that.cores_data = sort_cores_data( cores.status );
+    
+    that.menu_element
+      .empty();
+
+    var core_list = [];
+    core_list.push( '<option></option>' );
+
+    var core_count = 0;
+    for( var core_name in that.cores_data )
+    {
+      core_count++;
+      var core_path = config.solr_path + '/' + core_name;
+      var classes = [];
+
+      if( cores.status[core_name]['isDefaultCore'] )
+      {
+        classes.push( 'default' );
+      }
+
+      var core_tpl = '<option '
+                   + '    id="' + core_name.replace( /\./g, '__' ) + '" '
+                   + '    class="' + classes.join( ' ' ) + '"'
+                   + '    data-basepath="' + core_path + '"'
+                   + '    schema="' + cores.status[core_name]['schema'] + '"'
+                   + '    config="' + cores.status[core_name]['config'] + '"'
+                   + '    value="#/' + core_name + '"'
+                   + '    title="' + core_name + '"'
+                   + '>' 
+                   + core_name 
+                   + '</option>';
+
+      core_list.push( core_tpl );
+    }
+
+    var has_cores = 0 !== core_count;
+    if( has_cores )
+    {
+      that.menu_element
+        .append( core_list.join( "\n" ) )
+        .trigger( 'liszt:updated' );
+    }
+
+    var core_selector = $( '#core-selector' );
+    core_selector.find( '#has-cores' ).toggle( has_cores );
+    core_selector.find( '#has-no-cores' ).toggle( !has_cores );
+
+    if( has_cores )
+    {
+      var cores_element = core_selector.find( '#has-cores' );
+      var selector_width = cores_element.width();
+
+      cores_element.find( '.chzn-container' )
+        .css( 'width', selector_width + 'px' );
+      
+      cores_element.find( '.chzn-drop' )
+        .css( 'width', ( selector_width - 2 ) + 'px' );
+    }
+
+    this.check_for_init_failures( cores );
+  };
+
+  this.remove_init_failures = function remove_init_failures()
+  {
+    $( '#init-failures' )
+      .hide()
+      .find( 'ul' )
+        .empty();
+  }
+
+  this.check_for_init_failures = function check_for_init_failures( cores )
+  {
+    if( !cores.initFailures )
+    {
+      this.remove_init_failures();
+      return false;
+    }
+
+    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 )
+    {
+      this.remove_init_failures();
+      return false;
+    }
+
+    $( '#init-failures' )
+      .show()
+      .find( 'ul' )
+        .html( failures.join( "\n" ) );
+  }
+
+  this.run = function()
+  {
+    var navigator_language = navigator.userLanguage || navigator.language;
+    var language_match = navigator_language.match( /^(\w{2})([-_](\w{2}))?$/ );
+    if( language_match )
+    {
+      if( language_match[1] )
+      {
+        browser.language = language_match[1].toLowerCase();
+      }
+      if( language_match[3] )
+      {
+        browser.country = language_match[3].toUpperCase();
+      }
+      if( language_match[1] && language_match[3] )
+      {
+        browser.locale = browser.language + '_' + browser.country
+      }
+    }
+
+    $.ajax
+    (
+      {
+        url : config.solr_path + config.core_admin_path + '?wt=json&indexInfo=false',
+        dataType : 'json',
+        beforeSend : function( arr, form, options )
+        {               
+          $( '#content' )
+            .html( '<div id="index"><div class="loader">Loading ...</div></div>' );
+        },
+        success : function( response )
+        {
+          that.set_cores_data( response );
+
+          that.menu_element
+            .chosen()
+            .off( 'change' )
+            .on
+            (
+              'change',
+              function( event )
+              {
+                location.href = $( 'option:selected', this ).val();
+                return false;
+              }
+            )
+            .on
+            (
+              'liszt:updated',
+              function( event )
+              {
+                var core_name = $( 'option:selected', this ).text();
+
+                that.core_menu
+                  .html
+                  (
+                    //Keep this in alphabetical order after the overview
+                    '<li class="overview"><a href="#/' + core_name + '"><span>Overview</span></a></li>' + "\n" +
+                    '<li class="analysis"><a href="#/' + core_name + '/analysis"><span>Analysis</span></a></li>' + "\n" +
+                    '<li class="dataimport"><a href="#/' + core_name + '/dataimport"><span>Dataimport</span></a></li>' + "\n" +
+                    '<li class="documents"><a href="#/' + core_name + '/documents"><span>Documents</span></a></li>' + "\n" +
+                    '<li class="files"><a href="#/' + core_name + '/files"><span>Files</span></a></li>' + "\n" +
+                    '<li class="ping"><a rel="' + that.config.solr_path + '/' + core_name + '/admin/ping"><span>Ping</span></a></li>' + "\n" +
+                    '<li class="plugins"><a href="#/' + core_name + '/plugins"><span>Plugins / Stats</span></a></li>' + "\n" +
+                    '<li class="query"><a href="#/' + core_name + '/query"><span>Query</span></a></li>' + "\n" +
+                    '<li class="replication"><a href="#/' + core_name + '/replication"><span>Replication</span></a></li>' + "\n" +
+                    '<li class="schema-browser"><a href="#/' + core_name + '/schema-browser"><span>Schema Browser</span></a></li>'
+                  )
+                  .show();
+
+                if( !core_name )
+                {
+                  that.core_menu
+                    .hide()
+                    .empty();
+                }
+              }
+            );
+
+          var system_url = config.solr_path + '/admin/info/system?wt=json';
+          $.ajax
+          (
+            {
+              url : system_url,
+              dataType : 'json',
+              beforeSend : function( arr, form, options )
+              {
+              },
+              success : function( response )
+              {
+                that.dashboard_values = response;
+
+                var environment_args = null;
+                var cloud_args = null;
+
+                if( response.jvm && response.jvm.jmx && response.jvm.jmx.commandLineArgs )
+                {
+                  var command_line_args = response.jvm.jmx.commandLineArgs.join( ' | ' );
+
+                  environment_args = command_line_args.match( /-Dsolr.environment=((dev|test|prod)?[\w\d]*)/i );
+                }
+
+                if( response.mode )
+                {
+                  cloud_args = response.mode.match( /solrcloud/i );
+                }
+
+                // environment
+
+                var wrapper = $( '#wrapper' );
+                var environment_element = $( '#environment' );
+                if( environment_args )
+                {
+                  wrapper
+                    .addClass( 'has-environment' );
+
+                  if( environment_args[1] )
+                  {
+                    environment_element
+                      .html( environment_args[1] );
+                  }
+
+                  if( environment_args[2] )
+                  {
+                    environment_element
+                      .addClass( environment_args[2] );
+                  }
+                }
+                else
+                {
+                  wrapper
+                    .removeClass( 'has-environment' );
+                }
+
+                // cloud
+
+                var cloud_nav_element = $( '#menu #cloud' );
+                if( cloud_args )
+                {
+                  cloud_nav_element
+                    .show();
+                }
+
+                // sammy
+
+                sammy.run( location.hash );
+              },
+              error : function()
+              {
+                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>'
+                );
+              },
+              complete : function()
+              {
+                loader.hide( this );
+              }
+            }
+          );
+        },
+        error : function()
+        {
+        },
+        complete : function()
+        {
+        }
+      }
+    );
+  };
+
+  this.convert_duration_to_seconds = function convert_duration_to_seconds( str )
+  {
+    var seconds = 0;
+    var arr = new String( str || '' ).split( '.' );
+    var parts = arr[0].split( ':' ).reverse();
+    var parts_count = parts.length;
+
+    for( var i = 0; i < parts_count; i++ )
+    {
+      seconds += ( parseInt( parts[i], 10 ) || 0 ) * Math.pow( 60, i );
+    }
+
+    // treat more or equal than .5 as additional second
+    if( arr[1] && 5 <= parseInt( arr[1][0], 10 ) )
+    {
+      seconds++;
+    }
+
+    return seconds;
+  };
+
+  this.convert_seconds_to_readable_time = function convert_seconds_to_readable_time( seconds )
+  {
+    seconds = parseInt( seconds || 0, 10 );
+    var minutes = Math.floor( seconds / 60 );
+    var hours = Math.floor( minutes / 60 );
+
+    var text = [];
+    if( 0 !== hours )
+    {
+      text.push( hours + 'h' );
+      seconds -= hours * 60 * 60;
+      minutes -= hours * 60;
+    }
+
+    if( 0 !== minutes )
+    {
+      text.push( minutes + 'm' );
+      seconds -= minutes * 60;
+    }
+
+    if( 0 !== seconds )
+    {
+      text.push( ( '0' + seconds ).substr( -2 ) + 's' );
+    }
+
+    return text.join( ' ' );
+  };
+
+  this.clear_timeout = function clear_timeout()
+  {
+    if( !app.timeout )
+    {
+      return false;
+    }
+
+    console.debug( 'Clearing Timeout #' + this.timeout );
+    clearTimeout( this.timeout );
+    this.timeout = null;
+  };
+
+  this.format_json = function format_json( json_str )
+  {
+    if( JSON.stringify && JSON.parse )
+    {
+      json_str = JSON.stringify( JSON.parse( json_str ), undefined, 2 );
+    }
+
+    return json_str.esc();
+  };
+
+  this.format_number = function format_number( number )
+  {
+    var sep = {
+      'de_CH' : '\'',
+      'de' : '.',
+      'en' : ',',
+      'es' : '.',
+      'it' : '.',
+      'ja' : ',',
+      'sv' : ' ',
+      'tr' : '.',
+      '_' : '' // fallback
+    };
+
+    return ( number || 0 ).toString().replace
+    (
+      /\B(?=(\d{3})+(?!\d))/g,
+      sep[ browser.locale ] || sep[ browser.language ] || sep['_']
+    );
+  };
+
+};
+
+var connection_check_delay = 1000;
+var connection_working = true;
+
+var connection_check = function connection_check()
+{
+  $.ajax
+  (
+    {
+      url : config.solr_path + config.core_admin_path + '?wt=json&indexInfo=false',
+      dataType : 'json',
+      context : $( '.blockUI #connection_status span' ),
+      beforeSend : function( arr, form, options )
+      {               
+        this
+          .addClass( 'loader' );
+      },
+      success : function( response )
+      {
+        connection_working = true;
+
+        this
+          .html( 'Instance is available - <a href="javascript:location.reload();">Reload the page</a>' );
+
+        this.parents( '#connection_status' )
+          .addClass( 'online' );
+
+        this.parents( '.blockUI' )
+          .css( 'borderColor', '#080' );
+      },
+      error : function()
+      {
+        connection_check_delay += connection_check_delay;
+        window.setTimeout( connection_check, connection_check_delay );
+      },
+      complete : function()
+      {
+        this
+          .removeClass( 'loader' );
+      }
+    }
+  );
+};
+
+var connection_error = function connection_error()
+{
+  connection_working = false;
+
+  $.blockUI
+  (
+    {
+      message: $( '#connection_status' ),
+      css: { width: '450px', borderColor: '#f00' }
+    }
+  );
+
+  window.setTimeout( connection_check, connection_check_delay );
+}
+
+$( document ).ajaxError
+(
+  function( event, xhr, settings, thrownError )
+  {
+    if( connection_working && 0 === xhr.status )
+    {
+      connection_error();
+    }
+  }
+);
+
+$.ajaxSetup( { cache: false } );
+var app = new solr_admin( app_config );

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/app.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js?rev=1700119&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js (added)
+++ ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js Sun Aug 30 13:27:07 2015
@@ -0,0 +1,740 @@
+/*
+ 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.
+*/
+
+var zk_error = function zk_error( xhr, text_status, error_thrown )
+{
+  var zk = null;
+  try
+  {
+    eval( 'zk = ' + xhr.responseText + ';' );
+  }
+  catch( e ) {}
+
+  var message = '<p class="txt">Loading of "<code>' + xhr.url + '</code>" '
+              + 'failed (HTTP-Status <code>' + xhr.status + '</code>)</p>' + "\n";
+
+  if( zk.error )
+  {
+    message += '<p class="msg">"' + zk.error.esc() + '"</p>' + "\n";
+  }
+  
+  this.closest( '#cloud' )
+    .html( '<div class="block" id="error">' + message + '</div>' );
+};
+
+var init_debug = function( cloud_element )
+{
+  var debug_element = $( '#debug', cloud_element );
+  var debug_button = $( '#menu #cloud .dump a' );
+
+  var clipboard_element = $( '.clipboard', debug_element );
+  var clipboard_button = $( 'a', clipboard_element );
+
+  debug_button
+    .die( 'click' )
+    .live
+    (
+      'click',
+      function( event )
+      {
+        debug_element.trigger( 'show' );
+        return false;
+      }
+    );
+
+  $( '.close', debug_element )
+    .die( 'click' )
+    .live
+    (
+      'click',
+      function( event )
+      {
+        debug_element.trigger( 'hide' );
+        return false;
+      }
+    );
+
+  $( '.clipboard', debug_element )
+    .die( 'click' )
+    .live
+    (
+      'click',
+      function( event )
+      {
+        return false;
+      }
+    );
+
+  debug_element
+    .die( 'show' )
+    .live
+    (
+      'show',
+      function( event )
+      {
+        debug_element.show();
+
+        $.ajax
+        (
+          {
+            url : app.config.solr_path + '/zookeeper?wt=json&dump=true',
+            dataType : 'text',
+            context : debug_element,
+            beforeSend : function( xhr, settings )
+            {
+              $( '.debug', debug_element )
+                .html( '<span class="loader">Loading Dump ...</span>' );
+
+              ZeroClipboard.setMoviePath( 'img/ZeroClipboard.swf' );
+
+              clipboard_client = new ZeroClipboard.Client();
+                              
+              clipboard_client.addEventListener
+              (
+                'load',
+                function( client )
+                {
+                }
+              );
+
+              clipboard_client.addEventListener
+              (
+                'complete',
+                function( client, text )
+                {
+                  clipboard_element
+                    .addClass( 'copied' );
+
+                  clipboard_button
+                    .data( 'text', clipboard_button.text() )
+                    .text( clipboard_button.data( 'copied' ) );
+                }
+              );
+            },
+            success : function( response, text_status, xhr )
+            {
+              clipboard_client.glue
+              (
+                clipboard_element.get(0),
+                clipboard_button.get(0)
+              );
+
+              clipboard_client.setText( response.replace( /\\/g, '\\\\' ) );
+
+              $( '.debug', debug_element )
+                .removeClass( 'loader' )
+                .text( response );
+            },
+            error : function( xhr, text_status, error_thrown )
+            {
+            },
+            complete : function( xhr, text_status )
+            {
+            }
+          }
+        );
+      }
+    )
+    .die( 'hide' )
+    .live
+    (
+      'hide',
+      function( event )
+      {
+        $( '.debug', debug_element )
+          .empty();
+
+        clipboard_element
+          .removeClass( 'copied' );
+
+        clipboard_button
+          .data( 'copied', clipboard_button.text() )
+          .text( clipboard_button.data( 'text' ) );
+
+        clipboard_client.destroy();
+
+        debug_element.hide();
+      }
+    );
+};
+
+var helper_path_class = function( p )
+{
+  var classes = [ 'link' ];
+  classes.push( 'lvl-' + p.target.depth );
+
+  if( p.target.data && p.target.data.leader )
+  {
+    classes.push( 'leader' );
+  }
+
+  if( p.target.data && p.target.data.state )
+  {
+    classes.push( p.target.data.state );
+  }
+
+  return classes.join( ' ' );
+};
+
+var helper_node_class = function( d )
+{
+  var classes = [ 'node' ];
+  classes.push( 'lvl-' + d.depth );
+
+  if( d.data && d.data.leader )
+  {
+    classes.push( 'leader' );
+  }
+
+  if( d.data && d.data.state )
+  {
+    classes.push( d.data.state );
+  }
+
+  return classes.join( ' ' );
+};
+
+var helper_data = {
+  protocol: [],
+  host: [],
+  hostname: [],
+  port: [],
+  pathname: []
+};
+
+var helper_node_text = function( d )
+{
+  if( !d.data || !d.data.uri )
+  {
+    return d.name;
+  }
+
+  var name = d.data.uri.hostname;
+
+  if( 1 !== helper_data.protocol.length )
+  {
+    name = d.data.uri.protocol + '//' + name;
+  }
+
+  if( 1 !== helper_data.port.length )
+  {
+    name += ':' + d.data.uri.port;
+  }
+
+  if( 1 !== helper_data.pathname.length )
+  {
+    name += d.data.uri.pathname;
+  }
+
+  return name;
+};
+
+var generate_graph = function( graph_element, graph_data, leaf_count )
+{
+  var w = graph_element.width(),
+      h = leaf_count * 20;
+
+  var tree = d3.layout.tree()
+    .size([h, w - 400]);
+
+  var diagonal = d3.svg.diagonal()
+    .projection(function(d) { return [d.y, d.x]; });
+
+  var vis = d3.select( '#canvas' ).append( 'svg' )
+    .attr( 'width', w )
+    .attr( 'height', h)
+    .append( 'g' )
+      .attr( 'transform', 'translate(100, 0)' );
+
+  var nodes = tree.nodes( graph_data );
+
+  var link = vis.selectAll( 'path.link' )
+    .data( tree.links( nodes ) )
+    .enter().append( 'path' )
+      .attr( 'class', helper_path_class )
+      .attr( 'd', diagonal );
+
+  var node = vis.selectAll( 'g.node' )
+    .data( nodes )
+    .enter().append( 'g' )
+      .attr( 'class', helper_node_class )
+      .attr( 'transform', function(d) { return 'translate(' + d.y + ',' + d.x + ')'; } )
+
+  node.append( 'circle' )
+    .attr( 'r', 4.5 );
+
+  node.append( 'text' )
+    .attr( 'dx', function( d ) { return 0 === d.depth ? -8 : 8; } )
+    .attr( 'dy', function( d ) { return 5; } )
+    .attr( 'text-anchor', function( d ) { return 0 === d.depth ? 'end' : 'start'; } )
+    .attr( 'data-href', function( d ) { return d.name; } )
+    .text( helper_node_text );
+
+  $( 'text[data-href*="//"]', graph_element )
+    .die( 'click' )
+    .live
+    (
+      'click',
+      function()
+      {
+        location.href = $( this ).data( 'href' );
+      }
+    );
+};
+
+var generate_rgraph = function( graph_element, graph_data, leaf_count )
+{
+  var max_val = Math.min( graph_element.width(), $( 'body' ).height() )
+  var r = max_val / 2;
+
+  var cluster = d3.layout.cluster()
+    .size([360, r - 160]);
+
+  var diagonal = d3.svg.diagonal.radial()
+    .projection(function(d) { return [d.y, d.x / 180 * Math.PI]; });
+
+  var vis = d3.select( '#canvas' ).append( 'svg' )
+    .attr( 'width', r * 2 )
+    .attr( 'height', r * 2 )
+    .append( 'g' )
+      .attr( 'transform', 'translate(' + r + ',' + r + ')' );
+
+  var nodes = cluster.nodes( graph_data );
+
+  var link = vis.selectAll( 'path.link' )
+    .data( cluster.links( nodes ) )
+    .enter().append( 'path' )
+      .attr( 'class', helper_path_class )
+      .attr( 'd', diagonal );
+
+  var node = vis.selectAll( 'g.node' )
+    .data( nodes )
+    .enter().append( 'g' )
+      .attr( 'class', helper_node_class )
+      .attr( 'transform', function(d) { return 'rotate(' + (d.x - 90) + ')translate(' + d.y + ')'; } )
+
+  node.append( 'circle' )
+    .attr( 'r', 4.5 );
+
+  node.append( 'text' )
+    .attr( 'dx', function(d) { return d.x < 180 ? 8 : -8; } )
+    .attr( 'dy', '.31em' )
+    .attr( 'text-anchor', function(d) { return d.x < 180 ? 'start' : 'end'; } )
+    .attr( 'transform', function(d) { return d.x < 180 ? null : 'rotate(180)'; } )
+    .attr( 'data-href', function( d ) { return d.name; } )
+    .text( helper_node_text );
+
+  $( 'text[data-href*="//"]', graph_element )
+    .die( 'click' )
+    .live
+    (
+      'click',
+      function()
+      {
+        location.href = $( this ).data( 'href' );
+      }
+    );
+};
+
+var prepare_graph = function( graph_element, callback )
+{
+  $.ajax
+  (
+    {
+      url : app.config.solr_path + '/zookeeper?wt=json&path=%2Flive_nodes',
+      dataType : 'json',
+      success : function( response, text_status, xhr )
+      {
+        var live_nodes = {};
+        for( var c in response.tree[0].children )
+        {
+          live_nodes[response.tree[0].children[c].data.title] = true;
+        }
+
+        $.ajax
+        (
+          {
+            url : app.config.solr_path + '/zookeeper?wt=json&detail=true&path=%2Fclusterstate.json',
+            dataType : 'json',
+            context : graph_element,
+            beforeSend : function( xhr, settings )
+            {
+              this
+                .show();
+            },
+            success : function( response, text_status, xhr )
+            {
+              var state = null;
+              eval( 'state = ' + response.znode.data + ';' );
+              
+              var leaf_count = 0;
+              var graph_data = {
+                name: null,
+                children : []
+              };
+
+              for( var c in state )
+              {
+                var shards = [];
+                for( var s in state[c].shards )
+                {
+                  var nodes = [];
+                  for( var n in state[c].shards[s].replicas )
+                  {
+                    leaf_count++;
+                    var replica = state[c].shards[s].replicas[n]
+
+                    var uri = replica.base_url;
+                    var parts = uri.match( /^(\w+:)\/\/(([\w\d\.-]+)(:(\d+))?)(.+)$/ );
+                    var uri_parts = {
+                      protocol: parts[1],
+                      host: parts[2],
+                      hostname: parts[3],
+                      port: parseInt( parts[5] || 80, 10 ),
+                      pathname: parts[6]
+                    };
+                    
+                    helper_data.protocol.push( uri_parts.protocol );
+                    helper_data.host.push( uri_parts.host );
+                    helper_data.hostname.push( uri_parts.hostname );
+                    helper_data.port.push( uri_parts.port );
+                    helper_data.pathname.push( uri_parts.pathname );
+
+                    var status = replica.state;
+
+                    if( !live_nodes[replica.node_name] )
+                    {
+                      status = 'gone';
+                    }
+
+                    var node = {
+                      name: uri,
+                      data: {
+                        type : 'node',
+                        state : status,
+                        leader : 'true' === replica.leader,
+                        uri : uri_parts
+                      }
+                    };
+                    nodes.push( node );
+                  }
+
+                  var shard = {
+                    name: s,
+                    data: {
+                      type : 'shard'
+                    },
+                    children: nodes
+                  };
+                  shards.push( shard );
+                }
+
+                var collection = {
+                  name: c,
+                  data: {
+                    type : 'collection'
+                  },
+                  children: shards
+                };
+                graph_data.children.push( collection );
+              }
+              
+              helper_data.protocol = $.unique( helper_data.protocol );
+              helper_data.host = $.unique( helper_data.host );
+              helper_data.hostname = $.unique( helper_data.hostname );
+              helper_data.port = $.unique( helper_data.port );
+              helper_data.pathname = $.unique( helper_data.pathname );
+
+              callback( graph_element, graph_data, leaf_count );
+            },
+            error : function( xhr, text_status, error_thrown)
+            {
+            },
+            complete : function( xhr, text_status )
+            {
+            }
+          }
+        );
+      },
+      error : function( xhr, text_status, error_thrown)
+      {
+      },
+      complete : function( xhr, text_status )
+      {
+      }
+    }
+  );
+
+};
+
+var init_graph = function( graph_element )
+{
+  prepare_graph
+  (
+    graph_element,
+    function( graph_element, graph_data, leaf_count )
+    {
+      generate_graph( graph_element, graph_data, leaf_count );
+    }
+  );
+}
+
+var init_rgraph = function( graph_element )
+{
+  prepare_graph
+  (
+    graph_element,
+    function( graph_element, graph_data, leaf_count )
+    {
+      generate_rgraph( graph_element, graph_data, leaf_count );
+    }
+  );
+}
+
+var init_tree = function( tree_element )
+{
+  $.ajax
+  (
+    {
+      url : app.config.solr_path + '/zookeeper?wt=json',
+      dataType : 'json',
+      context : tree_element,
+      beforeSend : function( xhr, settings )
+      {
+        this
+          .show();
+      },
+      success : function( response, text_status, xhr )
+      {
+        var self = this;
+                      
+        $( '#tree', this )
+          .jstree
+          (
+            {
+              "plugins" : [ "json_data" ],
+              "json_data" : {
+                "data" : response.tree,
+                "progressive_render" : true
+              },
+              "core" : {
+                "animation" : 0
+              }
+            }
+          )
+          .jstree
+          (
+            'open_node',
+            'li:first'
+          );
+
+        var tree_links = $( '#tree a', this );
+
+        tree_links
+          .die( 'click' )
+          .live
+          (
+            'click',
+            function( event )
+            {
+              $( 'a.active', $( this ).parents( '#tree' ) )
+                .removeClass( 'active' );
+                                  
+              $( this )
+                .addClass( 'active' );
+
+              tree_element
+                .addClass( 'show' );
+
+              var file_content = $( '#file-content' );
+
+              $( 'a.close', file_content )
+                .die( 'click' )
+                .live
+                (
+                  'click',
+                  function( event )
+                  {
+                    $( '#tree a.active' )
+                      .removeClass( 'active' );
+                                      
+                    tree_element
+                      .removeClass( 'show' );
+
+                    return false;
+                  }
+                );
+
+              $.ajax
+              (
+                {
+                  url : this.href,
+                  dataType : 'json',
+                  context : file_content,
+                  beforeSend : function( xhr, settings )
+                  {
+                  },
+                  success : function( response, text_status, xhr )
+                  {
+                    var props = [];
+                    for( var key in response.znode.prop )
+                    {
+                      props.push
+                      (
+                        '<li><dl class="clearfix">' + "\n" +
+                          '<dt>' + key.esc() + '</dt>' + "\n" +
+                          '<dd>' + response.znode.prop[key].esc() + '</dd>' + "\n" +
+                        '</dl></li>'
+                      );
+                    }
+
+                    $( '#prop ul', this )
+                      .empty()
+                      .html( props.join( "\n" ) );
+
+                    $( '#prop ul li:odd', this )
+                      .addClass( 'odd' );
+
+                    var data_element = $( '#data', this );
+
+                    var highlight = false;
+                    var data = '<em>Node "' + response.znode.path + '" has no utf8 Content</em>';
+
+                    if( response.znode.data )
+                    {
+                      var classes = '';
+                      var path = response.znode.path.split( '.' );
+                      
+                      if( 1 < path.length )
+                      {
+                        highlight = true;
+                        classes = 'syntax language-' + path.pop().esc();
+                      }
+
+                      data = '<pre class="' + classes + '">'
+                           + response.znode.data.esc()
+                           + '</pre>';
+                    }
+                               
+
+                    data_element
+                        .show()
+                        .html( data );
+
+                    if( highlight )
+                    {
+                      hljs.highlightBlock( data_element.get(0) );
+                    }
+                    
+                  },
+                  error : function( xhr, text_status, error_thrown)
+                  {
+                  },
+                  complete : function( xhr, text_status )
+                  {
+                  }
+                }
+              );
+
+              return false;
+            }
+          );
+      },
+      error : zk_error,
+      complete : function( xhr, text_status )
+      {
+      }
+    }
+  );
+};
+
+// #/~cloud
+sammy.get
+(
+  /^#\/(~cloud)$/,
+  function( context )
+  {
+    var content_element = $( '#content' );
+
+    $.get
+    (
+      'tpl/cloud.html',
+      function( template )
+      {
+        content_element
+          .html( template );
+
+        var cloud_element = $( '#cloud', content_element );
+        var navigation_element = $( '#menu #cloud' );
+
+        init_debug( cloud_element );
+
+        $( '.tree', navigation_element )
+          .die( 'activate' )
+          .live
+          (
+            'activate',
+            function( event )
+            {
+              $( this ).addClass( 'active' );
+              init_tree( $( '#tree-content', cloud_element ) );
+            }
+          );
+
+        $( '.graph', navigation_element )
+          .die( 'activate' )
+          .live
+          (
+            'activate',
+            function( event )
+            {
+              $( this ).addClass( 'active' );
+              init_graph( $( '#graph-content', cloud_element ) );
+            }
+          );
+
+        $( '.rgraph', navigation_element )
+          .die( 'activate' )
+          .live
+          (
+            'activate',
+            function( event )
+            {
+              $( this ).addClass( 'active' );
+              init_rgraph( $( '#graph-content', cloud_element ) );
+            }
+          );
+
+        $.ajax
+        (
+          {
+            url : app.config.solr_path + '/zookeeper?wt=json',
+            dataType : 'json',
+            context : cloud_element,
+            success : function( response, text_status, xhr )
+            {
+              $( 'a[href="' + context.path + '"]', navigation_element )
+                .trigger( 'activate' );
+            },
+            error : zk_error
+          }
+        );
+        
+      }
+    );
+  }
+);

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cloud.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js?rev=1700119&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js (added)
+++ ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js Sun Aug 30 13:27:07 2015
@@ -0,0 +1,734 @@
+/*
+ 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.
+*/
+
+sammy.bind
+(
+  'cores_load_data',
+  function( event, params )
+  {
+    $.ajax
+    (
+      {
+        url : app.config.solr_path + app.config.core_admin_path + '?wt=json',
+        dataType : 'json',
+        beforeSend : function( xhr, settings )
+        {
+        },
+        success : function( response, text_status, xhr )
+        {
+          if( params.only_failures )
+          {
+            app.check_for_init_failures( response );
+            return true;
+          }
+
+          var has_cores = false;
+          for( core in response.status )
+          {
+            has_cores = true; break;
+          }
+
+          app.set_cores_data( response );
+          
+          if( has_cores )
+          {
+            params.success( app.cores_data );
+          }
+          /** OFBiz customization **/
+          else if( response.ofbizLogin )
+          {
+            params.ofbizLogin();
+          }
+          else
+          {
+            params.error();
+          }
+        },
+        error : function( xhr, text_status, error_thrown)
+        {
+        },
+        complete : function( xhr, text_status )
+        {
+        }
+      }
+    );
+  }
+);
+
+sammy.bind
+(
+  'cores_build_navigation',
+  function( event, params )
+  {
+    var navigation_content = ['<ul>'];
+
+    for( var core in params.cores )
+    {
+      var core_name = core;
+      if( !core_name )
+      {
+        core_name = '<em>(empty)</em>';
+      }
+      navigation_content.push( '<li><a href="' + params.basepath + core + '">' + core_name + '</a></li>' );
+    }
+
+    params.navigation_element
+      .html( navigation_content.join( "\n" ) );
+        
+    $( 'a[href="' + params.basepath + params.current_core + '"]', params.navigation_element ).parent()
+      .addClass( 'current' );
+  }
+);
+
+sammy.bind
+(
+  'cores_load_template',
+  function( event, params )
+  {
+    if( app.cores_template )
+    {
+      params.callback();
+      return true;
+    }
+
+    $.get
+    (
+      'tpl/cores.html',
+      function( template )
+      {
+        params.content_element
+          .html( template );
+             
+        app.cores_template = template;   
+        params.callback();
+      }
+    );
+  }
+);
+
+// #/~cores
+sammy.get
+(
+  /^#\/(~cores)$/,
+  function( context )
+  {
+    delete app.cores_template;
+    var content_element = $( '#content' );
+
+    sammy.trigger
+    (
+      'cores_load_data',
+      {
+        /** OFBiz customization **/
+        ofbizLogin : function()
+        {
+          context.redirect( 'control/checkLogin' );
+        },
+        success : function( cores )
+        {
+          var first_core = null;
+          for( var key in cores )
+          {
+            if( !first_core )
+            {
+              first_core = key;
+            }
+            continue;
+          }
+          context.redirect( context.path + '/' + first_core );
+        },
+        error : function()
+        {
+          sammy.trigger
+          (
+            'cores_load_template',
+            {
+              content_element : content_element,
+              callback : function()
+              {
+                var cores_element = $( '#cores', content_element );
+                var navigation_element = $( '#navigation', cores_element );
+                var data_element = $( '#data', cores_element );
+                var core_data_element = $( '#core-data', data_element );
+                var index_data_element = $( '#index-data', data_element );
+
+                // layout
+
+                var ui_block = $( '#ui-block' );
+                var actions_element = $( '.actions', cores_element );
+                var div_action = $( 'div.action', actions_element );
+
+                ui_block
+                  .css( 'opacity', 0.7 )
+                  .width( cores_element.width() + 10 )
+                  .height( cores_element.height() );
+
+                if( $( '#cloud.global' ).is( ':visible' ) )
+                {
+                  $( '.cloud', div_action )
+                    .show();
+                }
+
+                $( 'button.action', actions_element )
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      var self = $( this );
+
+                      self
+                        .toggleClass( 'open' );
+
+                      $( '.action.' + self.attr( 'id' ), actions_element )
+                        .trigger( 'open' );
+
+                      return false;
+                    }
+                  );
+
+                div_action
+                  .die( 'close' )
+                  .live
+                  (
+                    'close',
+                    function( event )
+                    {
+                      div_action.hide();
+                      ui_block.hide();
+                    }
+                  )
+                  .die( 'open' )
+                  .live
+                  (
+                    'open',
+                    function( event )
+                    {
+                      var self = $( this );
+                      var rel = $( '#' + self.data( 'rel' ) );
+
+                      self
+                        .trigger( 'close' )
+                        .show()
+                        .css( 'left', rel.position().left );
+                      
+                      ui_block
+                        .show();
+                    }
+                  );
+
+                $( 'form button.reset', actions_element )
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      $( this ).closest( 'div.action' )
+                        .trigger( 'close' );
+                    }
+                  );
+
+                $( 'form', div_action )
+                  .ajaxForm
+                  (
+                    {
+                      url : app.config.solr_path + app.config.core_admin_path + '?wt=json&indexInfo=false',
+                      dataType : 'json',
+                      beforeSubmit : function( array, form, options )
+                      {
+                        $( 'button[type="submit"] span', form )
+                          .addClass( 'loader' );
+                      },
+                      success : function( response, status_text, xhr, form )
+                      {
+                        delete app.cores_data;
+                        sammy.refresh();
+
+                        $( 'button.reset', form )
+                          .trigger( 'click' );
+                      },
+                      error : function( xhr, text_status, error_thrown )
+                      {
+                        var response = null;
+                        eval( 'response = ' + xhr.responseText + ';' );
+
+                        var error_elem = $( '.error', div_action.filter( ':visible' ) );
+                        error_elem.show();
+                        $( 'span', error_elem ).text( response.error.msg );
+                      },
+                      complete : function()
+                      {
+                        $( 'button span.loader', actions_element )
+                          .removeClass( 'loader' );
+                      }
+                    }
+                  );
+
+                // --
+
+                $( '#add', content_element )
+                  .trigger( 'click' );
+
+                $( '[data-rel="add"] input[type="text"]:first', content_element )
+                  .focus();
+              }
+            }
+          );
+        }
+      }
+    );
+  }
+);
+
+// #/~cores
+sammy.get
+(
+  /^#\/(~cores)\//,
+  function( context )
+  {
+    var content_element = $( '#content' );
+
+    var path_parts = this.path.match( /^(.+\/~cores\/)(.*)$/ );
+    var current_core = path_parts[2];
+
+    sammy.trigger
+    (
+      'cores_load_data',
+      {
+        /** OFBiz customization **/
+        ofbizLogin : function()
+        {
+          context.redirect( 'control/checkLogin' );
+        },
+        error : function()
+        {
+          context.redirect( '#/' + context.params.splat[0] );
+        },
+        success : function( cores )
+        {
+          sammy.trigger
+          (
+            'cores_load_template',
+            {
+              content_element : content_element,
+              callback : function()
+              {
+                var cores_element = $( '#cores', content_element );
+                var navigation_element = $( '#navigation', cores_element );
+                var data_element = $( '#data', cores_element );
+                var core_data_element = $( '#core-data', data_element );
+                var index_data_element = $( '#index-data', data_element );
+
+                cores_element
+                  .removeClass( 'empty' );
+
+                sammy.trigger
+                (
+                  'cores_build_navigation',
+                  {
+                    cores : cores,
+                    basepath : path_parts[1],
+                    current_core : current_core,
+                    navigation_element : navigation_element
+                  }
+                );
+
+                var core_data = cores[current_core];
+                var core_basepath = $( '#' + current_core, app.menu_element ).attr( 'data-basepath' );
+
+                // core-data
+
+                $( '.startTime dd', core_data_element )
+                  .html( core_data.startTime );
+
+                $( '.instanceDir dd', core_data_element )
+                  .html( core_data.instanceDir );
+
+                $( '.dataDir dd', core_data_element )
+                  .html( core_data.dataDir );
+
+                // index-data
+
+                $( '.lastModified dd', index_data_element )
+                  .html( core_data.index.lastModified || '-' );
+
+                $( '.version dd', index_data_element )
+                  .html( core_data.index.version );
+
+                $( '.numDocs dd', index_data_element )
+                  .html( core_data.index.numDocs );
+
+                $( '.maxDoc dd', index_data_element )
+                  .html( core_data.index.maxDoc );
+                
+                $( '.deletedDocs dd', index_data_element )
+                  .html( core_data.index.deletedDocs || '-' );
+
+                $( '.optimized dd', index_data_element )
+                  .addClass( !core_data.index.hasDeletions ? 'ico-1' : 'ico-0' );
+
+                $( '#actions #optimize', cores_element )
+                  .show();
+
+                $( '.optimized dd span', index_data_element )
+                  .html( !core_data.index.hasDeletions ? 'yes' : 'no' );
+
+                $( '.current dd', index_data_element )
+                  .addClass( core_data.index.current ? 'ico-1' : 'ico-0' );
+
+                $( '.current dd span', index_data_element )
+                  .html( core_data.index.current ? 'yes' : 'no' );
+
+                $( '.directory dd', index_data_element )
+                  .html
+                  (
+                    core_data.index.directory
+                      .replace( /:/g, ':&#8203;' )
+                      .replace( /@/g, '@&#8203;' )
+                  );
+
+                var core_names = [];
+                var core_selects = $( '#actions select', cores_element );
+
+                for( var key in cores )
+                {
+                  core_names.push( '<option value="' + key + '">' + key + '</option>' )
+                }
+
+                core_selects
+                  .html( core_names.join( "\n") );
+
+                $( 'option[value="' + current_core + '"]', core_selects.filter( '.other' ) )
+                  .remove();
+                
+                $( 'input[data-core="current"]', cores_element )
+                  .val( current_core );
+
+                // layout
+
+                var ui_block = $( '#ui-block' );
+                var actions_element = $( '.actions', cores_element );
+                var div_action = $( 'div.action', actions_element );
+
+                ui_block
+                  .css( 'opacity', 0.7 )
+                  .width( cores_element.width() + 10 )
+                  .height( cores_element.height() );
+
+                if( $( '#cloud.global' ).is( ':visible' ) )
+                {
+                  $( '.cloud', div_action )
+                    .show();
+                }
+
+                $( 'button.action', actions_element )
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      var self = $( this );
+
+                      self
+                        .toggleClass( 'open' );
+
+                      $( '.action.' + self.attr( 'id' ), actions_element )
+                        .trigger( 'open' );
+
+                      return false;
+                    }
+                  );
+
+                div_action
+                  .die( 'close' )
+                  .live
+                  (
+                    'close',
+                    function( event )
+                    {
+                      div_action.hide();
+                      ui_block.hide();
+                    }
+                  )
+                  .die( 'open' )
+                  .live
+                  (
+                    'open',
+                    function( event )
+                    {
+                      var self = $( this );
+                      var rel = $( '#' + self.data( 'rel' ) );
+
+                      self
+                        .trigger( 'close' )
+                        .show()
+                        .css( 'left', rel.position().left );
+                      
+                      ui_block
+                        .show();
+                    }
+                  );
+
+                $( 'form button.reset', actions_element )
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      $( this ).closest( 'div.action' )
+                        .trigger( 'close' );
+                    }
+                  );
+
+                var form_callback = {
+
+                  rename : function( form, response )
+                  {
+                    var url = path_parts[1] + $( 'input[name="other"]', form ).val();
+                    context.redirect( url );
+                  }
+
+                };
+
+                $( 'form', div_action )
+                  .ajaxForm
+                  (
+                    {
+                      url : app.config.solr_path + app.config.core_admin_path + '?wt=json&indexInfo=false',
+                      dataType : 'json',
+                      beforeSubmit : function( array, form, options )
+                      {
+                        $( 'button[type="submit"] span', form )
+                          .addClass( 'loader' );
+                      },
+                      success : function( response, status_text, xhr, form )
+                      {
+                        var action = $( 'input[name="action"]', form ).val().toLowerCase();
+
+                        delete app.cores_data;
+
+                        if( form_callback[action] )
+                        {
+                         form_callback[action]( form, response ); 
+                        }
+                        else
+                        {
+                          sammy.refresh();
+                        }
+
+                        $( 'button.reset', form )
+                          .trigger( 'click' );
+                      },
+                      error : function( xhr, text_status, error_thrown )
+                      {
+                        var response = null;
+                        eval( 'response = ' + xhr.responseText + ';' );
+
+                        var error_elem = $( '.error', div_action.filter( ':visible' ) );
+                        error_elem.show();
+                        $( 'span', error_elem ).text( response.error.msg );
+                      },
+                      complete : function()
+                      {
+                        $( 'button span.loader', actions_element )
+                          .removeClass( 'loader' );
+                      }
+                    }
+                  );
+
+                var reload_button = $( '#actions #reload', cores_element );
+                reload_button
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      $.ajax
+                      (
+                        {
+                          url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=RELOAD&core=' + current_core,
+                          dataType : 'json',
+                          context : $( this ),
+                          beforeSend : function( xhr, settings )
+                          {
+                            $( 'span', this )
+                              .addClass( 'loader' );
+                          },
+                          success : function( response, text_status, xhr )
+                          {
+                            this
+                              .addClass( 'success' );
+
+                            delete app.cores_data;
+                            sammy.refresh();
+
+                            window.setTimeout
+                            (
+                              function()
+                              {
+                                reload_button
+                                  .removeClass( 'success' );
+                              },
+                              1000
+                            );
+                          },
+                          error : function( xhr, text_status, error_thrown )
+                          {
+                            this
+                              .addClass( 'warn' );
+
+                            sammy.trigger( 'cores_load_data', { only_failures : true } );
+
+                            window.setTimeout
+                            (
+                              function()
+                              {
+                                reload_button
+                                  .removeClass( 'warn' );
+                              },
+                              1000
+                            );
+                          },
+                          complete : function( xhr, text_status )
+                          {
+                            $( 'span', this )
+                              .removeClass( 'loader' );
+                          }
+                        }
+                      );
+                    }
+                  );
+                                
+                $( '#actions #unload', cores_element )
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      var ret = confirm( 'Do you really want to unload Core "' + current_core + '"?' );
+                      if( !ret )
+                      {
+                        return false;
+                      }
+
+                      $.ajax
+                      (
+                        {
+                          url : app.config.solr_path + app.config.core_admin_path + '?wt=json&action=UNLOAD&core=' + current_core,
+                          dataType : 'json',
+                          context : $( this ),
+                          beforeSend : function( xhr, settings )
+                          {
+                            $( 'span', this )
+                              .addClass( 'loader' );
+                          },
+                          success : function( response, text_status, xhr )
+                          {
+                            delete app.cores_data;
+                            context.redirect( path_parts[1].substr( 0, path_parts[1].length - 1 ) );
+                          },
+                          error : function( xhr, text_status, error_thrown )
+                          {
+                          },
+                          complete : function( xhr, text_status )
+                          {
+                            $( 'span', this )
+                              .removeClass( 'loader' );
+                          }
+                        }
+                      );
+                    }
+                  );
+
+                var optimize_button = $( '#actions #optimize', cores_element );
+                optimize_button
+                  .die( 'click' )
+                  .live
+                  (
+                    'click',
+                    function( event )
+                    {
+                      $.ajax
+                      (
+                        {
+                          url : core_basepath + '/update?optimize=true&waitFlush=true&wt=json',
+                          dataType : 'json',
+                          context : $( this ),
+                          beforeSend : function( xhr, settings )
+                          {
+                            $( 'span', this )
+                              .addClass( 'loader' );
+                          },
+                          success : function( response, text_status, xhr )
+                          {
+                            this
+                              .addClass( 'success' );
+
+                            window.setTimeout
+                            (
+                              function()
+                              {
+                                optimize_button
+                                  .removeClass( 'success' );
+                              },
+                              1000
+                            );
+                                                        
+                            $( '.optimized dd.ico-0', index_data_element )
+                              .removeClass( 'ico-0' )
+                              .addClass( 'ico-1' );
+                          },
+                          error : function( xhr, text_status, error_thrown)
+                          {
+                            console.warn( 'd0h, optimize broken!' );
+                          },
+                          complete : function( xhr, text_status )
+                          {
+                            $( 'span', this )
+                              .removeClass( 'loader' );
+                          }
+                        }
+                      );
+                    }
+                  );
+
+                $( '.timeago', data_element )
+                  .timeago();
+
+                $( 'ul', data_element )
+                  .each
+                  (
+                    function( i, element )
+                    {
+                      $( 'li:odd', element )
+                        .addClass( 'odd' );
+                    }
+                  )
+              }
+            }
+          );
+        }
+      }
+    );
+  }
+);
\ No newline at end of file

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/solr/webapp/solr/js/scripts/cores.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain