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;
                }


Reply via email to