From d188534f3de95a174c0bb4bcf2073b5fe62870af Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Thu, 5 Sep 2013 17:34:06 +0530 Subject: [PATCH] CLOUDSTACK-4612: Specified locale keyboard language is not showing as default in consoleView passed during deployVM. While deploying a VM, user passes the "keyboard" parameter to specify the default language for that VM but in the consoleView, the default language selected is en-us irrespective of the default language of the VM. --- .../servlet/ConsoleProxyClientParam.java | 10 +++++++- .../cloud/servlet/ConsoleProxyServlet.java | 7 +++++- .../console-proxy/server/js/ajaxviewer.js | 9 ++++--- .../consoleproxy/ConsoleProxyAjaxHandler.java | 8 ++++--- .../consoleproxy/ConsoleProxyClientBase.java | 8 ++++--- .../consoleproxy/ConsoleProxyClientParam.java | 12 ++++++++-- .../ConsoleProxyHttpHandlerHelper.java | 24 ++++++++++--------- 7 files changed, 54 insertions(+), 24 deletions(-) diff --git a/server/src/com/cloud/servlet/ConsoleProxyClientParam.java b/server/src/com/cloud/servlet/ConsoleProxyClientParam.java index e420110edb0..88da836ba7a 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyClientParam.java +++ b/server/src/com/cloud/servlet/ConsoleProxyClientParam.java @@ -26,7 +26,7 @@ public class ConsoleProxyClientParam { private String clientTunnelUrl; private String clientTunnelSession; - + private String locale; private String ajaxSessionId; public ConsoleProxyClientParam() { @@ -97,6 +97,14 @@ public class ConsoleProxyClientParam { this.ajaxSessionId = ajaxSessionId; } + public String getLocale() { + return this.locale; + } + + public void setLocale(String locale) { + this.locale = locale; + } + public String getClientMapKey() { if(clientTag != null && !clientTag.isEmpty()) return clientTag; diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java index f6559a56db7..35f8b435203 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java +++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java @@ -55,6 +55,7 @@ import com.cloud.utils.db.Transaction; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.dao.UserVmDetailsDaoImpl; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -74,7 +75,7 @@ public class ConsoleProxyServlet extends HttpServlet { @Inject VirtualMachineManager _vmMgr; @Inject ManagementServer _ms; @Inject IdentityService _identityService; - + @Inject UserVmDetailsDaoImpl _userVmDetailsDaoImpl; static ManagementServer s_ms; private Gson _gson = new GsonBuilder().create(); @@ -384,6 +385,7 @@ public class ConsoleProxyServlet extends HttpServlet { Ternary parsedHostInfo = parseHostInfo(portInfo.first()); + Map details = _userVmDetailsDaoImpl.findDetails(vm.getId()); String sid = vm.getVncPassword(); String tag = vm.getUuid(); String ticket = genAccessTicket(host, String.valueOf(portInfo.second()), sid, tag); @@ -394,6 +396,9 @@ public class ConsoleProxyServlet extends HttpServlet { param.setClientHostPassword(sid); param.setClientTag(tag); param.setTicket(ticket); + if (details != null && details.containsKey("keyboard")) { + param.setLocale(details.get("keyboard")); + } if(parsedHostInfo.second() != null && parsedHostInfo.third() != null) { param.setClientTunnelUrl(parsedHostInfo.second()); param.setClientTunnelSession(parsedHostInfo.third()); diff --git a/services/console-proxy/server/js/ajaxviewer.js b/services/console-proxy/server/js/ajaxviewer.js index 96432049227..e5657e16575 100644 --- a/services/console-proxy/server/js/ajaxviewer.js +++ b/services/console-proxy/server/js/ajaxviewer.js @@ -332,7 +332,7 @@ KeyboardMapper.prototype = { ///////////////////////////////////////////////////////////////////////////// // class AjaxViewer // -function AjaxViewer(panelId, imageUrl, updateUrl, tileMap, width, height, tileWidth, tileHeight) { +function AjaxViewer(panelId, imageUrl, updateUrl, locale, tileMap, width, height, tileWidth, tileHeight) { // logging is disabled by default so that it won't have negative impact on performance // however, a back door key-sequence can trigger to open the logger window, it is designed to help // trouble-shooting @@ -358,8 +358,11 @@ function AjaxViewer(panelId, imageUrl, updateUrl, tileMap, width, height, tileWi this.tileWidth = tileWidth; this.tileHeight = tileHeight; this.maxTileZIndex = 1; - - this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_ENGLISH; + + if (locale == AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH || locale == AjaxViewer.KEYBOARD_TYPE_JAPANESE) + this.currentKeyboard = locale; + else + this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_ENGLISH; this.keyboardMappers = []; this.timer = 0; diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java index 6cadeca1f4a..04254a8fdb4 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java @@ -77,7 +77,8 @@ public class ConsoleProxyAjaxHandler implements HttpHandler { String eventStr = queryMap.get("event"); String console_url = queryMap.get("consoleurl"); String console_host_session = queryMap.get("sessionref"); - + String vm_locale = queryMap.get("locale"); + if(tag == null) tag = ""; @@ -124,7 +125,8 @@ public class ConsoleProxyAjaxHandler implements HttpHandler { param.setTicket(ticket); param.setClientTunnelUrl(console_url); param.setClientTunnelSession(console_host_session); - + param.setLocale(vm_locale); + viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr); } catch(Exception e) { @@ -181,7 +183,7 @@ public class ConsoleProxyAjaxHandler implements HttpHandler { } } } - + private static String convertStreamToString(InputStream is, boolean closeStreamAfterRead) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java index 07a1b6f8f96..b3cda0b2809 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java @@ -20,6 +20,8 @@ import java.awt.Image; import java.awt.Rectangle; import java.util.List; +import javassist.tools.web.Viewer; + import org.apache.log4j.Logger; import com.cloud.consoleproxy.util.TileInfo; @@ -283,11 +285,11 @@ public abstract class ConsoleProxyClientBase implements ConsoleProxyClient, Cons return getAjaxViewerPageContent(sbTileSequence.toString(), imgUrl, updateUrl, width, height, tileWidth, tileHeight, title, ConsoleProxy.keyboardType == ConsoleProxy.KEYBOARD_RAW, - languages, guest); + languages, guest, this.clientParam.getLocale()); } private String getAjaxViewerPageContent(String tileSequence, String imgUrl, String updateUrl, int width, - int height, int tileWidth, int tileHeight, String title, boolean rawKeyboard, List languages, String guest) { + int height, int tileWidth, int tileHeight, String title, boolean rawKeyboard, List languages, String guest, String locale) { StringBuffer sbLanguages = new StringBuffer(""); if(languages != null) { @@ -342,7 +344,7 @@ public abstract class ConsoleProxyClientBase implements ConsoleProxyClient, Cons "