You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by su...@gmx.de on 2008/05/08 10:14:51 UTC

Tapestry 4.1 Secure streaming of video files

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: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Tapestry 4.1 Secure streaming of video files

Posted by Andreas Andreou <an...@gmail.com>.
Hi,
IEngineService are the closest you'll get to servlets from Tapestry

This basically means there's only one instance of them - i guess it's
easy for people
to forget this and start storing state in that (only) instance like
you do with mediafile
(linkFactory is a hivemind service and webRespone is a hivemind
threaded service so they're ok)

What you need to do is fix your getlink method (it generates a link to
the page service now, why?
it needs to generate a link to itself and add all the parameters
needed to process the request when
the user eventually clicks on it) and perhaps add the mediafilename or
id as a parameter (similar to
your commented out code)

Then you need to make service read that parameter, and do the further
processing without storing
any state to the engineservice class

On Thu, May 8, 2008 at 11:25 AM,  <su...@gmx.de> wrote:
> Here is the stack trace:
>
>  2008-05-07 18:14:13,375 [http-8080-Processor24] INFO  com.company.services.MediaAsset  - Loading video file from:
>  2008-05-07 18:14:13,375 [http-8080-Processor24] INFO  com.company.services.MediaAsset  - file=http://192.160.25.194:8080/videostore/media/CF-00001-0002-DE.flv?page=Home&showdigits=true&autostart=true
>  2008-05-07 18:14:15,328 [http-8080-Processor22] ERROR com.company.services.MediaService  - --> file read error4:org.apache.catalina.connector.ClientAbortException: null
>  java.net.SocketException: Connection reset by peer: socket write error
>         at java.net.SocketOutputStream.socketWrite0(Native Method)
>         at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
>         at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
>         at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:746)
>         at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
>         at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:304)
>         at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:991)
>         at org.apache.coyote.Response.action(Response.java:182)
>         at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:322)
>         at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:293)
>         at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:97)
>         at com.company.services.MediaService.serveImage(MediaService.java:117)
>         at com.company.services.MediaService.service(MediaService.java:80)
>         at $IEngineService_119c428b0a8.service($IEngineService_119c428b0a8.java)
>         at org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
>         at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:241)
>         at org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
>         at $WebRequestServicer_119c428b06d.service($WebRequestServicer_119c428b06d.java)
>         at org.trails.i18n.LocaleFilter.service(LocaleFilter.java:26)
>         at $WebRequestServicerFilter_119c428b06b.service($WebRequestServicerFilter_119c428b06b.java)
>         at $WebRequestServicer_119c428b06f.service($WebRequestServicer_119c428b06f.java)
>         at $WebRequestServicer_119c428b067.service($WebRequestServicer_119c428b067.java)
>         at org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
>         at $ServletRequestServicer_119c428b04d.service($ServletRequestServicer_119c428b04d.java)
>         at org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
>         at $ServletRequestServicerFilter_119c428b049.service($ServletRequestServicerFilter_119c428b049.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
>         at $ServletRequestServicerFilter_119c428b047.service($ServletRequestServicerFilter_119c428b047.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
>         at $ServletRequestServicerFilter_119c428b04b.service($ServletRequestServicerFilter_119c428b04b.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at $ServletRequestServicer_119c428b041.service($ServletRequestServicer_119c428b041.java)
>         at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
>         at org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
>         at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
>         at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.trails.security.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:152)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:229)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
>         at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
>         at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
>         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
>         at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
>         at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
>         at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
>         at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
>         at java.lang.Thread.run(Thread.java:619)
>
>  2008-05-07 18:14:15,500 [http-8080-Processor25] ERROR com.company.services.MediaService  - --> file read error4:org.apache.catalina.connector.ClientAbortException: null
>  java.net.SocketException: Connection reset by peer: socket write error
>         at java.net.SocketOutputStream.socketWrite0(Native Method)
>         at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
>         at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
>         at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:746)
>         at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
>         at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:304)
>         at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:991)
>         at org.apache.coyote.Response.action(Response.java:182)
>         at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:322)
>         at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:293)
>         at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:97)
>         at com.company.services.MediaService.serveImage(MediaService.java:117)
>         at com.company.services.MediaService.service(MediaService.java:80)
>         at $IEngineService_119c428b0a8.service($IEngineService_119c428b0a8.java)
>         at org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
>         at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:241)
>         at org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
>         at $WebRequestServicer_119c428b06d.service($WebRequestServicer_119c428b06d.java)
>         at org.trails.i18n.LocaleFilter.service(LocaleFilter.java:26)
>         at $WebRequestServicerFilter_119c428b06b.service($WebRequestServicerFilter_119c428b06b.java)
>         at $WebRequestServicer_119c428b06f.service($WebRequestServicer_119c428b06f.java)
>         at $WebRequestServicer_119c428b067.service($WebRequestServicer_119c428b067.java)
>         at org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
>         at $ServletRequestServicer_119c428b04d.service($ServletRequestServicer_119c428b04d.java)
>         at org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
>         at $ServletRequestServicerFilter_119c428b049.service($ServletRequestServicerFilter_119c428b049.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
>         at $ServletRequestServicerFilter_119c428b047.service($ServletRequestServicerFilter_119c428b047.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
>         at $ServletRequestServicerFilter_119c428b04b.service($ServletRequestServicerFilter_119c428b04b.java)
>         at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
>         at $ServletRequestServicer_119c428b041.service($ServletRequestServicer_119c428b041.java)
>         at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
>         at org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
>         at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
>         at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.trails.security.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:152)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:229)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
>         at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>         at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
>         at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
>         at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
>         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
>         at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
>         at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
>         at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
>         at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
>         at java.lang.Thread.run(Thread.java:619)
>
>
>  -------- Original-Nachricht --------
>  > Datum: Thu, 08 May 2008 10:14:51 +0200
>  > Von: superoverdrive@gmx.de
>  > An: "Tapestry users" <us...@tapestry.apache.org>
>  > Betreff: Tapestry 4.1 Secure streaming of video files
>
>
>
>  > 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: users-unsubscribe@tapestry.apache.org
>  > For additional commands, e-mail: users-help@tapestry.apache.org
>
>  ---------------------------------------------------------------------
>  To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>  For additional commands, e-mail: users-help@tapestry.apache.org
>
>



