Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/SchedulerPageUtil.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/SchedulerPageUtil.java (revision 0) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/SchedulerPageUtil.java (revision 0) @@ -0,0 +1,167 @@ +package org.apache.hadoop.yarn.server.resourcemanager.webapp; + +import org.apache.hadoop.yarn.webapp.view.HtmlBlock; + +public class SchedulerPageUtil{ + + static class NodeBlockUtil extends HtmlBlock{ + + static class ExpandNode extends HtmlBlock{ + @Override + protected void render(Block html) { + html. + script().$type("text/javascript"). + _("function reopenQueryNodes(){", + " var currentParam = window.location.href.split('?');", + " var tmpCurrentParam = currentParam;", + " var queryQueuesString = '';", + " if( tmpCurrentParam.length > 1 ) {", + " //openQueues=q1#q2¶m1=value1¶m2=value2", + " tmpCurrentParam=tmpCurrentParam[1];", + " if( tmpCurrentParam.indexOf('openQueues=') != -1 ) {", + " tmpCurrentParam = tmpCurrentParam.split('openQueues=')[1].split('&')[0];", + " queryQueuesString = tmpCurrentParam;", + " }", + " }", + " if( queryQueuesString != '' ) {", + " queueArray = queryQueuesString.split('#');", + " $('#cs .q').each(function() {", + " var name = $(this).html();", + " if( name != 'root' && $.inArray(name, queueArray) !=-1 ) {", + " $(this).closest('li').removeClass('jstree-closed').addClass('jstree-open'); ", + " }", + " });", + " }", + "}")._(); + } + + } + + static class StoreExpandedNode extends HtmlBlock{ + @Override + protected void render(Block html) { + html. + script().$type("text/javascript"). + _("function storeExpandedNode(e,data){", + " var OPEN_QUEUES = 'openQueues';", + " var ACTION_OPEN = 'open';", + " var ACTION_CLOSED = 'closed';", + " var $li = $(data.args[0]);", + " var action = ACTION_CLOSED; //closed or open", + " var queueName = ''", + " if( $li.hasClass('jstree-open') ) {", + " action=ACTION_OPEN;", + " }", + " queueName = $li.find('.q').html();", + " // http://localhost:8088/cluster/scheduler?openQueues=q1#q2¶m1=value1¶m2=value2 ", + " // ==> [http://localhost:8088/cluster/scheduler , openQueues=q1#q2¶m1=value1¶m2=value2]", + " var currentParam = window.location.href.split('?');", + " var tmpCurrentParam = currentParam;", + " var queryString = '';", + " if( tmpCurrentParam.length > 1 ) {", + " //openQueues=q1#q2¶m1=value1¶m2=value2", + " tmpCurrentParam = tmpCurrentParam[1];", + " currentParam = tmpCurrentParam;", + " tmpCurrentParam = tmpCurrentParam.split('&');", + " var len = tmpCurrentParam.length;", + " var paramExist = false;", + " if( len > 1 ) { //Currently no query param are present but in future if any are added for that handling it now", + " queryString = '';", + " for( var i = 0 ; i < len ; i++ ) { //searching for param openQueues", + " if( tmpCurrentParam[i].substr(0,11) == OPEN_QUEUES+'=' ) {", + " if( action == ACTION_OPEN ) {", + " tmpCurrentParam[i] = addQueueName(tmpCurrentParam[i],queueName);", + " }", + " else if( action == ACTION_CLOSED ) {", + " tmpCurrentParam[i] = removeQueueName(tmpCurrentParam[i] , queueName);", + " }", + " paramExist = true;", + " }", + " if( i > 0 ) {", + " queryString+='&';", + " }", + " queryString += tmpCurrentParam[i];", + " }", + " //If in existing query string OPEN_QUEUES param is not present", + " if( action == ACTION_OPEN && !paramExist ) {", + " queryString = currentParam+'&'+OPEN_QUEUES+'='+queueName;", + " }", + " } ", + " //Only one param is present in current query string", + " else {", + " tmpCurrentParam=tmpCurrentParam[0];", + " //checking if the only param present in query string is OPEN_QUEUES or not and making queryString accordingly", + " if( tmpCurrentParam.substr(0,11) == OPEN_QUEUES+'=' ) {", + " if( action == ACTION_OPEN ) {", + " queryString = addQueueName(tmpCurrentParam,queueName);", + " }", + " else if( action == ACTION_CLOSED ) {", + " queryString = removeQueueName(tmpCurrentParam , queueName);", + " }", + " }", + " else {", + " if( action == ACTION_OPEN ) {", + " queryString = tmpCurrentParam+'&'+OPEN_QUEUES+'='+queueName;", + " }", + " }", + " }", + " } else {", + " if( action == ACTION_OPEN ) {", + " tmpCurrentParam = '';", + " currentParam = tmpCurrentParam;", + " queryString = OPEN_QUEUES+'='+queueName;", + " }", + " }", + " if( queryString != '' ) {", + " queryString = '?'+queryString;", + " }", + " var url = window.location.protocol + '//' + window.location.host + window.location.pathname + queryString;", + " window.history.pushState({path:url},'',url);", + "};", + "", + "function removeQueueName(queryString, queueName) {", + " var index = queryString.indexOf(queueName);", + " //Finding if queue is present in query param then only remove it", + " if( index != -1 ) {", + " //removing openQueues=", + " var tmp = queryString.substr(11,queryString.length);", + " tmp = tmp.split('#');", + " var len = tmp.length;", + " var newQueryString = '';", + " for( var i = 0 ; i < len ; i++ ) {", + " if( tmp[i] != queueName ) {", + " if( newQueryString != '' ) {", + " newQueryString += '#';", + " }", + " newQueryString += tmp[i];", + " }", + " }", + " queryString = newQueryString;", + " if( newQueryString!='' ) {", + " queryString = 'openQueues='+newQueryString;", + " }", + " }", + " return queryString;", + "}", + "", + "function addQueueName(queryString , queueName) {", + " queueArray = queryString.split('#');", + " if( $.inArray(queueArray , queueName) == -1 ) {", + " queryString = queryString+'#'+queueName;", + " }", + " return queryString;", + "}", + "")._(); + } + + } + + @Override + protected void render(Block html) { + html. + _(ExpandNode.class). + _(StoreExpandedNode.class); + } + } + +} Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java (revision 1540479) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java (working copy) @@ -196,7 +196,8 @@ _("$(function() {", " $('#cs a span').addClass('ui-corner-all').css('position', 'absolute');", " $('#cs').bind('loaded.jstree', function (e, data) {", - " data.inst.open_node('#pq', true);", + " var callback = {call:reopenQueryNodes}", + " data.inst.open_node('#pq', callback);", " }).", " jstree({", " core: { animation: 188, html_titles: true },", @@ -212,7 +213,12 @@ " $('#apps').dataTable().fnFilter(q, 3, true);", " });", " $('#cs').show();", - "});")._(); + " $('#cs').bind({", + " 'open_node.jstree' :function(e,data){ storeExpandedNode(e,data); },", + " 'close_node.jstree':function(e,data){ storeExpandedNode(e,data); }", + " });", + "});")._(). + _(SchedulerPageUtil.NodeBlockUtil.class); } @Override protected Class content() { Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java (revision 1540479) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java (working copy) @@ -249,7 +249,8 @@ _("$(function() {", " $('#cs a span').addClass('ui-corner-all').css('position', 'absolute');", " $('#cs').bind('loaded.jstree', function (e, data) {", - " data.inst.open_node('#pq', true);", + " var callback = {call:reopenQueryNodes}", + " data.inst.open_node('#pq', callback);", " }).", " jstree({", " core: { animation: 188, html_titles: true },", @@ -265,7 +266,12 @@ " $('#apps').dataTable().fnFilter(q, 3, true);", " });", " $('#cs').show();", - "});")._(); + " $('#cs').bind({", + " 'open_node.jstree' :function(e,data){ storeExpandedNode(e,data); },", + " 'close_node.jstree':function(e,data){ storeExpandedNode(e,data); }", + " });", + "});")._(). + _(SchedulerPageUtil.NodeBlockUtil.class); } @Override protected Class content() {