/******************************************************************************* * Copyright (c) 2011-2014 Fernando Petrola * * This file is part of Dragome SDK. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html ******************************************************************************/ package com.dragome.web.debugging.messages; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.html.MessageEvent; import org.w3c.dom.websocket.WebSocket; import com.dragome.commons.javascript.ScriptHelper; import com.dragome.web.annotations.ClientSideMethod; import com.dragome.web.dispatcher.EventDispatcherHelper; import com.dragome.web.enhancers.jsdelegate.JsCast; import com.dragome.web.html.dom.w3c.MessageEventExtension; public class ClientToServerMessageChannel implements MessageChannel { public static final String WEBSOCKET_PATH= "null"; private static Receiver receiver; private int counter= 0; private Sender sender; private WebSocket websocket; public ClientToServerMessageChannel() { websocket= createWebsocket(); } public void send(String aMessage) { websocket.send(aMessage + "|" + counter); counter++; } public void setReceiver(Receiver receiver) { ClientToServerMessageChannel.receiver= receiver; } public Receiver getReceiver() { return receiver; } public void setSender(Sender sender) { this.sender= sender; } public WebSocket createWebsocket() { ScriptHelper.put("s", "/dragome-debug", this); String url= (String) ScriptHelper.eval("((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + (location.pathname).substr(0, (location.pathname).lastIndexOf('/')) + s", this); ScriptHelper.put("url", url, this); WebSocket webSocket= ScriptHelper.evalCasting("new WebSocket(url)", WebSocket.class, this); webSocket.setOnopen(new EventListener() { @ClientSideMethod public void handleEvent(Event evt) { EventDispatcherHelper.runApplication(); System.out.println("open"); } }); webSocket.setOnmessage(new EventListener() { @ClientSideMethod public void handleEvent(Event evt) { try { MessageEventExtension messageEvent= JsCast.castTo(evt, MessageEventExtension.class); receiver.messageReceived(messageEvent.getDataAsString()); evt.stopPropagation(); } catch (Exception e) { } } }); webSocket.setOnclose(new EventListener() { @ClientSideMethod public void handleEvent(Event evt) { System.out.println("close"); } }); return webSocket; } }