-- 
Andreas Andreou - andyhot@apache.org - http://blog.andyhot.gr
Tapestry / Tacos developer
Open Source / JEE Consulting

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Tapestry 4.1 Secure streaming of video files

Posted by su...@gmx.de.
Here is the stack trace:

2008-05-07 18:14:13,375 [http-8080-Processor24] INFO  com.company.services.MediaAsset  - Loading video file from: 
2008-05-07 18:14:13,375 [http-8080-Processor24] INFO  com.company.services.MediaAsset  - file=http://192.160.25.194:8080/videostore/media/CF-00001-0002-DE.flv?page=Home&showdigits=true&autostart=true
2008-05-07 18:14:15,328 [http-8080-Processor22] ERROR com.company.services.MediaService  - --> file read error4:org.apache.catalina.connector.ClientAbortException: null
java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:746)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
	at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:304)
	at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:991)
	at org.apache.coyote.Response.action(Response.java:182)
	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:322)
	at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:293)
	at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:97)
	at com.company.services.MediaService.serveImage(MediaService.java:117)
	at com.company.services.MediaService.service(MediaService.java:80)
	at $IEngineService_119c428b0a8.service($IEngineService_119c428b0a8.java)
	at org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
	at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:241)
	at org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
	at $WebRequestServicer_119c428b06d.service($WebRequestServicer_119c428b06d.java)
	at org.trails.i18n.LocaleFilter.service(LocaleFilter.java:26)
	at $WebRequestServicerFilter_119c428b06b.service($WebRequestServicerFilter_119c428b06b.java)
	at $WebRequestServicer_119c428b06f.service($WebRequestServicer_119c428b06f.java)
	at $WebRequestServicer_119c428b067.service($WebRequestServicer_119c428b067.java)
	at org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
	at $ServletRequestServicer_119c428b04d.service($ServletRequestServicer_119c428b04d.java)
	at org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
	at $ServletRequestServicerFilter_119c428b049.service($ServletRequestServicerFilter_119c428b049.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
	at $ServletRequestServicerFilter_119c428b047.service($ServletRequestServicerFilter_119c428b047.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
	at $ServletRequestServicerFilter_119c428b04b.service($ServletRequestServicerFilter_119c428b04b.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at $ServletRequestServicer_119c428b041.service($ServletRequestServicer_119c428b041.java)
	at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
	at org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.trails.security.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:152)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:229)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:619)

2008-05-07 18:14:15,500 [http-8080-Processor25] ERROR com.company.services.MediaService  - --> file read error4:org.apache.catalina.connector.ClientAbortException: null
java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:746)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
	at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:304)
	at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:991)
	at org.apache.coyote.Response.action(Response.java:182)
	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:322)
	at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:293)
	at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:97)
	at com.company.services.MediaService.serveImage(MediaService.java:117)
	at com.company.services.MediaService.service(MediaService.java:80)
	at $IEngineService_119c428b0a8.service($IEngineService_119c428b0a8.java)
	at org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
	at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:241)
	at org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
	at $WebRequestServicer_119c428b06d.service($WebRequestServicer_119c428b06d.java)
	at org.trails.i18n.LocaleFilter.service(LocaleFilter.java:26)
	at $WebRequestServicerFilter_119c428b06b.service($WebRequestServicerFilter_119c428b06b.java)
	at $WebRequestServicer_119c428b06f.service($WebRequestServicer_119c428b06f.java)
	at $WebRequestServicer_119c428b067.service($WebRequestServicer_119c428b067.java)
	at org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
	at $ServletRequestServicer_119c428b04d.service($ServletRequestServicer_119c428b04d.java)
	at org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
	at $ServletRequestServicerFilter_119c428b049.service($ServletRequestServicerFilter_119c428b049.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
	at $ServletRequestServicerFilter_119c428b047.service($ServletRequestServicerFilter_119c428b047.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
	at $ServletRequestServicerFilter_119c428b04b.service($ServletRequestServicerFilter_119c428b04b.java)
	at $ServletRequestServicer_119c428b04f.service($ServletRequestServicer_119c428b04f.java)
	at $ServletRequestServicer_119c428b041.service($ServletRequestServicer_119c428b041.java)
	at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
	at org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.trails.security.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:152)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:229)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:619)


-------- Original-Nachricht --------
> Datum: Thu, 08 May 2008 10:14:51 +0200
> Von: superoverdrive@gmx.de
> An: "Tapestry users" <us...@tapestry.apache.org>
> Betreff: Tapestry 4.1 Secure streaming of video files

> 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: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org