You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/01/26 09:51:40 UTC

svn commit: r1561466 - in /openmeetings/trunk/singlewebapp: WebContent/red5/red5-highperf.sh src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java

Author: solomax
Date: Sun Jan 26 08:51:39 2014
New Revision: 1561466

URL: http://svn.apache.org/r1561466
Log:
[OPENMEETINGS-885] big files are played in Chrome as expected;
	Apache License header is added;

Modified:
    openmeetings/trunk/singlewebapp/WebContent/red5/red5-highperf.sh
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java

Modified: openmeetings/trunk/singlewebapp/WebContent/red5/red5-highperf.sh
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/red5/red5-highperf.sh?rev=1561466&r1=1561465&r2=1561466&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/WebContent/red5/red5-highperf.sh (original)
+++ openmeetings/trunk/singlewebapp/WebContent/red5/red5-highperf.sh Sun Jan 26 08:51:39 2014
@@ -1,4 +1,17 @@
 #!/bin/bash
+# #############################################
+# 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.
+# #############################################
 
 if [ -z "$RED5_HOME" ]; then export RED5_HOME=.; fi
 

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java?rev=1561466&r1=1561465&r2=1561466&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java Sun Jan 26 08:51:39 2014
@@ -38,6 +38,8 @@ import org.apache.openmeetings.db.dao.us
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.wicket.protocol.http.servlet.ResponseIOException;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.AbstractResource;
 import org.apache.wicket.request.resource.ContentDisposition;
@@ -49,6 +51,7 @@ import org.apache.wicket.util.resource.F
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.time.Time;
 import org.slf4j.Logger;
 
 public abstract class RecordingResourceReference extends ResourceReference {
@@ -69,8 +72,12 @@ public abstract class RecordingResourceR
 			private final static String RANGES_BYTES = "bytes";
 			private File file;
 			private boolean isRange = false;
-			private int start = 0;
-			private int end = 0;
+			private long start = 0;
+			private long end = 0;
+			
+			private long getChunkLength() {
+				return isRange ? end - start + 1 : (file == null ? -1 : file.length());
+			}
 			
 			private IResourceStream getResourceStream() {
 				return file == null ? null : new FileResourceStream(file) {
@@ -80,7 +87,8 @@ public abstract class RecordingResourceR
 					@Override
 					public InputStream getInputStream() throws ResourceStreamNotFoundException {
 						if (bi == null) {
-							bi = new BoundedInputStream(super.getInputStream(), isRange ? end + start + 1 : -1);
+							//bi = new BoundedInputStream(super.getInputStream(), end + 1);
+							bi = new BoundedInputStream(super.getInputStream(), isRange ? end + 1 : (file == null ? -1 : file.length()));
 							try {
 								bi.skip(start);
 							} catch (IOException e) {
@@ -92,7 +100,7 @@ public abstract class RecordingResourceR
 					
 					@Override
 					public Bytes length() {
-						return Bytes.bytes(isRange ? end - start + 1 : file.length());
+						return Bytes.bytes(getChunkLength());
 					}
 					
 					@Override
@@ -109,7 +117,17 @@ public abstract class RecordingResourceR
 					}
 				};
 			}
-			
+
+			@Override
+			protected void setResponseHeaders(ResourceResponse data, Attributes attributes) {
+				Response response = attributes.getResponse();
+				if (response instanceof WebResponse) {
+					WebResponse webResponse = (WebResponse)response;
+					webResponse.setStatus(isRange ? HttpServletResponse.SC_PARTIAL_CONTENT : HttpServletResponse.SC_OK);
+				}
+				super.setResponseHeaders(data, attributes);
+			}
+
 			@Override
 			protected ResourceResponse newResourceResponse(Attributes attributes) {
 				ResourceResponse rr = new ResourceResponse();
@@ -120,40 +138,38 @@ public abstract class RecordingResourceR
 					rr.setFileName(getFileName(r));
 					rr.setContentType(RecordingResourceReference.this.getContentType());
 					rr.setContentDisposition(ContentDisposition.INLINE);
+					rr.setLastModified(Time.millis(file.lastModified()));
 					rr.getHeaders().addHeader(ACCEPT_RANGES_HEADER, RANGES_BYTES);
 					String range = ((HttpServletRequest)attributes.getRequest().getContainerRequest()).getHeader(RANGE_HEADER);
 					if (range != null && range.startsWith(RANGES_BYTES)) {
-						String[] bounds = range.substring(RANGES_BYTES.length() + 1).split("-"); //TODO open ranges !!
-						if (bounds != null && bounds.length > 1) {
+						String[] bounds = range.substring(RANGES_BYTES.length() + 1).split("-");
+						if (bounds != null && bounds.length > 0) {
+							long length = file.length();
 							isRange = true;
-							start = Integer.parseInt(bounds[0]);
-							end = Integer.parseInt(bounds[1]);
+							start = Long.parseLong(bounds[0]);
+							end = bounds.length > 1 ? Long.parseLong(bounds[1]) : length - 1;
 							//Content-Range: bytes 229376-232468/232469
-							rr.getHeaders().addHeader(CONTENT_RANGE_HEADER, String.format("%s %d-%d/%d", RANGES_BYTES, start, end, file.length()));
+							rr.getHeaders().addHeader(CONTENT_RANGE_HEADER, String.format("%s %d-%d/%d", RANGES_BYTES, start, end, length));
 						}
 					}
-					final IResourceStream rStream = getResourceStream();
-					rr.setContentLength(rStream.length().bytes());
-					try {
-						final InputStream  s = rStream.getInputStream();
-						rr.setWriteCallback(new WriteCallback() {
-							@Override
-							public void writeData(Attributes attributes) throws IOException {
-								try {
-									writeStream(attributes, s);
-								} catch (ResponseIOException e) {
-									if (!isRange) {
-										log.error("Error while playing the stream", e);
-									}
-									// in case of range operations we expecting such exceptions 
-								} finally {
-									rStream.close();
+					rr.setContentLength(getChunkLength());
+					rr.setWriteCallback(new WriteCallback() {
+						@Override
+						public void writeData(Attributes attributes) throws IOException {
+							IResourceStream rStream = getResourceStream();
+							try {
+								writeStream(attributes, rStream.getInputStream());
+							} catch (ResourceStreamNotFoundException e1) {
+							} catch (ResponseIOException e) {
+								// in case of range operations we expecting such exceptions
+								if (!isRange) {
+									log.error("Error while playing the stream", e);
 								}
+							} finally {
+								rStream.close();
 							}
-						});
-					} catch (ResourceStreamNotFoundException e1) {
-						rr.setError(HttpServletResponse.SC_NOT_FOUND);
-					}
+						}
+					});
 				} else {
 					rr.setError(HttpServletResponse.SC_NOT_FOUND);
 				}
@@ -177,10 +193,12 @@ public abstract class RecordingResourceR
 	}
 	
 	private FlvRecording getRecording(Long id) {
-		FlvRecordingDao recDao = getBean(FlvRecordingDao.class);
-		FlvRecording r = recDao.get(id);
+		FlvRecording r = getBean(FlvRecordingDao.class).get(id);
 		// TODO should we process public?
 		// || r.getOwnerId() == 0 || r.getParentFileExplorerItemId() == null || r.getParentFileExplorerItemId() == 0
+		if (r == null) {
+			return r;
+		}
 		if (r.getOwnerId() == null || getUserId() == r.getOwnerId()) {
 			return r;
 		}