summaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/terminal/gwt/server/ApplicationResourceHandler.java
blob: 7cf66d5fcf9ef4228f8a596377362341e20e4c26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
@VaadinApache2LicenseForJavaFiles@
 */

package com.vaadin.terminal.gwt.server;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletResponse;

import com.vaadin.Application;
import com.vaadin.terminal.ApplicationResource;
import com.vaadin.terminal.DownloadStream;
import com.vaadin.terminal.RequestHandler;
import com.vaadin.terminal.WrappedRequest;
import com.vaadin.terminal.WrappedResponse;

public class ApplicationResourceHandler implements RequestHandler {
    private static final Pattern APP_RESOURCE_PATTERN = Pattern
            .compile("^/?APP/(\\d+)/.*");

    public boolean handleRequest(Application application,
            WrappedRequest request, WrappedResponse response)
            throws IOException {
        // Check for application resources
        String requestPath = request.getRequestPathInfo();
        if (requestPath == null) {
            return false;
        }
        Matcher resourceMatcher = APP_RESOURCE_PATTERN.matcher(requestPath);

        if (resourceMatcher.matches()) {
            ApplicationResource resource = application
                    .getResource(resourceMatcher.group(1));
            if (resource != null) {
                DownloadStream stream = resource.getStream();
                if (stream != null) {
                    stream.setCacheTime(resource.getCacheTime());
                    stream.writeTo(response);
                    return true;
                }
            }
            // We get here if the url looks like an application resource but no
            // resource can be served
            response.sendError(HttpServletResponse.SC_NOT_FOUND,
                    request.getRequestPathInfo() + " can not be found");
            return true;
        }

        return false;
    }
}