@Override public void onStateChange(AtmosphereResourceEvent event) throws IOException { AtmosphereResource r = event.getResource(); AtmosphereResponse res = r.getResponse(); if (event.isSuspended()) { String body = event.getMessage().toString(); ChatData data = new Gson().fromJson(body, ChatData.class); res.getWriter().write(new ChatData(data.getAuthor(), data.getText()).toString()); switch (r.transport()) { case JSONP: case AJAX: case LONG_POLLING: event.getResource().resume(); break; default: res.getWriter().flush(); break; } } else if (!event.isResuming()) { event.broadcaster().broadcast(new ChatData("Someone", "say bye bye!").toString()); } }
@Override public void onStateChange(AtmosphereResourceEvent event) throws IOException { AtmosphereResource resource = event.getResource(); String id = resource.uuid(); if (event.isCancelled()) { callWithUi(resource, disconnectCallback); } else if (event.isResuming()) { // A connection that was suspended earlier was resumed (committed to // the client.) Should only happen if the transport is JSONP or // long-polling. getLogger().log(Level.FINER, "Resuming request for resource {0}", id); } else { // A message was broadcast to this resource and should be sent to // the client. We don't do any actual broadcasting, in the sense of // sending to multiple recipients; any UIDL message is specific to a // single client. getLogger().log(Level.FINER, "Writing message to resource {0}", id); Writer writer = resource.getResponse().getWriter(); writer.write(event.getMessage().toString()); switch (resource.transport()) { case WEBSOCKET: break; case SSE: case STREAMING: writer.flush(); break; case JSONP: case LONG_POLLING: resource.resume(); break; default: getLogger().log(Level.SEVERE, "Unknown transport {0}", resource.transport()); } } }
@Override public void onStateChange(AtmosphereResourceEvent event) throws IOException { AtmosphereResponse response = event.getResource().getResponse(); AtmosphereResource resource = event.getResource(); if (event.isSuspended()) { // Set content type before do response.getWriter() // http://docs.oracle.com/javaee/5/api/javax/servlet/ServletResponse.html#setContentType(java.lang.String) response.setContentType("text/plain; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); if (event.getMessage().getClass().isArray()) { LOG.fine("SEND MESSAGE ARRAY " + event.getMessage().toString()); List<Object> list = Arrays.asList(event.getMessage()); response.getOutputStream().write(MSG_SEPARATOR.getBytes(MSG_CHARSET)); for (Object object : list) { String message = (String) object; message += MSG_SEPARATOR; response.getOutputStream().write(message.getBytes(MSG_CHARSET)); } } else if (event.getMessage() instanceof List) { LOG.fine("SEND MESSAGE LIST " + event.getMessage().toString()); @SuppressWarnings("unchecked") List<Object> list = List.class.cast(event.getMessage()); response.getOutputStream().write(MSG_SEPARATOR.getBytes(MSG_CHARSET)); for (Object object : list) { String message = (String) object; message += MSG_SEPARATOR; response.getOutputStream().write(message.getBytes(MSG_CHARSET)); } } else if (event.getMessage() instanceof String) { LOG.fine("SEND MESSAGE " + event.getMessage().toString()); String message = (String) event.getMessage(); response.getOutputStream().write(message.getBytes(MSG_CHARSET)); } try { response.flushBuffer(); switch (resource.transport()) { case JSONP: case LONG_POLLING: event.getResource().resume(); break; case WEBSOCKET: case STREAMING: case SSE: response.getOutputStream().flush(); break; default: LOG.info("Unknown transport"); break; } } catch (IOException e) { LOG.info("Error resuming resource response", e); } } else if (event.isResuming()) { LOG.fine("RESUMING"); } else if (event.isResumedOnTimeout()) { LOG.fine("RESUMED ON TIMEOUT"); } else if (event.isClosedByApplication() || event.isClosedByClient()) { LOG.fine("CONNECTION CLOSED"); AtmosphereResourceSession resourceSession = AtmosphereResourceSessionFactory.getDefault().getSession(resource); AtmosphereChannel resourceChannel = resourceSession.getAttribute(WAVE_CHANNEL_ATTRIBUTE, AtmosphereChannel.class); if (resourceChannel != null) { resourceChannel.onDisconnect(); } } }