Skip to content

Commit

Permalink
Merge branch 'atmosphere-0.8.0' of github.com:Atmosphere/atmosphere i…
Browse files Browse the repository at this point in the history
…nto atmosphere-0.8.0
  • Loading branch information
jfarcand committed Oct 31, 2011
2 parents 9261e0b + ca1d76f commit 20311b3
Show file tree
Hide file tree
Showing 37 changed files with 3,047 additions and 451 deletions.
Expand Up @@ -56,6 +56,7 @@
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import static org.atmosphere.cpr.HeaderConfig.WEBSOCKET_UPGRADE;

/**
Expand Down Expand Up @@ -131,7 +132,7 @@ public void onConnect(com.sun.grizzly.websockets.WebSocket w) {
try {

webSocketProcessor = (WebSocketProcessor) GrizzlyWebSocket.class.getClassLoader()
.loadClass(config.getServlet().getWebSocketProcessorClassName())
.loadClass(config.getServlet().getWebSocketProtocolClassName())
.getDeclaredConstructor(new Class[]{AtmosphereServlet.class, WebSocket.class})
.newInstance(new Object[]{config.getServlet(), new GrizzlyWebSocket(webSocket)});

Expand All @@ -146,8 +147,8 @@ public boolean isApplicationRequest(Request request) {
return true;
}

public void onMessage(com.sun.grizzly.websockets.WebSocket webSocket, DataFrame dataFrame) {
webSocketProcessor.parseMessage(dataFrame.getTextPayload());
public void onMessage(com.sun.grizzly.websockets.WebSocket w, DataFrame dataFrame) {
webSocketProcessor.invokeWebSocketProtocol(dataFrame.getTextPayload());
}

public void onClose(com.sun.grizzly.websockets.WebSocket webSocket) {
Expand Down
Expand Up @@ -85,7 +85,7 @@ public boolean checkOrigin(HttpServletRequest request, String origin) {

public org.eclipse.jetty.websocket.WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
logger.debug("WebSocket-connect request {} with protocol {}", request.getRequestURI(), protocol);
return new JettyWebSocketHandler(request, config.getServlet(), config.getServlet().getWebSocketProcessorClassName());
return new JettyWebSocketHandler(request, config.getServlet(), config.getServlet().getWebSocketProtocolClassName());
}
});

Expand Down
Expand Up @@ -16,6 +16,7 @@
package org.atmosphere.cpr;

import org.atmosphere.websocket.WebSocketProcessor;
import org.atmosphere.websocket.WebSocketProtocol;

/**
* Web.xml init-param configuration supported by Atmosphere.
Expand Down Expand Up @@ -86,7 +87,7 @@ public interface ApplicationConfig {
/**
* Tell Atmosphere the {@link org.atmosphere.websocket.WebSocketProcessor} to use.
*/
String WEBSOCKET_PROCESSOR = WebSocketProcessor.class.getName();
String WEBSOCKET_PROTOCOL = WebSocketProtocol.class.getName();
/**
* Tell Atmosphere the content-type to use when a WebSocket message is dispatched as an HTTPServletRequest
*/
Expand Down
Expand Up @@ -41,6 +41,7 @@
import org.atmosphere.cpr.AtmosphereServlet.Action;
import org.atmosphere.cpr.AtmosphereServlet.AtmosphereConfig;
import org.atmosphere.cpr.AtmosphereServlet.AtmosphereHandlerWrapper;
import org.atmosphere.util.uri.UriTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -223,6 +224,23 @@ public void action(AtmosphereResourceImpl r) {
aliveRequests.remove(r.getRequest());
}

protected AtmosphereHandlerWrapper map(String path) {
AtmosphereHandlerWrapper atmosphereHandlerWrapper = config.handlers().get(path);
if (atmosphereHandlerWrapper == null) {
final Map<String, String> m = new HashMap<String, String>();
for (Map.Entry<String, AtmosphereHandlerWrapper> e : config.handlers().entrySet()) {
UriTemplate t = new UriTemplate(e.getKey());
logger.debug("Trying to map {} to {}", t, path);
if (t.match(path, m)) {
atmosphereHandlerWrapper = e.getValue();
logger.trace("Mapped {} to {}", t, e.getValue());
break;
}
}
}
return atmosphereHandlerWrapper;
}

