/* * Copyright 2011 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.terminal; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import com.vaadin.Application; import com.vaadin.service.FileTypeResolver; import com.vaadin.terminal.Terminal.ErrorEvent; /** * FileResources are files or directories on local filesystem. The * files and directories are served through URI:s to the client terminal and * thus must be registered to an URI context before they can be used. The * resource is automatically registered to the application when it is created. * * @author Vaadin Ltd. * @since 3.0 */ @SuppressWarnings("serial") public class FileResource implements ApplicationResource { /** * Default buffer size for this stream resource. */ private int bufferSize = 0; /** * File where the downloaded content is fetched from. */ private File sourceFile; /** * Application. */ private final Application application; /** * Default cache time for this stream resource. */ private long cacheTime = DownloadStream.DEFAULT_CACHETIME; /** * Creates a new file resource for providing given file for client * terminals. */ public FileResource(File sourceFile, Application application) { this.application = application; setSourceFile(sourceFile); application.addResource(this); } /** * Gets the resource as stream. * * @see com.vaadin.terminal.ApplicationResource#getStream() */ @Override public DownloadStream getStream() { try { final DownloadStream ds = new DownloadStream(new FileInputStream( sourceFile), getMIMEType(), getFilename()); ds.setParameter("Content-Length", String.valueOf(sourceFile.length())); ds.setCacheTime(cacheTime); return ds; } catch (final FileNotFoundException e) { // Log the exception using the application error handler getApplication().getErrorHandler().terminalError(new ErrorEvent() { @Override public Throwable getThrowable() { return e; } }); return null; } } /** * Gets the source file. * * @return the source File. */ public File getSourceFile() { return sourceFile; } /** * Sets the source file. * * @param sourceFile * the source file to set. */ public void setSourceFile(File sourceFile) { this.sourceFile = sourceFile; } /** * @see com.vaadin.terminal.ApplicationResource#getApplication() */ @Override public Application getApplication() { return application; } /** * @see com.vaadin.terminal.ApplicationResource#getFilename() */ @Override public String getFilename() { return sourceFile.getName(); } /** * @see com.vaadin.terminal.Resource#getMIMEType() */ @Override public String getMIMEType() { return FileTypeResolver.getMIMEType(sourceFile); } /** * Gets the length of cache expiration time. This gives the adapter the * possibility cache streams sent to the client. The caching may be made in * adapter or at the client if the client supports caching. Default is * DownloadStream.DEFAULT_CACHETIME. * * @return Cache time in milliseconds. */ @Override public long getCacheTime() { return cacheTime; } /** * Sets the length of cache expiration time. This gives the adapter the * possibility cache streams sent to the client. The caching may be made in * adapter or at the client if the client supports caching. Zero or negavive * value disbales the caching of this stream. * * @param cacheTime * the cache time in milliseconds. */ public void setCacheTime(long cacheTime) { this.cacheTime = cacheTime; } /* documented in superclass */ @Override public int getBufferSize() { return bufferSize; } /** * Sets the size of the download buffer used for this resource. * * @param bufferSize * the size of the buffer in bytes. */ public void setBufferSize(int bufferSize) { this.bufferSize = bufferSize; } }