From 7478e610d99d1f2fb383ecbfa0b70d72eae27f81 Mon Sep 17 00:00:00 2001 From: server Date: Tue, 10 Dec 2019 18:12:37 -0500 Subject: solr changes --- .../server/solr-webapp/webapp/js/angular/app.js | 516 ----------- .../webapp/js/angular/controllers/analysis.js | 201 ----- .../webapp/js/angular/controllers/cloud.js | 983 --------------------- .../js/angular/controllers/cluster-suggestions.js | 62 -- .../js/angular/controllers/collection-overview.js | 39 - .../webapp/js/angular/controllers/collections.js | 274 ------ .../webapp/js/angular/controllers/core-overview.js | 93 -- .../webapp/js/angular/controllers/cores.js | 180 ---- .../webapp/js/angular/controllers/dataimport.js | 302 ------- .../webapp/js/angular/controllers/documents.js | 137 --- .../webapp/js/angular/controllers/files.js | 100 --- .../webapp/js/angular/controllers/index.js | 97 -- .../js/angular/controllers/java-properties.js | 45 - .../webapp/js/angular/controllers/logging.js | 158 ---- .../webapp/js/angular/controllers/login.js | 317 ------- .../webapp/js/angular/controllers/plugins.js | 167 ---- .../webapp/js/angular/controllers/query.js | 118 --- .../webapp/js/angular/controllers/replication.js | 235 ----- .../webapp/js/angular/controllers/schema.js | 611 ------------- .../webapp/js/angular/controllers/segments.js | 99 --- .../webapp/js/angular/controllers/stream.js | 239 ----- .../webapp/js/angular/controllers/threads.js | 50 -- .../webapp/js/angular/controllers/unknown.js | 37 - .../solr-webapp/webapp/js/angular/services.js | 333 ------- 24 files changed, 5393 deletions(-) delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/app.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/analysis.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cloud.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cluster-suggestions.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collection-overview.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collections.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/core-overview.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cores.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/dataimport.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/documents.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/files.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/index.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/java-properties.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/logging.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/login.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/plugins.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/query.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/replication.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/schema.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/segments.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/stream.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/threads.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/unknown.js delete mode 100644 solr-8.1.1/server/solr-webapp/webapp/js/angular/services.js (limited to 'solr-8.1.1/server/solr-webapp/webapp/js/angular') diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/app.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/app.js deleted file mode 100644 index 9abacee46..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/app.js +++ /dev/null @@ -1,516 +0,0 @@ -/* - 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 solrAdminApp = angular.module("solrAdminApp", [ - "ngResource", - "ngRoute", - "ngCookies", - "ngtimeago", - "solrAdminServices", - "localytics.directives", - "ab-base64" -]); - -solrAdminApp.config([ - '$routeProvider', function($routeProvider) { - $routeProvider. - when('/', { - templateUrl: 'partials/index.html', - controller: 'IndexController' - }). - when('/unknown', { - templateUrl: 'partials/unknown.html', - controller: 'UnknownController' - }). - when('/login', { - templateUrl: 'partials/login.html', - controller: 'LoginController' - }). - when('/login/:route', { - templateUrl: 'partials/login.html', - controller: 'LoginController' - }). - when('/~logging', { - templateUrl: 'partials/logging.html', - controller: 'LoggingController' - }). - when('/~logging/level', { - templateUrl: 'partials/logging-levels.html', - controller: 'LoggingLevelController' - }). - when('/~cloud', { - templateUrl: 'partials/cloud.html', - controller: 'CloudController' - }). - when('/~cores', { - templateUrl: 'partials/cores.html', - controller: 'CoreAdminController' - }). - when('/~cores/:corename', { - templateUrl: 'partials/cores.html', - controller: 'CoreAdminController' - }). - when('/~collections', { - templateUrl: 'partials/collections.html', - controller: 'CollectionsController' - }). - when('/~collections/:collection', { - templateUrl: 'partials/collections.html', - controller: 'CollectionsController' - }). - when('/~threads', { - templateUrl: 'partials/threads.html', - controller: 'ThreadsController' - }). - when('/~java-properties', { - templateUrl: 'partials/java-properties.html', - controller: 'JavaPropertiesController' - }). - when('/~cluster-suggestions', { - templateUrl: 'partials/cluster_suggestions.html', - controller: 'ClusterSuggestionsController' - }). - when('/:core/core-overview', { - templateUrl: 'partials/core_overview.html', - controller: 'CoreOverviewController' - }). - when('/:core/collection-overview', { - templateUrl: 'partials/collection_overview.html', - controller: 'CollectionOverviewController' - }). - when('/:core/analysis', { - templateUrl: 'partials/analysis.html', - controller: 'AnalysisController' - }). - when('/:core/dataimport', { - templateUrl: 'partials/dataimport.html', - controller: 'DataImportController' - }). - when('/:core/dataimport/:handler*', { - templateUrl: 'partials/dataimport.html', - controller: 'DataImportController' - }). - when('/:core/documents', { - templateUrl: 'partials/documents.html', - controller: 'DocumentsController' - }). - when('/:core/files', { - templateUrl: 'partials/files.html', - controller: 'FilesController' - }). - when('/:core/plugins', { - templateUrl: 'partials/plugins.html', - controller: 'PluginsController', - reloadOnSearch: false - }). - when('/:core/plugins/:legacytype', { - templateUrl: 'partials/plugins.html', - controller: 'PluginsController', - reloadOnSearch: false - }). - when('/:core/query', { - templateUrl: 'partials/query.html', - controller: 'QueryController' - }). - when('/:core/stream', { - templateUrl: 'partials/stream.html', - controller: 'StreamController' - }). - when('/:core/replication', { - templateUrl: 'partials/replication.html', - controller: 'ReplicationController' - }). - when('/:core/dataimport', { - templateUrl: 'partials/dataimport.html', - controller: 'DataImportController' - }). - when('/:core/dataimport/:handler*', { - templateUrl: 'partials/dataimport.html', - controller: 'DataImportController' - }). - when('/:core/schema', { - templateUrl: 'partials/schema.html', - controller: 'SchemaController' - }). - when('/:core/segments', { - templateUrl: 'partials/segments.html', - controller: 'SegmentsController' - }). - otherwise({ - templateUrl: 'partials/unknown.html', - controller: 'UnknownController' - }); -}]) -.constant('Constants', { - IS_ROOT_PAGE: 1, - IS_CORE_PAGE: 2, - IS_COLLECTION_PAGE: 3, - ROOT_URL: "/" -}) -.filter('uriencode', function() { - return window.encodeURIComponent; -}) -.filter('highlight', function($sce) { - return function(input, lang) { - if (lang && input && lang!="txt" && lang!="csv") return hljs.highlight(lang, input).value; - return input; - } -}) -.filter('unsafe', function($sce) { return $sce.trustAsHtml; }) -.directive('loadingStatusMessage', function() { - return { - link: function($scope, $element, attrs) { - var show = function() {$element.css('display', 'block')}; - var hide = function() {$element.css('display', 'none')}; - $scope.$on('loadingStatusActive', show); - $scope.$on('loadingStatusInactive', hide); - } - }; -}) -.directive('escapePressed', function () { - return function (scope, element, attrs) { - element.bind("keydown keypress", function (event) { - if(event.which === 27) { - scope.$apply(function (){ - scope.$eval(attrs.escapePressed); - }); - event.preventDefault(); - } - }); - }; -}) -.directive('focusWhen', function($timeout) { - return { - link: function(scope, element, attrs) { - scope.$watch(attrs.focusWhen, function(value) { - if(value === true) { - $timeout(function() { - element[0].focus(); - }, 100); - } - }); - } - }; -}) -.directive('scrollableWhenSmall', function($window) { - return { - link: function(scope, element, attrs) { - var w = angular.element($window); - - var checkFixedMenu = function() { - var shouldScroll = w.height() < (element.height() + $('#header').height() + 40); - element.toggleClass( 'scroll', shouldScroll); - }; - w.bind('resize', checkFixedMenu); - w.bind('load', checkFixedMenu); - } - } -}) -.filter('readableSeconds', function() { - return function(input) { - seconds = parseInt(input||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(' '); - }; -}) -.filter('number', function($locale) { - return function(input) { - var sep = { - 'de_CH' : '\'', - 'de' : '.', - 'en' : ',', - 'es' : '.', - 'it' : '.', - 'ja' : ',', - 'sv' : ' ', - 'tr' : '.', - '_' : '' // fallback - }; - - var browser = {}; - var match = $locale.id.match( /^(\w{2})([-_](\w{2}))?$/ ); - if (match[1]) { - browser.language = match[1].toLowerCase(); - } - if (match[1] && match[3]) { - browser.locale = match[1] + '_' + match[3]; - } - - return ( input || 0 ).toString().replace(/\B(?=(\d{3})+(?!\d))/g, - sep[ browser.locale ] || sep[ browser.language ] || sep['_']); - }; -}) -.filter('orderObjectBy', function() { - return function(items, field, reverse) { - var filtered = []; - angular.forEach(items, function(item) { - filtered.push(item); - }); - filtered.sort(function (a, b) { - return (a[field] > b[field] ? 1 : -1); - }); - if(reverse) filtered.reverse(); - return filtered; - }; -}) -.directive('jstree', function($parse) { - return { - restrict: 'EA', - scope: { - data: '=', - onSelect: '&' - }, - link: function(scope, element, attrs) { - scope.$watch("data", function(newValue, oldValue) { - if (newValue) { - var treeConfig = { - "plugins" : [ "themes", "json_data", "ui" ], - "json_data" : { - "data" : scope.data, - "progressive_render" : true - }, - "core" : { - "animation" : 0 - } - }; - - var tree = $(element).jstree(treeConfig); - tree.jstree('open_node','li:first'); - if (tree) { - element.bind("select_node.jstree", function (event, data) { - scope.$apply(function() { - scope.onSelect({url: data.args[0].href, data: data}); - }); - }); - } - } - }, true); - } - }; -}) -.directive('connectionMessage', function() { - return { - link: function($scope, $element, attrs) { - var show = function() {$element.css('display', 'block')}; - var hide = function() {$element.css('display', 'none')}; - $scope.$on('connectionStatusActive', show); - $scope.$on('connectionStatusInactive', hide); - } - }; -}) -.factory('httpInterceptor', function($q, $rootScope, $location, $timeout, $injector) { - var activeRequests = 0; - - var started = function(config) { - if (activeRequests == 0) { - $rootScope.$broadcast('loadingStatusActive'); - } - if ($rootScope.exceptions[config.url]) { - delete $rootScope.exceptions[config.url]; - } - activeRequests++; - if (sessionStorage.getItem("auth.header")) { - config.headers['Authorization'] = sessionStorage.getItem("auth.header"); - } - config.timeout = 10000; - return config || $q.when(config); - }; - - var ended = function(response) { - activeRequests--; - if (activeRequests == 0) { - $rootScope.$broadcast('loadingStatusInactive'); - } - if ($rootScope.retryCount>0) { - $rootScope.connectionRecovered = true; - $rootScope.retryCount=0; - $timeout(function() { - $rootScope.connectionRecovered=false; - $rootScope.$broadcast('connectionStatusInactive'); - },2000); - } - if (!$location.path().startsWith('/login') && !$location.path().startsWith('/unknown')) { - sessionStorage.removeItem("http401"); - sessionStorage.removeItem("auth.state"); - sessionStorage.removeItem("auth.statusText"); - } - return response || $q.when(response); - }; - - var failed = function(rejection) { - activeRequests--; - if (activeRequests == 0) { - $rootScope.$broadcast('loadingStatusInactive'); - } - if (rejection.config.headers.doNotIntercept) { - return rejection; - } - if (rejection.status === 0) { - $rootScope.$broadcast('connectionStatusActive'); - if (!$rootScope.retryCount) $rootScope.retryCount=0; - $rootScope.retryCount ++; - var $http = $injector.get('$http'); - var result = $http(rejection.config); - return result; - } else if (rejection.status === 401) { - // Authentication redirect - var headers = rejection.headers(); - var wwwAuthHeader = headers['www-authenticate']; - sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader); - sessionStorage.setItem("auth.authDataHeader", headers['x-solr-authdata']); - sessionStorage.setItem("auth.statusText", rejection.statusText); - sessionStorage.setItem("http401", "true"); - sessionStorage.removeItem("auth.scheme"); - sessionStorage.removeItem("auth.realm"); - sessionStorage.removeItem("auth.username"); - sessionStorage.removeItem("auth.header"); - sessionStorage.removeItem("auth.state"); - if ($location.path().includes('/login')) { - if (!sessionStorage.getItem("auth.location")) { - sessionStorage.setItem("auth.location", "/"); - } - } else { - sessionStorage.setItem("auth.location", $location.path()); - $location.path('/login'); - } - } else { - $rootScope.exceptions[rejection.config.url] = rejection.data.error; - } - return $q.reject(rejection); - }; - - return {request: started, response: ended, responseError: failed}; -}) -.config(function($httpProvider) { - $httpProvider.interceptors.push("httpInterceptor"); - // Force BasicAuth plugin to serve us a 'Authorization: xBasic xxxx' header so browser will not pop up login dialogue - $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; -}) -.directive('fileModel', function ($parse) { - return { - restrict: 'A', - link: function(scope, element, attrs) { - var model = $parse(attrs.fileModel); - var modelSetter = model.assign; - - element.bind('change', function(){ - scope.$apply(function(){ - modelSetter(scope, element[0].files[0]); - }); - }); - } - }; -}); - -solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $location, Cores, Collections, System, Ping, Constants) { - - $rootScope.exceptions={}; - - $rootScope.toggleException = function() { - $scope.showException=!$scope.showException; - }; - - $scope.refresh = function() { - $scope.cores = []; - $scope.collections = []; - } - - $scope.refresh(); - $scope.resetMenu = function(page, pageType) { - Cores.list(function(data) { - $scope.cores = []; - var currentCoreName = $route.current.params.core; - delete $scope.currentCore; - for (key in data.status) { - var core = data.status[key]; - $scope.cores.push(core); - if ((!$scope.isSolrCloud || pageType == Constants.IS_CORE_PAGE) && core.name == currentCoreName) { - $scope.currentCore = core; - } - } - $scope.showInitFailures = Object.keys(data.initFailures).length>0; - $scope.initFailures = data.initFailures; - }); - - System.get(function(data) { - $scope.isCloudEnabled = data.mode.match( /solrcloud/i ); - - if ($scope.isCloudEnabled) { - Collections.list(function (data) { - $scope.collections = []; - var currentCollectionName = $route.current.params.core; - delete $scope.currentCollection; - for (key in data.collections) { - var collection = {name: data.collections[key]}; - $scope.collections.push(collection); - if (pageType == Constants.IS_COLLECTION_PAGE && collection.name == currentCollectionName) { - $scope.currentCollection = collection; - } - } - }) - } - - }); - - $scope.showingLogging = page.lastIndexOf("logging", 0) === 0; - $scope.showingCloud = page.lastIndexOf("cloud", 0) === 0; - $scope.page = page; - $scope.currentUser = sessionStorage.getItem("auth.username"); - $scope.http401 = sessionStorage.getItem("http401"); - }; - - $scope.ping = function() { - Ping.ping({core: $scope.currentCore.name}, function(data) { - $scope.showPing = true; - $scope.pingMS = data.responseHeader.QTime; - }); - // @todo .attr( 'title', '/admin/ping is not configured (' + xhr.status + ': ' + error_thrown + ')' ); - }; - - $scope.dumpCloud = function() { - $scope.$broadcast("cloud-dump"); - } - - $scope.showCore = function(core) { - $location.url("/" + core.name + "/core-overview"); - } - - $scope.showCollection = function(collection) { - $location.url("/" + collection.name + "/collection-overview") - } - - $scope.$on('$routeChangeStart', function() { - $rootScope.exceptions = {}; - }); -}); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/analysis.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/analysis.js deleted file mode 100644 index 5fff59caa..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/analysis.js +++ /dev/null @@ -1,201 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('AnalysisController', - function($scope, $location, $routeParams, Luke, Analysis, Constants) { - $scope.resetMenu("analysis", Constants.IS_COLLECTION_PAGE); - - $scope.refresh = function() { - Luke.schema({core: $routeParams.core}, function(data) { - $scope.fieldsAndTypes = []; - for (var field in data.schema.fields) { - $scope.fieldsAndTypes.push({ - group: "Fields", - value: "fieldname=" + field, - label: field}); - } - for (var type in data.schema.types) { - $scope.fieldsAndTypes.push({ - group: "Types", - value: "fieldtype=" + type, - label: type}); - } - $scope.core = $routeParams.core; - }); - - $scope.parseQueryString(); - // @todo - set defaultSearchField either to context["analysis.fieldname"] or context["analysis.fieldtype"] - - }; - $scope.verbose = true; - - var getShortComponentName = function(longname) { - var short = -1 !== longname.indexOf( '$' ) - ? longname.split( '$' )[1] - : longname.split( '.' ).pop(); - return short.match( /[A-Z]/g ).join( '' ); - }; - - var getCaptionsForComponent = function(data) { - var captions = []; - for (var key in data[0]) { - key = key.replace(/.*#/,''); - if (key != "match" && key!="positionHistory") { - captions.push(key.replace(/.*#/,'')); - } - } - return captions; - }; - - var getTokensForComponent = function(data) { - var tokens = []; - var previousPosition = 0; - var index=0; - for (var i in data) { - var tokenhash = data[i]; - var positionDifference = tokenhash.position - previousPosition; - for (var j=positionDifference; j>1; j--) { - tokens.push({position: tokenhash.position - j+1, blank:true, index:index++}); - } - - var token = {position: tokenhash.position, keys:[], index:index++}; - - for (key in tokenhash) { - if (key == "match" || key=="positionHistory") { - //skip, to not display these keys in the UI - } else { - var tokenInfo = new Object(); - tokenInfo.name = key; - tokenInfo.value = tokenhash[key]; - if ('text' === key || 'raw_bytes' === key ) { - if (tokenhash.match) { - tokenInfo.extraclass = 'match'; //to highlight matching text strings - } - } - token.keys.push(tokenInfo); - } - } - tokens.push(token); - previousPosition = tokenhash.position; - } - return tokens; - }; - - var extractComponents = function(data, result, name) { - if (data) { - result[name] = []; - for (var i = 0; i < data.length; i += 2) { - var component = { - name: data[i], - short: getShortComponentName(data[i]), - captions: getCaptionsForComponent(data[i + 1]), - tokens: getTokensForComponent(data[i + 1]) - }; - result[name].push(component); - } - } - }; - - var processAnalysisData = function(analysis, fieldOrType) { - var fieldname; - for (fieldname in analysis[fieldOrType]) {console.log(fieldname);break;} - var response = {}; - extractComponents(analysis[fieldOrType][fieldname].index, response, "index"); - extractComponents(analysis[fieldOrType][fieldname].query, response, "query"); - return response; - }; - - $scope.updateQueryString = function() { - - var parts = $scope.fieldOrType.split("="); - var fieldOrType = parts[0]; - var name = parts[1]; - - if ($scope.indexText) { - $location.search("analysis.fieldvalue", $scope.indexText); - } else if ($location.search()["analysis.fieldvalue"]) { - $location.search("analysis.fieldvalue", null); - } - if ($scope.queryText) { - $location.search("analysis.query", $scope.queryText); - } else if ($location.search()["analysis.query"]) { - $location.search("analysis.query", null); - } - - if (fieldOrType == "fieldname") { - $location.search("analysis.fieldname", name); - $location.search("analysis.fieldtype", null); - } else { - $location.search("analysis.fieldtype", name); - $location.search("analysis.fieldname", null); - } - $location.search("verbose_output", $scope.verbose ? "1" : "0"); - }; - - $scope.parseQueryString = function () { - var params = {}; - var search = $location.search(); - - if (Object.keys(search).length == 0) { - return; - } - for (var key in search) { - params[key]=search[key]; - } - $scope.indexText = search["analysis.fieldvalue"]; - $scope.queryText = search["analysis.query"]; - if (search["analysis.fieldname"]) { - $scope.fieldOrType = "fieldname=" + search["analysis.fieldname"]; - $scope.schemaBrowserUrl = "field=" + search["analysis.fieldname"]; - } else { - $scope.fieldOrType = "fieldtype=" + search["analysis.fieldtype"]; - $scope.schemaBrowserUrl = "type=" + search["analysis.fieldtype"]; - } - if (search["verbose_output"] == undefined) { - $scope.verbose = true; - } else { - $scope.verbose = search["verbose_output"] == "1"; - } - - if ($scope.fieldOrType || $scope.indexText || $scope.queryText) { - params.core = $routeParams.core; - var parts = $scope.fieldOrType.split("="); - var fieldOrType = parts[0] == "fieldname" ? "field_names" : "field_types"; - - Analysis.field(params, function(data) { - $scope.result = processAnalysisData(data.analysis, fieldOrType); - }); - } - }; - - $scope.changeFieldOrType = function() { - var parts = $scope.fieldOrType.split("="); - if (parts[0]=='fieldname') { - $scope.schemaBrowserUrl = "field=" + parts[1]; - } else { - $scope.schemaBrowserUrl = "type=" + parts[1]; - } - }; - - $scope.toggleVerbose = function() { - $scope.verbose = !$scope.verbose; - $scope.updateQueryString(); - }; - - $scope.refresh(); - } -); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cloud.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cloud.js deleted file mode 100644 index 0d49df2db..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cloud.js +++ /dev/null @@ -1,983 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('CloudController', - function($scope, $location, Zookeeper, Constants, Collections, System, Metrics, ZookeeperStatus) { - - $scope.showDebug = false; - - $scope.$on("cloud-dump", function(event) { - $scope.showDebug = true; - }); - - $scope.closeDebug = function() { - $scope.showDebug = false; - }; - - var view = $location.search().view ? $location.search().view : "nodes"; - if (view === "tree") { - $scope.resetMenu("cloud-tree", Constants.IS_ROOT_PAGE); - treeSubController($scope, Zookeeper); - } else if (view === "graph") { - $scope.resetMenu("cloud-graph", Constants.IS_ROOT_PAGE); - graphSubController($scope, Zookeeper, false); - } else if (view === "nodes") { - $scope.resetMenu("cloud-nodes", Constants.IS_ROOT_PAGE); - nodesSubController($scope, Collections, System, Metrics); - } else if (view === "zkstatus") { - $scope.resetMenu("cloud-zkstatus", Constants.IS_ROOT_PAGE); - zkStatusSubController($scope, ZookeeperStatus, false); - } - } -); - -function getOrCreateObj(name, object) { - if (name in object) { - entry = object[name]; - } else { - entry = {}; - object[name] = entry; - } - return entry; -} - -function getOrCreateList(name, object) { - if (name in object) { - entry = object[name]; - } else { - entry = []; - object[name] = entry; - } - return entry; -} - -function ensureInList(string, list) { - if (list.indexOf(string) === -1) { - list.push(string); - } -} - -/* Puts a node name into the hosts structure */ -function ensureNodeInHosts(node_name, hosts) { - var hostName = node_name.split(":")[0]; - var host = getOrCreateObj(hostName, hosts); - var hostNodes = getOrCreateList("nodes", host); - ensureInList(node_name, hostNodes); -} - -// from http://scratch99.com/web-development/javascript/convert-bytes-to-mb-kb/ -function bytesToSize(bytes) { - var sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb']; - if (bytes === 0) return '0b'; - var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); - if (bytes === 0) return bytes + '' + sizes[i]; - return (bytes / Math.pow(1024, i)).toFixed(1) + '' + sizes[i]; -} - -function numDocsHuman(docs) { - var sizes = ['', 'k', 'mn', 'bn', 'tn']; - if (docs === 0) return '0'; - var i = parseInt(Math.floor(Math.log(docs) / Math.log(1000))); - if (i === 0) return docs + '' + sizes[i]; - return (docs / Math.pow(1000, i)).toFixed(1) + '' + sizes[i]; -} - -/* Returns a style class depending on percentage */ -var styleForPct = function (pct) { - if (pct < 60) return "pct-normal"; - if (pct < 80) return "pct-warn"; - return "pct-critical" -}; - -function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function coreNameToLabel(name) { - return name.replace(/(.*?)_shard((\d+_?)+)_replica_?[ntp]?(\d+)/, '\$1_s\$2r\$4'); -} - -var nodesSubController = function($scope, Collections, System, Metrics) { - $scope.pageSize = 10; - $scope.showNodes = true; - $scope.showTree = false; - $scope.showGraph = false; - $scope.showData = false; - $scope.showAllDetails = false; - $scope.showDetails = {}; - $scope.from = 0; - $scope.to = $scope.pageSize - 1; - $scope.filterType = "node"; // Pre-initialize dropdown - - $scope.toggleAllDetails = function() { - $scope.showAllDetails = !$scope.showAllDetails; - for (var node in $scope.nodes) { - $scope.showDetails[node] = $scope.showAllDetails; - } - for (var host in $scope.hosts) { - $scope.showDetails[host] = $scope.showAllDetails; - } - }; - - $scope.toggleDetails = function(key) { - $scope.showDetails[key] = !$scope.showDetails[key] === true; - }; - - $scope.toggleHostDetails = function(key) { - $scope.showDetails[key] = !$scope.showDetails[key] === true; - for (var nodeId in $scope.hosts[key].nodes) { - var node = $scope.hosts[key].nodes[nodeId]; - $scope.showDetails[node] = $scope.showDetails[key]; - } - }; - - $scope.nextPage = function() { - $scope.from += parseInt($scope.pageSize); - $scope.reload(); - }; - - $scope.previousPage = function() { - $scope.from = Math.max(0, $scope.from - parseInt($scope.pageSize)); - $scope.reload(); - }; - - // Checks if this node is the first (alphabetically) for a given host. Used to decide rowspan in table - $scope.isFirstNodeForHost = function(node) { - var hostName = node.split(":")[0]; - var nodesInHost = $scope.filteredNodes.filter(function (node) { - return node.startsWith(hostName); - }); - return nodesInHost[0] === node; - }; - - // Returns the first live node for this host, to make sure we pick host-level metrics from a live node - $scope.firstLiveNodeForHost = function(key) { - var hostName = key.split(":")[0]; - var liveNodesInHost = $scope.filteredNodes.filter(function (key) { - return key.startsWith(hostName); - }).filter(function (key) { - return $scope.live_nodes.includes(key); - }); - return liveNodesInHost.length > 0 ? liveNodesInHost[0] : key; - }; - - // Initializes the cluster state, list of nodes, collections etc - $scope.initClusterState = function() { - var nodes = {}; - var hosts = {}; - var live_nodes = []; - - // We build a node-centric view of the cluster state which we can easily consume to render the table - Collections.status(function (data) { - // Fetch cluster state from collections API and invert to a nodes structure - for (var name in data.cluster.collections) { - var collection = data.cluster.collections[name]; - collection.name = name; - var shards = collection.shards; - collection.shards = []; - for (var shardName in shards) { - var shard = shards[shardName]; - shard.name = shardName; - shard.collection = collection.name; - var replicas = shard.replicas; - shard.replicas = []; - for (var replicaName in replicas) { - var core = replicas[replicaName]; - core.name = replicaName; - core.label = coreNameToLabel(core['core']); - core.collection = collection.name; - core.shard = shard.name; - core.shard_state = shard.state; - - var node_name = core['node_name']; - var node = getOrCreateObj(node_name, nodes); - var cores = getOrCreateList("cores", node); - cores.push(core); - node['base_url'] = core.base_url; - node['id'] = core.base_url.replace(/[^\w\d]/g, ''); - node['host'] = node_name.split(":")[0]; - var collections = getOrCreateList("collections", node); - ensureInList(core.collection, collections); - ensureNodeInHosts(node_name, hosts); - } - } - } - - live_nodes = data.cluster.live_nodes; - for (n in data.cluster.live_nodes) { - node = data.cluster.live_nodes[n]; - if (!(node in nodes)) { - var hostName = node.split(":")[0]; - nodes[node] = {}; - nodes[node]['host'] = hostName; - } - ensureNodeInHosts(node, hosts); - } - - // Make sure nodes are sorted alphabetically to align with rowspan in table - for (var host in hosts) { - hosts[host].nodes.sort(); - } - - $scope.nodes = nodes; - $scope.hosts = hosts; - $scope.live_nodes = live_nodes; - - $scope.Math = window.Math; - $scope.reload(); - }); - }; - - $scope.filterInput = function() { - $scope.from = 0; - $scope.to = $scope.pageSize - 1; - $scope.reload(); - }; - - /* - Reload will fetch data for the current page of the table and thus refresh numbers. - It is also called whenever a filter or paging action is executed - */ - $scope.reload = function() { - var nodes = $scope.nodes; - var node_keys = Object.keys(nodes); - var hosts = $scope.hosts; - var live_nodes = $scope.live_nodes; - var hostNames = Object.keys(hosts); - hostNames.sort(); - var pageSize = isNumeric($scope.pageSize) ? $scope.pageSize : 10; - - // Calculate what nodes that will show on this page - var nodesToShow = []; - var nodesParam; - var hostsToShow = []; - var filteredNodes; - var filteredHosts; - var isFiltered = false; - switch ($scope.filterType) { - case "node": // Find what nodes match the node filter - if ($scope.nodeFilter) { - filteredNodes = node_keys.filter(function (node) { - return node.indexOf($scope.nodeFilter) !== -1; - }); - } - break; - - case "collection": // Find what collections match the collection filter and what nodes that have these collections - if ($scope.collectionFilter) { - candidateNodes = {}; - nodesCollections = []; - for (var i = 0 ; i < node_keys.length ; i++) { - var node_name = node_keys[i]; - var node = nodes[node_name]; - nodeColl = {}; - nodeColl['node'] = node_name; - collections = {}; - node.cores.forEach(function(core) { - collections[core.collection] = true; - }); - nodeColl['collections'] = Object.keys(collections); - nodesCollections.push(nodeColl); - } - nodesCollections.forEach(function(nc) { - matchingColls = nc['collections'].filter(function (collection) { - return collection.indexOf($scope.collectionFilter) !== -1; - }); - if (matchingColls.length > 0) { - candidateNodes[nc.node] = true; - } - }); - filteredNodes = Object.keys(candidateNodes); - } - break; - - case "health": - - } - - if (filteredNodes) { - // If filtering is active, calculate what hosts contain the nodes that match the filters - isFiltered = true; - filteredHosts = filteredNodes.map(function (node) { - return node.split(":")[0]; - }).filter(function (item, index, self) { - return self.indexOf(item) === index; - }); - } else { - filteredNodes = node_keys; - filteredHosts = hostNames; - } - filteredNodes.sort(); - filteredHosts.sort(); - - // Find what hosts & nodes (from the filtered set) that should be displayed on current page - for (var id = $scope.from ; id < $scope.from + pageSize && filteredHosts[id] ; id++) { - var hostName = filteredHosts[id]; - hostsToShow.push(hostName); - if (isFiltered) { // Only show the nodes per host matching active filter - nodesToShow = nodesToShow.concat(filteredNodes.filter(function (node) { - return node.startsWith(hostName); - })); - } else { - nodesToShow = nodesToShow.concat(hosts[hostName]['nodes']); - } - } - nodesParam = nodesToShow.filter(function (node) { - return live_nodes.includes(node); - }).join(','); - var deadNodes = nodesToShow.filter(function (node) { - return !live_nodes.includes(node); - }); - deadNodes.forEach(function (node) { - nodes[node]['dead'] = true; - }); - $scope.nextEnabled = $scope.from + pageSize < filteredHosts.length; - $scope.prevEnabled = $scope.from - pageSize >= 0; - nodesToShow.sort(); - hostsToShow.sort(); - - /* - Fetch system info for all selected nodes - Pick the data we want to display and add it to the node-centric data structure - */ - System.get({"nodes": nodesParam}, function (systemResponse) { - for (var node in systemResponse) { - if (node in nodes) { - var s = systemResponse[node]; - nodes[node]['system'] = s; - var memTotal = s.system.totalPhysicalMemorySize; - var memFree = s.system.freePhysicalMemorySize; - var memPercentage = Math.floor((memTotal - memFree) / memTotal * 100); - nodes[node]['memUsedPct'] = memPercentage; - nodes[node]['memUsedPctStyle'] = styleForPct(memPercentage); - nodes[node]['memTotal'] = bytesToSize(memTotal); - nodes[node]['memFree'] = bytesToSize(memFree); - nodes[node]['memUsed'] = bytesToSize(memTotal - memFree); - - var heapTotal = s.jvm.memory.raw.total; - var heapFree = s.jvm.memory.raw.free; - var heapPercentage = Math.floor((heapTotal - heapFree) / heapTotal * 100); - nodes[node]['heapUsed'] = bytesToSize(heapTotal - heapFree); - nodes[node]['heapUsedPct'] = heapPercentage; - nodes[node]['heapUsedPctStyle'] = styleForPct(heapPercentage); - nodes[node]['heapTotal'] = bytesToSize(heapTotal); - nodes[node]['heapFree'] = bytesToSize(heapFree); - - var jvmUptime = s.jvm.jmx.upTimeMS / 1000; // Seconds - nodes[node]['jvmUptime'] = secondsForHumans(jvmUptime); - nodes[node]['jvmUptimeSec'] = jvmUptime; - - nodes[node]['uptime'] = s.system.uptime.replace(/.*up (.*?,.*?),.*/, "$1"); - nodes[node]['loadAvg'] = Math.round(s.system.systemLoadAverage * 100) / 100; - nodes[node]['cpuPct'] = Math.ceil(s.system.processCpuLoad); - nodes[node]['cpuPctStyle'] = styleForPct(Math.ceil(s.system.processCpuLoad)); - nodes[node]['maxFileDescriptorCount'] = s.system.maxFileDescriptorCount; - nodes[node]['openFileDescriptorCount'] = s.system.openFileDescriptorCount; - } - } - }); - - /* - Fetch metrics for all selected nodes. Only pull the metrics that we'll show to save bandwidth - Pick the data we want to display and add it to the node-centric data structure - */ - Metrics.get({ - "nodes": nodesParam, - "prefix": "CONTAINER.fs,org.eclipse.jetty.server.handler.DefaultHandler.get-requests,INDEX.sizeInBytes,SEARCHER.searcher.numDocs,SEARCHER.searcher.deletedDocs,SEARCHER.searcher.warmupTime" - }, - function (metricsResponse) { - for (var node in metricsResponse) { - if (node in nodes) { - var m = metricsResponse[node]; - nodes[node]['metrics'] = m; - var diskTotal = m.metrics['solr.node']['CONTAINER.fs.totalSpace']; - var diskFree = m.metrics['solr.node']['CONTAINER.fs.usableSpace']; - var diskPercentage = Math.floor((diskTotal - diskFree) / diskTotal * 100); - nodes[node]['diskUsedPct'] = diskPercentage; - nodes[node]['diskUsedPctStyle'] = styleForPct(diskPercentage); - nodes[node]['diskTotal'] = bytesToSize(diskTotal); - nodes[node]['diskFree'] = bytesToSize(diskFree); - - var r = m.metrics['solr.jetty']['org.eclipse.jetty.server.handler.DefaultHandler.get-requests']; - nodes[node]['req'] = r.count; - nodes[node]['req1minRate'] = Math.floor(r['1minRate'] * 100) / 100; - nodes[node]['req5minRate'] = Math.floor(r['5minRate'] * 100) / 100; - nodes[node]['req15minRate'] = Math.floor(r['15minRate'] * 100) / 100; - nodes[node]['reqp75_ms'] = Math.floor(r['p75_ms']); - nodes[node]['reqp95_ms'] = Math.floor(r['p95_ms']); - nodes[node]['reqp99_ms'] = Math.floor(r['p99_ms']); - - var cores = nodes[node]['cores']; - var indexSizeTotal = 0; - var docsTotal = 0; - var graphData = []; - if (cores) { - for (coreId in cores) { - var core = cores[coreId]; - var keyName = "solr.core." + core['core'].replace(/(.*?)_(shard(\d+_?)+)_(replica.*?)/, '\$1.\$2.\$4'); - var nodeMetric = m.metrics[keyName]; - var size = nodeMetric['INDEX.sizeInBytes']; - size = (typeof size !== 'undefined') ? size : 0; - core['sizeInBytes'] = size; - core['size'] = bytesToSize(size); - if (core['shard_state'] !== 'active' || core['state'] !== 'active') { - // If core state is not active, display the real state, or if shard is inactive, display that - var labelState = (core['state'] !== 'active') ? core['state'] : core['shard_state']; - core['label'] += "_(" + labelState + ")"; - } - indexSizeTotal += size; - var numDocs = nodeMetric['SEARCHER.searcher.numDocs']; - numDocs = (typeof numDocs !== 'undefined') ? numDocs : 0; - core['numDocs'] = numDocs; - core['numDocsHuman'] = numDocsHuman(numDocs); - core['avgSizePerDoc'] = bytesToSize(numDocs === 0 ? 0 : size / numDocs); - var deletedDocs = nodeMetric['SEARCHER.searcher.deletedDocs']; - deletedDocs = (typeof deletedDocs !== 'undefined') ? deletedDocs : 0; - core['deletedDocs'] = deletedDocs; - core['deletedDocsHuman'] = numDocsHuman(deletedDocs); - var warmupTime = nodeMetric['SEARCHER.searcher.warmupTime']; - warmupTime = (typeof warmupTime !== 'undefined') ? warmupTime : 0; - core['warmupTime'] = warmupTime; - docsTotal += core['numDocs']; - } - for (coreId in cores) { - core = cores[coreId]; - var graphObj = {}; - graphObj['label'] = core['label']; - graphObj['size'] = core['sizeInBytes']; - graphObj['sizeHuman'] = core['size']; - graphObj['pct'] = (core['sizeInBytes'] / indexSizeTotal) * 100; - graphData.push(graphObj); - } - cores.sort(function (a, b) { - return b.sizeInBytes - a.sizeInBytes - }); - } else { - cores = {}; - } - graphData.sort(function (a, b) { - return b.size - a.size - }); - nodes[node]['graphData'] = graphData; - nodes[node]['numDocs'] = numDocsHuman(docsTotal); - nodes[node]['sizeInBytes'] = indexSizeTotal; - nodes[node]['size'] = bytesToSize(indexSizeTotal); - nodes[node]['sizePerDoc'] = docsTotal === 0 ? '0b' : bytesToSize(indexSizeTotal / docsTotal); - - // Build the d3 powered bar chart - $('#chart' + nodes[node]['id']).empty(); - var chart = d3.select('#chart' + nodes[node]['id']).append('div').attr('class', 'chart'); - - // Add one div per bar which will group together both labels and bars - var g = chart.selectAll('div') - .data(nodes[node]['graphData']).enter() - .append('div'); - - // Add the bars - var bars = g.append("div") - .attr("class", "rect") - .text(function (d) { - return d.label + ':\u00A0\u00A0' + d.sizeHuman; - }); - - // Execute the transition to show the bars - bars.transition() - .ease('elastic') - .style('width', function (d) { - return d.pct + '%'; - }); - } - } - }); - $scope.nodes = nodes; - $scope.hosts = hosts; - $scope.live_nodes = live_nodes; - $scope.nodesToShow = nodesToShow; - $scope.hostsToShow = hostsToShow; - $scope.filteredNodes = filteredNodes; - $scope.filteredHosts = filteredHosts; - }; - $scope.initClusterState(); -}; - -var zkStatusSubController = function($scope, ZookeeperStatus) { - $scope.showZkStatus = true; - $scope.showNodes = false; - $scope.showTree = false; - $scope.showGraph = false; - $scope.tree = {}; - $scope.showData = false; - $scope.showDetails = false; - - $scope.toggleDetails = function() { - $scope.showDetails = !$scope.showDetails === true; - }; - - $scope.initZookeeper = function() { - ZookeeperStatus.monitor({}, function(data) { - $scope.zkState = data.zkStatus; - $scope.mainKeys = ["ok", "clientPort", "zk_server_state", "zk_version", - "zk_approximate_data_size", "zk_znode_count", "zk_num_alive_connections"]; - $scope.detailKeys = ["dataDir", "dataLogDir", - "zk_avg_latency", "zk_max_file_descriptor_count", "zk_watch_count", - "zk_packets_sent", "zk_packets_received", - "tickTime", "maxClientCnxns", "minSessionTimeout", "maxSessionTimeout"]; - $scope.ensembleMainKeys = ["serverId", "electionPort", "quorumPort"]; - $scope.ensembleDetailKeys = ["peerType", "electionAlg", "initLimit", "syncLimit", - "zk_followers", "zk_synced_followers", "zk_pending_syncs"]; - }); - }; - - $scope.initZookeeper(); -}; - -var treeSubController = function($scope, Zookeeper) { - $scope.showZkStatus = false; - $scope.showTree = true; - $scope.showGraph = false; - $scope.tree = {}; - $scope.showData = false; - - $scope.showTreeLink = function(link) { - var path = decodeURIComponent(link.replace(/.*[\\?&]path=([^&#]*).*/, "$1")); - Zookeeper.detail({path: path}, function(data) { - $scope.znode = data.znode; - var path = data.znode.path.split( '.' ); - if(path.length >1) { - $scope.lang = path.pop(); - } else { - var lastPathElement = data.znode.path.split( '/' ).pop(); - if (lastPathElement == "managed-schema") { - $scope.lang = "xml"; - } - } - $scope.showData = true; - }); - }; - - $scope.hideData = function() { - $scope.showData = false; - }; - - $scope.initTree = function() { - Zookeeper.simple(function(data) { - $scope.tree = data.tree; - }); - }; - - $scope.initTree(); -}; - -/** - * Translates seconds into human readable format of seconds, minutes, hours, days, and years - * - * @param {number} seconds The number of seconds to be processed - * @return {string} The phrase describing the the amount of time - */ -function secondsForHumans ( seconds ) { - var levels = [ - [Math.floor(seconds / 31536000), 'y'], - [Math.floor((seconds % 31536000) / 86400), 'd'], - [Math.floor(((seconds % 31536000) % 86400) / 3600), 'h'], - [Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 'm'] - ]; - var returntext = ''; - - for (var i = 0, max = levels.length; i < max; i++) { - if ( levels[i][0] === 0 ) continue; - returntext += ' ' + levels[i][0] + levels[i][1]; - } - return returntext.trim() === '' ? '0m' : returntext.trim(); -} - -var graphSubController = function ($scope, Zookeeper) { - $scope.showZkStatus = false; - $scope.showTree = false; - $scope.showGraph = true; - - $scope.filterType = "status"; - - $scope.helperData = { - protocol: [], - host: [], - hostname: [], - port: [], - pathname: [], - replicaType: [], - base_url: [], - core: [], - node_name: [], - state: [], - core_node: [] - }; - - $scope.next = function() { - $scope.pos += $scope.rows; - $scope.initGraph(); - }; - - $scope.previous = function() { - $scope.pos = Math.max(0, $scope.pos - $scope.rows); - $scope.initGraph(); - }; - - $scope.resetGraph = function() { - $scope.pos = 0; - $scope.initGraph(); - }; - - $scope.initGraph = function() { - Zookeeper.liveNodes(function (data) { - var live_nodes = {}; - for (var c in data.tree[0].children) { - live_nodes[data.tree[0].children[c].data.title] = true; - } - - var params = {view: "graph"}; - if ($scope.rows) { - params.start = $scope.pos; - params.rows = $scope.rows; - } - - var filter = ($scope.filterType=='status') ? $scope.pagingStatusFilter : $scope.pagingFilter; - - if (filter) { - params.filterType = $scope.filterType; - params.filter = filter; - } - - Zookeeper.clusterState(params, function (data) { - eval("var state=" + data.znode.data); // @todo fix horrid means to parse JSON - - 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 shard_status = state[c].shards[s].state; - shard_status = shard_status == 'inactive' ? 'shard-inactive' : shard_status; - 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], - replicaType: replica.type, - base_url: replica.base_url, - core: replica.core, - node_name: replica.node_name, - state: replica.state, - core_node: n - }; - - $scope.helperData.protocol.push(uri_parts.protocol); - $scope.helperData.host.push(uri_parts.host); - $scope.helperData.hostname.push(uri_parts.hostname); - $scope.helperData.port.push(uri_parts.port); - $scope.helperData.pathname.push(uri_parts.pathname); - $scope.helperData.replicaType.push(uri_parts.replicaType); - $scope.helperData.base_url.push(uri_parts.base_url); - $scope.helperData.core.push(uri_parts.core); - $scope.helperData.node_name.push(uri_parts.node_name); - $scope.helperData.state.push(uri_parts.state); - $scope.helperData.core_node.push(uri_parts.core_node); - - var replica_status = replica.state; - - if (!live_nodes[replica.node_name]) { - replica_status = 'gone'; - } else if(shard_status=='shard-inactive') { - replica_status += ' ' + shard_status; - } - - var node = { - name: uri, - data: { - type: 'node', - state: replica_status, - leader: 'true' === replica.leader, - uri: uri_parts - } - }; - nodes.push(node); - } - - var shard = { - name: shard_status == "shard-inactive" ? s + ' (inactive)' : s, - data: { - type: 'shard', - state: shard_status - }, - children: nodes - }; - shards.push(shard); - } - - var collection = { - name: c, - data: { - type: 'collection' - }, - children: shards - }; - graph_data.children.push(collection); - } - - $scope.helperData.protocol = $.unique($scope.helperData.protocol); - $scope.helperData.host = $.unique($scope.helperData.host); - $scope.helperData.hostname = $.unique($scope.helperData.hostname); - $scope.helperData.port = $.unique($scope.helperData.port); - $scope.helperData.pathname = $.unique($scope.helperData.pathname); - $scope.helperData.replicaType = $.unique($scope.helperData.replicaType); - $scope.helperData.base_url = $.unique($scope.helperData.base_url); - $scope.helperData.core = $.unique($scope.helperData.core); - $scope.helperData.node_name = $.unique($scope.helperData.node_name); - $scope.helperData.state = $.unique($scope.helperData.state); - $scope.helperData.core_node = $.unique($scope.helperData.core_node); - - if (data.znode && data.znode.paging) { - $scope.showPaging = true; - - var parr = data.znode.paging.split('|'); - if (parr.length < 3) { - $scope.showPaging = false; - } else { - $scope.start = Math.max(parseInt(parr[0]), 0); - $scope.prevEnabled = ($scope.start > 0); - $scope.rows = parseInt(parr[1]); - $scope.total = parseInt(parr[2]); - - if ($scope.rows == -1) { - $scope.showPaging = false; - } else { - var filterType = parr.length > 3 ? parr[3] : ''; - - if (filterType == '' || filterType == 'none') filterType = 'status'; - - +$('#cloudGraphPagingFilterType').val(filterType); - - var filter = parr.length > 4 ? parr[4] : ''; - var page = Math.floor($scope.start / $scope.rows) + 1; - var pages = Math.ceil($scope.total / $scope.rows); - $scope.last = Math.min($scope.start + $scope.rows, $scope.total); - $scope.nextEnabled = ($scope.last < $scope.total); - } - } - } - else { - $scope.showPaging = false; - } - $scope.graphData = graph_data; - $scope.leafCount = leaf_count; - }); - }); - }; - - $scope.initGraph(); - $scope.pos = 0; -}; - -solrAdminApp.directive('graph', function(Constants) { - return { - restrict: 'EA', - scope: { - data: "=", - leafCount: "=", - helperData: "=", - }, - link: function (scope, element, attrs) { - 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) { - if(!(d.data.type=='shard' && d.data.state=='active')){ - classes.push(d.data.state); - } - } - - return classes.join(' '); - }; - - var helper_tooltip_text = function (d) { - if (!d.data || !d.data.uri) { - return tooltip; - } - - var tooltip = d.data.uri.core_node + " {
"; - - if (0 !== scope.helperData.core.length) { - tooltip += "core: [" + d.data.uri.core + "],
"; - } - - if (0 !== scope.helperData.node_name.length) { - tooltip += "node_name: [" + d.data.uri.node_name + "],
"; - } - - tooltip += "}"; - - return tooltip; - }; - - var helper_node_text = function (d) { - if (!d.data || !d.data.uri) { - return d.name; - } - - var name = d.data.uri.hostname; - - if (1 !== scope.helperData.protocol.length) { - name = d.data.uri.protocol + '//' + name; - } - - if (1 !== scope.helperData.port.length) { - name += ':' + d.data.uri.port; - } - - if (1 !== scope.helperData.pathname.length) { - name += d.data.uri.pathname; - } - - if(0 !== scope.helperData.replicaType.length) { - name += ' (' + d.data.uri.replicaType[0] + ')'; - } - - return name; - }; - - scope.$watch("data", function(newValue, oldValue) { - if (newValue) { - flatGraph(element, scope.data, scope.leafCount); - } - - $('text').tooltip({ - content: function() { - return $(this).attr('title'); - } - }); - }); - - - function setNodeNavigationBehavior(node, view){ - node - .attr('data-href', function (d) { - if (d.type == "node"){ - return getNodeUrl(d, view); - } - else{ - return ""; - } - }) - .on('click', function(d) { - if (d.data.type == "node"){ - location.href = getNodeUrl(d, view); - } - }); - } - - function getNodeUrl(d, view){ - var url = d.name + Constants.ROOT_URL + "#/~cloud"; - if (view != undefined){ - url += "?view=" + view; - } - return url; - } - - var flatGraph = function(element, graphData, leafCount) { - var w = element.width(), - h = leafCount * 20; - - var tree = d3.layout.tree().size([h, w - 400]); - - var diagonal = d3.svg.diagonal().projection(function (d) { - return [d.y, d.x]; - }); - - d3.select('#canvas', element).html(''); - var vis = d3.select('#canvas', element).append('svg') - .attr('width', w) - .attr('height', h) - .append('g') - .attr('transform', 'translate(100, 0)'); - - var nodes = tree.nodes(graphData); - - 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("title", helper_tooltip_text) - .text(helper_node_text); - - setNodeNavigationBehavior(node); - }; - } - }; -}); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cluster-suggestions.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cluster-suggestions.js deleted file mode 100644 index 01e1964e0..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cluster-suggestions.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - 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. -*/ -solrAdminApp.controller('ClusterSuggestionsController', -function($scope, $http, Constants) { - $scope.resetMenu("cluster-suggestion", Constants.IS_COLLECTION_PAGE); - $scope.data={}; - var dataArr =[]; - var dataJson = {}; - //function to display suggestion - $http({ - method: 'GET', - url: '/api/cluster/autoscaling/suggestions' - }).then(function successCallback(response) { - $scope.data = response.data; - $scope.parsedData = $scope.data.suggestions; - }, function errorCallback(response) { - }); - //function to perform operation - $scope.postdata = function (x) { - x.loading = true; - var path=x.operation.path; - var command=x.operation.command; - var fullPath='/api/'+path; - console.log(fullPath); - console.log(command); - $http.post(fullPath, JSON.stringify(command)).then(function (response) { - if (response.data) - console.log(response.data); - x.loading = false; - x.done = true; - x.run=true; - $scope.msg = "Command Submitted Successfully!"; - }, function (response) { - x.failed=true; - $scope.msg = "Service does not exist"; - $scope.statusval = response.status; - $scope.statustext = response.statusText; - $scope.headers = response.headers(); - }); - }; - $scope.showPopover = function() { - $scope.popup = true; - }; - - $scope.hidePopover = function () { - $scope.popup = false; - }; -}); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collection-overview.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collection-overview.js deleted file mode 100644 index d1834b2bd..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collection-overview.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('CollectionOverviewController', -function($scope, $routeParams, Collections, Constants) { - $scope.resetMenu("collection-overview", Constants.IS_COLLECTION_PAGE); - - $scope.refresh = function() { - Collections.status({}, function(data) { - $scope.selectedCollection = data.cluster.collections[$routeParams.core]; - $scope.selectedCollection.name = $routeParams.core; - $scope.rootUrl = Constants.ROOT_URL; - }); - }; - - $scope.showReplica = function(replica) { - replica.show = !replica.show; - } - - $scope.hideShard = function(shard) { - shard.hide = !shard.hide; - } - - $scope.refresh(); -}); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collections.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collections.js deleted file mode 100644 index 111d7ea56..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/collections.js +++ /dev/null @@ -1,274 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('CollectionsController', - function($scope, $routeParams, $location, $timeout, Collections, Zookeeper, Constants){ - $scope.resetMenu("collections", Constants.IS_ROOT_PAGE); - - $scope.refresh = function() { - - $scope.rootUrl = Constants.ROOT_URL + "#/~collections/" + $routeParams.collection; - - Collections.status(function (data) { - $scope.collections = []; - for (var name in data.cluster.collections) { - var collection = data.cluster.collections[name]; - collection.name = name; - var shards = collection.shards; - collection.shards = []; - for (var shardName in shards) { - var shard = shards[shardName]; - shard.name = shardName; - shard.collection = collection.name; - var replicas = shard.replicas; - shard.replicas = []; - for (var replicaName in replicas) { - var replica = replicas[replicaName]; - replica.name = replicaName; - replica.collection = collection.name; - replica.shard = shard.name; - shard.replicas.push(replica); - } - collection.shards.push(shard); - } - $scope.collections.push(collection); - if ($routeParams.collection == name) { - $scope.collection = collection; - } - } - if ($routeParams.collection && !$scope.collection) { - alert("No collection called " + $routeParams.collection) - $location.path("/~collections"); - } - $scope.liveNodes = data.cluster.liveNodes; - }); - Zookeeper.configs(function(data) { - $scope.configs = []; - var items = data.tree[0].children; - for (var i in items) { - $scope.configs.push({name: items[i].data.title}); - } - }); - }; - - $scope.hideAll = function() { - $scope.showRename = false; - $scope.showAdd = false; - $scope.showDelete = false; - $scope.showSwap = false; - $scope.showCreateAlias = false; - $scope.showDeleteAlias = false; - }; - - $scope.showAddCollection = function() { - $scope.hideAll(); - $scope.showAdd = true; - $scope.newCollection = { - name: "", - routerName: "compositeId", - numShards: 1, - configName: "", - replicationFactor: 1, - maxShardsPerNode: 1, - autoAddReplicas: 'false' - }; - }; - - $scope.toggleCreateAlias = function() { - $scope.hideAll(); - $scope.showCreateAlias = true; - } - - $scope.toggleDeleteAlias = function() { - $scope.hideAll(); - $scope.showDeleteAlias = true; - Zookeeper.aliases({}, function(data){ - if (Object.keys(data.aliases).length == 0) { - delete $scope.aliases; - } else { - $scope.aliases = data.aliases; - } - }); - - } - - $scope.cancelCreateAlias = $scope.cancelDeleteAlias = function() { - $scope.hideAll(); - } - - $scope.createAlias = function() { - var collections = []; - for (var i in $scope.aliasCollections) { - collections.push($scope.aliasCollections[i].name); - } - Collections.createAlias({name: $scope.aliasToCreate, collections: collections.join(",")}, function(data) { - $scope.hideAll(); - }); - } - $scope.deleteAlias = function() { - Collections.deleteAlias({name: $scope.aliasToDelete}, function(data) { - $scope.hideAll(); - }); - - }; - $scope.addCollection = function() { - if (!$scope.newCollection.name) { - $scope.addMessage = "Please provide a core name"; - } else if (false) { //@todo detect whether core exists - $scope.AddMessage = "A core with that name already exists"; - } else { - var coll = $scope.newCollection; - var params = { - name: coll.name, - "router.name": coll.routerName, - numShards: coll.numShards, - "collection.configName": coll.configName, - replicationFactor: coll.replicationFactor, - maxShardsPerNode: coll.maxShardsPerNode, - autoAddReplicas: coll.autoAddReplicas - }; - if (coll.shards) params.shards = coll.shards; - if (coll.routerField) params["router.field"] = coll.routerField; - Collections.add(params, function(data) { - $scope.cancelAddCollection(); - $scope.resetMenu("collections", Constants.IS_ROOT_PAGE); - $location.path("/~collections/" + $scope.newCollection.name); - }); - } - }; - - $scope.cancelAddCollection = function() { - delete $scope.addMessage; - $scope.showAdd = false; - }; - - $scope.showDeleteCollection = function() { - $scope.hideAll(); - if ($scope.collection) { - $scope.showDelete = true; - } else { - alert("No collection selected."); - } - }; - - $scope.deleteCollection = function() { - if ($scope.collection.name == $scope.collectionDeleteConfirm) { - Collections.delete({name: $scope.collection.name}, function (data) { - $location.path("/~collections"); - }); - } else { - $scope.deleteMessage = "Collection names do not match."; - } - }; - - $scope.reloadCollection = function() { - if (!$scope.collection) { - alert("No collection selected."); - return; - } - Collections.reload({name: $scope.collection.name}, - function(successData) { - $scope.reloadSuccess = true; - $timeout(function() {$scope.reloadSuccess=false}, 1000); - }, - function(failureData) { - $scope.reloadFailure = true; - $timeout(function() {$scope.reloadFailure=false}, 1000); - $location.path("/~collections"); - }); - }; - - $scope.toggleAddReplica = function(shard) { - $scope.hideAll(); - shard.showAdd = !shard.showAdd; - delete $scope.addReplicaMessage; - - Zookeeper.liveNodes({}, function(data) { - $scope.nodes = []; - var children = data.tree[0].children; - for (var child in children) { - $scope.nodes.push(children[child].data.title); - } - }); - }; - - $scope.toggleRemoveReplica = function(replica) { - $scope.hideAll(); - replica.showRemove = !replica.showRemove; - }; - - $scope.toggleRemoveShard = function(shard) { - $scope.hideAll(); - shard.showRemove = !shard.showRemove; - }; - - $scope.deleteShard = function(shard) { - Collections.deleteShard({collection: shard.collection, shard:shard.name}, function(data) { - shard.deleted = true; - $timeout(function() { - $scope.refresh(); - }, 2000); - }); - } - - $scope.deleteReplica = function(replica) { - Collections.deleteReplica({collection: replica.collection, shard:replica.shard, replica:replica.name}, function(data) { - replica.deleted = true; - $timeout(function() { - $scope.refresh(); - }, 2000); - }); - } - $scope.addReplica = function(shard) { - var params = { - collection: shard.collection, - shard: shard.name, - } - if (shard.replicaNodeName && shard.replicaNodeName != "") { - params.node = shard.replicaNodeName; - } - Collections.addReplica(params, function(data) { - shard.replicaAdded = true; - $timeout(function () { - shard.replicaAdded = false; - shard.showAdd = false; - $$scope.refresh(); - }, 2000); - }); - }; - - $scope.toggleShard = function(shard) { - shard.show = !shard.show; - } - - $scope.toggleReplica = function(replica) { - replica.show = !replica.show; - } - - $scope.refresh(); - } -); - -var flatten = function(data) { - var list = []; - for (var name in data) { - var entry = data[name]; - entry.name = name; - list.push(entry); - } - return list; -} diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/core-overview.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/core-overview.js deleted file mode 100644 index 0e2b3d2a6..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/core-overview.js +++ /dev/null @@ -1,93 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('CoreOverviewController', -function($scope, $rootScope, $routeParams, Luke, CoreSystem, Update, Replication, Ping, Constants) { - $scope.resetMenu("overview", Constants.IS_CORE_PAGE); - $scope.refreshIndex = function() { - Luke.index({core: $routeParams.core}, - function(data) { - $scope.index = data.index; - delete $scope.statsMessage; - }, - function(error) { - $scope.statsMessage = "Luke is not configured"; - } - ); - }; - - $scope.refreshReplication = function() { - Replication.details({core: $routeParams.core}, - function(data) { - $scope.isSlave = data.details.isSlave == "true"; - $scope.isMaster = data.details.isMaster == "true"; - $scope.replication = data.details; - }, - function(error) { - $scope.replicationMessage = "Replication is not configured"; - }); - }; - - $scope.refreshSystem = function() { - CoreSystem.get({core: $routeParams.core}, - function(data) { - $scope.core = data.core; - delete $scope.systemMessage; - }, - function(error) { - $scope.systemMessage = "/admin/system Handler is not configured"; - } - ); - }; - - $scope.refreshPing = function() { - Ping.status({core: $routeParams.core}, function(data) { - if (data.error) { - $scope.healthcheckStatus = false; - if (data.error.code == 503) { - $scope.healthcheckMessage = 'Ping request handler is not configured with a healthcheck file.'; - } - } else { - $scope.healthcheckStatus = data.status == "enabled"; - } - }); - }; - - $scope.toggleHealthcheck = function() { - if ($scope.healthcheckStatus) { - Ping.disable( - function(data) {$scope.healthcheckStatus = false}, - function(error) {$scope.healthcheckMessage = error} - ); - } else { - Ping.enable( - function(data) {$scope.healthcheckStatus = true}, - function(error) {$scope.healthcheckMessage = error} - ); - } - }; - - $scope.refresh = function() { - $scope.refreshIndex(); - $scope.refreshReplication(); - $scope.refreshSystem(); - $scope.refreshPing(); - }; - - $scope.refresh(); -}); - diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cores.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cores.js deleted file mode 100644 index 202b6224c..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/cores.js +++ /dev/null @@ -1,180 +0,0 @@ -/* - 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. -*/ - -solrAdminApp.controller('CoreAdminController', - function($scope, $routeParams, $location, $timeout, $route, Cores, Update, Constants){ - $scope.resetMenu("cores", Constants.IS_ROOT_PAGE); - $scope.selectedCore = $routeParams.corename; // use 'corename' not 'core' to distinguish from /solr/:core/ - $scope.refresh = function() { - Cores.get(function(data) { - var coreCount = 0; - var cores = data.status; - for (_obj in cores) coreCount++; - $scope.hasCores = coreCount >0; - if (!$scope.selectedCore && coreCount==0) { - $scope.showAddCore(); - return; - } else if (!$scope.selectedCore) { - for (firstCore in cores) break; - $scope.selectedCore = firstCore; - $location.path("/~cores/" + $scope.selectedCore).replace(); - } - $scope.core = cores[$scope.selectedCore]; - $scope.corelist = []; - $scope.swapCorelist = []; - for (var core in cores) { - $scope.corelist.push(cores[core]); - if (cores[core] != $scope.core) { - $scope.swapCorelist.push(cores[core]); - } - } - if ($scope.swapCorelist.length>0) { - $scope.swapOther = $scope.swapCorelist[0].name; - } - }); - }; - $scope.showAddCore = function() { - $scope.hideAll(); - $scope.showAdd = true; - $scope.newCore = { - name: "new_core", - dataDir: "data", - instanceDir: "new_core", - config: "solrconfig.xml", - schema: "schema.xml", - collection: "", - shard: "" - }; - }; - - $scope.addCore = function() { - if (!$scope.newCore.name) { - $scope.addMessage = "Please provide a core name"; - } else if (false) { //@todo detect whether core exists - $scope.AddMessage = "A core with that name already exists"; - } else { - var params = { - name: $scope.newCore.name, - instanceDir: $scope.newCore.instanceDir, - config: $scope.newCore.config, - schema: $scope.newCore.schema, - dataDir: $scope.newCore.dataDir - }; - if ($scope.isCloud) { - params.collection = $scope.newCore.collection; - params.shard = $scope.newCore.shard; - } - Cores.add(params, function(data) { - $location.path("/~cores/" + $scope.newCore.name); - $scope.cancelAddCore(); - }); - } - }; - - $scope.cancelAddCore = function() { - delete $scope.addMessage; - $scope.showAdd = false - }; - - $scope.unloadCore = function() { - var answer = confirm( 'Do you really want to unload Core "' + $scope.selectedCore + '"?' ); - if( !answer ) return; - Cores.unload({core: $scope.selectedCore}, function(data) { - $location.path("/~cores"); - }); - }; - - $scope.showRenameCore = function() { - $scope.hideAll(); - $scope.showRename = true; - }; - - $scope.renameCore = function() { - if (!$scope.other) { - $scope.renameMessage = "Please provide a new name for the " + $scope.selectedCore + " core"; - } else if ($scope.other == $scope.selectedCore) { - $scope.renameMessage = "New name must be different from the current one"; - } else { - Cores.rename({core:$scope.selectedCore, other: $scope.other}, function(data) { - $location.path("/~cores/" + $scope.other); - $scope.cancelRename(); - }); - } - }; - - $scope.cancelRenameCore = function() { - $scope.showRename = false; - delete $scope.renameMessage; - $scope.other = ""; - }; - - $scope.showSwapCores = function() { - $scope.hideAll(); - $scope.showSwap = true; - }; - - $scope.swapCores = function() { - if (!$scope.swapOther) { - $scope.swapMessage = "Please select a core to swap with"; - } else if ($scope.swapOther == $scope.selectedCore) { - $scope.swapMessage = "Cannot swap with the same core"; - } else { - Cores.swap({core: $scope.selectedCore, other: $scope.swapOther}, function(data) { - $location.path("/~cores/" + $scope.swapOther); - delete $scope.swapOther; - $scope.cancelSwapCores(); - }); - } - }; - - $scope.cancelSwapCores = function() { - delete $scope.swapMessage; - $scope.showSwap = false; - } - - $scope.reloadCore = function() { - if ($scope.initFailures[$scope.selectedCore]) { - delete $scope.initFailures[$scope.selectedCore]; - $scope.showInitFailures = Object.keys(data.initFailures).length>0; - } - Cores.reload({core: $scope.selectedCore}, - function(data) { - if (data.error) { - $scope.reloadFailure = true; - $timeout(function() { - $scope.reloadFailure = false; - $route.reload(); - }, 1000); - } else { - $scope.reloadSuccess = true; - $timeout(function () { - $scope.reloadSuccess = false; - $route.reload(); - }, 1000); - } - }); - }; - - $scope.hideAll = function() { - $scope.showRename = false; - $scope.showAdd = false; - $scope.showSwap = false; - }; - - $scope.refresh(); - } -); diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/dataimport.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/dataimport.js deleted file mode 100644 index c31b6f0fb..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/dataimport.js +++ /dev/null @@ -1,302 +0,0 @@ -/* - 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 dataimport_timeout = 2000; - -solrAdminApp.controller('DataImportController', - function($scope, $rootScope, $routeParams, $location, $timeout, $interval, $cookies, Mbeans, DataImport, Constants) { - $scope.resetMenu("dataimport", Constants.IS_COLLECTION_PAGE); - - $scope.refresh = function () { - Mbeans.info({core: $routeParams.core, cat: 'QUERY'}, function (data) { - var mbeans = data['solr-mbeans'][1]; - $scope.handlers = []; - for (var key in mbeans) { - if (mbeans[key]['class'] !== key && mbeans[key]['class'] === 'org.apache.solr.handler.dataimport.DataImportHandler') { - $scope.handlers.push(key); - } - } - $scope.hasHandlers = $scope.handlers.length > 0; - - if (!$routeParams.handler) { - $location.path("/" + $routeParams.core + "/dataimport/" + $scope.handlers[0]); - } else { - $scope.currentHandler = $routeParams.handler; - } - }); - - $scope.handler = $routeParams.handler; - if ($scope.handler && $scope.handler[0]=="/") { - $scope.handler = $scope.handler.substr(1); - } - if ($scope.handler) { - DataImport.config({core: $routeParams.core, name: $scope.handler}, function (data) { - try { - $scope.config = data.config; - var xml = $.parseXML(data.config); - $scope.entities = []; - $('document > entity', xml).each(function (i, element) { - $scope.entities.push($(element).attr('name')); - }); - $scope.refreshStatus(); - } catch (err) { - console.log(err); - } - }); - } - $scope.lastUpdate = "unknown"; - $scope.lastUpdateUTC = ""; - }; - - $scope.toggleDebug = function () { - $scope.isDebugMode = !$scope.isDebugMode; - if ($scope.isDebugMode) { - // also enable Debug checkbox - $scope.form.showDebug = true; - } - $scope.showConfiguration = true; - } - - $scope.toggleConfiguration = function () { - $scope.showConfiguration = !$scope.showConfiguration; - } - - $scope.toggleRawStatus = function () { - $scope.showRawStatus = !$scope.showRawStatus; - } - - $scope.toggleRawDebug = function () { - $scope.showRawDebug = !$scope.showRawDebug; - } - - $scope.reload = function () { - DataImport.reload({core: $routeParams.core, name: $scope.handler}, function () { - $scope.reloaded = true; - $timeout(function () { - $scope.reloaded = false; - }, 5000); - $scope.refresh(); - }); - } - - $scope.form = { - command: "full-import", - verbose: false, - clean: false, - commit: true, - showDebug: false, - custom: "", - core: $routeParams.core - }; - - $scope.submit = function () { - var params = {}; - for (var key in $scope.form) { - if (key == "showDebug") { - if ($scope.form.showDebug) { - params["debug"] = true; - } - } else { - params[key] = $scope.form[key]; - } - } - if (params.custom.length) { - var customParams = $scope.form.custom.split("&"); - for (var i in customParams) { - var parts = customParams[i].split("="); - params[parts[0]] = parts[1]; - } - } - delete params.custom; - - if ($scope.isDebugMode) { - params.dataConfig = $scope.config; - } - - params.core = $routeParams.core; - params.name = $scope.handler; - - DataImport.post(params, function (data) { - $scope.rawResponse = JSON.stringify(data, null, 2); - $scope.refreshStatus(); - }); - }; - - $scope.abort = function () { - $scope.isAborting = true; - DataImport.abort({core: $routeParams.core, name: $scope.handler}, function () { - $timeout(function () { - $scope.isAborting = false; - $scope.refreshStatus(); - }, 4000); - }); - } - - $scope.refreshStatus = function () { - - console.log("Refresh Status"); - - $scope.isStatusLoading = true; - DataImport.status({core: $routeParams.core, name: $scope.handler}, function (data) { - if (data[0] == "<") { - $scope.hasHandlers = false; - return; - } - - var now = new Date(); - $scope.lastUpdate = now.toTimeString().split(' ').shift(); - $scope.lastUpdateUTC = now.toUTCString(); - var messages = data.statusMessages; - var messagesCount = 0; - for( var key in messages ) { messagesCount++; } - - if (data.status == 'busy') { - $scope.status = "indexing"; - - $scope.timeElapsed = data.statusMessages['Time Elapsed']; - $scope.elapsedSeconds = parseSeconds($scope.timeElapsed); - - var info = $scope.timeElapsed ? 'Indexing since ' + $scope.timeElapsed : 'Indexing ...'; - $scope.info = showInfo(messages, true, info, $scope.elapsedSeconds); - - } else if (messages.RolledBack) { - $scope.status = "failure"; - $scope.info = showInfo(messages, true); - } else if (messages.Aborted) { - $scope.status = "aborted"; - $scope.info = showInfo(messages, true, 'Aborting current Import ...'); - } else if (data.status == "idle" && messagesCount != 0) { - $scope.status = "success"; - $scope.info = showInfo(messages, true); - } else { - $scope.status = "idle"; - $scope.info = showInfo(messages, false, 'No information available (idle)'); - } - - delete data.$promise; - delete data.$resolved; - - $scope.rawStatus = JSON.stringify(data, null, 2); - - $scope.isStatusLoading = false; - $scope.statusUpdated = true; - $timeout(function () { - $scope.statusUpdated = false; - }, dataimport_timeout / 2); - }); - }; - - $scope.updateAutoRefresh = function () { - $scope.autorefresh = !$scope.autorefresh; - $cookies.dataimport_autorefresh = $scope.autorefresh ? true : null; - if ($scope.autorefresh) { - $scope.refreshTimeout = $interval($scope.refreshStatus, dataimport_timeout); - var onRouteChangeOff = $scope.$on('$routeChangeStart', function() { - $interval.cancel($scope.refreshTimeout); - onRouteChangeOff(); - }); - - } else if ($scope.refreshTimeout) { - $interval.cancel($scope.refreshTimeout); - } - $scope.refreshStatus(); - }; - - $scope.refresh(); - -}); - -var showInfo = function (messages, showFull, info_text, elapsed_seconds) { - - var info = {}; - if (info_text) { - info.text = info_text; - } else { - info.text = messages[''] || ''; - // format numbers included in status nicely - /* @todo this pretty printing is hard to work out how to do in an Angularesque way: - info.text = info.text.replace(/\d{4,}/g, - function (match, position, string) { - return app.format_number(parseInt(match, 10)); - } - ); - */ - - var time_taken_text = messages['Time taken']; - info.timeTaken = parseSeconds(time_taken_text); - } - info.showDetails = false; - - if (showFull) { - if (!elapsed_seconds) { - var time_taken_text = messages['Time taken']; - elapsed_seconds = parseSeconds(time_taken_text); - } - - info.showDetails = true; - - var document_config = { - 'Requests': 'Total Requests made to DataSource', - 'Fetched': 'Total Rows Fetched', - 'Skipped': 'Total Documents Skipped', - 'Processed': 'Total Documents Processed' - }; - - info.docs = []; - for (var key in document_config) { - var value = parseInt(messages[document_config[key]], 10); - var doc = {desc: document_config[key], name: key, value: value}; - if (elapsed_seconds && key != 'Skipped') { - doc.speed = Math.round(value / elapsed_seconds); - } - info.docs.push(doc); - } - - var dates_config = { - 'Started': 'Full Dump Started', - 'Aborted': 'Aborted', - 'Rolledback': 'Rolledback' - }; - - info.dates = []; - for (var key in dates_config) { - var value = messages[dates_config[key]]; - if (value) { - value = value.replace(" ", "T")+".000Z"; - console.log(value); - var date = {desc: dates_config[key], name: key, value: value}; - info.dates.push(date); - } - } - } - return info; -} - -var parseSeconds = function(time) { - var seconds = 0; - var arr = new String(time || '').split('.'); - var parts = arr[0].split(':').reverse(); - - for (var i = 0; i < parts.length; i++) { - seconds += ( parseInt(parts[i], 10) || 0 ) * Math.pow(60, i); - } - - if (arr[1] && 5 <= parseInt(arr[1][0], 10)) { - seconds++; // treat more or equal than .5 as additional second - } - return seconds; -} diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/documents.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/documents.js deleted file mode 100644 index d38265a05..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/documents.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - 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. - */ -//helper for formatting JSON and others - -var DOC_PLACEHOLDER = '\n' + - 'change.me' + - 'change.me' + - ''; - -var ADD_PLACEHOLDER = '\n' + DOC_PLACEHOLDER + '\n'; - -solrAdminApp.controller('DocumentsController', - function($scope, $rootScope, $routeParams, $location, Luke, Update, FileUpload, Constants) { - $scope.resetMenu("documents", Constants.IS_COLLECTION_PAGE); - - $scope.refresh = function () { - Luke.schema({core: $routeParams.core}, function(data) { - //TODO: handle dynamic fields - delete data.schema.fields._version_; - $scope.fields = Object.keys(data.schema.fields); - }); - $scope.document = ""; - $scope.handler = "/update"; - $scope.type = "json"; - $scope.commitWithin = 1000; - $scope.overwrite = true; - }; - - $scope.refresh(); - - $scope.changeDocumentType = function () { - $scope.placeholder = ""; - if ($scope.type == 'json') { - $scope.placeholder = '{"id":"change.me","title":"change.me"}'; - } else if ($scope.type == 'csv') { - $scope.placeholder = "id,title\nchange.me,change.me"; - } else if ($scope.type == 'solr') { - $scope.placeholder = ADD_PLACEHOLDER; - } else if ($scope.type == 'xml') { - $scope.placeholder = DOC_PLACEHOLDER; - } - }; - - $scope.addWizardField = function () { - if ($scope.document == "") $scope.document = "{}"; - var doc = JSON.parse($scope.document); - doc[$scope.fieldName] = $scope.fieldData; - $scope.document = JSON.stringify(doc, null, '\t'); - $scope.fieldData = ""; - }; - - $scope.submit = function () { - var contentType = ""; - var postData = ""; - var params = {}; - var doingFileUpload = false; - - if ($scope.handler[0] == '/') { - params.handler = $scope.handler.substring(1); - } else { - params.handler = 'update'; - params.qt = $scope.handler; - } - - params.commitWithin = $scope.commitWithin; - params.overwrite = $scope.overwrite; - params.core = $routeParams.core; - params.wt = "json"; - - if ($scope.type == "json" || $scope.type == "wizard") { - postData = "[" + $scope.document + "]"; - contentType = "json"; - } else if ($scope.type == "csv") { - postData = $scope.document; - contentType = "csv"; - } else if ($scope.type == "xml") { - postData = "" + $scope.document + ""; - contentType = "xml"; - } else if ($scope.type == "upload") { - doingFileUpload = true; - params.raw = $scope.literalParams; - } else if ($scope.type == "solr") { - postData = $scope.document; - if (postData[0] == "<") { - contentType = "xml"; - } else if (postData[0] == "{" || postData[0] == '[') { - contentType = "json"; - } else { - alert("Cannot identify content type") - } - } - if (!doingFileUpload) { - var callback = function (success) { - $scope.responseStatus = "success"; - delete success.$promise; - delete success.$resolved; - $scope.response = JSON.stringify(success, null, ' '); - }; - var failure = function (failure) { - $scope.responseStatus = failure; - }; - if (contentType == "json") { - Update.postJson(params, postData, callback, failure); - } else if (contentType == "xml") { - Update.postXml(params, postData, callback, failure); - } else if (contentType == "csv") { - Update.postCsv(params, postData, callback, failure); - } - } else { - var file = $scope.fileUpload; - console.log('file is ' + JSON.stringify(file)); - var uploadUrl = "/fileUpload"; - FileUpload.upload(params, $scope.fileUpload, function (success) { - $scope.responseStatus = "success"; - $scope.response = JSON.stringify(success, null, ' '); - }, function (failure) { - $scope.responseStatus = "failure"; - $scope.response = JSON.stringify(failure, null, ' '); - }); - } - } - }); - diff --git a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/files.js b/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/files.js deleted file mode 100644 index c1d7abfe2..000000000 --- a/solr-8.1.1/server/solr-webapp/webapp/js/angular/controllers/files.js +++ /dev/null @@ -1,100 +0,0 @@ -/* - 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 contentTypeMap = { xml : 'text/xml', html : 'text/html', js : 'text/javascript', json : 'application/json', 'css' : 'text/css' }; -var languages = {js: "javascript", xml:"xml", xsl:"xml", vm: "xml", html: "xml", json: "json", css: "css"}; - -solrAdminApp.controller('FilesController', - function($scope, $rootScope, $routeParams, $location, Files, Constants) { - $scope.resetMenu("files", Constants.IS_COLLECTION_PAGE); - - $scope.file = $location.search().file; - $scope.content = null; - - $scope.baseurl = $location.absUrl().substr(0,$location.absUrl().indexOf("#")); // Including /solr/ context - - $scope.refresh = function () { - - var process = function (path, tree) { - var params = {core: $routeParams.core}; - if (path.slice(-1) == '/') { - params.file = path.slice(0, -1); - } else if (path!='') { - params.file = path; - } - - Files.list(params, function (data) { - var filenames = Object.keys(data.files); - filenames.sort(); - for (var i in filenames) { - var file = filenames[i]; - var filedata = data.files[file]; - var state = undefined; - var children = undefined; - - if (filedata.directory) { - file = file + "/"; - if ($scope.file && $scope.file.indexOf(path + file) == 0) { - state = "open"; - } else { - state = "closed"; - } - children = []; - process(path + file, children); - } - tree.push({ - data: { - title: file, - attr: { id: path + file} - }, - children: children, - state: state - }); - } - }); - } - $scope.tree = []; - process("", $scope.tree); - - if ($scope.file && $scope.file != '' && $scope.file.split('').pop()!='/') { - var extension; - if ($scope.file == "managed-schema") { - extension = contentTypeMap['xml']; - } else { - extension = $scope.file.match( /\.(\w+)$/)[1] || ''; - } - var contentType = (contentTypeMap[extension] || 'text/plain' ) + ';charset=utf-8'; - - Files.get({core: $routeParams.core, file: $scope.file, contentType: contentType}, function(data) { - $scope.content = data.data; - $scope.url = data.config.url + "?" + $.param(data.config.params); // relative URL - if (contentType.indexOf("text/plain") && (data.data.indexOf("=0) || data.data.indexOf("