You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2012/09/10 22:55:52 UTC

[35/50] [abbrv] CLOUDSTACK-61 Console proxy has plenty of files with CRLF line ending.

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
index d91a198..6cadeca 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
@@ -14,8 +14,8 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,377 +30,377 @@ import com.cloud.consoleproxy.util.Logger;
 import com.sun.net.httpserver.Headers;
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyAjaxHandler implements HttpHandler {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxHandler.class);
-	
-	public ConsoleProxyAjaxHandler() {
-	}
-	
-	public void handle(HttpExchange t) throws IOException {
-		try {
-	        if(s_logger.isTraceEnabled())
-	        	s_logger.trace("AjaxHandler " + t.getRequestURI());
-	        
-	        long startTick = System.currentTimeMillis();
-	        
-	        doHandle(t);
-	        
-	        if(s_logger.isTraceEnabled())
-	        	s_logger.trace(t.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
-		} catch (IOException e) {
-			throw e;
-		} catch (IllegalArgumentException e) {
-			s_logger.warn("Exception, ", e);
-			t.sendResponseHeaders(400, -1);		// bad request
-		} catch(Throwable e) {
-			s_logger.error("Unexpected exception, ", e);
-			t.sendResponseHeaders(500, -1);		// server error
-		} finally {
-			t.close();
-		}
-	}
-	
-	private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
-		String queries = t.getRequestURI().getQuery();
-		if(s_logger.isTraceEnabled())
-			s_logger.trace("Handle AJAX request: " + queries);
-		
-		Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
-		
-		String host = queryMap.get("host");
-		String portStr = queryMap.get("port");
-		String sid = queryMap.get("sid");
-		String tag = queryMap.get("tag");
-		String ticket = queryMap.get("ticket");
-		String ajaxSessionIdStr = queryMap.get("sess");
-		String eventStr = queryMap.get("event");
-		String console_url = queryMap.get("consoleurl");
-		String console_host_session = queryMap.get("sessionref");
-		
-		if(tag == null)
-			tag = "";
-		
-		long ajaxSessionId = 0;
-		int event = 0;
-		
-		int port;
-
-		if(host == null || portStr == null || sid == null) 
-			throw new IllegalArgumentException();
-		
-		try {
-			port = Integer.parseInt(portStr);
-		} catch (NumberFormatException e) {
-			s_logger.warn("Invalid number parameter in query string: " + portStr);
-			throw new IllegalArgumentException(e);
-		}
-
-		if(ajaxSessionIdStr != null) {
-			try {
-				ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
-			} catch (NumberFormatException e) {
-				s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
-				throw new IllegalArgumentException(e);
-			}
-		}
-
-		if(eventStr != null) {
-			try {
-				event = Integer.parseInt(eventStr);
-			} catch (NumberFormatException e) {
-				s_logger.warn("Invalid number parameter in query string: " + eventStr);
-				throw new IllegalArgumentException(e);
-			}
-		}
-		
-		ConsoleProxyClient viewer = null;
-		try {
-			ConsoleProxyClientParam param = new ConsoleProxyClientParam();
-			param.setClientHostAddress(host);
-			param.setClientHostPort(port);
-			param.setClientHostPassword(sid);
-			param.setClientTag(tag);
-			param.setTicket(ticket);
-			param.setClientTunnelUrl(console_url);
-			param.setClientTunnelSession(console_host_session);
-			
-			viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
-		} catch(Exception e) {
-
-			s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
-
-			String[] content = new String[] {
-				"<html><head></head><body>",
-				"<div id=\"main_panel\" tabindex=\"1\">",
-				"<p>Access is denied for the console session. Please close the window and retry again</p>",
-				"</div></body></html>"
-			};
-			
-			StringBuffer sb = new StringBuffer();
-			for(int i = 0; i < content.length; i++)
-				sb.append(content[i]);
-			
-			sendResponse(t, "text/html", sb.toString());
-			return;
-		}
-		
-		if(event != 0) {
-			if(ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
-				if(event == 7) {
-					// client send over an event bag
-					InputStream is = t.getRequestBody();
-					handleClientEventBag(viewer, convertStreamToString(is, true));
-				} else {
-					handleClientEvent(viewer, event, queryMap);
-				}
-				sendResponse(t, "text/html", "OK");
-			} else {
-				if(s_logger.isDebugEnabled())
-					s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
-				
-				sendResponse(t, "text/html", "Invalid ajax client session id");
-			}
-		} else {
-			if(ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
-				s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
-				handleClientKickoff(t, viewer);
-			} else if(ajaxSessionId == 0) {
-				if(s_logger.isDebugEnabled())
-					s_logger.debug("Ajax request indicates a fresh client start");
-		
-				String title = queryMap.get("t");
-				String guest = queryMap.get("guest");
-				handleClientStart(t, viewer, title != null ? title : "", guest);
-			} else {
-				
-				if(s_logger.isTraceEnabled())
-					s_logger.trace("Ajax request indicates client update");
-				
-				handleClientUpdate(t, viewer);
-			}
-		}
-	}
-	
-	private static String convertStreamToString(InputStream is, boolean closeStreamAfterRead) { 
-		BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
-		StringBuilder sb = new StringBuilder(); 
-		String line = null; 
-		try { 
-			while ((line = reader.readLine()) != null) { 
-				sb.append(line + "\n"); 
-			} 
-		} catch (IOException e) {
-			s_logger.warn("Exception while reading request body: ", e);
-		} finally {
-			if(closeStreamAfterRead) {
-				try { 
-					is.close(); 
-				} catch (IOException e) { 
-				} 
-			}
-		} 
-		return sb.toString(); 
-	} 	
-	
-	private void sendResponse(HttpExchange t, String contentType, String response) throws IOException {
-		Headers hds = t.getResponseHeaders();
-		hds.set("Content-Type", contentType);
-	
-		t.sendResponseHeaders(200, response.length());
-		OutputStream os = t.getResponseBody();
-		try {
-			os.write(response.getBytes());
-		} finally {
-			os.close();
-		}
-	}
-	
-	@SuppressWarnings("deprecation")
-	private void handleClientEventBag(ConsoleProxyClient viewer, String requestData) {
-		if(s_logger.isTraceEnabled())
-			s_logger.trace("Handle event bag, event bag: " + requestData);
-		
-		int start = requestData.indexOf("=");
-		if(start < 0)
-			start = 0;
-		else if(start > 0)
-			start++;
-		String data = URLDecoder.decode(requestData.substring(start));
-		String[] tokens = data.split("\\|");
-		if(tokens != null && tokens.length > 0) {
-			int count = 0;
-			try {
-				count = Integer.parseInt(tokens[0]);
-				int parsePos = 1;
-				int type, event, x, y, code, modifiers;
-				for(int i = 0; i < count; i++) {
-					type = Integer.parseInt(tokens[parsePos++]);
-					if(type == 1) 	{
-						// mouse event
-						event = Integer.parseInt(tokens[parsePos++]);
-						x = Integer.parseInt(tokens[parsePos++]);
-						y = Integer.parseInt(tokens[parsePos++]);
-						code = Integer.parseInt(tokens[parsePos++]);
-						modifiers = Integer.parseInt(tokens[parsePos++]);
-						
-						Map<String, String> queryMap = new HashMap<String, String>();
-						queryMap.put("event", String.valueOf(event));
-						queryMap.put("x", String.valueOf(x));
-						queryMap.put("y", String.valueOf(y));
-						queryMap.put("code", String.valueOf(code));
-						queryMap.put("modifier", String.valueOf(modifiers));
-						handleClientEvent(viewer, event, queryMap);
-					} else {
-						// keyboard event
-						event = Integer.parseInt(tokens[parsePos++]);
-						code = Integer.parseInt(tokens[parsePos++]);
-						modifiers = Integer.parseInt(tokens[parsePos++]);
-						
-						Map<String, String> queryMap = new HashMap<String, String>();
-						queryMap.put("event", String.valueOf(event));
-						queryMap.put("code", String.valueOf(code));
-						queryMap.put("modifier", String.valueOf(modifiers));
-						handleClientEvent(viewer, event, queryMap);
-					}
-				}
-			} catch(NumberFormatException e) {
-				s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
-			} catch(Exception e) {
-				s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
-			} catch(OutOfMemoryError e) {
-				s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
-				System.exit(1);
-			}
-		}
-	}
-	
-	private void handleClientEvent(ConsoleProxyClient viewer, int event, Map<String, String> queryMap) {
-		int code = 0;
-		int x = 0, y = 0;
-		int modifiers = 0;
-		
-		String str;
-		switch(event) {
-		case 1:		// mouse move
-		case 2:		// mouse down
-		case 3:		// mouse up
-		case 8:		// mouse double click
-			str = queryMap.get("x");
-			if(str != null) {
-				try {
-					x = Integer.parseInt(str);
-				} catch (NumberFormatException e) {
-					s_logger.warn("Invalid number parameter in query string: " + str);
-					throw new IllegalArgumentException(e);
-				}
-			}
-			str = queryMap.get("y");
-			if(str != null) {
-				try {
-					y = Integer.parseInt(str);
-				} catch (NumberFormatException e) {
-					s_logger.warn("Invalid number parameter in query string: " + str);
-					throw new IllegalArgumentException(e);
-				}
-			}
-			
-			if(event != 1) {
-				str = queryMap.get("code");
-				try {
-					code = Integer.parseInt(str);
-				} catch (NumberFormatException e) {
-					s_logger.warn("Invalid number parameter in query string: " + str);
-					throw new IllegalArgumentException(e);
-				}
-				
-				str = queryMap.get("modifier");
-				try {
-					modifiers = Integer.parseInt(str);
-				} catch (NumberFormatException e) {
-					s_logger.warn("Invalid number parameter in query string: " + str);
-					throw new IllegalArgumentException(e);
-				}
-				
-				if(s_logger.isTraceEnabled())
-					s_logger.trace("Handle client mouse event. event: " + event + ", x: " + x + ", y: " + y + ", button: " + code + ", modifier: " + modifiers);
-			} else {
-				if(s_logger.isTraceEnabled())
-					s_logger.trace("Handle client mouse move event. x: " + x + ", y: " + y);
-			}
-			viewer.sendClientMouseEvent(InputEventType.fromEventCode(event), x, y, code, modifiers);
-			break;
-			
-		case 4:		// key press
-		case 5:		// key down
-		case 6:		// key up
-			str = queryMap.get("code");
-			try {
-				code = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-				s_logger.warn("Invalid number parameter in query string: " + str);
-				throw new IllegalArgumentException(e);
-			}
-			
-			str = queryMap.get("modifier");
-			try {
-				modifiers = Integer.parseInt(str);
-			} catch (NumberFormatException e) {
-				s_logger.warn("Invalid number parameter in query string: " + str);
-				throw new IllegalArgumentException(e);
-			}
-			
-			if(s_logger.isDebugEnabled())
-				s_logger.debug("Handle client keyboard event. event: " + event + ", code: " + code + ", modifier: " + modifiers);
-			viewer.sendClientRawKeyboardEvent(InputEventType.fromEventCode(event), code, modifiers);
-			break;
-			
-		default :
-			break;
-		}
-	}
-	
-	private void handleClientKickoff(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
-		String response = viewer.onAjaxClientKickoff();
-		t.sendResponseHeaders(200, response.length());
-		OutputStream os = t.getResponseBody();
-		try {
-			os.write(response.getBytes());
-		} finally {
-			os.close();
-		}
-	}
-	
-	private void handleClientStart(HttpExchange t, ConsoleProxyClient viewer, String title, String guest) throws IOException {
-		List<String> languages = t.getRequestHeaders().get("Accept-Language");
-		String response = viewer.onAjaxClientStart(title, languages, guest);
-		
-		Headers hds = t.getResponseHeaders();
-		hds.set("Content-Type", "text/html");
-		hds.set("Cache-Control", "no-cache");
-		hds.set("Cache-Control", "no-store");
-		t.sendResponseHeaders(200, response.length());
-		
-		OutputStream os = t.getResponseBody();
-		try {
-			os.write(response.getBytes());
-		} finally {
-			os.close();
-		}
-	}
-	
-	private void handleClientUpdate(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
-		String response = viewer.onAjaxClientUpdate();
-		
-		Headers hds = t.getResponseHeaders();
-		hds.set("Content-Type", "text/javascript");
-		t.sendResponseHeaders(200, response.length());
-		
-		OutputStream os = t.getResponseBody();
-		try {
-			os.write(response.getBytes());
-		} finally {
-			os.close();
-		}
-	}
-}
+
+public class ConsoleProxyAjaxHandler implements HttpHandler {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxHandler.class);
+    
+    public ConsoleProxyAjaxHandler() {
+    }
+    
+    public void handle(HttpExchange t) throws IOException {
+        try {
+            if(s_logger.isTraceEnabled())
+                s_logger.trace("AjaxHandler " + t.getRequestURI());
+            
+            long startTick = System.currentTimeMillis();
+            
+            doHandle(t);
+            
+            if(s_logger.isTraceEnabled())
+                s_logger.trace(t.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
+        } catch (IOException e) {
+            throw e;
+        } catch (IllegalArgumentException e) {
+            s_logger.warn("Exception, ", e);
+            t.sendResponseHeaders(400, -1);     // bad request
+        } catch(Throwable e) {
+            s_logger.error("Unexpected exception, ", e);
+            t.sendResponseHeaders(500, -1);     // server error
+        } finally {
+            t.close();
+        }
+    }
+    
+    private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
+        String queries = t.getRequestURI().getQuery();
+        if(s_logger.isTraceEnabled())
+            s_logger.trace("Handle AJAX request: " + queries);
+        
+        Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
+        
+        String host = queryMap.get("host");
+        String portStr = queryMap.get("port");
+        String sid = queryMap.get("sid");
+        String tag = queryMap.get("tag");
+        String ticket = queryMap.get("ticket");
+        String ajaxSessionIdStr = queryMap.get("sess");
+        String eventStr = queryMap.get("event");
+        String console_url = queryMap.get("consoleurl");
+        String console_host_session = queryMap.get("sessionref");
+        
+        if(tag == null)
+            tag = "";
+        
+        long ajaxSessionId = 0;
+        int event = 0;
+        
+        int port;
+
+        if(host == null || portStr == null || sid == null) 
+            throw new IllegalArgumentException();
+        
+        try {
+            port = Integer.parseInt(portStr);
+        } catch (NumberFormatException e) {
+            s_logger.warn("Invalid number parameter in query string: " + portStr);
+            throw new IllegalArgumentException(e);
+        }
+
+        if(ajaxSessionIdStr != null) {
+            try {
+                ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        if(eventStr != null) {
+            try {
+                event = Integer.parseInt(eventStr);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Invalid number parameter in query string: " + eventStr);
+                throw new IllegalArgumentException(e);
+            }
+        }
+        
+        ConsoleProxyClient viewer = null;
+        try {
+            ConsoleProxyClientParam param = new ConsoleProxyClientParam();
+            param.setClientHostAddress(host);
+            param.setClientHostPort(port);
+            param.setClientHostPassword(sid);
+            param.setClientTag(tag);
+            param.setTicket(ticket);
+            param.setClientTunnelUrl(console_url);
+            param.setClientTunnelSession(console_host_session);
+            
+            viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
+        } catch(Exception e) {
+
+            s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
+
+            String[] content = new String[] {
+                "<html><head></head><body>",
+                "<div id=\"main_panel\" tabindex=\"1\">",
+                "<p>Access is denied for the console session. Please close the window and retry again</p>",
+                "</div></body></html>"
+            };
+            
+            StringBuffer sb = new StringBuffer();
+            for(int i = 0; i < content.length; i++)
+                sb.append(content[i]);
+            
+            sendResponse(t, "text/html", sb.toString());
+            return;
+        }
+        
+        if(event != 0) {
+            if(ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
+                if(event == 7) {
+                    // client send over an event bag
+                    InputStream is = t.getRequestBody();
+                    handleClientEventBag(viewer, convertStreamToString(is, true));
+                } else {
+                    handleClientEvent(viewer, event, queryMap);
+                }
+                sendResponse(t, "text/html", "OK");
+            } else {
+                if(s_logger.isDebugEnabled())
+                    s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
+                
+                sendResponse(t, "text/html", "Invalid ajax client session id");
+            }
+        } else {
+            if(ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
+                s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
+                handleClientKickoff(t, viewer);
+            } else if(ajaxSessionId == 0) {
+                if(s_logger.isDebugEnabled())
+                    s_logger.debug("Ajax request indicates a fresh client start");
+        
+                String title = queryMap.get("t");
+                String guest = queryMap.get("guest");
+                handleClientStart(t, viewer, title != null ? title : "", guest);
+            } else {
+                
+                if(s_logger.isTraceEnabled())
+                    s_logger.trace("Ajax request indicates client update");
+                
+                handleClientUpdate(t, viewer);
+            }
+        }
+    }
+    
+    private static String convertStreamToString(InputStream is, boolean closeStreamAfterRead) { 
+        BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
+        StringBuilder sb = new StringBuilder(); 
+        String line = null; 
+        try { 
+            while ((line = reader.readLine()) != null) { 
+                sb.append(line + "\n"); 
+            } 
+        } catch (IOException e) {
+            s_logger.warn("Exception while reading request body: ", e);
+        } finally {
+            if(closeStreamAfterRead) {
+                try { 
+                    is.close(); 
+                } catch (IOException e) { 
+                } 
+            }
+        } 
+        return sb.toString(); 
+    }   
+    
+    private void sendResponse(HttpExchange t, String contentType, String response) throws IOException {
+        Headers hds = t.getResponseHeaders();
+        hds.set("Content-Type", contentType);
+    
+        t.sendResponseHeaders(200, response.length());
+        OutputStream os = t.getResponseBody();
+        try {
+            os.write(response.getBytes());
+        } finally {
+            os.close();
+        }
+    }
+    
+    @SuppressWarnings("deprecation")
+    private void handleClientEventBag(ConsoleProxyClient viewer, String requestData) {
+        if(s_logger.isTraceEnabled())
+            s_logger.trace("Handle event bag, event bag: " + requestData);
+        
+        int start = requestData.indexOf("=");
+        if(start < 0)
+            start = 0;
+        else if(start > 0)
+            start++;
+        String data = URLDecoder.decode(requestData.substring(start));
+        String[] tokens = data.split("\\|");
+        if(tokens != null && tokens.length > 0) {
+            int count = 0;
+            try {
+                count = Integer.parseInt(tokens[0]);
+                int parsePos = 1;
+                int type, event, x, y, code, modifiers;
+                for(int i = 0; i < count; i++) {
+                    type = Integer.parseInt(tokens[parsePos++]);
+                    if(type == 1)   {
+                        // mouse event
+                        event = Integer.parseInt(tokens[parsePos++]);
+                        x = Integer.parseInt(tokens[parsePos++]);
+                        y = Integer.parseInt(tokens[parsePos++]);
+                        code = Integer.parseInt(tokens[parsePos++]);
+                        modifiers = Integer.parseInt(tokens[parsePos++]);
+                        
+                        Map<String, String> queryMap = new HashMap<String, String>();
+                        queryMap.put("event", String.valueOf(event));
+                        queryMap.put("x", String.valueOf(x));
+                        queryMap.put("y", String.valueOf(y));
+                        queryMap.put("code", String.valueOf(code));
+                        queryMap.put("modifier", String.valueOf(modifiers));
+                        handleClientEvent(viewer, event, queryMap);
+                    } else {
+                        // keyboard event
+                        event = Integer.parseInt(tokens[parsePos++]);
+                        code = Integer.parseInt(tokens[parsePos++]);
+                        modifiers = Integer.parseInt(tokens[parsePos++]);
+                        
+                        Map<String, String> queryMap = new HashMap<String, String>();
+                        queryMap.put("event", String.valueOf(event));
+                        queryMap.put("code", String.valueOf(code));
+                        queryMap.put("modifier", String.valueOf(modifiers));
+                        handleClientEvent(viewer, event, queryMap);
+                    }
+                }
+            } catch(NumberFormatException e) {
+                s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
+            } catch(Exception e) {
+                s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
+            } catch(OutOfMemoryError e) {
+                s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+                System.exit(1);
+            }
+        }
+    }
+    
+    private void handleClientEvent(ConsoleProxyClient viewer, int event, Map<String, String> queryMap) {
+        int code = 0;
+        int x = 0, y = 0;
+        int modifiers = 0;
+        
+        String str;
+        switch(event) {
+        case 1:     // mouse move
+        case 2:     // mouse down
+        case 3:     // mouse up
+        case 8:     // mouse double click
+            str = queryMap.get("x");
+            if(str != null) {
+                try {
+                    x = Integer.parseInt(str);
+                } catch (NumberFormatException e) {
+                    s_logger.warn("Invalid number parameter in query string: " + str);
+                    throw new IllegalArgumentException(e);
+                }
+            }
+            str = queryMap.get("y");
+            if(str != null) {
+                try {
+                    y = Integer.parseInt(str);
+                } catch (NumberFormatException e) {
+                    s_logger.warn("Invalid number parameter in query string: " + str);
+                    throw new IllegalArgumentException(e);
+                }
+            }
+            
+            if(event != 1) {
+                str = queryMap.get("code");
+                try {
+                    code = Integer.parseInt(str);
+                } catch (NumberFormatException e) {
+                    s_logger.warn("Invalid number parameter in query string: " + str);
+                    throw new IllegalArgumentException(e);
+                }
+                
+                str = queryMap.get("modifier");
+                try {
+                    modifiers = Integer.parseInt(str);
+                } catch (NumberFormatException e) {
+                    s_logger.warn("Invalid number parameter in query string: " + str);
+                    throw new IllegalArgumentException(e);
+                }
+                
+                if(s_logger.isTraceEnabled())
+                    s_logger.trace("Handle client mouse event. event: " + event + ", x: " + x + ", y: " + y + ", button: " + code + ", modifier: " + modifiers);
+            } else {
+                if(s_logger.isTraceEnabled())
+                    s_logger.trace("Handle client mouse move event. x: " + x + ", y: " + y);
+            }
+            viewer.sendClientMouseEvent(InputEventType.fromEventCode(event), x, y, code, modifiers);
+            break;
+            
+        case 4:     // key press
+        case 5:     // key down
+        case 6:     // key up
+            str = queryMap.get("code");
+            try {
+                code = Integer.parseInt(str);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Invalid number parameter in query string: " + str);
+                throw new IllegalArgumentException(e);
+            }
+            
+            str = queryMap.get("modifier");
+            try {
+                modifiers = Integer.parseInt(str);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Invalid number parameter in query string: " + str);
+                throw new IllegalArgumentException(e);
+            }
+            
+            if(s_logger.isDebugEnabled())
+                s_logger.debug("Handle client keyboard event. event: " + event + ", code: " + code + ", modifier: " + modifiers);
+            viewer.sendClientRawKeyboardEvent(InputEventType.fromEventCode(event), code, modifiers);
+            break;
+            
+        default :
+            break;
+        }
+    }
+    
+    private void handleClientKickoff(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
+        String response = viewer.onAjaxClientKickoff();
+        t.sendResponseHeaders(200, response.length());
+        OutputStream os = t.getResponseBody();
+        try {
+            os.write(response.getBytes());
+        } finally {
+            os.close();
+        }
+    }
+    
+    private void handleClientStart(HttpExchange t, ConsoleProxyClient viewer, String title, String guest) throws IOException {
+        List<String> languages = t.getRequestHeaders().get("Accept-Language");
+        String response = viewer.onAjaxClientStart(title, languages, guest);
+        
+        Headers hds = t.getResponseHeaders();
+        hds.set("Content-Type", "text/html");
+        hds.set("Cache-Control", "no-cache");
+        hds.set("Cache-Control", "no-store");
+        t.sendResponseHeaders(200, response.length());
+        
+        OutputStream os = t.getResponseBody();
+        try {
+            os.write(response.getBytes());
+        } finally {
+            os.close();
+        }
+    }
+    
+    private void handleClientUpdate(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
+        String response = viewer.onAjaxClientUpdate();
+        
+        Headers hds = t.getResponseHeaders();
+        hds.set("Content-Type", "text/javascript");
+        t.sendResponseHeaders(200, response.length());
+        
+        OutputStream os = t.getResponseBody();
+        try {
+            os.write(response.getBytes());
+        } finally {
+            os.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
index 9c00948..5e10149 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
@@ -14,87 +14,87 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
 import java.awt.Graphics2D;
 import java.awt.Image;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Map;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+
 import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyAjaxImageHandler implements HttpHandler {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxImageHandler.class);
-
-	public void handle(HttpExchange t) throws IOException {
-		try {
-	        if(s_logger.isDebugEnabled())
-	        	s_logger.debug("AjaxImageHandler " + t.getRequestURI());
-	        
-	        long startTick = System.currentTimeMillis();
-	        
-	        doHandle(t);
-	        
-	        if(s_logger.isDebugEnabled())
-	        	s_logger.debug(t.getRequestURI() + "Process time " + (System.currentTimeMillis() - startTick) + " ms");
-		} catch (IOException e) {
-			throw e;
-		} catch (IllegalArgumentException e) {
-			s_logger.warn("Exception, ", e);
-			t.sendResponseHeaders(400, -1);		// bad request
-		} catch(OutOfMemoryError e) {
-			s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
-			System.exit(1);
-		} catch(Throwable e) {
-			s_logger.error("Unexpected exception, ", e);
-			t.sendResponseHeaders(500, -1);		// server error
-		} finally {
-			t.close();
-		}
-	}
-
-	private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
-		String queries = t.getRequestURI().getQuery();
-		Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
-		
-		String host = queryMap.get("host");
-		String portStr = queryMap.get("port");
-		String sid = queryMap.get("sid");
-		String tag = queryMap.get("tag");
-		String ticket = queryMap.get("ticket");
-		String keyStr = queryMap.get("key");
-		String console_url = queryMap.get("consoleurl");
-		String console_host_session = queryMap.get("sessionref");
-                String w = queryMap.get("w");	        
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyAjaxImageHandler implements HttpHandler {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxImageHandler.class);
+
+    public void handle(HttpExchange t) throws IOException {
+        try {
+            if(s_logger.isDebugEnabled())
+                s_logger.debug("AjaxImageHandler " + t.getRequestURI());
+            
+            long startTick = System.currentTimeMillis();
+            
+            doHandle(t);
+            
+            if(s_logger.isDebugEnabled())
+                s_logger.debug(t.getRequestURI() + "Process time " + (System.currentTimeMillis() - startTick) + " ms");
+        } catch (IOException e) {
+            throw e;
+        } catch (IllegalArgumentException e) {
+            s_logger.warn("Exception, ", e);
+            t.sendResponseHeaders(400, -1);     // bad request
+        } catch(OutOfMemoryError e) {
+            s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+            System.exit(1);
+        } catch(Throwable e) {
+            s_logger.error("Unexpected exception, ", e);
+            t.sendResponseHeaders(500, -1);     // server error
+        } finally {
+            t.close();
+        }
+    }
+
+    private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
+        String queries = t.getRequestURI().getQuery();
+        Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
+        
+        String host = queryMap.get("host");
+        String portStr = queryMap.get("port");
+        String sid = queryMap.get("sid");
+        String tag = queryMap.get("tag");
+        String ticket = queryMap.get("ticket");
+        String keyStr = queryMap.get("key");
+        String console_url = queryMap.get("consoleurl");
+        String console_host_session = queryMap.get("sessionref");
+                String w = queryMap.get("w");           
                 String h = queryMap.get("h");
-		
+        
                 int key = 0;
                 int width = 144;
                 int height = 110;
-		
-		if(tag == null)
-			tag = "";
-		
-		int port;
-		if(host == null || portStr == null || sid == null)
-			throw new IllegalArgumentException();
-		
-		try {
-			port = Integer.parseInt(portStr);
-		} catch (NumberFormatException e) {
-			s_logger.warn("Invalid numeric parameter in query string: " + portStr);
-			throw new IllegalArgumentException(e);
-		}
-		
-		try {
+        
+        if(tag == null)
+            tag = "";
+        
+        int port;
+        if(host == null || portStr == null || sid == null)
+            throw new IllegalArgumentException();
+        
+        try {
+            port = Integer.parseInt(portStr);
+        } catch (NumberFormatException e) {
+            s_logger.warn("Invalid numeric parameter in query string: " + portStr);
+            throw new IllegalArgumentException(e);
+        }
+        
+        try {
                     if (keyStr != null)
-            	        key = Integer.parseInt(keyStr);
+                        key = Integer.parseInt(keyStr);
                     if(null != w)
                        width = Integer.parseInt(w);
 
@@ -102,58 +102,58 @@ public class ConsoleProxyAjaxImageHandler implements HttpHandler {
                        height = Integer.parseInt(h);
 
              } catch (NumberFormatException e) {
-			s_logger.warn("Invalid numeric parameter in query string: " + keyStr);
-			throw new IllegalArgumentException(e);
-		}
+            s_logger.warn("Invalid numeric parameter in query string: " + keyStr);
+            throw new IllegalArgumentException(e);
+        }
 
-		ConsoleProxyClientParam param = new ConsoleProxyClientParam();
-		param.setClientHostAddress(host);
-		param.setClientHostPort(port);
-		param.setClientHostPassword(sid);
-		param.setClientTag(tag);
-		param.setTicket(ticket);
-		param.setClientTunnelUrl(console_url);
-		param.setClientTunnelSession(console_host_session);
+        ConsoleProxyClientParam param = new ConsoleProxyClientParam();
+        param.setClientHostAddress(host);
+        param.setClientHostPort(port);
+        param.setClientHostPassword(sid);
+        param.setClientTag(tag);
+        param.setTicket(ticket);
+        param.setClientTunnelUrl(console_url);
+        param.setClientTunnelSession(console_host_session);
 
-		ConsoleProxyClient viewer = ConsoleProxy.getVncViewer(param);
+        ConsoleProxyClient viewer = ConsoleProxy.getVncViewer(param);
 
-		if (key == 0) {
-			Image scaledImage = viewer.getClientScaledImage(width, height);
-			BufferedImage bufferedImage = new BufferedImage(width, height,
-					BufferedImage.TYPE_3BYTE_BGR);
-			Graphics2D bufImageGraphics = bufferedImage.createGraphics();
-			bufImageGraphics.drawImage(scaledImage, 0, 0, null);
-			ByteArrayOutputStream bos = new ByteArrayOutputStream(8196);
-			javax.imageio.ImageIO.write(bufferedImage, "jpg", bos);
-			byte[] bs = bos.toByteArray();
-			Headers hds = t.getResponseHeaders();
-			hds.set("Content-Type", "image/jpeg");
-			hds.set("Cache-Control", "no-cache");
-			hds.set("Cache-Control", "no-store");
-			t.sendResponseHeaders(200, bs.length);
-			OutputStream os = t.getResponseBody();
-			os.write(bs);
-			os.close();
-		} else {
-			AjaxFIFOImageCache imageCache = viewer.getAjaxImageCache();
-	                byte[] img = imageCache.getImage(key);
-	
-			if(img != null) {
-				Headers hds = t.getResponseHeaders();
-				hds.set("Content-Type", "image/jpeg");
-				t.sendResponseHeaders(200, img.length);
-				
-				OutputStream os = t.getResponseBody();
-				try {
-					os.write(img, 0, img.length);
-				} finally {
-					os.close();
-				}
-			} else {
-				if(s_logger.isInfoEnabled())
-					s_logger.info("Image has already been swept out, key: " + key);
-				t.sendResponseHeaders(404, -1);
-			}
-		}
-	}
-}
+        if (key == 0) {
+            Image scaledImage = viewer.getClientScaledImage(width, height);
+            BufferedImage bufferedImage = new BufferedImage(width, height,
+                    BufferedImage.TYPE_3BYTE_BGR);
+            Graphics2D bufImageGraphics = bufferedImage.createGraphics();
+            bufImageGraphics.drawImage(scaledImage, 0, 0, null);
+            ByteArrayOutputStream bos = new ByteArrayOutputStream(8196);
+            javax.imageio.ImageIO.write(bufferedImage, "jpg", bos);
+            byte[] bs = bos.toByteArray();
+            Headers hds = t.getResponseHeaders();
+            hds.set("Content-Type", "image/jpeg");
+            hds.set("Cache-Control", "no-cache");
+            hds.set("Cache-Control", "no-store");
+            t.sendResponseHeaders(200, bs.length);
+            OutputStream os = t.getResponseBody();
+            os.write(bs);
+            os.close();
+        } else {
+            AjaxFIFOImageCache imageCache = viewer.getAjaxImageCache();
+                    byte[] img = imageCache.getImage(key);
+    
+            if(img != null) {
+                Headers hds = t.getResponseHeaders();
+                hds.set("Content-Type", "image/jpeg");
+                t.sendResponseHeaders(200, img.length);
+                
+                OutputStream os = t.getResponseBody();
+                try {
+                    os.write(img, 0, img.length);
+                } finally {
+                    os.close();
+                }
+            } else {
+                if(s_logger.isInfoEnabled())
+                    s_logger.info("Image has already been swept out, key: " + key);
+                t.sendResponseHeaders(404, -1);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
index d9563b9..26ee9b3 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
@@ -14,68 +14,68 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
-// duplicated class
-public class ConsoleProxyAuthenticationResult {
-	private boolean success;
-	private boolean isReauthentication;
-	private String host;
-	private int port;
-	private String tunnelUrl;
-	private String tunnelSession;
-	
-	public ConsoleProxyAuthenticationResult() {
-		success = false;
-		isReauthentication = false;
-		port = 0;
-	}
-
-	public boolean isSuccess() {
-		return success;
-	}
-
-	public void setSuccess(boolean success) {
-		this.success = success;
-	}
-
-	public boolean isReauthentication() {
-		return isReauthentication;
-	}
-
-	public void setReauthentication(boolean isReauthentication) {
-		this.isReauthentication = isReauthentication;
-	}
-
-	public String getHost() {
-		return host;
-	}
-
-	public void setHost(String host) {
-		this.host = host;
-	}
-
-	public int getPort() {
-		return port;
-	}
-
-	public void setPort(int port) {
-		this.port = port;
-	}
-
-	public String getTunnelUrl() {
-		return tunnelUrl;
-	}
-
-	public void setTunnelUrl(String tunnelUrl) {
-		this.tunnelUrl = tunnelUrl;
-	}
-
-	public String getTunnelSession() {
-		return tunnelSession;
-	}
-
-	public void setTunnelSession(String tunnelSession) {
-		this.tunnelSession = tunnelSession;
-	}
-}
+package com.cloud.consoleproxy;
+
+// duplicated class
+public class ConsoleProxyAuthenticationResult {
+    private boolean success;
+    private boolean isReauthentication;
+    private String host;
+    private int port;
+    private String tunnelUrl;
+    private String tunnelSession;
+    
+    public ConsoleProxyAuthenticationResult() {
+        success = false;
+        isReauthentication = false;
+        port = 0;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public boolean isReauthentication() {
+        return isReauthentication;
+    }
+
+    public void setReauthentication(boolean isReauthentication) {
+        this.isReauthentication = isReauthentication;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public String getTunnelUrl() {
+        return tunnelUrl;
+    }
+
+    public void setTunnelUrl(String tunnelUrl) {
+        this.tunnelUrl = tunnelUrl;
+    }
+
+    public String getTunnelSession() {
+        return tunnelSession;
+    }
+
+    public void setTunnelSession(String tunnelSession) {
+        this.tunnelSession = tunnelSession;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
index 2706184..c9ad8ab 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
@@ -14,8 +14,8 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
@@ -23,26 +23,26 @@ import javax.net.ssl.SSLServerSocket;
 
 import com.cloud.consoleproxy.util.Logger;
 import com.sun.net.httpserver.HttpServer;
-
-public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyBaseServerFactoryImpl.class);
-	
-	@Override
-	public void init(byte[] ksBits, String ksPassword) {
-	}
-	
-	@Override
-	public HttpServer createHttpServerInstance(int port) throws IOException {
-		if(s_logger.isInfoEnabled())
-			s_logger.info("create HTTP server instance at port: " + port);
-		return HttpServer.create(new InetSocketAddress(port), 5);
-	}
-	
-	@Override
-	public SSLServerSocket createSSLServerSocket(int port) throws IOException {
-		if(s_logger.isInfoEnabled())
-			s_logger.info("SSL server socket is not supported in ConsoleProxyBaseServerFactoryImpl");
-		
-		return null;
-	}
-}
+
+public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyBaseServerFactoryImpl.class);
+    
+    @Override
+    public void init(byte[] ksBits, String ksPassword) {
+    }
+    
+    @Override
+    public HttpServer createHttpServerInstance(int port) throws IOException {
+        if(s_logger.isInfoEnabled())
+            s_logger.info("create HTTP server instance at port: " + port);
+        return HttpServer.create(new InetSocketAddress(port), 5);
+    }
+    
+    @Override
+    public SSLServerSocket createSSLServerSocket(int port) throws IOException {
+        if(s_logger.isInfoEnabled())
+            s_logger.info("SSL server socket is not supported in ConsoleProxyBaseServerFactoryImpl");
+        
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
index 89097d8..43a0bab 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
@@ -14,12 +14,12 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
-public interface ConsoleProxyClientListener {
-	void onFramebufferSizeChange(int w, int h);
-	void onFramebufferUpdate(int x, int y, int w, int h);
-
-	void onClientConnected();
-	void onClientClose();
-}
+package com.cloud.consoleproxy;
+
+public interface ConsoleProxyClientListener {
+    void onFramebufferSizeChange(int w, int h);
+    void onFramebufferUpdate(int x, int y, int w, int h);
+
+    void onClientConnected();
+    void onClientClose();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
index 5471dea..408eb04 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
@@ -14,57 +14,57 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-
+package com.cloud.consoleproxy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
 import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyCmdHandler implements HttpHandler {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyCmdHandler.class);
-	
-	public void handle(HttpExchange t) throws IOException {
-		try {
-	        Thread.currentThread().setName("Cmd Thread " + 
-	        		Thread.currentThread().getId() + " " + t.getRemoteAddress());
-			s_logger.info("CmdHandler " + t.getRequestURI());
-			doHandle(t);
-		} catch (Exception e) {
-			s_logger.error(e.toString(), e);
-			String response = "Not found";
-			t.sendResponseHeaders(404, response.length());
-			OutputStream os = t.getResponseBody();
-			os.write(response.getBytes());
-			os.close();
-		} catch(OutOfMemoryError e) {
-			s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
-			System.exit(1);
-		} catch (Throwable e) {
-			s_logger.error(e.toString(), e);
-		} finally {
-			t.close();
-		}
-	}
-	
-	public void doHandle(HttpExchange t) throws Exception {
-		String path = t.getRequestURI().getPath();
-		int i = path.indexOf("/", 1);
-		String cmd = path.substring(i + 1);
-		s_logger.info("Get CMD request for " + cmd);
-		if (cmd.equals("getstatus")) {
-			ConsoleProxyClientStatsCollector statsCollector = ConsoleProxy.getStatsCollector();
-			
-			Headers hds = t.getResponseHeaders();
-			hds.set("Content-Type", "text/plain");
-			t.sendResponseHeaders(200, 0);
-			OutputStreamWriter os = new OutputStreamWriter(t.getResponseBody());
-			statsCollector.getStatsReport(os);
-			os.close();
-		}
-	}
-}
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyCmdHandler implements HttpHandler {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyCmdHandler.class);
+    
+    public void handle(HttpExchange t) throws IOException {
+        try {
+            Thread.currentThread().setName("Cmd Thread " + 
+                    Thread.currentThread().getId() + " " + t.getRemoteAddress());
+            s_logger.info("CmdHandler " + t.getRequestURI());
+            doHandle(t);
+        } catch (Exception e) {
+            s_logger.error(e.toString(), e);
+            String response = "Not found";
+            t.sendResponseHeaders(404, response.length());
+            OutputStream os = t.getResponseBody();
+            os.write(response.getBytes());
+            os.close();
+        } catch(OutOfMemoryError e) {
+            s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+            System.exit(1);
+        } catch (Throwable e) {
+            s_logger.error(e.toString(), e);
+        } finally {
+            t.close();
+        }
+    }
+    
+    public void doHandle(HttpExchange t) throws Exception {
+        String path = t.getRequestURI().getPath();
+        int i = path.indexOf("/", 1);
+        String cmd = path.substring(i + 1);
+        s_logger.info("Get CMD request for " + cmd);
+        if (cmd.equals("getstatus")) {
+            ConsoleProxyClientStatsCollector statsCollector = ConsoleProxy.getStatsCollector();
+            
+            Headers hds = t.getResponseHeaders();
+            hds.set("Content-Type", "text/plain");
+            t.sendResponseHeaders(200, 0);
+            OutputStreamWriter os = new OutputStreamWriter(t.getResponseBody());
+            statsCollector.getStatsReport(os);
+            os.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
index cf2027b..7756d01 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
@@ -14,61 +14,61 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.cloud.consoleproxy.util.Logger;
-
-public class ConsoleProxyHttpHandlerHelper {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyHttpHandlerHelper.class);
-	
-	public static Map<String, String> getQueryMap(String query) {
-		String[] params = query.split("&");
-		Map<String, String> map = new HashMap<String, String>();
-		for (String param : params) {
-			String[] paramTokens = param.split("=");
-			if(paramTokens != null && paramTokens.length == 2) {
-				String name = param.split("=")[0];
-				String value = param.split("=")[1];
-				map.put(name, value);
-			} else if (paramTokens.length == 3) {
-				// very ugly, added for Xen tunneling url
-				String name = paramTokens[0];
-				String value = paramTokens[1] + "=" + paramTokens[2];
-				map.put(name, value);
-			} else {
-				if(s_logger.isDebugEnabled())
-					s_logger.debug("Invalid paramemter in URL found. param: " + param);
-			}
-		}
-		
-		// This is a ugly solution for now. We will do encryption/decryption translation
-		// here to make it transparent to rest of the code.
-		if(map.get("token") != null) {
-			ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(
-				ConsoleProxy.getEncryptorPassword());
-			
-			ConsoleProxyClientParam param = encryptor.decryptObject(ConsoleProxyClientParam.class, map.get("token"));
-			if(param != null) {
-				if(param.getClientHostAddress() != null)
-					map.put("host", param.getClientHostAddress());
-				if(param.getClientHostPort() != 0)
-					map.put("port", String.valueOf(param.getClientHostPort()));
-				if(param.getClientTag() != null)
-					map.put("tag", param.getClientTag());
-				if(param.getClientHostPassword() != null)
-					map.put("sid", param.getClientHostPassword());
-				if(param.getClientTunnelUrl() != null)
-					map.put("consoleurl", param.getClientTunnelUrl());
-				if(param.getClientTunnelSession() != null)
-					map.put("sessionref", param.getClientTunnelSession());
-				if(param.getTicket() != null)
-					map.put("ticket", param.getTicket());
-			}
-		}
-		
-		return map;
-	}
-}
+package com.cloud.consoleproxy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.cloud.consoleproxy.util.Logger;
+
+public class ConsoleProxyHttpHandlerHelper {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyHttpHandlerHelper.class);
+    
+    public static Map<String, String> getQueryMap(String query) {
+        String[] params = query.split("&");
+        Map<String, String> map = new HashMap<String, String>();
+        for (String param : params) {
+            String[] paramTokens = param.split("=");
+            if(paramTokens != null && paramTokens.length == 2) {
+                String name = param.split("=")[0];
+                String value = param.split("=")[1];
+                map.put(name, value);
+            } else if (paramTokens.length == 3) {
+                // very ugly, added for Xen tunneling url
+                String name = paramTokens[0];
+                String value = paramTokens[1] + "=" + paramTokens[2];
+                map.put(name, value);
+            } else {
+                if(s_logger.isDebugEnabled())
+                    s_logger.debug("Invalid paramemter in URL found. param: " + param);
+            }
+        }
+        
+        // This is a ugly solution for now. We will do encryption/decryption translation
+        // here to make it transparent to rest of the code.
+        if(map.get("token") != null) {
+            ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(
+                ConsoleProxy.getEncryptorPassword());
+            
+            ConsoleProxyClientParam param = encryptor.decryptObject(ConsoleProxyClientParam.class, map.get("token"));
+            if(param != null) {
+                if(param.getClientHostAddress() != null)
+                    map.put("host", param.getClientHostAddress());
+                if(param.getClientHostPort() != 0)
+                    map.put("port", String.valueOf(param.getClientHostPort()));
+                if(param.getClientTag() != null)
+                    map.put("tag", param.getClientTag());
+                if(param.getClientHostPassword() != null)
+                    map.put("sid", param.getClientHostPassword());
+                if(param.getClientTunnelUrl() != null)
+                    map.put("consoleurl", param.getClientTunnelUrl());
+                if(param.getClientTunnelSession() != null)
+                    map.put("sessionref", param.getClientTunnelSession());
+                if(param.getTicket() != null)
+                    map.put("ticket", param.getTicket());
+            }
+        }
+        
+        return map;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
index 701ad7a..ff66de3 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
@@ -14,76 +14,76 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
+package com.cloud.consoleproxy;
 
 import com.cloud.consoleproxy.util.Logger;
 import com.cloud.consoleproxy.util.LoggerFactory;
-
-public class ConsoleProxyLoggerFactory implements LoggerFactory {
-	public ConsoleProxyLoggerFactory() {
-	}
-	
-	public Logger getLogger(Class<?> clazz) {
-		return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz));
-	}
-	
-	public static class Log4jLogger extends Logger {
-		private org.apache.log4j.Logger logger;
-		
-		public Log4jLogger(org.apache.log4j.Logger logger) {
-			this.logger = logger;
-		}
-		
-		public boolean isTraceEnabled() {
-			return logger.isTraceEnabled();
-		}
-		
-		public boolean isDebugEnabled() {
-			return logger.isDebugEnabled();
-		}
-		
-		public boolean isInfoEnabled() {
-			return logger.isInfoEnabled();
-		}
-
-		public void trace(Object message) {
-			logger.trace(message);
-		}
-		
-		public void trace(Object message, Throwable exception) {
-			logger.trace(message, exception);
-		}
-		
-		public void info(Object message) {
-			logger.info(message);
-		}
-		
-		public void info(Object message, Throwable exception) {
-			logger.info(message, exception);
-		}
-		
-		public void debug(Object message) {
-			logger.debug(message);
-		}
-		
-		public void debug(Object message, Throwable exception) {
-			logger.debug(message, exception);
-		}
-		
-		public void warn(Object message) {
-			logger.warn(message);
-		}
-		
-		public void warn(Object message, Throwable exception) {
-			logger.warn(message, exception);
-		}
-		
-		public void error(Object message) {
-			logger.error(message);
-		}
-		
-		public void error(Object message, Throwable exception) {
-			logger.error(message, exception);
-		}
-	}
-}
+
+public class ConsoleProxyLoggerFactory implements LoggerFactory {
+    public ConsoleProxyLoggerFactory() {
+    }
+    
+    public Logger getLogger(Class<?> clazz) {
+        return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz));
+    }
+    
+    public static class Log4jLogger extends Logger {
+        private org.apache.log4j.Logger logger;
+        
+        public Log4jLogger(org.apache.log4j.Logger logger) {
+            this.logger = logger;
+        }
+        
+        public boolean isTraceEnabled() {
+            return logger.isTraceEnabled();
+        }
+        
+        public boolean isDebugEnabled() {
+            return logger.isDebugEnabled();
+        }
+        
+        public boolean isInfoEnabled() {
+            return logger.isInfoEnabled();
+        }
+
+        public void trace(Object message) {
+            logger.trace(message);
+        }
+        
+        public void trace(Object message, Throwable exception) {
+            logger.trace(message, exception);
+        }
+        
+        public void info(Object message) {
+            logger.info(message);
+        }
+        
+        public void info(Object message, Throwable exception) {
+            logger.info(message, exception);
+        }
+        
+        public void debug(Object message) {
+            logger.debug(message);
+        }
+        
+        public void debug(Object message, Throwable exception) {
+            logger.debug(message, exception);
+        }
+        
+        public void warn(Object message) {
+            logger.warn(message);
+        }
+        
+        public void warn(Object message, Throwable exception) {
+            logger.warn(message, exception);
+        }
+        
+        public void error(Object message) {
+            logger.error(message);
+        }
+        
+        public void error(Object message, Throwable exception) {
+            logger.error(message, exception);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
index be5df6e..030b2f4 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
@@ -34,120 +34,120 @@ import com.cloud.consoleproxy.util.Logger;
 // itself and the shell script will re-launch console proxy
 //
 public class ConsoleProxyMonitor {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyMonitor.class);
-	
-	private String[] _argv;
-	private Map<String, String> _argMap = new HashMap<String, String>();
-	
-	private volatile Process _process;
-	private boolean _quit = false;
-	
-	public ConsoleProxyMonitor(String[] argv) {
-		_argv = argv;
-		
-		for(String arg : _argv) {
-			String[] tokens = arg.split("=");
-			if(tokens.length == 2) {
-				s_logger.info("Add argument " + tokens[0] + "=" + tokens[1] + " to the argument map");
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyMonitor.class);
+    
+    private String[] _argv;
+    private Map<String, String> _argMap = new HashMap<String, String>();
+    
+    private volatile Process _process;
+    private boolean _quit = false;
+    
+    public ConsoleProxyMonitor(String[] argv) {
+        _argv = argv;
+        
+        for(String arg : _argv) {
+            String[] tokens = arg.split("=");
+            if(tokens.length == 2) {
+                s_logger.info("Add argument " + tokens[0] + "=" + tokens[1] + " to the argument map");
 
-				_argMap.put(tokens[0].trim(), tokens[1].trim());
-			} else {
-				s_logger.warn("unrecognized argument, skip adding it to argument map");
-			}
-		}
-	}
-	
-	private void run() {
-		Runtime.getRuntime().addShutdownHook(new Thread() {
-			@Override
-			public void run() {
-				_quit = true;
-				onShutdown();
-			}
-		});
-		
-		while(!_quit) {
-			String cmdLine = getLaunchCommandLine();
-			
-			s_logger.info("Launch console proxy process with command line: " + cmdLine);
-			
-			try {
-				_process = Runtime.getRuntime().exec(cmdLine);
-			} catch (IOException e) {
-				s_logger.error("Unexpected exception ", e);
-				System.exit(1);
-			}
-			
-			boolean waitSucceeded = false;
-			int exitCode = 0;
-			while(!waitSucceeded) {
-				try {
-					exitCode = _process.waitFor();
-					waitSucceeded = true;
-					
-					if(s_logger.isInfoEnabled())
-						s_logger.info("Console proxy process exits with code: " + exitCode);
-				} catch (InterruptedException e) {
-					if(s_logger.isInfoEnabled())
-						s_logger.info("InterruptedException while waiting for termination of console proxy, will retry");
-				}
-			}
-		}
-	}
-	
-	private String getLaunchCommandLine() {
-		StringBuffer sb = new StringBuffer("java ");
-		String jvmOptions = _argMap.get("jvmoptions");
-		
-		if(jvmOptions != null)
-			sb.append(jvmOptions);
-		
-		for(Map.Entry<String, String> entry : _argMap.entrySet()) {
-			if(!"jvmoptions".equalsIgnoreCase(entry.getKey()))
-				sb.append(" ").append(entry.getKey()).append("=").append(entry.getValue());
-		}
-		
-		return sb.toString();
-	}
-	
-	private void onShutdown() {
-		if(_process != null) {
-			if(s_logger.isInfoEnabled())
-				s_logger.info("Console proxy monitor shuts dwon, terminate console proxy process");
-			_process.destroy();
-		}
-	}
+                _argMap.put(tokens[0].trim(), tokens[1].trim());
+            } else {
+                s_logger.warn("unrecognized argument, skip adding it to argument map");
+            }
+        }
+    }
+    
+    private void run() {
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+                _quit = true;
+                onShutdown();
+            }
+        });
+        
+        while(!_quit) {
+            String cmdLine = getLaunchCommandLine();
+            
+            s_logger.info("Launch console proxy process with command line: " + cmdLine);
+            
+            try {
+                _process = Runtime.getRuntime().exec(cmdLine);
+            } catch (IOException e) {
+                s_logger.error("Unexpected exception ", e);
+                System.exit(1);
+            }
+            
+            boolean waitSucceeded = false;
+            int exitCode = 0;
+            while(!waitSucceeded) {
+                try {
+                    exitCode = _process.waitFor();
+                    waitSucceeded = true;
+                    
+                    if(s_logger.isInfoEnabled())
+                        s_logger.info("Console proxy process exits with code: " + exitCode);
+                } catch (InterruptedException e) {
+                    if(s_logger.isInfoEnabled())
+                        s_logger.info("InterruptedException while waiting for termination of console proxy, will retry");
+                }
+            }
+        }
+    }
+    
+    private String getLaunchCommandLine() {
+        StringBuffer sb = new StringBuffer("java ");
+        String jvmOptions = _argMap.get("jvmoptions");
+        
+        if(jvmOptions != null)
+            sb.append(jvmOptions);
+        
+        for(Map.Entry<String, String> entry : _argMap.entrySet()) {
+            if(!"jvmoptions".equalsIgnoreCase(entry.getKey()))
+                sb.append(" ").append(entry.getKey()).append("=").append(entry.getValue());
+        }
+        
+        return sb.toString();
+    }
+    
+    private void onShutdown() {
+        if(_process != null) {
+            if(s_logger.isInfoEnabled())
+                s_logger.info("Console proxy monitor shuts dwon, terminate console proxy process");
+            _process.destroy();
+        }
+    }
 
-	private static void configLog4j() {
-		URL configUrl = System.class.getResource("/conf/log4j-cloud.xml");
-		if(configUrl == null)
-			configUrl = ClassLoader.getSystemResource("log4j-cloud.xml");
-		
-		if(configUrl == null)
-			configUrl = ClassLoader.getSystemResource("conf/log4j-cloud.xml");
-			
-		if(configUrl != null) {
-			try {
-				System.out.println("Configure log4j using " + configUrl.toURI().toString());
-			} catch (URISyntaxException e1) {
-				e1.printStackTrace();
-			}
+    private static void configLog4j() {
+        URL configUrl = System.class.getResource("/conf/log4j-cloud.xml");
+        if(configUrl == null)
+            configUrl = ClassLoader.getSystemResource("log4j-cloud.xml");
+        
+        if(configUrl == null)
+            configUrl = ClassLoader.getSystemResource("conf/log4j-cloud.xml");
+            
+        if(configUrl != null) {
+            try {
+                System.out.println("Configure log4j using " + configUrl.toURI().toString());
+            } catch (URISyntaxException e1) {
+                e1.printStackTrace();
+            }
 
-			try {
-				File file = new File(configUrl.toURI());
-				
-				System.out.println("Log4j configuration from : " + file.getAbsolutePath());
-				DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
-			} catch (URISyntaxException e) {
-				System.out.println("Unable to convert log4j configuration Url to URI");
-			}
-		} else {
-			System.out.println("Configure log4j with default properties");
-		}
-	}
-	
-	public static void main(String[] argv) {
-		configLog4j();
-		(new ConsoleProxyMonitor(argv)).run();
-	}
+            try {
+                File file = new File(configUrl.toURI());
+                
+                System.out.println("Log4j configuration from : " + file.getAbsolutePath());
+                DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
+            } catch (URISyntaxException e) {
+                System.out.println("Unable to convert log4j configuration Url to URI");
+            }
+        } else {
+            System.out.println("Configure log4j with default properties");
+        }
+    }
+    
+    public static void main(String[] argv) {
+        configLog4j();
+        (new ConsoleProxyMonitor(argv)).run();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
index f9dc21e..7d16047 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
@@ -14,168 +14,168 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.consoleproxy;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
+package com.cloud.consoleproxy;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
 import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyResourceHandler implements HttpHandler {
-	private static final Logger s_logger = Logger.getLogger(ConsoleProxyResourceHandler.class);
-
-	static Map<String, String> s_mimeTypes;
-	static {
-		s_mimeTypes = new HashMap<String, String>();
-		s_mimeTypes.put("jar", "application/java-archive");
-		s_mimeTypes.put("js", "text/javascript");
-		s_mimeTypes.put("css", "text/css");
-		s_mimeTypes.put("jpg", "image/jpeg");
-		s_mimeTypes.put("html", "text/html");
-		s_mimeTypes.put("htm", "text/html");
-		s_mimeTypes.put("log", "text/plain");
-	}
-	
-	static Map<String, String> s_validResourceFolders;
-	static {
-		s_validResourceFolders = new HashMap<String, String>();
-		s_validResourceFolders.put("applet", "");
-		s_validResourceFolders.put("logs", "");
-		s_validResourceFolders.put("images", "");
-		s_validResourceFolders.put("js", "");
-		s_validResourceFolders.put("css", "");
-		s_validResourceFolders.put("html", "");
-	}
-	
-	public ConsoleProxyResourceHandler() {
-	}
-	
-	public void handle(HttpExchange t) throws IOException {
-		try {
-	        if(s_logger.isDebugEnabled())
-	        	s_logger.debug("Resource Handler " + t.getRequestURI());
-	        
-	        long startTick = System.currentTimeMillis();
-	        
-	        doHandle(t);
-	        
-	        if(s_logger.isDebugEnabled())
-	        	s_logger.debug(t.getRequestURI() + " Process time " + (System.currentTimeMillis() - startTick) + " ms");
-		} catch (IOException e) {
-			throw e;
-		} catch(Throwable e) {
-			s_logger.error("Unexpected exception, ", e);
-			t.sendResponseHeaders(500, -1);		// server error
-		} finally {
-			t.close();
-		}
-	}
-	
-	@SuppressWarnings("deprecation")
-	private void doHandle(HttpExchange t) throws Exception {
-		String path = t.getRequestURI().getPath();
-
-		if(s_logger.isInfoEnabled())
-			s_logger.info("Get resource request for " + path);
-		
-		int i = path.indexOf("/", 1);
-		String filepath = path.substring(i + 1);
-		i = path.lastIndexOf(".");
-		String extension = (i == -1) ? "" : path.substring(i + 1);
-		String contentType = getContentType(extension);
-
-		if(!validatePath(filepath)) {
-			if(s_logger.isInfoEnabled())
-				s_logger.info("Resource access is forbidden, uri: " + path);
-			
-			t.sendResponseHeaders(403, -1);		// forbidden
-			return;
-		}
-		
-		File f = new File ("./" + filepath);
-		if(f.exists()) {
-			long lastModified = f.lastModified();
-			String ifModifiedSince = t.getRequestHeaders().getFirst("If-Modified-Since");
-			if (ifModifiedSince != null) {
-				long d = Date.parse(ifModifiedSince);
-				if (d + 1000 >= lastModified) {
-					Headers hds = t.getResponseHeaders();
-					hds.set("Content-Type", contentType);
-					t.sendResponseHeaders(304, -1);
-					
-					if(s_logger.isInfoEnabled())
-						s_logger.info("Sent 304 file has not been " +
-								"modified since " + ifModifiedSince);
-					return;
-				}
-			}
-			
-			long length = f.length();
-			Headers hds = t.getResponseHeaders();
-			hds.set("Content-Type", contentType);
-			hds.set("Last-Modified", new Date(lastModified).toGMTString());
-			t.sendResponseHeaders(200, length);
-			responseFileContent(t, f);
-			
-			if(s_logger.isInfoEnabled())
-				s_logger.info("Sent file " + path + " with content type " + contentType);
-		} else {
-			if(s_logger.isInfoEnabled())
-				s_logger.info("file does not exist" + path);
-			t.sendResponseHeaders(404, -1);
-		}
-	}
-	
-	private static String getContentType(String extension) {
-		String key = extension.toLowerCase();
-		if(s_mimeTypes.containsKey(key)) {
-			return s_mimeTypes.get(key);
-		}
-		return "application/octet-stream"; 
-	}
-	
-	private static void responseFileContent(HttpExchange t, File f) throws Exception {
-		OutputStream os = t.getResponseBody();
-		FileInputStream fis = new FileInputStream(f);
-		while (true) {
-			byte[] b = new byte[8192];
-			int n = fis.read(b);
-			if (n < 0) {
-				break;
-			}
-			os.write(b, 0, n);
-		}
-		fis.close();
-		os.close();
-	}
-	
-	private static boolean validatePath(String path) {
-		int i = path.indexOf("/");
-		if(i == -1) {
-			if(s_logger.isInfoEnabled())
-				s_logger.info("Invalid resource path: can not start at resource root");
-			return false;
-		}
-		
-		if(path.contains("..")) {
-			if(s_logger.isInfoEnabled())
-				s_logger.info("Invalid resource path: contains relative up-level navigation");
-			
-			return false;
-		}
-		
-		return isValidResourceFolder(path.substring(0, i));
-	}
-	
-	private static boolean isValidResourceFolder(String name) {
-		return s_validResourceFolders.containsKey(name); 
-	}
-}
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyResourceHandler implements HttpHandler {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyResourceHandler.class);
+
+    static Map<String, String> s_mimeTypes;
+    static {
+        s_mimeTypes = new HashMap<String, String>();
+        s_mimeTypes.put("jar", "application/java-archive");
+        s_mimeTypes.put("js", "text/javascript");
+        s_mimeTypes.put("css", "text/css");
+        s_mimeTypes.put("jpg", "image/jpeg");
+        s_mimeTypes.put("html", "text/html");
+        s_mimeTypes.put("htm", "text/html");
+        s_mimeTypes.put("log", "text/plain");
+    }
+    
+    static Map<String, String> s_validResourceFolders;
+    static {
+        s_validResourceFolders = new HashMap<String, String>();
+        s_validResourceFolders.put("applet", "");
+        s_validResourceFolders.put("logs", "");
+        s_validResourceFolders.put("images", "");
+        s_validResourceFolders.put("js", "");
+        s_validResourceFolders.put("css", "");
+        s_validResourceFolders.put("html", "");
+    }
+    
+    public ConsoleProxyResourceHandler() {
+    }
+    
+    public void handle(HttpExchange t) throws IOException {
+        try {
+            if(s_logger.isDebugEnabled())
+                s_logger.debug("Resource Handler " + t.getRequestURI());
+            
+            long startTick = System.currentTimeMillis();
+            
+            doHandle(t);
+            
+            if(s_logger.isDebugEnabled())
+                s_logger.debug(t.getRequestURI() + " Process time " + (System.currentTimeMillis() - startTick) + " ms");
+        } catch (IOException e) {
+            throw e;
+        } catch(Throwable e) {
+            s_logger.error("Unexpected exception, ", e);
+            t.sendResponseHeaders(500, -1);     // server error
+        } finally {
+            t.close();
+        }
+    }
+    
+    @SuppressWarnings("deprecation")
+    private void doHandle(HttpExchange t) throws Exception {
+        String path = t.getRequestURI().getPath();
+
+        if(s_logger.isInfoEnabled())
+            s_logger.info("Get resource request for " + path);
+        
+        int i = path.indexOf("/", 1);
+        String filepath = path.substring(i + 1);
+        i = path.lastIndexOf(".");
+        String extension = (i == -1) ? "" : path.substring(i + 1);
+        String contentType = getContentType(extension);
+
+        if(!validatePath(filepath)) {
+            if(s_logger.isInfoEnabled())
+                s_logger.info("Resource access is forbidden, uri: " + path);
+            
+            t.sendResponseHeaders(403, -1);     // forbidden
+            return;
+        }
+        
+        File f = new File ("./" + filepath);
+        if(f.exists()) {
+            long lastModified = f.lastModified();
+            String ifModifiedSince = t.getRequestHeaders().getFirst("If-Modified-Since");
+            if (ifModifiedSince != null) {
+                long d = Date.parse(ifModifiedSince);
+                if (d + 1000 >= lastModified) {
+                    Headers hds = t.getResponseHeaders();
+                    hds.set("Content-Type", contentType);
+                    t.sendResponseHeaders(304, -1);
+                    
+                    if(s_logger.isInfoEnabled())
+                        s_logger.info("Sent 304 file has not been " +
+                                "modified since " + ifModifiedSince);
+                    return;
+                }
+            }
+            
+            long length = f.length();
+            Headers hds = t.getResponseHeaders();
+            hds.set("Content-Type", contentType);
+            hds.set("Last-Modified", new Date(lastModified).toGMTString());
+            t.sendResponseHeaders(200, length);
+            responseFileContent(t, f);
+            
+            if(s_logger.isInfoEnabled())
+                s_logger.info("Sent file " + path + " with content type " + contentType);
+        } else {
+            if(s_logger.isInfoEnabled())
+                s_logger.info("file does not exist" + path);
+            t.sendResponseHeaders(404, -1);
+        }
+    }
+    
+    private static String getContentType(String extension) {
+        String key = extension.toLowerCase();
+        if(s_mimeTypes.containsKey(key)) {
+            return s_mimeTypes.get(key);
+        }
+        return "application/octet-stream"; 
+    }
+    
+    private static void responseFileContent(HttpExchange t, File f) throws Exception {
+        OutputStream os = t.getResponseBody();
+        FileInputStream fis = new FileInputStream(f);
+        while (true) {
+            byte[] b = new byte[8192];
+            int n = fis.read(b);
+            if (n < 0) {
+                break;
+            }
+            os.write(b, 0, n);
+        }
+        fis.close();
+        os.close();
+    }
+    
+    private static boolean validatePath(String path) {
+        int i = path.indexOf("/");
+        if(i == -1) {
+            if(s_logger.isInfoEnabled())
+                s_logger.info("Invalid resource path: can not start at resource root");
+            return false;
+        }
+        
+        if(path.contains("..")) {
+            if(s_logger.isInfoEnabled())
+                s_logger.info("Invalid resource path: contains relative up-level navigation");
+            
+            return false;
+        }
+        
+        return isValidResourceFolder(path.substring(0, i));
+    }
+    
+    private static boolean isValidResourceFolder(String name) {
+        return s_validResourceFolders.containsKey(name); 
+    }
+}