Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java')
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java
new file mode 100644
index 0000000000..c66d1b53d3
--- /dev/null
+++ b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java
@@ -0,0 +1,170 @@
+// ========================================================================
+// Copyright (c) 2006-2011 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+package org.eclipse.jetty.osgi.equinoxtools.console;
+
+import java.io.IOException;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.osgi.equinoxtools.WebEquinoxToolsActivator;
+import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleWriterOutputStream.OnFlushListener;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.WebSocketServlet;
+import org.eclipse.osgi.framework.console.ConsoleSession;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * Websocket version of the Chat with equinox.
+ * Ported from jetty's example 'WebSocketChatServlet'
+ */
+public class EquinoxConsoleWebSocketServlet extends WebSocketServlet implements OnFlushListener
+{
+ private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>();
+ private static final long serialVersionUID = 1L;
+ private WebConsoleSession _consoleSession;
+ private EquinoxChattingSupport _support;
+
+ public EquinoxConsoleWebSocketServlet()
+ {
+
+ }
+ public EquinoxConsoleWebSocketServlet(WebConsoleSession consoleSession, EquinoxChattingSupport support)
+ {
+ _consoleSession = consoleSession;
+ _support = support;
+ }
+ @Override
+ public void init() throws ServletException
+ {
+ if (_consoleSession == null)
+ {
+ _consoleSession = new WebConsoleSession();
+ WebEquinoxToolsActivator.getContext().registerService(ConsoleSession.class.getName(), _consoleSession, null);
+ }
+ if (_support == null)
+ {
+ _support = new EquinoxChattingSupport(_consoleSession);
+ }
+ super.init();
+ _consoleSession.addOnFlushListener(this);
+ }
+
+ @Override
+ public void destroy()
+ {
+ _consoleSession.removeOnFlushListener(this);
+ }
+
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws javax.servlet.ServletException ,IOException
+ {
+ //getServletContext().getNamedDispatcher("default").forward(request,response);
+ response.sendRedirect(request.getContextPath() + request.getServletPath()
+ + (request.getPathInfo() != null ? request.getPathInfo() : "") + "/index.html");
+ };
+
+ public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
+ {
+ return new ChatWebSocket();
+ }
+
+ /* ------------------------------------------------------------ */
+ /* ------------------------------------------------------------ */
+ class ChatWebSocket implements WebSocket.OnTextMessage
+ {
+ Connection _connection;
+ String _username;
+
+ public void onOpen(Connection connection)
+ {
+ // Log.info(this+" onConnect");
+ _connection=connection;
+ _members.add(this);
+ }
+
+ public void onMessage(byte frame, byte[] data,int offset, int length)
+ {
+ // Log.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length));
+ }
+
+ public void onMessage(String data)
+ {
+ Log.info("onMessage: {}",data);
+ if (data.indexOf("disconnect")>=0)
+ _connection.disconnect();
+ else
+ {
+ if (!data.endsWith(":has joined!"))
+ {
+ if (_username != null)
+ {
+ if (data.startsWith(_username + ":"))
+ {
+ data = data.substring(_username.length()+1);
+ }
+ else
+ {
+ //we should not be here?
+ }
+ }
+ _consoleSession.processCommand(data, false);
+ }
+ else
+ {
+ _username = data.substring(0, data.length()-":has joined!".length());
+ }
+ // Log.info(this+" onMessage: "+data);
+ onFlush();
+ }
+ }
+
+ public void onClose(int code, String message)
+ {
+ // Log.info(this+" onDisconnect");
+ _members.remove(this);
+ }
+
+ }
+
+
+ /**
+ * Called right after the flush method on the output stream has been executed.
+ */
+ public void onFlush()
+ {
+ Queue<String> pendingConsoleOutputMessages = _support.processConsoleOutput(false, this);
+ for (ChatWebSocket member : _members)
+ {
+ try
+ {
+ for (String line : pendingConsoleOutputMessages)
+ {
+ member._connection.sendMessage(line);
+ }
+ }
+ catch(IOException e)
+ {
+ Log.warn(e);
+ }
+ }
+ }
+
+}

Back to the top