    001// Copyright 2006, 2008, 2011, 2013 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007// http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.internal.services;
    016
    017import org.apache.tapestry5.commons.Resource;
    018import org.apache.tapestry5.services.assets.StreamableResource;
    019import org.apache.tapestry5.services.assets.StreamableResourceSource;
    020
    021import javax.servlet.http.HttpServletResponse;
    022import java.io.IOException;
    023import java.util.EnumSet;
    024import java.util.Set;
    025
    026/**
    027 * Responsible for streaming the contents of a resource to the client. This is sometimes a simple
    028 * {@link Resource} (often from the {@link org.apache.tapestry5.internal.services.javascript.ModuleDispatcher},
    029 * or more frequently an asset represented as a {@link StreamableResource} (via {@link AssetDispatcher}, {@link org.apache.tapestry5.services.assets.AssetRequestHandler},
    030 * and {@link StreamableResourceSource}). As of 5.4, the ResourceStreamer handles ETag support, as well as
    031 * validation of the checksum (provided in the URL).
    032 *
    033 * @since 5.1.0.0
    034 */
    035public interface ResourceStreamer
    036{
    037    /**
    038     * Used to customize the behavior of {@link #streamResource(org.apache.tapestry5.commons.Resource, java.lang.String, java.util.Set)}.
    039     *
    040     * @since 5.4
    041     */
    042    enum Options
    043    {
    044        /**
    045         * Omit the normal expiration date header; this is appropriate for JavaScript modules, which cannot include
    046         * their own checksum in the URL (instead, we rely on ETags to prevent unwanted data transfer).
    047         */
    048        OMIT_EXPIRATION
    049    }
    050
    051    static final Set<Options> DEFAULT_OPTIONS = EnumSet.noneOf(Options.class);
    052
    053    /**
    054     * Streams the content of the resource to the client (or sends
    055     * an alternative response such as {@link HttpServletResponse#SC_NOT_MODIFIED}). Encapsulates logic for compression
    056     * and for caching.
    057     *
    058     * @param resource
    059     *         to stream
    060     * @param providedChecksum
    061     *         checksum from URL (or null to not validate against checksum, which is normal for modules)
    062     * @param options
    063     *         enable or disable certain features
    064     * @see StreamableResourceSource
    065     */
    066    boolean streamResource(Resource resource, String providedChecksum, Set<Options> options) throws IOException;
    067
    068    /**
    069     * Streams a resource that has been assembled elsewhere.  The StreamableResource may reflect either a normal
    070     * or a compressed stream, depending on the type of resource and the capabilities of the client.
    071     *
    072     * @param resource
    073     *         content to stream
    074     * @param providedChecksum
    075     *         checksum provided (in the URL) to validate against the {@linkplain org.apache.tapestry5.services.assets.StreamableResource#getChecksum()} actual checksum}
    076     *         for the resource, may be blank to not validate against the checksum
    077     * @param options
    078     *         enable or disable certain features
    079     * @return true if the request was handled (even if sending a {@link HttpServletResponse#SC_NOT_MODIFIED} response),
    080     *         or false if the request was not handled (because the provided checksum did not match the actual checksum).
    081     * @throws IOException
    082     * @since 5.4
    083     */
    084    boolean streamResource(StreamableResource resource, String providedChecksum, Set<Options> options) throws IOException;
    085}