Guava has a method to join a sequence of input streams into one input stream that might be useful here:
http://docs.guava-libraries.googlecode.com/git-history/v12.0/javadoc/com/google/common/io/ByteStreams.html#join(java.lang.Iterable) It actually works in terms of an Iterable (or array) of InputSupplier<InputStream>. There is also a method to turn a URL into an input stream supplier: http://docs.guava-libraries.googlecode.com/git-history/v12.0/javadoc/com/google/common/io/Resources.html#newInputStreamSupplier(java.net.URL) --tim On Wed, Apr 18, 2012 at 12:07 PM, Thierry Boileau < [email protected]> wrote: > Hello Bjorn, > > > >By messing with the code you sent, this seems to be a function of setting > the representation size. If I set the size, it's fine, if not, it sends the > whole thing regardless of content-range, which seems like a bug. > Thanks for discovering a bug inside the RangeFilter class. > > Then, I've found that the problem is due to the usage of the > OutputRepresentation in order to gather the several instances of > InputStream. I propose you to use an InputRepresentation instead. > First, I've set up a InputStream class that composes the several > InputStream (this implementation is only a "quick" code): > > private static class CompositeInputStream extends InputStream { > private Iterator<URL> urlIt = null; > private InputStream is = null; > > public CompositeInputStream(Vector<URL> urls) throws IOException { > urlIt = urls.iterator(); > if (urlIt.hasNext()) { > is = urlIt.next().openStream(); > } > } > > @Override > public int read() throws IOException { > // read each input stream until exhaustion > int r = is.read(); > > boolean goOn = (r == -1); > while (goOn) { > // choose the next one until exhaustion > if (urlIt.hasNext()) { > is = urlIt.next().openStream(); > r = is.read(); > goOn = (r == -1); > } else { > goOn = false; > } > } > > return r; > } > } > > Then, I simple return the InputRepresentation: > return new InputRepresentation(new CompositeInputStream(urls)); > > I hope this will help you. > > Best regards, > Thierry Boileau > > > > >> On Apr 11, 2012, at 2:14 PM, Bjorn Roche wrote: >> >> >> On Apr 11, 2012, at 1:50 PM, Thierry Boileau wrote: >> >> Hi Bjorn, >> >> that's right, I primarily use the restlet 2.1 version, which does not >> support this constructor I think. I'm not sure this has an impact. >> >> >> Well when I use the setter I get the same thing (throws exception) as >> when I pass that value to the constructor. >> >> Also, it looks like the range is being ignored -- I am getting the full >> document back rather than part. >> >> >> By messing with the code you sent, this seems to be a function of setting >> the representation size. If I set the size, it's fine, if not, it sends the >> whole thing regardless of content-range, which seems like a bug. >> >> Can you send me build instructions (pom or ant file?) for your code if >> you have it? I am testing with curl, maybe there is an issue with one of >> our tests? >> >> >> I've figured out how to build (I am an idiot with building)... and I >> can't reproduce the exception. >> >> bjorn >> >> >> Finally, is it possible to avoid the range processing on just some calls >> for greater efficiency? >> >> bjorn >> >> Best regards, >> Thierry Boileau >> >> Thierry, >>> >>> The first thing I noticed in your code is that you are using the >>> OutputRepresentation constructor that does not take an expectedSize >>> argument, so I took that out and the exception goes away. At the moment my >>> tests are still failing, so I'll look into that some more. >>> >>> bjorn >>> >>> On Apr 11, 2012, at 12:39 PM, Thierry Boileau wrote: >>> >>> Hi Bjorn, >>> >>> I send you a sample test code (server + client) based on your code that >>> works for me. But I notice that my app sends only 15000 bytes... Can you >>> tell us the metrics of your tests? >>> >>> Not 100% sure of the question.. do you mean container? I am not using >>>> jetting. My initialization code looks like this: >>>> Component component = new Component(); >>>> component.getServers().add(Protocol.HTTP, PORT); >>>> component.getDefaultHost().attach(new >>>> com.xonami.rest.server.ApiApplication()); >>>> component.start(); >>>> >>>> Is that what you wanted? >>>> >>> I wanted to know if the application is served using some "server" >>> extensions such as jetty (org.restlet.ext.jetty.jar) or simple >>> (org.restlet.ext.simple.jar), or inside a servlet container. >>> >>> >>> also, in the code I sent it looks like it was not "hanging" but rather >>>> pausing for a moment and then throwing this exception: >>>> >>>> java.io.IOException: Timeout while writing to the queue-based output >>>> stream >>>> at org.restlet.engine.io.PipeStream$2.write(PipeStream.java:106) >>>> at java.io.OutputStream.write(OutputStream.java:99) >>>> at >>>> com.xonami.rest.server.media.RawMediaStateWithIdResource$1.write(RawMediaStateWithIdResource.java:158) >>>> at org.restlet.engine.io.BioUtils$2.run(BioUtils.java:394) >>>> at org.restlet.service.TaskService$1$1.run(TaskService.java:130) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) >>>> at java.lang.Thread.run(Thread.java:680) >>>> >>> >>> thanks, I try to reproduce this error. Or, if may ask you, can you >>> provide a reproductible sample test code? >>> >>> Best regards, >>> Thierry Boileau >>> >>> >>>> ----------------------------- >>>> Bjorn Roche >>>> http://www.xonami.com >>>> Audio Collaboration >>>> http://blog.bjornroche.com >>>> >>>> ------------------------------------------------------ >>>> >>>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2947368 >>>> >>> >>> <testRange.zip> >>> >>> >>> ----------------------------- >>> Bjorn Roche >>> http://www.xonami.com >>> Audio Collaboration >>> http://blog.bjornroche.com >>> >>> >>> >>> >>> >> >> ----------------------------- >> Bjorn Roche >> http://www.xonami.com >> Audio Collaboration >> http://blog.bjornroche.com >> >> >> >> >> >> ----------------------------- >> Bjorn Roche >> http://www.xonami.com >> Audio Collaboration >> http://blog.bjornroche.com >> >> >> >> >> > ------------------------------------------------------ http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2949515

