|
Play Framework/Scala example source code file (WebSocket.java)
The WebSocket.java Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.mvc;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import akka.actor.ActorRef;
import akka.actor.Props;
import play.libs.F.*;
/**
* A WebSocket result.
*/
public abstract class WebSocket<A> {
/**
* Called when the WebSocket is ready
*
* @param in The Socket in.
* @param out The Socket out.
*/
public abstract void onReady(In<A> in, Out<A> out);
/**
* If this method returns a result, the WebSocket will be rejected with that result.
*
* This method will be invoked before onReady.
*
* @return The result to reject the WebSocket with, or null if the WebSocket shouldn't be rejected.
*/
public Result rejectWith() {
return null;
}
/**
* If this method returns true, then the WebSocket should be handled by an actor. The actor will be obtained by
* passing an ActorRef representing to the actor method, which should return the props for creating the actor.
*/
public boolean isActor() {
return false;
}
/**
* The props to create the actor to handle this WebSocket.
*
* @param out The actor to send upstream messages to.
* @return The props of the actor to handle the WebSocket. If isActor returns true, must not return null.
*/
public Props actorProps(ActorRef out) {
return null;
}
/**
* A WebSocket out.
*/
public static interface Out<A> {
/**
* Writes a frame.
*/
public void write(A frame);
/**
* Close this channel.
*/
public void close();
}
/**
* A WebSocket in.
*/
public static class In<A> {
/**
* Callbacks to invoke at each frame.
*/
public final List<Callback<A>> callbacks = new CopyOnWriteArrayList<Callback<A>>();
/**
* Callbacks to invoke on close.
*/
public final List<Callback0> closeCallbacks = new CopyOnWriteArrayList<Callback0>();
/**
* Registers a message callback.
*/
public void onMessage(Callback<A> callback) {
callbacks.add(callback);
}
/**
* Registers a close callback.
*/
public void onClose(Callback0 callback) {
closeCallbacks.add(callback);
}
}
/**
* Creates a WebSocket. The abstract {@code onReady} method is
* implemented using the specified {@code Callback2<In<A>, Out<A>>}
*
* @param callback the callback used to implement onReady
* @return a new WebSocket
* @throws NullPointerException if the specified callback is null
*/
public static <A> WebSocket<A> whenReady(Callback2<In<A>, Out<A>> callback) {
return new WhenReadyWebSocket<A>(callback);
}
/**
* Rejects a WebSocket.
*
* @param result The result that will be returned.
* @return A rejected WebSocket.
*/
public static <A> WebSocket<A> reject(final Result result) {
return new WebSocket<A>() {
public void onReady(In<A> in, Out<A> out) {
}
public Result rejectWith() {
return result;
}
};
}
/**
* Handles a WebSocket with an actor.
*
* @param props The function used to create the props for the actor. The passed in argument is the upstream actor.
* @return An actor WebSocket.
*/
public static <A> WebSocket<A> withActor(final Function<ActorRef, Props> props) {
return new WebSocket<A>() {
public void onReady(In<A> in, Out<A> out) {
}
public boolean isActor() {
return true;
}
public Props actorProps(ActorRef out) {
try {
return props.apply(out);
} catch (RuntimeException e) {
throw e;
} catch (Error e) {
throw e;
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
};
}
/**
* An extension of WebSocket that obtains its onReady from
* the specified {@code Callback2<In<A>, Out<A>>}.
*/
static final class WhenReadyWebSocket<A> extends WebSocket<A> {
private final Callback2<In<A>, Out<A>> callback;
WhenReadyWebSocket(Callback2<In<A>, Out<A>> callback) {
if (callback == null) throw new NullPointerException("WebSocket onReady callback cannot be null");
this.callback = callback;
}
@Override
public void onReady(In<A> in, Out<A> out) {
try {
callback.invoke(in, out);
} catch (Throwable e) {
play.PlayInternal.logger().error("Exception in WebSocket.onReady", e);
}
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework WebSocket.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.