/**
* Return the {@link AtmosphereHandler} mapped to the passed servlet-path.
*
Expand All @@ -231,49 +249,18 @@ public void action(AtmosphereResourceImpl r) {
* @throws javax.servlet.ServletException
*/
protected AtmosphereHandlerWrapper map(HttpServletRequest req) throws ServletException {
String path = req.getServletPath();
if (path == null || path.length() == 0) {
path = "/";
String path = req.getServletPath() + req.getPathInfo();
if (path == null || path.length() <= 1) {
path = "/all";
}

AtmosphereHandlerWrapper atmosphereHandlerWrapper = config.handlers().get(path);
AtmosphereHandlerWrapper atmosphereHandlerWrapper = map(path);
if (atmosphereHandlerWrapper == null) {
// Try the /*
if (!path.endsWith("/")) {
path += "/*";
} else {
path += "*";
}
atmosphereHandlerWrapper = config.handlers().get(path);
if (atmosphereHandlerWrapper == null) {
atmosphereHandlerWrapper = config.handlers().get("/*");
if (atmosphereHandlerWrapper == null) {

if (req.getPathInfo() != null) {
// Try appending the pathInfo
path = req.getServletPath() + req.getPathInfo();
}
atmosphereHandlerWrapper = map("/all");
}

atmosphereHandlerWrapper = config.handlers().get(path);
if (atmosphereHandlerWrapper == null) {
// Last chance
if (!path.endsWith("/")) {
path += "/*";
} else {
path += "*";
}
// Try appending the pathInfo
atmosphereHandlerWrapper = config.handlers().get(path);
if (atmosphereHandlerWrapper == null) {
logger.warn("No AtmosphereHandler maps request for {}", path);
for (String m : config.handlers().keySet()) {
logger.warn("\tAtmosphereHandler registered: {}", m);
}
throw new ServletException("No AtmosphereHandler maps request for " + path);
}
}
}
}
if (atmosphereHandlerWrapper == null){
throw new ServletException("No AtmosphereHandler maps request for " + path);
}
config.getBroadcasterFactory().add(atmosphereHandlerWrapper.broadcaster,
atmosphereHandlerWrapper.broadcaster.getID());
Expand Down
64 changes: 49 additions & 15 deletions modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java
Expand Up @@ -39,6 +39,7 @@ public class AtmosphereRequest extends HttpServletRequestWrapper {
private final BufferedReader br;
private final String pathInfo;
private final Map<String, String> headers;
private final Map<String, String[]> queryStrings;
private final String methodType;
private final String contentType;
private final HttpServletRequest request;
Expand All @@ -48,6 +49,7 @@ private AtmosphereRequest(Builder b) {
pathInfo = b.pathInfo == null ? b.request.getPathInfo() : b.pathInfo;
request = b.request;
headers = b.headers;
queryStrings = b.queryStrings;

if (b.dataBytes != null) {
bis = new ByteInputStream(b.dataBytes, b.offset, b.length);
Expand All @@ -56,7 +58,7 @@ private AtmosphereRequest(Builder b) {
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
} else if (b.data != null){
} else if (b.data != null) {
bis = new ByteInputStream(b.data.getBytes(), 0, b.data.getBytes().length);
br = new BufferedReader(new StringReader(b.data));
} else {
Expand Down Expand Up @@ -141,14 +143,40 @@ public String getHeader(String s) {
}
}

public String getParameter(String s) {
String name = super.getParameter(s);
if (name == null) {
if (queryStrings.get(s) != null) {
return queryStrings.get(s)[0];
}
}
return name;
}

public Map<String, String[]> getParameterMap() {
Map<String, String[]> m = this.request.getParameterMap();
for (Map.Entry<String, String[]> e : m.entrySet()) {
String[] s = queryStrings.get(e.getKey());
if (s != null) {
String[] s1 = new String[s.length + e.getValue().length];
System.arraycopy(s, 0, s1, 0, s.length);
System.arraycopy(s1, s.length + 1, e.getValue(), 0, e.getValue().length);
queryStrings.put(e.getKey(), s1);
} else {
queryStrings.put(e.getKey(), e.getValue());
}
}
return Collections.unmodifiableMap(queryStrings);
}

@Override
public ServletInputStream getInputStream() throws IOException {
return bis == null? request.getInputStream() : bis;
return bis == null ? request.getInputStream() : bis;
}

@Override
public BufferedReader getReader() throws IOException {
return br == null? request.getReader() : br;
return br == null ? request.getReader() : br;
}

private static class ByteInputStream extends ServletInputStream {
Expand All @@ -167,21 +195,22 @@ public int read() throws IOException {

public final static class Builder {

public HttpServletRequest request;
public String pathInfo;
public byte[] dataBytes;
public int offset;
public int length;
public String encoding = "UTF-8";
public String methodType;
public String contentType;
public String data;
public Map<String, String> headers;
private HttpServletRequest request;
private String pathInfo;
private byte[] dataBytes;
private int offset;
private int length;
private String encoding = "UTF-8";
private String methodType;
private String contentType;
private String data;
private Map<String, String> headers;
private Map<String, String[]> queryStrings;

public Builder() {
}

public Builder headers(Map<String,String> headers) {
public Builder headers(Map<String, String> headers) {
this.headers = headers;
return this;
}
Expand Down Expand Up @@ -223,9 +252,14 @@ public Builder body(String data) {
return this;
}

public AtmosphereRequest build(){
public AtmosphereRequest build() {
return new AtmosphereRequest(this);
}

public Builder queryStrings(Map<String, String[]> queryStrings) {
this.queryStrings = queryStrings;
return this;
}
}

}
Expand Up @@ -195,8 +195,12 @@ public void setThrowable(Throwable t) {

@Override
public String toString() {
return "AtmosphereResourceEventImpl{" + "isResuming=" + isResuming() + " isCancelled=" + isCancelled + ", isResumedOnTimeout=" +
isResumedOnTimeout + ", message=" + message + ", resource=" + resource + ", throwable=" + throwable +
return "AtmosphereResourceEventImpl{" +
"isCancelled=" + isCancelled +
",\n isResumedOnTimeout=" + isResumedOnTimeout +
",\n throwable=" + throwable +
",\n message=" + message +
",\n\t resource=" + resource +
'}';
}
}
Expand Up @@ -157,7 +157,7 @@ public AtmosphereHandler getAtmosphereHandler() {
* {@inheritDoc}
*/
public void resume() {
// Stragely but possible two thread try to resume at the same time.
// Strangely but possible two thread try to resume at the same time.
try {
synchronized (event) {
if (!event.isResuming() && !event.isResumedOnTimeout() && event.isSuspended() && isInScope) {
Expand Down Expand Up @@ -541,7 +541,7 @@ public void notifyListeners() {
*/
public void notifyListeners(AtmosphereResourceEvent event) {
if (listeners.size() > 0) {
logger.debug("Invoking listener with {}", event);
logger.trace("Invoking listener with {}", event);
} else {
return;
}
Expand Down Expand Up @@ -645,13 +645,13 @@ public int hashCode() {
public String toString() {
return "AtmosphereResourceImpl{" +
", hasCode" + hashCode() +
", action=" + action +
", broadcaster=" + broadcaster.getClass().getName() +
", cometSupport=" + cometSupport +
", serializer=" + serializer +
", isInScope=" + isInScope +
", useWriter=" + useWriter +
", listeners=" + listeners +
",\n action=" + action +
",\n broadcaster=" + broadcaster.getClass().getName() +
",\n cometSupport=" + cometSupport +
",\n serializer=" + serializer +
",\n isInScope=" + isInScope +
",\n useWriter=" + useWriter +
",\n listeners=" + listeners +
'}';
}

Expand Down

0 comments on commit 20311b3

Please sign in to comment.