I am trying to stream flash video files in a protected way using this Media 
Service....

It works fine, but once 2 people access the same file one of the streams sooner 
or later just stops and the connection is closed....

Has anyone tried something similiar and tested the parallel acces on the same 
file?


package com.company.services;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;

import javax.activation.MimetypesFileTypeMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hivemind.util.Defense;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.IEngineService;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.services.LinkFactory;
import org.apache.tapestry.services.ServiceConstants;
import org.apache.tapestry.util.ContentType;
import org.apache.tapestry.web.WebResponse;

import com.fivecast.pages.AdminHomeConfig;
import com.fivecast.pages.Home;
import com.fivecast.pages.Video;

public class MediaService implements IEngineService {
        public static final String SERVICE_NAME = "media";
        
        private static final Log LOG = LogFactory.getLog(MediaService.class);
        
        private LinkFactory _linkFactory;
        private WebResponse _response;
        private File mediafile = null;

        public ILink getLink(boolean post, Object parameter) {
                Defense.isAssignable(parameter, IComponent.class, "parameter");
                IComponent component = (IComponent) parameter;
                IPage page = component.getPage();
                Map<String, String> parameters = new HashMap<String, String>();
                parameters.put(ServiceConstants.SERVICE, getName());
                parameters.put(ServiceConstants.PAGE, page.getPageName());
                parameters.put(ServiceConstants.COMPONENT, null);
                if(page.getPageName().equals("Home"))
                {
                        Home p = (Home)page;
                        mediafile = p.getFile();
                }
                else if(page.getPageName().equals("Video"))
                {
                        Video p = (Video)page;
                        mediafile = p.getFile();
                }
                else if(page.getPageName().equals("AdminHomeConfig"))
                {
                        AdminHomeConfig p = (AdminHomeConfig)page;
                        mediafile = p.getFile();
                }
                if(mediafile != null)
                {
                        mediafile.setReadOnly();
                        parameters.put("mediafilename", mediafile.getName());
                }
//              parameters.put("mediafilename", 
mediafile.getName().substring(0, mediafile.getName().length()-4));
                return _linkFactory.constructLink(this, false, parameters, 
true);
        }

        public void service(IRequestCycle cycle) throws IOException {
                try {
                        cycle.getAbsoluteURL(SERVICE_NAME);
                        serveImage();
                } catch (ClassCastException ex) {
                        LOG.error("--> ClassCastException:" + ex);
                } catch (Throwable ex) {
                        LOG.error("--> Throwable:" + ex);
                        try
                        {
                                output.close();
                                raf.close();
                                LOG.info("--> stream close.");
                        } catch(Exception e)
                        {
                                LOG.error("--> stream couldn't close.");
                        }
                }
                return;
        }
        
        private BufferedOutputStream output;
//      BufferedInputStream inputStream;
        private RandomAccessFile raf;

        
        private void serveImage() throws IOException {
                output = new BufferedOutputStream(_response.getOutputStream(new 
ContentType(getMimeType())));
                synchronized (this)
                {
                        try
                        {
                                raf = new RandomAccessFile(mediafile, "r");
                                if(raf != null)
                                {
                                        byte[] byteArray=new byte[1024*300];
                                        int numRead = 0;
                                        while ((numRead = raf.read(byteArray)) 
!= -1)
                                        {
                                                output.write(byteArray, 0, 
numRead);
                                                output.flush();
                                        }
                                }
                        } catch (FileNotFoundException e)
                        {
                                e.printStackTrace();
                                LOG.error("--> file read error:" +  e);
                        }
                        catch (IllegalArgumentException ex){
                                ex.printStackTrace();
                                LOG.error("--> file read error:" +  
ex.getMessage());
                        }
                        catch (NullPointerException ex){
                                LOG.error("--> file read error:" +  
ex.getMessage());
                                
                        }
                        
                        catch (IOException ex){
                                LOG.error("--> file read error:" +  
ex.getMessage());
                        }
                        finally {
                                output.close();
                                raf.close();
                        }
                        
                        output.close();
                        raf.close();
                }
        }
/*      
        private void serveImage() throws IOException {
                output = new BufferedOutputStream(_response.getOutputStream(new 
ContentType(getMimeType())));
                synchronized (this)
                {
                        inputStream = new BufferedInputStream(getMediaFile());
                        if(inputStream != null)
                        {
                                byte[] byteArray=new byte[1024*300];
                                int numRead = 0;
                                while ((numRead = inputStream.read(byteArray)) 
!= -1)
                                {
                                        output.write(byteArray, 0, numRead);
                                        output.flush();
                                }
                        }
                        output.close();
                        inputStream.close();
                }
                
        }
*/      
        public String getName() {
                return SERVICE_NAME;
        }

        public void setLinkFactory(LinkFactory linkFactory) {
                _linkFactory = linkFactory;
        }

        public void setResponse(WebResponse response) {
                _response = response;
        }
        
        private String getMimeType() {
                try {
                        MimetypesFileTypeMap map = new MimetypesFileTypeMap();
                        return map.getContentType(mediafile);
                } catch (Exception e) {
                        return null;
                }
        }
        
        public FileInputStream getMediaFile() {
                try {
                        if (mediafile != null) {
                                FileInputStream streamer = new 
FileInputStream(mediafile);
                                return streamer;
                        }
                } catch (FileNotFoundException e) {
                }
                return null;
        }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to