001// Licensed under the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012 013package org.apache.tapestry5.services.assets; 014 015import org.apache.tapestry5.commons.Resource; 016import org.apache.tapestry5.http.ContentType; 017import org.apache.tapestry5.ioc.annotations.IncompatibleChange; 018 019import java.io.IOException; 020import java.io.InputStream; 021import java.io.OutputStream; 022 023/** 024 * An object, derived from a {@link Resource}, that can be streamed (ultimately, to a client web browser). In addition, 025 * a StreamableResource may be transformed (by the stack of interceptors around {@link StreamableResourceSource}: this 026 * includes transforming a Resource (example: CoffeeScript to JavaScript compilation), as well as aggregation 027 * and compression. 028 * 029 * @since 5.3 030 */ 031public interface StreamableResource 032{ 033 /** 034 * Describes the underlying {@link Resource} (or resources} for this streamable resource; expressly used 035 * as part of the object's {@code toString()}. 036 */ 037 String getDescription(); 038 039 /** 040 * Indicates if the content is compressed, or compressable. 041 */ 042 CompressionStatus getCompression(); 043 044 /** 045 * Returns the resource's content type. 046 */ 047 @IncompatibleChange(release = "5.4", details = "Changed from type String to ContentType") 048 ContentType getContentType(); 049 050 /** 051 * The size, in bytes, of the underlying bytestream. 052 */ 053 int getSize(); 054 055 /** 056 * Streams the resource's content to the provided stream. The caller is responsible for flushing or closing 057 * the output stream. 058 */ 059 void streamTo(OutputStream os) throws IOException; 060 061 /** 062 * Opens the content of the resource as an input stream; the caller is responsible for closing the stream 063 * after reading it. 064 * 065 * @return stream of the contents of the resource 066 * @throws IOException 067 */ 068 InputStream openStream() throws IOException; 069 070 /** 071 * Returns the time the resource was last modified, with accuracy to one second (so as to match 072 * the HTTP request/response date headers). 073 */ 074 long getLastModified(); 075 076 /** 077 * Compute and return the checksum of the content for this asset; the checksum should be computed 078 * based on the uncompressed content. 079 * 080 * @return checksum for uncompressed content 081 * @see AssetChecksumGenerator#generateChecksum(StreamableResource) 082 * @since 5.4 083 */ 084 String getChecksum() throws IOException; 085 086 087 /** 088 * Returns a new StreamableResource that includes the provided customizer. Customizers are invoked 089 * in the order they are added. 090 * 091 * @since 5.4 092 */ 093 StreamableResource addResponseCustomizer(ResponseCustomizer customizer); 094 095 /** 096 * Returns the customizer, if any, for this resource. This may represent an aggregate customizer. 097 * 098 * @since 5.4 099 */ 100 ResponseCustomizer getResponseCustomizer(); 101 102 /** 103 * Returns a new StreamableResource instance with the new content type. 104 * 105 * @param newContentType 106 * @since 5.4 107 */ 108 StreamableResource withContentType(ContentType newContentType); 109}