diff --git a/gxwebsocket/src/main/java/com/genexus/internet/websocket/GXWebSocket.java b/gxwebsocket/src/main/java/com/genexus/internet/websocket/GXWebSocket.java index f0143a655..96d683451 100644 --- a/gxwebsocket/src/main/java/com/genexus/internet/websocket/GXWebSocket.java +++ b/gxwebsocket/src/main/java/com/genexus/internet/websocket/GXWebSocket.java @@ -10,49 +10,34 @@ import com.genexus.websocket.Session; @ServerEndpoint(value = "/gxwebsocket") -public class GXWebSocket extends GXWebSocketCommon implements IGXWebSocketAsync { - - private static GXWebSocket instance = null; - - public GXWebSocket(){ - instance = this; - } - - public static IGXWebSocketAsync getInstance() { - return instance; +public class GXWebSocket { + + private GXWebSocketService wsService; + + public GXWebSocket() { + wsService = GXWebSocketService.getService(); } - + @OnOpen - public void OnOpen (javax.websocket.Session session) { - OnOpenCommon(new Session(session)); + public void onOpen(javax.websocket.Session session) { + wsService.onOpen(new Session(session)); } @OnMessage - public void OnMessage (String txt, javax.websocket.Session session) { - OnMessageCommon(txt, new Session(session)); + public void onMessage(String txt, javax.websocket.Session session) { + wsService.onMessage(txt, new Session(session)); } @OnClose - public void myOnClose (javax.websocket.Session session, CloseReason reason) { - myOnCloseCommon(new Session(session)); + public void onClose(javax.websocket.Session session, CloseReason reason) { + wsService.onClose(new Session(session)); } @OnError public void onError(Throwable exception, javax.websocket.Session session) { - onErrorCommon(exception, new Session(session)); + wsService.onError(exception, new Session(session)); } - - public SendResponseType send(String clientId, String message) { - return sendCommon(clientId, message); - } - - public void broadcast(String message) { - broadcastCommon(message); - } - public boolean start() { - return true; - } } diff --git a/gxwebsocket/src/main/java/com/genexus/websocket/Session.java b/gxwebsocket/src/main/java/com/genexus/websocket/Session.java index 7d41df17b..84a959ab9 100644 --- a/gxwebsocket/src/main/java/com/genexus/websocket/Session.java +++ b/gxwebsocket/src/main/java/com/genexus/websocket/Session.java @@ -14,7 +14,7 @@ public Integer getHashCode() { return new Integer(session.hashCode()); } - public String getQueryString() { + public String getId() { return session.getQueryString(); } diff --git a/gxwebsocketjakarta/src/main/java/com/genexus/internet/websocket/GXWebSocket.java b/gxwebsocketjakarta/src/main/java/com/genexus/internet/websocket/GXWebSocket.java index 5d23a8232..3ca418848 100644 --- a/gxwebsocketjakarta/src/main/java/com/genexus/internet/websocket/GXWebSocket.java +++ b/gxwebsocketjakarta/src/main/java/com/genexus/internet/websocket/GXWebSocket.java @@ -10,49 +10,33 @@ import com.genexus.websocket.Session; @ServerEndpoint(value = "/gxwebsocket") -public class GXWebSocket extends GXWebSocketCommon implements IGXWebSocketAsync { - - private static GXWebSocket instance = null; - - public GXWebSocket(){ - instance = this; - } - - public static IGXWebSocketAsync getInstance() { - return instance; +public class GXWebSocket { + + private GXWebSocketService wsService; + + public GXWebSocket() { + wsService = GXWebSocketService.getService(); } - + @OnOpen - public void OnOpen (jakarta.websocket.Session session) { - OnOpenCommon(new Session(session)); + public void onOpen(jakarta.websocket.Session session) { + wsService.onOpen(new Session(session)); } - + @OnMessage - public void OnMessage (String txt, jakarta.websocket.Session session) { - OnMessageCommon(txt, new Session(session)); + public void onMessage(String txt, jakarta.websocket.Session session) { + wsService.onMessage(txt, new Session(session)); } @OnClose - public void myOnClose (jakarta.websocket.Session session, CloseReason reason) { - myOnCloseCommon(new Session(session)); + public void onClose(jakarta.websocket.Session session, CloseReason reason) { + wsService.onClose(new Session(session)); } - + @OnError - public void onError(Throwable exception, jakarta.websocket.Session session) { - onErrorCommon(exception, new Session(session)); - } - - public SendResponseType send(String clientId, String message) { - return sendCommon(clientId, message); + public void onError(Throwable exception, jakarta.websocket.Session session) { + wsService.onError(exception, new Session(session)); } - - public void broadcast(String message) { - broadcastCommon(message); - } - - public boolean start() { - return true; - } } diff --git a/gxwebsocketjakarta/src/main/java/com/genexus/websocket/Session.java b/gxwebsocketjakarta/src/main/java/com/genexus/websocket/Session.java index b7da86f30..edf07c796 100644 --- a/gxwebsocketjakarta/src/main/java/com/genexus/websocket/Session.java +++ b/gxwebsocketjakarta/src/main/java/com/genexus/websocket/Session.java @@ -3,7 +3,7 @@ import jakarta.websocket.RemoteEndpoint; import java.io.IOException; -public class Session implements ISession{ +public class Session implements ISession { private jakarta.websocket.Session session; public Session(jakarta.websocket.Session session) { @@ -14,7 +14,7 @@ public Integer getHashCode() { return new Integer(session.hashCode()); } - public String getQueryString() { + public String getId() { return session.getQueryString(); } diff --git a/java/src/main/java/com/genexus/Application.java b/java/src/main/java/com/genexus/Application.java index 96214b021..6bd7cfce3 100644 --- a/java/src/main/java/com/genexus/Application.java +++ b/java/src/main/java/com/genexus/Application.java @@ -3,10 +3,7 @@ import java.io.Closeable; import java.io.IOException; import java.sql.SQLException; -import java.util.Date; -import java.util.Enumeration; -import java.util.Properties; -import java.util.Vector; +import java.util.*; import com.genexus.db.DBConnectionManager; import com.genexus.db.DynamicExecute; @@ -42,7 +39,6 @@ public class Application private static Boolean isJMXEnabled; public static Class gxCfg = ApplicationContext.getInstance().getClass(); - //public static ModelContext clientContext; private static Vector toCleanup = new Vector<>(); static LocalUtil localUtil; static Class ClassName = null; @@ -753,10 +749,10 @@ public static boolean getShowConnectError() static boolean useSmartCache = false; + public static com.genexus.GXSmartCacheProvider getSmartCacheProvider(int handle) { useSmartCache = true; return getConnectionManager().getUserInformation(handle).getSmartCacheProvider(); - } - + } } diff --git a/java/src/main/java/com/genexus/internet/GXWebNotification.java b/java/src/main/java/com/genexus/internet/GXWebNotification.java index 9f993d286..14da7995d 100644 --- a/java/src/main/java/com/genexus/internet/GXWebNotification.java +++ b/java/src/main/java/com/genexus/internet/GXWebNotification.java @@ -2,54 +2,35 @@ import com.genexus.ModelContext; import com.genexus.diagnostics.core.ILogger; import com.genexus.diagnostics.core.LogManager; -import com.genexus.internet.websocket.IGXWebSocketAsync; +import com.genexus.internet.websocket.GXWebSocketService; import com.genexus.internet.websocket.SendResponseType; import com.genexus.xml.GXXMLSerializable; public class GXWebNotification { public static final ILogger logger = LogManager.getLogger(GXWebNotification.class); + private GXWebSocketService wsService; + private HttpContext httpContext; - private static IGXWebSocketAsync ws; - private HttpContext _ctx; - - private short _errCode; - private String _errDescription; - - + private short errCode; + private String errDescription; + public short getErrCode() { - return _errCode; + return errCode; } public String getErrDescription() { - return _errDescription; + return errDescription; } public GXWebNotification(ModelContext gxContext) - { - _ctx = (HttpContext) gxContext.getHttpContext(); - if (ws == null) - { - try { - setError((short)1); - Class c = Class.forName("com.genexus.internet.websocket.GXWebSocket"); - java.lang.reflect.Method method = c.getDeclaredMethod("getInstance", (Class[])null); - Object o = method.invoke(null, (Object[])null); - ws = (IGXWebSocketAsync)o; - if (ws != null) - setError((short)0); - } catch (Exception e) { - logger.error("GXWebNotification", e); - } - } - if (_errCode != 0) - { - logger.error("Could not create com.genexus.internet.GXWebSocket instance. Check whether WebServer requirements are met and WebNotifications Provider Generator Property is set"); - } + { + wsService = GXWebSocketService.getService(); + httpContext = (HttpContext) gxContext.getHttpContext(); } - + public short notifyClient(String clientId, String message) { return notifyClientImpl(clientId, message); @@ -62,43 +43,38 @@ public short notifyClient(String clientId, GXXMLSerializable message) } public short notifyClientImpl(String clientId, String message) - { - if (ws != null) + { + SendResponseType result = wsService.send(clientId.trim(), message); + switch (result) { - SendResponseType result = ws.send(clientId.trim(), message); - switch (result) - { - case OK: - setError((short)0); - break; - case SessionNotFound: - setError((short)2); - break; - case SessionInvalid: - setError((short)3); - break; - case SendFailed: - setError((short)4); - break; - default: - break; - } + case OK: + setError((short)0); + break; + case SessionNotFound: + setError((short)2); + break; + case SessionInvalid: + setError((short)3); + break; + case SendFailed: + setError((short)4); + break; + default: + break; } - else - setError((short)1); - - return _errCode; + + return errCode; } public short notify(String message) { - return notifyClient(_ctx.getClientId(), message); + return notifyClient(httpContext.getClientId(), message); } public short notify(GXXMLSerializable message) { - return notifyClient(_ctx.getClientId(), message); + return notifyClient(httpContext.getClientId(), message); } @@ -113,44 +89,39 @@ public void broadcast(String message) } private void broadcastImpl(String message) - { - if (ws != null) - { - ws.broadcast(message); - setError((short)0); - } - else - setError((short)1); + { + wsService.broadcast(message); + setError((short)0); } private void setError(short i) { - this._errCode = i; + this.errCode = i; switch (i) { case 0: - _errDescription = "OK"; + errDescription = "OK"; break; case 1: - _errDescription = "Could not start WebSocket Server"; + errDescription = "WebSocket Server has not been initialized yet. No incoming connections were received"; break; case 2: - _errDescription = "WebSocket Session not found"; + errDescription = "WebSocket Session not found. The client is not connected to socket server"; break; case 3: - _errDescription = "WebSocket Session is closed or invalid"; + errDescription = "WebSocket Session was found, but it's state was closed or invalid"; break; case 4: - _errDescription = "Message could not be delivered to client"; + errDescription = "Message could not be delivered to client because of a connection error"; break; default: - _errDescription = "Unknown error"; + errDescription = "Unknown error"; break; } } public String getClientId() { - return _ctx.getClientId(); + return httpContext.getClientId(); } } diff --git a/java/src/main/java/com/genexus/internet/websocket/GXWebSocketCommon.java b/java/src/main/java/com/genexus/internet/websocket/GXWebSocketCommon.java deleted file mode 100644 index f4e6e49f7..000000000 --- a/java/src/main/java/com/genexus/internet/websocket/GXWebSocketCommon.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.genexus.internet.websocket; - -import java.io.IOException; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -import json.org.json.JSONObject; - -import com.genexus.Application; -import com.genexus.GXutil; -import com.genexus.ModelContext; -import com.genexus.db.DynamicExecute; -import com.genexus.util.GXService; -import com.genexus.util.GXServices; -import com.genexus.xml.GXXMLSerializable; -import com.genexus.websocket.ISession; - -public class GXWebSocketCommon { - - private static String[] handlerCache = new String[HandlerType.values().length]; - - private static GXWebSocketSessionCollection wsClients = new GXWebSocketSessionCollection(); - - private ConcurrentHashMap sessions = new ConcurrentHashMap(); - - public enum HandlerType { - ReceivedMessage, OnOpen, OnClose, OnError - } - - public void closedSession(GXWebSocketSession session) - { - wsClients.remove(session); - } - - protected void OnOpenCommon (ISession session) { - GXWebSocketSession client = getGXWebSocketSession(session); - wsClients.put(client); - - Object[] parms = new Object[1]; - parms[0] = client.getId(); - ExecuteHandler(HandlerType.OnOpen, parms); - } - - protected void OnMessageCommon (String txt, ISession session) { - Object[] parms = new Object[2]; - parms[0] = getGXWebSocketSession(session).getId(); - - try { - - GXXMLSerializable nInfo = (GXXMLSerializable) Class.forName("com.genexuscore.genexus.server.SdtNotificationInfo").getConstructor().newInstance(); - JSONObject jInfo = new JSONObject(); - jInfo.put("Message", txt); - nInfo.FromJSONObject(jInfo); - parms[1] = nInfo; - ExecuteHandler(HandlerType.ReceivedMessage, parms); - - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private void ExecuteHandler(HandlerType type, Object[] parameters){ - String handler = getHandlerClassName(type); - if (handler != null){ - try { - if (!DynamicExecute.dynamicExecute(ModelContext.getModelContext(GXutil.class), -1, Application.class, handler, parameters)){ - System.out.println("GXWebSocket - Handler could not be executed: " + handler); - } - } - catch (Exception e){ - System.out.println("GXWebSocket - Handler failed executing action: " + handler); - e.printStackTrace(); - } - } - } - - private String getPtyTypeName(HandlerType type){ - String typeName = ""; - switch(type) - { - case ReceivedMessage: - typeName = "WEBNOTIFICATIONS_RECEIVED_HANDLER"; - break; - case OnClose: - typeName = "WEBNOTIFICATIONS_ONCLOSE_HANDLER"; - break; - case OnError: - typeName = "WEBNOTIFICATIONS_ONERROR_HANDLER"; - break; - case OnOpen: - typeName = "WEBNOTIFICATIONS_ONOPEN_HANDLER"; - break; - } - return typeName; - } - - private String getHandlerClassName(HandlerType hType){ - int idx = hType.ordinal(); - String handlerClassName = handlerCache[idx]; - if (handlerClassName == null){ - String type = getPtyTypeName(hType); - GXService service = GXServices.getInstance().get(GXServices.WEBNOTIFICATIONS_SERVICE); - if (service != null && service.getProperties() != null){ - String className = service.getProperties().get(type); - if (className != null && className.length() > 0){ - handlerClassName = GXutil.getClassName(className.toLowerCase()); - handlerCache[idx] = handlerClassName; - } - } - } - return handlerClassName; - } - - protected void myOnCloseCommon (ISession session) { - GXWebSocketSession client = getGXWebSocketSession(session); - closedSession(client); - Object[] parms = new Object[1]; - parms[0] = client.getId(); - ExecuteHandler(HandlerType.OnClose, parms); - sessions.remove(client.getSession().getHashCode()); - } - - protected void onErrorCommon(Throwable exception, ISession session) { - Object[] parms = new Object[2]; - parms[0] = getGXWebSocketSession(session).getId(); - parms[1] = exception.getMessage(); - ExecuteHandler(HandlerType.OnError, parms); - } - - protected SendResponseType sendCommon(String clientId, String message) { - SendResponseType result = SendResponseType.SessionNotFound; - List list = wsClients.getById(clientId); - if (list != null){ - for (GXWebSocketSession session : list){ - result = sendMessage( session,message); - } - } - return result; - } - - private SendResponseType sendMessage( GXWebSocketSession session, String message) { - SendResponseType result = SendResponseType.SessionInvalid; - if (session != null ){ - if (session.getSession().isOpen()){ - try { - session.getSession().sendEndPointText(message); - result = SendResponseType.OK; - } catch (IOException e) { - result = SendResponseType.SendFailed; - System.out.println("GXWebSocket - sendMessage failed. " + e.getMessage()); - } - } - else - { - System.out.println("GXWebSocket - sendMessage failed Session Was Closed"); - } - } - else - { - result = SendResponseType.SessionNotFound; - System.out.println("GXWebSocketServlet - sendMessage failed SessionNotFound"); - } - return result; - } - - - protected void broadcastCommon(String message) { - for ( GXWebSocketSession session : wsClients.getAll() ) { - sendMessage(session,message); - } - } - - public boolean start() { - return true; - } - - private GXWebSocketSession getGXWebSocketSession(ISession session) { - if (sessions.containsKey(session.getHashCode())) - return sessions.get(session.getHashCode()); - GXWebSocketSession socketSession = new GXWebSocketSession(session); - sessions.put(socketSession.getSession().getHashCode(), socketSession); - return socketSession; - } -} - - diff --git a/java/src/main/java/com/genexus/internet/websocket/GXWebSocketService.java b/java/src/main/java/com/genexus/internet/websocket/GXWebSocketService.java new file mode 100644 index 000000000..8171ffdaf --- /dev/null +++ b/java/src/main/java/com/genexus/internet/websocket/GXWebSocketService.java @@ -0,0 +1,200 @@ +package com.genexus.internet.websocket; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; +import json.org.json.JSONException; +import json.org.json.JSONObject; + +import com.genexus.Application; +import com.genexus.GXutil; +import com.genexus.ModelContext; +import com.genexus.db.DynamicExecute; +import com.genexus.util.GXService; +import com.genexus.util.GXServices; +import com.genexus.xml.GXXMLSerializable; +import com.genexus.websocket.ISession; + +public class GXWebSocketService { + public static final ILogger logger = LogManager.getLogger(GXWebSocketService.class); + private static GXWebSocketService instance; + + private String[] handlerCache = new String[HandlerType.values().length]; + private GXWebSocketSessionCollection wsClients = new GXWebSocketSessionCollection(); + private ConcurrentHashMap sessions = new ConcurrentHashMap(); + + public enum HandlerType { + ReceivedMessage, OnOpen, OnClose, OnError + } + + public static GXWebSocketService getService() { + if (instance == null) { + synchronized (GXWebSocketService.class) { + if (instance == null) { + instance = new GXWebSocketService(); + } + } + } + return instance; + } + + public void closedSession(GXWebSocketSession session) { + wsClients.remove(session); + } + + protected void onOpen(ISession session) { + logger.debug(String.format("WebSocket - Connection opened '%s'", session.getId())); + + GXWebSocketSession client = getGXWebSocketSession(session); + wsClients.put(client); + + Object[] parms = new Object[1]; + parms[0] = client.getId(); + executeHandler(HandlerType.OnOpen, parms); + } + + protected void onMessage(String txt, ISession session) { + logger.debug(String.format("WebSocket - New Message received '%s'", session.getId())); + + Object[] parameters = new Object[2]; + parameters[0] = getGXWebSocketSession(session).getId(); + + try { + + GXXMLSerializable nInfo = (GXXMLSerializable) Class.forName("com.genexuscore.genexus.server.SdtNotificationInfo").getConstructor().newInstance(); + JSONObject jInfo = new JSONObject(); + jInfo.put("Message", txt); + nInfo.FromJSONObject(jInfo); + parameters[1] = nInfo; + executeHandler(HandlerType.ReceivedMessage, parameters); + + } catch (ClassNotFoundException e) { + logger.error("WebSocket - SdtNotificationInfo class not found", e); + } catch (JSONException | InstantiationException | IllegalAccessException| InvocationTargetException | NoSuchMethodException e) { + logger.error("WebSocket - General error ", e); + } + } + + private void executeHandler(HandlerType type, Object[] parameters) { + String handler = getHandlerClassName(type); + if (handler != null) { + try { + if (!DynamicExecute.dynamicExecute(ModelContext.getModelContext(GXutil.class), -1, Application.class, handler, parameters)) { + logger.error(String.format("WebSocket - Handler '%s' failed to execute", handler)); + } + } catch (Exception e) { + logger.error(String.format("WebSocket - Handler '%s' failed to execute", handler)); + } + } + } + + private String getPtyTypeName(HandlerType type) { + String typeName = ""; + switch (type) { + case ReceivedMessage: + typeName = "WEBNOTIFICATIONS_RECEIVED_HANDLER"; + break; + case OnClose: + typeName = "WEBNOTIFICATIONS_ONCLOSE_HANDLER"; + break; + case OnError: + typeName = "WEBNOTIFICATIONS_ONERROR_HANDLER"; + break; + case OnOpen: + typeName = "WEBNOTIFICATIONS_ONOPEN_HANDLER"; + break; + } + return typeName; + } + + private String getHandlerClassName(HandlerType hType) { + int idx = hType.ordinal(); + String handlerClassName = handlerCache[idx]; + if (handlerClassName == null) { + String type = getPtyTypeName(hType); + GXService service = GXServices.getInstance().get(GXServices.WEBNOTIFICATIONS_SERVICE); + if (service != null && service.getProperties() != null) { + String className = service.getProperties().get(type); + if (className != null && className.length() > 0) { + handlerClassName = GXutil.getClassName(className.toLowerCase()); + handlerCache[idx] = handlerClassName; + } + } + } + return handlerClassName; + } + + protected void onClose(ISession session) { + logger.debug(String.format("WebSocket - Connection closed '%s'", session.getId())); + + GXWebSocketSession client = getGXWebSocketSession(session); + closedSession(client); + Object[] parms = new Object[1]; + parms[0] = client.getId(); + executeHandler(HandlerType.OnClose, parms); + sessions.remove(client.getSession().getHashCode()); + } + + protected void onError(Throwable exception, ISession session) { + logger.debug(String.format("WebSocket - Connection error '%s'", session.getId())); + + Object[] parms = new Object[2]; + parms[0] = getGXWebSocketSession(session).getId(); + parms[1] = exception.getMessage(); + executeHandler(HandlerType.OnError, parms); + } + + public SendResponseType send(String clientId, String message) { + logger.debug(String.format("WebSocket - Try send message to '%s'", clientId)); + + SendResponseType result = SendResponseType.SessionNotFound; + List list = wsClients.getById(clientId); + if (list != null) { + for (GXWebSocketSession session : list) { + result = sendMessage(session, message); + } + } + return result; + } + + private SendResponseType sendMessage(GXWebSocketSession session, String message) { + SendResponseType result = SendResponseType.SessionInvalid; + if (session != null) { + if (session.getSession().isOpen()) { + try { + session.getSession().sendEndPointText(message); + result = SendResponseType.OK; + } catch (IOException e) { + result = SendResponseType.SendFailed; + logger.warn("WebSocket - sendMessage failed", e); + } + } else { + logger.warn("WebSocket - sendMessage failed because session was invalid"); + } + } else { + result = SendResponseType.SessionNotFound; + } + return result; + } + + public void broadcast(String message) { + for (GXWebSocketSession session : wsClients.getAll()) { + sendMessage(session, message); + } + } + + private GXWebSocketSession getGXWebSocketSession(ISession session) { + if (sessions.containsKey(session.getHashCode())) { + return sessions.get(session.getHashCode()); + } + GXWebSocketSession socketSession = new GXWebSocketSession(session); + sessions.put(socketSession.getSession().getHashCode(), socketSession); + return socketSession; + } +} + + diff --git a/java/src/main/java/com/genexus/internet/websocket/GXWebSocketSession.java b/java/src/main/java/com/genexus/internet/websocket/GXWebSocketSession.java index 24d4d5532..b6aaec37d 100644 --- a/java/src/main/java/com/genexus/internet/websocket/GXWebSocketSession.java +++ b/java/src/main/java/com/genexus/internet/websocket/GXWebSocketSession.java @@ -11,7 +11,7 @@ public String getId(){ return id; } public GXWebSocketSession(ISession session){ - id = session.getQueryString(); + id = session.getId(); this.session = session; } public ISession getSession() diff --git a/java/src/main/java/com/genexus/internet/websocket/IGXWebSocketAsync.java b/java/src/main/java/com/genexus/internet/websocket/IGXWebSocketAsync.java deleted file mode 100644 index 314fdadc9..000000000 --- a/java/src/main/java/com/genexus/internet/websocket/IGXWebSocketAsync.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.genexus.internet.websocket; - -public interface IGXWebSocketAsync { - boolean start(); - SendResponseType send(String clientId, String message); - void broadcast(String message); -} - diff --git a/wrappercommon/src/main/java/com/genexus/websocket/ISession.java b/wrappercommon/src/main/java/com/genexus/websocket/ISession.java index 07eb227b5..03cbb5d6d 100644 --- a/wrappercommon/src/main/java/com/genexus/websocket/ISession.java +++ b/wrappercommon/src/main/java/com/genexus/websocket/ISession.java @@ -4,7 +4,7 @@ public interface ISession { Integer getHashCode(); - String getQueryString(); + String getId(); boolean isOpen(); void sendEndPointText(String message) throws IOException; }