Skip to content
Snippets Groups Projects
Commit c33c0952 authored by srosse's avatar srosse
Browse files

OO-1446: set expiration date for versioned static file ( and transparent.gif...

OO-1446: set expiration date for versioned static file ( and transparent.gif ), refactor Workbook media resource to work without temporary files, add flag to media resources to accept or not ranges, add patch for Tomcat 8 ( thanks D. Haag )
parent 42adb0ed
No related branches found
No related tags found
No related merge requests found
Showing
with 114 additions and 255 deletions
......@@ -232,6 +232,11 @@ public class StaticsLegacyDispatcher implements Dispatcher {
this.inStream = inStream;
this.rd = rd;
}
@Override
public boolean acceptRanges() {
return false;
}
@Override
public String getContentType() {
......
......@@ -101,6 +101,11 @@ public class CmdDownloadZip implements FolderCommand {
this.selection = selection;
this.currentContainer = currentContainer;
}
@Override
public boolean acceptRanges() {
return false;
}
@Override
public String getContentType() {
......
......@@ -158,6 +158,10 @@ public class ClasspathMediaResource extends LogDelegator implements MediaResourc
}
}
@Override
public boolean acceptRanges() {
return true;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
......
......@@ -45,6 +45,11 @@ public class CleanupAfterDeliveryFileMediaResource extends FileMediaResource {
public CleanupAfterDeliveryFileMediaResource(File file) {
super(file, true);
}
@Override
public boolean acceptRanges() {
return false;
}
/**
* @see org.olat.core.gui.media.MediaResource#release()
......
......@@ -35,10 +35,14 @@ import javax.servlet.http.HttpServletResponse;
*/
public class DefaultMediaResource implements MediaResource {
private String contentType;
private Long size;
private InputStream inputStream;
private Long lastModified;
private String contentType;
@Override
public boolean acceptRanges() {
return false;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
......@@ -51,7 +55,7 @@ public class DefaultMediaResource implements MediaResource {
* @see org.olat.core.gui.media.MediaResource#getInputStream()
*/
public InputStream getInputStream() {
return inputStream;
return null;
}
/**
......@@ -75,13 +79,6 @@ public class DefaultMediaResource implements MediaResource {
this.contentType = contentType;
}
/**
* @param inputStream
*/
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
/**
* @param lastModified
*/
......@@ -100,14 +97,13 @@ public class DefaultMediaResource implements MediaResource {
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
public void prepare(HttpServletResponse hres) {
//
//
}
/**
* @see org.olat.core.gui.media.MediaResource#release()
*/
public void release() {
//
//
}
}
\ No newline at end of file
......@@ -52,8 +52,8 @@ public class ExcelMediaResource extends StringMediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
@Override
public void prepare(HttpServletResponse hres) {
// anything
hres.setCharacterEncoding("utf-8");
......@@ -65,21 +65,7 @@ public class ExcelMediaResource extends StringMediaResource {
else {
name = optionalFilename;
}
/*try {
//String test = "aüa\u0395\u0159a\u0641bcd\u0395a\u03BA\u03C4\u03B5a\u0410\u0432\u0442b\u0159c";
String output = null;
byte[] b = test.getBytes("utf-8");
output = new String(b, "iso-8859-1");
String res = sb.toString();
//output = res;
} catch (UnsupportedEncodingException e) {
}
*/
//boolean isIE = false; // ie and konqueror and safari: true, only iso-8859-1
//hres.setHeader("Content-Disposition", "attachment; filename=" + (isIE?test:output) + ".xls");
hres.setHeader("Content-Disposition", "attachment; filename=" + name + ".xls");
hres.setHeader("Content-Description", "OLAT Generated data");
}
......@@ -93,10 +79,6 @@ public class ExcelMediaResource extends StringMediaResource {
if (!p.matcher(fileName).matches()) {
throw new AssertException(fileName + " is not a valid filename");
}
//TODO: check for no file extension and only valid characters
// StringHelper.check4SafeFileName(fileName);
this.optionalFilename = fileName;
}
}
\ No newline at end of file
......@@ -89,9 +89,15 @@ public class FileMediaResource implements MediaResource {
this.filesInfoMBean = (FilesInfoMBean) CoreSpringFactory.getBean(FilesInfoMBean.class.getCanonicalName());
}
@Override
public boolean acceptRanges() {
return true;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
*/
@Override
public String getContentType() {
String fileName = file.getName();
String mimeType = WebappHelper.getMimeType(fileName);
......@@ -102,6 +108,7 @@ public class FileMediaResource implements MediaResource {
/**
* @return @see org.olat.core.gui.media.MediaRequest#getSize()
*/
@Override
public Long getSize() {
return new Long(file.length());
}
......@@ -109,6 +116,7 @@ public class FileMediaResource implements MediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#getInputStream()
*/
@Override
public InputStream getInputStream() {
BufferedInputStream bis = null;
try {
......@@ -123,6 +131,7 @@ public class FileMediaResource implements MediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#getLastModified()
*/
@Override
public Long getLastModified() {
return new Long(file.lastModified());
}
......@@ -130,6 +139,7 @@ public class FileMediaResource implements MediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#release()
*/
@Override
public void release() {
// void
}
......@@ -137,6 +147,7 @@ public class FileMediaResource implements MediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
@Override
public void prepare(HttpServletResponse hres) {
if (deliverAsAttachment) {
// encode filename in ISO8859-1; does not really help but prevents from filename not being displayed at all
......@@ -147,9 +158,9 @@ public class FileMediaResource implements MediaResource {
hres.setHeader("Content-Disposition", "inline");
}
}
@Override
public String toString() {
return "FileMediaResource:"+file.getAbsolutePath();
}
}
\ No newline at end of file
......@@ -46,6 +46,7 @@ public class ForbiddenMediaResource extends DefaultMediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
@Override
public void prepare(HttpServletResponse hres) {
try {
hres.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: " + forbiddenFoundURI);
......
......@@ -56,6 +56,11 @@ public class HttpRequestMediaResource implements MediaResource {
public HttpRequestMediaResource(HttpResponse response) {
this.response = response;
}
@Override
public boolean acceptRanges() {
return false;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
......
......@@ -20,7 +20,6 @@
package org.olat.core.gui.media;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
......@@ -79,9 +78,4 @@ public class JSONMediaResource extends DefaultMediaResource {
log.error("", e);
}
}
@Override
public InputStream getInputStream() {
return null;
}
}
......@@ -35,6 +35,8 @@ import javax.servlet.http.HttpServletResponse;
* @author Felix Jost
*/
public interface MediaResource {
public boolean acceptRanges();
/**
* @return
......
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
*/
package org.olat.core.gui.media;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
/**
* Description:<br>
* Factory for different common types of MediaResources
* <P>
* Initial Date: 09.01.2007 <br>
*
* @author Felix Jost, http://www.goodsolutions.ch
*/
public class MediaResourceFactory {
/**
* Allow private browser caching of <seconds> seconds hours. After that period
* the browser <br>
* must revalidate the resource using a If-Modified-Since request header.<br>
* Usually the answer will be a Not-Modified, but it gives us the chance<br>
* to update CSS and Javascript files ant at least the next day users<br>
* will be up to date as well. <br>
* Add proxy max ager in case a proxy ignored the private cache settings.<br>
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9<br>
* <br>
* the bevaviour of this method is that it simply overwrites or sets a new
* http-response-header:<br>
* response.setHeader("Cache-Control", "private, max-age=21600,
* s-maxage=21600");<br>
* <br>
*
* @param originalMediaResource the mediaResource to be cache-enabled
* @param seconds determines how many seconds a browser may cache this
* mediaresource before revalidating it
* @return the resulting cachable mediaresource
*/
// thanks to Florian Gnägi.
public static MediaResource createCachableMediaResource(MediaResource originalMediaResource, int seconds) {
return new CachableMediaResource(originalMediaResource, seconds);
}
}
class CachableMediaResource implements MediaResource {
private final MediaResource original;
private final int seconds;
public CachableMediaResource(MediaResource original, int seconds) {
this.original = original;
this.seconds = seconds;
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#getContentType()
*/
public String getContentType() {
return original.getContentType();
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#getInputStream()
*/
public InputStream getInputStream() {
return original.getInputStream();
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#getLastModified()
*/
public Long getLastModified() {
return original.getLastModified();
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#getSize()
*/
public Long getSize() {
return original.getSize();
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
public void prepare(HttpServletResponse hres) {
original.prepare(hres);
// add or set additional header
hres.setHeader("Cache-Control", "private, max-age=" + seconds + ", s-maxage=" + seconds);
}
/*
* (non-Javadoc)
*
* @see org.olat.core.gui.media.MediaResource#release()
*/
public void release() {
original.release();
}
}
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
*/
package org.olat.core.gui.media;
import java.io.File;
/**
* Description:<BR/>
* <p>
* The mimed file media resource explicitly uses the given mime type instead of
* the mime type compiled from the file name.
* <p>
* Initial Date: Mar 7, 2005
*
* @author Felix Jost
*/
public class MimedFileMediaResource extends FileMediaResource {
private final String mimeType;
/**
* @param file
* @param mimeType
* @param deliverAsAttachment true: deliver as attachment; false: deliver inline
*/
public MimedFileMediaResource(File file, String mimeType, boolean deliverAsAttachment) {
super(file, deliverAsAttachment);
this.mimeType = mimeType;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
*/
public String getContentType() {
return mimeType;
}
}
......@@ -48,6 +48,7 @@ public class NotFoundMediaResource extends DefaultMediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
@Override
public void prepare(HttpServletResponse hres) {
try {
hres.sendError(HttpServletResponse.SC_NOT_FOUND, "Not found: " + notFoundURI);
......@@ -55,5 +56,4 @@ public class NotFoundMediaResource extends DefaultMediaResource {
// we can do nothing better
}
}
}
\ No newline at end of file
......@@ -39,6 +39,7 @@ public class NothingChangedMediaResource extends DefaultMediaResource {
/**
* @see org.olat.core.gui.media.MediaResource#prepare(javax.servlet.http.HttpServletResponse)
*/
@Override
public void prepare(HttpServletResponse hres) {
hres.setStatus(HttpServletResponse.SC_OK);
}
......
......@@ -49,6 +49,11 @@ public class RedirectMediaResource implements MediaResource {
public RedirectMediaResource(String redirectURL) {
this.redirectURL = redirectURL;
}
@Override
public boolean acceptRanges() {
return false;
}
/**
* @see org.olat.core.gui.media.MediaResource#getContentType()
......
......@@ -157,7 +157,7 @@ public class ServletUtil {
//fxdiff FXOLAT-118: accept range to deliver videos for iPad (implementation based on Tomcat)
List<Range> ranges = parseRange(httpReq, httpResp, (lastModified == null ? -1 : lastModified.longValue()), (size == null ? 0 : size.longValue()));
if(ranges != null) {
if(ranges != null && mr.acceptRanges()) {
httpResp.setHeader("Accept-Ranges", "bytes");
}
// maybe some more preparations
......
......@@ -57,6 +57,11 @@ public class StreamedMediaResource implements MediaResource {
this.lastModified = lastModified;
this.contentType = contentType;
}
@Override
public boolean acceptRanges() {
return false;
}
@Override
public String getContentType() {
......
......@@ -30,6 +30,7 @@ import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletResponse;
import org.olat.core.logging.AssertException;
......@@ -42,6 +43,11 @@ public class StringMediaResource extends DefaultMediaResource {
//default - if no encoding is specified we assume iso latin
private String encoding = "iso-8859-1";
private String data;
@Override
public boolean acceptRanges() {
return true;
}
/**
* @see org.olat.core.gui.media.MediaResource#getInputStream()
......
......@@ -19,13 +19,12 @@
*/
package org.olat.core.gui.media;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.logging.AssertException;
import org.olat.core.util.CodeHelper;
......@@ -36,30 +35,58 @@ import org.olat.core.util.CodeHelper;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class WorkbookMediaResource extends FileMediaResource {
public class WorkbookMediaResource implements MediaResource {
private final Workbook wb;
public WorkbookMediaResource(Workbook wb) {
super(null, true);
FileOutputStream fos = null;
this.wb = wb;
}
@Override
public boolean acceptRanges() {
return false;
}
@Override
public String getContentType() {
return "application/vnd.ms-excel; charset=utf-8";
}
@Override
public Long getSize() {
return null;
}
@Override
public InputStream getInputStream() {
return null;
}
@Override
public Long getLastModified() {
return null;
}
@Override
public void prepare(HttpServletResponse hres) {
hres.setCharacterEncoding("utf-8");
String name = "TableExport" + CodeHelper.getRAMUniqueID();
hres.setHeader("Content-Disposition", "attachment; filename=" + name + ".xls");
hres.setHeader("Content-Description", "OpenOLAT Generated data");
try {
File f = new File(FolderConfig.getCanonicalTmpDir(), "TableExport" + CodeHelper.getRAMUniqueID() + ".xls");
fos = new FileOutputStream(f);
wb.write(fos);
fos.close();
this.file = f;
wb.write(hres.getOutputStream());
} catch (IOException e) {
throw new AssertException("error preparing media resource for XLS Table Export", e);
} finally {
IOUtils.closeQuietly(fos);
}
}
/**
* @see org.olat.core.gui.media.MediaResource#release()
*/
@Override
public void release() {
file.delete();
//
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment